java

[JAVA] 추상클래스, 추상메소드와 인터페이스의 개념과 차이점

우주유령 2021. 10. 21. 22:43
728x90
반응형

추상메소드

추상 메소드는 abstract를 사용하여 껍데기만 작성한 메소드다.

추상메소드가 있는 class를 추상클래스라고 한다. 

추상클래스는 미완성 설계도에 비유하며, 인스턴스화 할 수 없다.

 

예를 들어 TV를 만드는데 대부분의 TV는 90%가 같은 기능이라고 하자. 그렇다면 설계도의 90%는 같으므로,

미리 90%가 만들어진 설계도를 작성해놓는 것이 좋을 것이다. 이때 쓰는 것이 바로 추상 클래스이다.

 

추상메소드의 디테일한 내용은 추상클래스를 상속받아 오버라이딩하여 구현해야 한다.

abstract class Shape { // 추상 클래스 선언
    public Shape() { } // 생성자
    public void paint() { draw(); } // 일반적인 메소드도 구현할 수 있다.
    abstract public void draw(); // 추상 메소드 선언
}

class Line extends Shape{
    @Override // 오버라이딩하여 구현
    public void draw() {
        System.out.println("line"); 
    }
}

이때 추상클래스를 오버라이딩하지 않고 그냥 상속받으면 상속받은 클래스도 추상클래스다.

추상클래스를 통해 설계와 구현을 분리할 수 있다.

 

인터페이스

인터페이스는 규격화를 위해서 만든다.

미리 틀을 짜 놓았다고 생각하면 된다.

interface PhoneInterface{
    public static final int Timeout = 1000;
    public abstract void sendCall(); 
    void receiveCall(); // public abstract 생략 가능
    public static void printLogo() {
        System.out.println("**Phone**");
    }
}

interface Mp3{
    public abstract void play();
}


class SamsungPhone implements PhoneInterface, Mp3 {
    @Override
    public void sendCall() {
        System.out.println("전화 거는중...");
    }

    @Override
    public void receiveCall() {
        System.out.println("전화가 왔습니다");
    }

    @Override
    public void play() {
        System.out.println("노래...");
    }

    //메소드 추가 작성
    public void flash() {System.out.println("flash가 켜졌습니다");}


}

implements를 사용하여 구현하고, interface에서 정의한 메소드들을 override한다. interface는 여러개를 다중구현할 수 있다.

 

 

 

추상클래스와 인터페이스는 둘 다 다형성을 위해서 존재하고, override해야한다는 점에서 비슷해 자주 헷갈린다.

그 둘의 차이점은 다음과 같다.

목적의 차이

추상클래스

  • 서브클래스에서 필요한 대부분의 기능을 구현한다.
  • 서브클래스에서만 필요한 부분은 추상메소드로 선언하여 서브클래스에서 구현하도록 한다.

인터페이스

  • 객체의 기능을 표준화한 문서같은 것이다.
  • 목적에 따라 상속받은 인터페이스들의 모든 추상메소드를 만들게 한다.

구성의 차이

추상클래스

  • 추상 메소드
  • 일반메소드
  • 상수, 변수 필드

인터페이스

  • 변수 필드(멤버변수)는 포함하지 않음
  • 상수는 포함
  • 추상메소드
  • 일반메소드
  • default메소드
  • static메소드
  • protected접근지정 선언 불가
  • 다중상속 지원

* 상수 : 인터페이스에서 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조해라 (절대적)

* 추상메소드 : 가이드만 줄테니 추상메소드를 overriding해서 재구현해라. (강제적)

* default 메소드 : 인터페이스에서 기본적으로 제공해주지만, 맘에 안들면 각자 구현해서 써라. (선택적)

* 정적메소드 : 인터페이스에서 제공해주는 것으로 무조건 사용 (절대적)

https://limkydev.tistory.com/197 참고

 

 

728x90
반응형