본문 바로가기
back-end/JAVA

37) 추상클래스의 작성1

by 모두의 향연 2021. 6. 15.
728x90
반응형

37) 추상클래스의 작성 1

 

1. 추상클래스의 작성

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

소스코드1(변경전)

이 소스코드를 화면에 구현해본다고 하자.

게임화면(예시)

군인 클래스에는 군인의 위치, 위치 변동 기능, 멈춤 기능, 스팀팩사용기능이 있다. 탱크와 수송선도 각각의 기능이 있다.

하지만 위치, 멈춤기능, 위치 변동 기능은 모두 다 사용하고 있는 것이기 때문에 일일이 클래스마다 작성하는 것은 시간낭비+코드만 길어지는 격이 된다. 그래서 공통적인 부분을 'Unit'클래스를 만들어 한 곳에 묶어주자.

 

소스코드3(변경후)

공통으로 묶어주는 클래스를 'Unit'이라 칭하고, 공통된 부분 '위치'와 '이동 기능', '멈춤 기능'을 넣는다.

위치 이동은 군인, 탱크, 수송선 모두가 존재하지만, 이동하는 속도가 다르기 때문에 abstract를 붙여 추상메서드를 만든다. 추상메서드를 썼기 때문에 Unit클래스는 abstract를 붙여 추상클래스가 된다.

 

군인과 탱크는 지상에서, 수송선은 바다에서 이동한다. 지상이랑 바다는 이동하는 속도가 다르기 때문에 move() 메서드 내용은 각각 다르다. 그래서 Unit클래스에 추상메서드로 작성한 것이다. 

즉, 구현부는 다르고 선언부는 똑같아도 되니까 추상메서드가 된 것이다(추상메서드는 구현부가 없으니까)

대신에 자손클래스에서는 구현부(몸통)를 구현해줘야 한다.

 

코드를 보면 어떤가? 공통적인 부분을 제거하고 한 곳으로 묶으니까 코드가 간결해졌다.

 

 

main클래스 생성
소스코드 도식화

위 코드에서 group [i]. move(100,200)를 출력하면 Unit의 move() 메서드가 출력되는 게 아니고 군인, 탱크, 수송선의 각 move()에서 출력된다.

즉, Unit에 있는 move()가 추상 메서드라 해도, 실제 인스턴스에 있는 move() 메서드가 출력된다는 것이다.

 

 

 

Object타입의 move()출력

그럼 Object인 최고조상클래스로 하면 어떨까? move() 메서드를 출력하면 실제 인스턴스에 있는 move() 메서드가 출력된다고 하니까 오류가 안 날까?

아니다. 

Object클래스 안에는 추상메서드move()가 아예 존재하지 않으므로 에러가 난다.

Unit클래스엔 move()가 있어서 출력 가능했던 것.

 

 

 

*유튜브 남궁성 선생님의 `자바의 정석`을 참고하여 만들었습니다*
*자세히 보고 싶은 분들은 유튜브 가서 보시면 됩니다*

 

728x90
반응형