반응형

추상 클래스의 작성

  • 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존클래스의 공통 부분을 뽑아서 추상클래스를 만든다.

 

추상 클래스를 작성 할 때, 저번 처럼 바로 정의할 수 도 있지만,
기존에 있는 클래스들에서 공통적인 부분을 뽑아서 추상클래스로 만들기도 한다.

예를들어, 이런 클래스가 있을 때,
Marine이라는 보병에 대한 클래스와, Tank라는 탱크에 대한 클래스, 그리고 Dropship이라는 수송선에 대한 클래스가 있을 때,
게임을 가정하고 만든 것인데, 이거 각 클래스를 보면, x, y로 각 유닛의 위치가 있고, 
움직이거나 멈출수 있어야 하는 것을 알 수 있다.

그래서 이것들의 공통 부분을 뽑아내서 우측처럼 Unit이라는 클래스를 만들었다.
x, y로 위치,
move,
stop을 뽑아냈다.

정지는 현재 위치에 정지하는 것이므로 공통이라고 치고,
move는 이동하는 것인데 보병, 탱크는 지상유닛, 그리고 수송선은 공중유닛이다.
지상유닛과 공중유닛은 이동하는 것이 다르다.
그래서 move메서드가 있지만, 선언부는 일치하지만, 실제 내용(구현부)는 다를 것이다.

그래서 선언부만 일치하므로, 일치하는 부분만 추상클래스의 선언부로 따로 뽑아낸 것이다. 

즉, 기존클래스의 공통부분을 추출해서 Unit이라는 클래스로 정의한 것이다.
그리고, 공통 부분을 뽑아서 클래스를 만든다고 해서 꼭 추상클래스는 아니지만,
선언부만 뽑아냈을 경우, 추상클래스로 만들 수 있다.

그래서, 나머지 클래스들이 Unit클래스를 상속받아서 int x, y; 부분이 빠져서 코드들이 간결해졌다.

이런것이 바로 객체 지향 언어의 장점이다.

물론, Unut클래스를 abstract를 붙이지 않고, void move(int x, iny y) {}이렇게 만들어도 되지만,
추상클래스로 만들지 않아서 abstract 붙이지 않을 경우, 다른 클래스에서 Unit클래스를 상속받아서 사용할 때,
이것이 이미 다 만들어져 있다고 생각하고, 객체를 생성하고, move()를 호출했는데 move메서드가 완성되어있지 않은 것을 몰라서 왜 동작하지 않는지 해멜 수도 있다.

그래서 일부로 추상클래스로 만들어서 추상클래스라는 abstract표시를 해줌으로서, 강제로 해당 메서드를 상속받아서 완성시키도록 강제하는 역할도 한다.

 

이렇게 추상클래스로 공통부분을 뽑아낸 뒤, 상속받아서 구현을 완료해서 사용하면, 
다형성의 장점을 이용해서 좌측 코드처럼 사용하는 것이 가능하다.

Unit타입의 길이 3짜리 배열을 만들고, 각 인덱스에 각 클래스의 인스턴스를 저장한다.

그러면, group리모컨에는 x, y, move, stop버튼이 존재하게 되고,
이 리모컨을 이용해서 move를 호출하면, 추상메서드가 호출되는 것이 아니라,
배열에 저장된 실제 인스턴스객체차례대로 move가 호출된다.

리모컨의 move가 추상메서드라고 해도,
실제 호출되는 것은, 실제 인스턴스에 구현된 메서드가 호출된다.

만약에 각 클래스의 인스턴스를 Object배열에 담으면 어떻게 될까?

Object는 최고 조상이므로 다형성에 의해 모든 타입의  객체를 저장할 수 있다.
그러나, Object배열을 다루는 리모콘(참조변수)로는 move()를 호출할 수 없다.

왜냐하면 Object클래스에는 move버튼이 없기때문이다.

이점을 잘 알아두자.

반응형

'JAVA' 카테고리의 다른 글

인터페이스의 선언, 상속, 구현  (0) 2022.04.06
추상 클래스의 작성 (2)  (0) 2022.04.05
추상 클래스, 추상 메서드  (0) 2022.04.05
여러 종류의 객체를 배열로 다루기  (0) 2022.04.04
매개변수 다형성  (0) 2022.04.04