자바_04_01_추상화
package abstraction01;
public class Mouse {
public String name;
public int age;
public int countOfTail;
public void sing() {
System.out.println(name + "찍찍!!");
}
}
한 마리의 쥐를 표현할 때, 필요한 것은 무엇인가. 보통 생명체를 표현하듯 이름과 나이가 떠오를 것이고, 쥐 하면 또 생각나는게 긴 꼬리일 것이다.
그리고 쥐의 울음소리는 찍찍이라고 어렸을 때부터 교육받아왔기에 그렇게 쥐 클래스를 만들었다.
package abstraction01;
public class MouseDriver {
public static void main(String[] args) {
Mouse mickey = new Mouse();
mickey.name = "미키";
mickey.age = 85;
mickey.countOfTail = 1;
mickey.sing();
mickey = null;
Mouse jerry = new Mouse();
jerry.name = "제리";
jerry.age = 73;
jerry.countOfTail = 1;
jerry.sing();
}
}
두 마리의 쥐를 만들었다. 가장 유명한 쥐 두마리인 미키마우스와 제리.
인스턴스를 각각 생성하고, 이름과 나이, 그리고 꼬리 갯수를 설정한다.
울음소리를 내게 해 보았다.
각 객체마다 새로 메소드를 쓰거나 새 변수를 선언할 필요가 없게 하는 것.
이것이 추상화라고 나는 이해했다.
그런데 이상하지 않은가? 쥐의 꼬리는 잘리거나 돌연변이인 경우를 제외하곤 모두 한 개일 것이다.
이렇게 당연한 사실을 매번 쥐를 생성할 때마다 귀찮게 선언해줘야 하는 게 정답일까? 물론 아니다.
package abstraction02;
public class Mouse {
public String name;
public int age;
public static int countOfTail;
public void sing() {
System.out.println(name + "찍찍!!");
}
}
위 코드에서는 countOfTail 변수를 static 키워드를 사용하여 해당 변수를 클래스변수로 만들어준다.
package abstraction02;
public class MouseDriver {
public static void main(String[] args) {
// TODO Auto-generated method stub
Mouse.countOfTail = 1;
Mouse mickey = new Mouse();
Mouse jerry = new Mouse();
Mouse mightyMouse = new Mouse();
System.out.println(mickey.countOfTail);
System.out.println(jerry.countOfTail);
System.out.println(mightyMouse.countOfTail);
System.out.println(Mouse.countOfTail);
}
}
새롭게 시작하는 이 실행문에서는 Mouse 클래스의 countOfTail 변수를 미리 선언해 두고, 인스턴스를 생성하고 이름과 나이는 따로 선언 없이 꼬리 갯수만 파악하려 했다.
실행 결과는 다음과 같다.
더 위의 것과는 다르게, 꼬리의 수를 클래스에 한 번만 선언했지만 인스턴스를 새로 생성할 때 앞선 선언이 유지되는 것을 볼 수 있다. Mouse.countOfTail이 메모리에 계속 유지되고 있는 것이다.
위와 같이 추상화하는 특징이 만약, 보편적인 것이라면 또는 불변의 진리라고 볼 수 있는 것이라면, static 키워드를 통해 클래스 자체의 전체 변수로 사용할 수 있는 것이다.