추상클래스 VS 인터페이스

윤재열·2022년 1월 19일
0

Java

목록 보기
37/71

자바공부를 다시하면서 추상클래스,인터페이스 둘다 추상메서드를쓰고 추상클래스는 공통적인 특성,인터페이스는 able로 끝나는 행동을 생성하는거라고 알고 있는데 공부하면 공부할수록 더어렵고 사람들마다 말하는게 달라서 제대로한번 정리하고 다시 머리를 뜯지 않으려고 제대로 머리에 넣어보자.

추상 클래스(abstract)

클래스를 설계도라 하면, 추상 클래스는 미완성 설계도에 비유할 수 있습니다.
(여기서 클래스가 미완성이라는 것은 추상 메서드를 포함하고 있다는 의미입니다.)

  • 예를들면, 같은 크기의 TV라도 기능의 차이에 따라 여러 종류의 모델이 있지만 설계도 90은 동일할테니, 어느정도 틀을 갖춘 상태에서 진행하는 것이 좋다.이떄 사용할 수 있는 것이 추상 클래스이다.

  • 추상메서드 : 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상메서드이다.
    추상 메서드는 상속받는 클래스에 따라 달라질 수 있다.(재정의를 할 수 있다.)

추상 클래스 규칙

  • 추상 클래스는 class 앞에 abstract를 붙여 표현한다.
  • 추상 메서드를 포함하지 않은 클래스도 abstract를 붙여서 추상 클래스로 지정할 수도 있다.
  • 클래스를 abstract로 지정하면 new 연산자를 통해 객체를 직접 생성할 수 없다.
  • 메서드에 abstract로 사용할 경우 interface의 메서드와 같이 구현 부분은 없다.
    (Ex.public void sound();)
  • abstract로 선언한 메서드를 자식 클래스에 반드시 구현해야한다.(오버라이딩)
    이는 자식 클래스에서 추상 메서드를 반드시 구현하도록 강제하는 것입니다.
  • new 연산자로 직접 생성자를 호출할 수는 없지만, 자식 객체가 생성될 때super()를 호출해서 추상 클래스 객체를 생성하므로 추상클래스도 생성자가 반드시 있어야 한다.

이제 예제를 보면서 알아보자

package 추상클래스;

public abstract class Player {
    boolean pause;
    int currentPos;
    
    public Player(){	//pause=false,currentPos=0으로 초기화
        this.pause=false;
        this.currentPos=0;
    }
    //지정된 위치에서 재생을 시작하는 기능 수행되도록 작성
    abstract void play(int pos);
    //재생을 즉시 멈추는 기능을 수행하도록 작성
    abstract void stop();
    
    public void pause(){
        if(pause){
            pause=false;
            play(currentPos);
        }else{
            pause = true;
            stop();
        }
    }
}

Player 추상 클래스는 오디오,VCR, 같은 재생 가능한 기기의 부모 클래스 가 될 수 있다.

public class CDPlayer extends Player {
    @Override
    void play(int pos) {
        // 구현 생략
    }

    @Override
    void stop() {
        // 구현 생략
    }

    //CDPlayer 클래스에 추가로 정의된 멤버
    int currentTrack;

    void nextTrack() {
        currentTrack++;
        // ...
    }

    void preTrack() {
        if (currentTrack > 1) {
            currentTrack--;
        }
        // ...
    }
}

인터페이스

인터페이스는 일종의 추상 클래스로,추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높아
추상 클래스와 달리 몸통을 갖춘 일반 메서드,멤버 변수를 구성원으로 가질 수 없다.
추상 클래스를 미완성 설계도라 하면, 인터페이스는 구현된 것은 아무것도 없는 밑그림만 그려진 기본 설계도 라고 할 수 있다.

인터페이스 규칙

  • 추상 클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용되기 보다,
    다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.
  • 일반 메서드, 멤버 변수를 구성원으로 가질 수 없다.(상수 필드와 추상 메서드만을 구성멤버로 가진다.)
  • 모든 멤버 변수는 public static final 이어야 하며, 이를 생략할 수 있다.
  • 모든 메서드는 public abstract이어야 하며,또한 생략할 수 있다.
    (public static final의 사용목적: 인터페이스 변수는 아무 인스턴스도 존재하지 않는 시점이기 때문에 스스로 초기화 될 권한이 없다. 때문에 public static final를 구현하여 구현 객체의 같은 상태를 보장한다.)

인터페이스의 다중 상속

인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와 달리 다중 상속을 받는 것이 가능하다.

public interface Movable{
void move(int x ,int y);
}

interface Attackable{
void attak(Unit u);
}
interface Fightable extends Movable, Attackable{
}

클래스의 상속과 마찬가지로 자식 인터페이스는 부모 인터페이스에 정의된 멤버 모두 상속받는다.

  • 인터페이스가 다중 상속이 가능한 이유?
    -인터페이스는 추상메서드만을 가지고 있는데, 이를 상속할 경우 상속하는 클래스에서 무조건 그 메서드를 구현해주어야 하는데, 이 경우 다중 상속하고 있는 인터페이스들에 동일한 메서드가 존재한다 하더라도, 그 내부 구현은 정의 되지 않았으니 문제될 것이 없다.

추상 클래스 VS 인터페이스

  • 공통점
    1.추상 클래스와 인터페이스 둘 다 가지고 있는 추상 메서드를 구현하도록 강제한다.
  1. 인스턴스화가 불가능하다.
  • 접근자
    -인터페이스에서 모든 변수는 public static final, 메서드는 public abstract 이다.
    하지만 추상 클래스에서는 static 이나 final이 아닌 필드를 가질 수 있고,
    public, protected, private 모두 가질 수 있다.

  • 사용목적
    -추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로,
    상속관계를 타고 올라갔을 때 부모 클래스를 상속하며
    부모 클래스가 가진 기능들을 구현해야 할 경우 사용한다.

    -인터페이스는 상속 관계를 타고 올라갔을 때 다른 조상 클래스를 상속하더라도, 같은 기능이 필요할 경우 사용한다.
    클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용한다.

    각각의 적절한 사용 케이스

  • 추상클래스

  1. 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
  2. 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메서드와 필드가 많거나,
    public 이외의 접근자(protected,private)선언이 필요한 경우
  • 인터페이스
  1. 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우.
    ex)Compareable,Cloneable 인터페이스는 여러 클래스들에서 구현되는데, 구현클래스들 간에 관련 성이없다.
    또 예를 들어 생물은 동물,식물로 나뉘는데 eatable이라는 인터페이스를 만들어 식충식물같은 경우에도 eatable을 쓰면된다.
  2. 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지 신경쓰지 않는 경우.
  3. 다중 상속을 허용하고 싶은 경우
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글