[기본 개념] 2 | (6.1) 추상클래스

728x90

[기본 개념] 2 | (6.1) 추상클래스

1> 추상클래스란?

2> 추상메서드(abstract method)

3> 추상클래스의 작성

1. 추상클래스란?

 클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.

 

추상클래스는 새로운 클래스를 작성하는 데 있어서 바탕이 되는 조상클래스로서 중요한 의미를 갖는다.

 

 추상클래스는 키워드 'abstract'를 붙이기만 하면 된다. 이렇게 함으로써 클래스 선언부의 abstract를 보고 상속을 통해 구현해주어야 한다는 것을 쉽게 알 수 있을 것이다.

 

        abstract class 클래스이름 {

            · · · 

        }

 

추상클래스도 생성자가 있으며 멤버변수와 메서드도 가질 수 있다.

2. 추상메서드(abstract method)

 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔 것이 추상메서드이다. 이와 같이 남겨놓는 이유는 상속받는 클래스에 따라 메서드의 내용이 달라질 수 있기 때문에 조상클래스에서 선언부만 작성하는 것이다. 그리고 주석을 덧붙여 어떤 기능을 수행할 것인지 알려주어 상속받는 자손 클래스가 적절히 구현해주어야 한다.

 

추상메서드 역시 키워드 'abstract'를 앞에 붙여주고, 구현부가 없으므로 괄호{ } 대신 ';'을 적어준다.

 

/* 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다. */

abstract 리턴타입 메서드이름( ) ;

3. 추상클래스의 작성

 상속이 자손클래스를 만드는데 조상클래스를 사용하는 것이라면 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상클래스를 만드는 것이라 할 수 있다.

 

추상화 클래스 간의 공통점을 찾아내서 공통의 조상을 만드는 작업

구체화 상속을 통해 클래스를 구현, 확장하는 작업

 

기존의 클래스로부터 공통된 부분을 뽑아내어 추상클래스를 만들어 보도록 하자.

 

        class Marine {    // 보병

            int x, y ;       // 현재위치

            void move(int x, int y) { /* 지정된 위치로 이동 */ }

            void stop( )               { /* 현재 위치에 정지 */ } 

            void stimPack( )         { /* 스팀팩을 사용한다. */ }

        }

 

        class Tank {       // 탱크

            int x, y ;       // 현재위치

            void move(int x, int y)    { /* 지정된 위치로 이동 */ }

            void stop( )                  { /* 현재 위치에 정지 */ } 

            void changeMode( )       { /* 공격모드를 변환한다. */ }

        }

 

        class Dropship {    // 수송선

            int x, y ;          // 현재위치

            void move(int x, int y)   { /* 지정된 위치로 이동 */ }

            void stop( )                 { /* 현재 위치에 정지 */ } 

            void load( )                 { /* 선택된 대상을 태운다. */ }

            void unload( )              { /* 선택된 대상을 내린다. */ }

        }

 

 이 유닛들은 각자 나름대로의 기능을 가지고 있지만 공통부분을 뽑아내어 하나의 클래스로 만들고, 이 클래스로부터 상속받도록 변경해보자.

 

        abstract class Unit {

            int x, y ;

            abstract void move(int x, int y) ;

            void stop( ) { /* 현재 위치에 정지 */ }

        }

 

        class Marine extends Unit {    // 보병

            void move(int x, int y)    { /* 지정된 위치로 이동 */ }

            void stimPack( )            { /* 스팀팩을 사용한다. */ }

        }

 

        class Tank extends Unit {      // 탱크

            void move(int x, int y)    { /* 지정된 위치로 이동 */ }

            void changeMode( )      { /* 공격모드를 변환한다. */ }

        }

 

        class Dropship extends Unit {    // 수송선

            void move(int x, int y)    { /* 지정된 위치로 이동 */ }

            void load( )                  { /* 선택된 대상을 태운다. */ }

            void unload( )               { /* 선택된 대상을 내린다. */ }

        } 

 

  각 클래스의 공통부분을 뽑아내서 Unit클래스를 정의하고 이로부터 상속받도록 하였다. 이 Unit클래스는 다른 유닛을 위한 클래스를 작성하는데 재활용될 수 있을 것이다.

 

 

 

 

출처 | Java의 정석 (남궁 성)

 

 

 

728x90