본문 바로가기
프로그래밍 언어/java

[java] extends vs implements

by m2162003 2020. 10. 2.

extends

- 상속

- 클래스에서 사용

- 슈퍼클래스에 정의된 필드와 매서드 사용 가능

- 또 다른 특징은 .... 다중 상속이 불가능하다는 것! 다중 상속이란 부모 클래스가 2개 이상 존재하는 것을 의미한다.

즉 무조건 하나의 슈퍼 클래스만 상속 가능하다는 의미다. 

public class Son extends Mother, Father....가 불가능하다!

 

자바가 다중 상속을 지원하지 않기에 등장한 것... 그것이 바로 인터페이스다.

 

implements

- 역시 상속을 의미한다.

- 인터페이스에서 사용

- 여러 개 상속 가능: public class Son implements Mother, Father 가능하다 

- 가장 큰 특징은 부모의 메서드를 반드시 오버라이딩(재정의)해야 한다는 것이다. -> 사실 이걸 보면 상속이 아닌 거 같다만 자바에서 상속이라니까..

- 그리고 인터페이스에 정의된 메서드는 선언만 되어 있음. 껍데기 함수 형만 적혀있는 것-> 어떻게 보면 명세서와 같은 역할이다. 틀만 선언되어 있지 구체적인 함수 구현은 인터페이스를 상속받은 객체에서 이뤄진다.

 

코드 예시

 

인터페이스 정의

package com.company;

public interface PersonInterface {
    public static final String name = "Dobby";

    public void sayMyName();
    public void sayMyHome();
}

1. 인터페이스 내에 필드는 무조건 공개여야 한다. 명세서 역할이기 때문

public static final로 선언해야 함. 안 붙여도 알아서 public static final이 된다.

 

2. 메서드는 추상화만 구현

 

클래스

package com.company;

public class BachelorImpl implements PersonInterface {

    private String home;

    public BachelorImpl(String home){
        this.home = home;
    }

    @Override
    public void sayMyName(){
        System.out.println("I am " + name);
    }

    @Override
    public  void sayMyHome(){
        System.out.println("I live in " + home);
    }
}

1. interface를 상속한 클래스는 구분을 위해 함수 이름 뒤에 주로 Impl이나 I를 붙인다.

2. 인터페이스에서 정의한 필드는 사용가능하다.

3. 인터페이스에서 정의한 필드는 final이므로 생성자에서 재정의할 수 없다.

 

main

package com.company;

public class Main {

    public static void main(String[] args) {

        BachelorImpl bachelor = new BachelorImpl("Lab");
        bachelor.sayMyName();
        bachelor.sayMyHome();

    }
}

 

 

결과:

 

댓글