java

자바_04_01_추상화

선호하는 2022. 12. 26. 21:00
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 키워드를 통해 클래스 자체의 전체 변수로 사용할 수 있는 것이다.