목표
과정
- ChangeAnimalState라는 클래스를 만든다.
- 클래스에 Animal이라는 객체를 멤버변수로 만들고 cat.state를 바꾸는 방법이 있고,
- 클래스의 sleep 메소드에만 매개변수를 받아서 cat.state를 바꾸는 방법이 있다.
- 이 방식을 사용한다.
- ChangeAnimalState 클래스는 cat의 상태만 변화시킬 것이기에 Animal 값이 남지 않아도 된다.
Animal 클래스
public class Animal {
// 멤버 변수(필드)
private int age;
private String name;
private String state;
public Animal(String name, int number) {
this.name = name;
age = number;
state = "awake";
}
}
ChangeAnimalState 클래스
public class ChangeAnimalState {
// private Animal animal;
public ChangeAnimalState() {
// this.animal = animal;
}
public void sleep(Animal animal) {
animal.setState("sleep");
System.out.println(animal.getName() + " is " + animal.getState());
}
}
- 주석 처리된 부분은 클레스에 Animal 멤버변수를 남겨놓는 방식이다.
메인 클래스
public class test {
public static void main(String[] args){
Mammalia cat = new Mammalia("happy", 10);
ChangeAnimalState changeCatState = new ChangeAnimalState();
changeCatState.sleep(cat); // happy is sleep
System.out.println(cat.getState()); // sleep
주의사항
- 객체 자체를 받지 않고, 메소드에 객체의 멤버변수를 넘겨주게 되면, 객체 자체의 멤버변수는 변하지 않는다.
- 아래 예제 코드에서는 eatingState가 그러하다.
ChangeAnimalState 클래스
public class ChangeAnimalState {
public ChangeAnimalState() {
}
public void sleep(Animal animal) {
animal.setState("sleep");
System.out.println(animal.getName() + " is " + animal.getState());
}
public void eatingState(String state) {
state = "eating";
}
}
메인 클래스
public class test {
public static void main(String[] args){
Mammalia cat = new Mammalia("happy", 10);
ChangeAnimalState changeCatState = new ChangeAnimalState();
changeCatState.sleep(cat); // happy is sleep
System.out.println(cat.getState()); // sleep
changeCatState.eatingState(cat.getState());
System.out.println(cat.getState()); // sleep
- 기대하는 출력값은 eating이지만 sleep으로 출력됨을 볼 수 있다.