본문 바로가기
언어 공부/Java

자바 extends와 implements 에 대해

by krapoi 2021. 9. 7.
반응형

오늘은 extends와 implements에 대해 공부해 보았다.

두 개의 역할이 정확히 어떤지 몰랐는데 이번의 계기로 인해 알게 되었다.

 

일단

extends는 상속시키는 것인데,

대충 A extends B를 하면 A는 B를 상속해 +a 하는 것이다.

(extends는 일반 클래스와 abstract 클래스 상속)

즉 B에 있는 모든 것을 사용할 필요는 없다는 것.

하지만 implements는 B에 있는 기능을 모두 사용해야 한다.

(implement는 interface 상속)

 

예를 들어 보자

extends:

public class test {
    public static void main(String[] args) {
        testpaper sc = new testpaper();
        System.out.println(sc.math);
        System.out.println(sc.eng);
        System.out.println(sc.kor);
        sc.test_result();
    }
}

class score{
    protected int math = 60;
    protected int kor = 21;
    protected int eng = 100;
    protected int result = math + kor + eng;

    public int test_result(){
        return result;
    }

}

class testpaper extends  score{
    public void print(){
        System.out.println(result);
    }
}

일단 extends는 오버 라이딩을 할 필요가 없다.

위의 작성한 코드를 보면 testpaper가 score를 extends를 이용해 상속을 받았지만, result만 사용하였다.

그리고 main을 보면 testpaper가 score상속을 받았기에 score에 있는 test_result의 메서드를 접근할 수 있는 걸 볼 수 있다.

 

또 자바에서는 다중 상속을 지원하지 않는다고 한다. 대충

public class A extends B, C {...}

이런 식으로 짜는 것이 안된다는 것이다.

대신 인터페이스인 implements가 나온 것이라고 한다.

 

implements:

public class Interface {

    public static void main(String[] args) {
        ExampleInterface in = new ExampleInterface();
        in.num1();
        in.num2();
    }
}

interface testInterface{
    public static int num = 12;
    public void num1();
    public void num2();

}

class ExampleInterface implements testInterface{
    @Override
    public void num1() {
        System.out.println(num);
    }

    @Override
    public void num2() {
        System.out.println(num + 2);
    }
}

위의 코드를 보면 ExampleInterface에서 interface인 testInterface를 implements 해 재정의를 하였다.

이렇게 implements는 무조건 부모의 메서드를 재정의(오버 라이딩)을 해야 한다.

물론

@Override
    public void num2() {
        
    }

이렇게 비워놔도 된다.

 

또 implements는 다중 상속을 지원한다.

public class A implement B, C {...}

이 코드를 지원한다는 뜻이다.

근데 "이러한 구현은 메서드를 어차피 재정의해야 되니 '상속'의 의미가 아니지 않냐?" 이런 질문이 생기는 사람도 있다고 한다. (물론 전 아닙니다.)

이 질문의 답으로는

Java와 C#의 인터페이스 상속은 계약 및 분류의 의미가 강하다고 하는데,

사실 그냥 자바가 상속이라 하니 상속인 것이라고 한다.

음 뭐 그렇다고 한다.

 

정리하자면

extends는 class + a(알파)이고

implements는 인터페이스 구현이다.

반응형

'언어 공부 > Java' 카테고리의 다른 글

[JAVA] 람다식의 개념과 사용법  (0) 2021.10.07
[JAVA] Replace(문자열 치환) 에 대하여  (0) 2021.10.05
객체지향 프로그래밍  (0) 2021.09.16
JAVA 메소드의 개념  (0) 2021.09.14
JAVA 클래스의 개념  (0) 2021.09.01