ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 추상클래스(abstract class)
    JAVA 2021. 7. 3. 00:50
    728x90
    반응형

    상속이 자손 클래스를 만드는데 조상 클래스를 사용하는 것이라면, 이와 반대로 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상 클래스를 만드는 것.

     

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

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

     

    추상클래스란?

    클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도 이다.

    추상클래스로 인스턴스 생성을 할 수 없고, 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.

    추상클래스는 자체로서는 클래스의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상클래스로서의 의미를 갖는다.

    abstract class 클래스이름 {
    	...
    }

     

    추상메서드란?

    메서드는 선언부와 구현부로 구성되어있는데,

    추상메서드의 경우 선언부만 존재하고 구현부는 작성하지 않는다.

    상속받는 클래스에 따라 메서드의 내용이 달라질 수 있기에 작성하지 않는것.

    주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려주고, 실제내용은 상속받는 클래스에서 구현하도록 한다.

     

    /*주석을 통해 어떤 기능을 수행할 목적인지 간단히 알려준다 */
    abstract 리턴타입 메서드이름();

     

     

    추상클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 조상인 추상클래스와 추상메서드를 모두 구현해주어야한다.

    만약 조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자손클래스 역시 추상클래스로 지정해주어야한다.

     

    abstract class Player { //추상클래스
    	abstract void play(int pos); //추상 메서드
        abstract void stop();        //추상 메서드
    }
    
    class AudioPlayer extends Player {
    	void play(int pos) {/*구현부 생략*/} //추상메서드를 구현
        void stop(){/*구현부 생략 */}        //추상메서드를 구현
    }
    
    abstract class AbstractPlayer extends Player {
    	void play(int pos) {/*내용 생략*/}  //추상메서드를 구현
    }

     

     

    기존 클래스로부터 공통된 부분을 뽑아내어 추상클래스를 만들어 보는 간단한 예제

    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() {}
    }

    stop() 의 경우 모두 동일한 동작을 하지만

    move() 의 경우 유닛에 따라 움직이는 방법이 서로 달라지기 때문에 최대한 공통점을 뽑아내서 추상메서드로 작성한다.

     

     

     

    공통조상인 Unit클래스 타입의 참조변수 배열을 통해서 서로 다른 종류의 인스턴스를 하나의 묶음으로 다룰 수 있다는 것을 보여주는 예시

     

    Unit[] group = new Unit[4]'
    group[0] = new Marine();
    group[1] = new Tank();
    group[2] = new Marine();
    group[3] = new Dropship();
    
    for(int i = 0; i < group.length; i++)
    	group[i].move(100,200);

     

    아래의 경우 Object는 모든 클래스의 조상인 타입임에도 불구하고, move메서드가 정의 되어있지않아서 move 메서드를 호출하는 부분에서 에러가 발생한다.

    Object[] group = new Unit[4]'
    group[0] = new Marine();
    group[1] = new Tank();
    group[2] = new Marine();
    group[3] = new Dropship();
    
    for(int i = 0; i < group.length; i++)
    	group[i].move(100,200);
    728x90
    반응형

    'JAVA' 카테고리의 다른 글

    [JAVA] println, print 차이  (0) 2021.08.08
    인터페이스 (interface)  (0) 2021.07.11
    메소드(함수) 호출 방식 Call by Value & Call by Reference  (0) 2021.06.18
    [JAVA]Map.Entry 인터페이스  (0) 2021.06.08
    [JAVA] 자료구조 - HashMAP  (0) 2021.06.08

    댓글

Designed by Tistory.