JAVA / 상속성, extends 와 implements의 차이

shin_stealer·2020년 12월 12일
0

상속의 사전적 의미

상속이란 사람의 사망에 의한 재산 및 신분상의 지위의 포괄적인 승계를 말한다.

JAVA 에서의 상속

JAVA에서의 상속의 의미 또한 비슷하다.
부모 클래스로부터 상속받은 자식클래스는 부모 클래스의 변수, 메소드 등을 자신의 것처럼 사용할 수 있다.

상속성의 프로그래밍 예시로 교통수단을 들어보겠다.

교통수단 -> 열차 -> KTX

열차 클래스는 교통수단이라는 클래스로부터 상속을 받고
KTX는 열차 클래스로부터 상속 받는다.

이 관계를 그림으로 표현해 보았다.

1번

2번

흔히 일반적으로 상속받는다는 의미를 보면 2번 그림이 맞는 것 같지만,

JAVA 에서는 부모클래스의 자원을 자식클래스에서 재사용을 하기 때문에
(KTX 클래스가 교통수단과 열차 클래스의 변수, 메소드를 사용할 수 있기 때문에)
1번 그림처럼 자식클래스가 부모클래스를 포함하는 것이 올바른 그림이다.

extends

JAVA에서 상속의 대표적인 형태이다.
부모 클래스의 메소드를 자식 클래스에서 그대로 사용할 수 있으며,
오버라이딩할 필요 없이 부모 클래스에 구현되어있는 것을 그대로 사용 가능하다.

아래 예시는 extends를 사용한 게임 케릭터 예시이다.


class Human {
    public int healthPoint = 100;

}

// human 클래스를 상속받은 Warrior 클래스
class Warrior extends Human {
    public void getHealthPoint() {
        System.out.println(healthPoint);
    }
}

public class CodeReader{

     public static void main(String []args){
        Warrior warrior = new Warrior();
        warrior.getHealthPoint();
     }
}


RESULT

Human 클래스(부모)에서 선언했던 health point를 전사 클래스(자식)에서는 따로 선언을 하지않아도 사용할 수 있다.

JAVA 에서 상속을 사용할 때 주의해야할 점이 있다.
바로 "다중 상속" 을 지원하지 않는다는 것인데,
이 것은 아래의 예시와 같다.


public class Son extends Father, Mother {

JAVA 에서는 위처럼 선언하여 사용할 수 없다.

이런 문제를 해결하기 위해서 나온 것이 implements 이다.


// Father interface에는 힘 스탯이 8이다.
interface Father {
    public int strength = 8;
    public void getStrength();
}

// Mother interface에는 스피드 스탯이 10이다.
interface Mother {
    public int speed = 10;
    public void getSpeed();
}

// Son 클래스는 Father, Mother 인터페이스를 상속한다.
class Son implements Father, Mother {

	
    // 상속받은 Mother 클래스의 메소드를 override 하여 재정의 해야한다.
    @Override
    public void getStrength () {
        System.out.println(strength);
    }
    
    // 상속받은 Mother 클래스의 메소드를 override 하여 재정의 해야한다.
    @Override
    public void getSpeed() {
        System.out.println(speed);
    }
}

public class CodeReader{

     public static void main(String []args){
        
        Son son = new Son();
        son.getStrength();
        son.getSpeed();
     }
}

위 예시와 같이 implements 를 사용하게 되면 두 가지 interface에서 선언했던 메소드를 override로 재정의하여 사용할 수 있다.

요약

extends

  • 부모에서 선언, 정의를 모두하며 자식은 메소드, 변수를 그대로 사용할 수 있다.

implements

  • 부모 객체는 선언만 하며 정의된 내용은 자식 클래스에서 override 해서 사용해야한다.

참고:
https://zbomoon.tistory.com/13
https://velog.io/@hkoo9329/%EC%9E%90%EB%B0%94-extends-implements-%EC%B0%A8%EC%9D%B4
https://commin.tistory.com/101
https://reakwon.tistory.com/27

profile
I am a Blacksmith.

0개의 댓글