Programming/Java

[Java] 상속

Smile :DK 2024. 5. 1. 19:17

상속(Inheritance)이란 ?

기존의 클래스기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다.

이때, 기존에 정의되어 있던 클래스부모 클래스 혹은 상위, 기초 클래스라고도 하며

상속을 통해 새롭게 작성되는 클래스자식 클래스 혹은 하위, 파생 클래스라고도 한다.

 

자바의 상속 방법

자바에서의 상속은 extends라는 키워드를 통해 사용할 수 있다.

부모 클래스를 정의하고 상속 받을 자식 클래스 뒤에 extends 키워드와 함께 부모 클래스를 적어주면 된다.

// 부모 클래스
class Parent { }


// 자식클래스
class Child extends Parent ()

 

상속의 장단점

장점

  1. 기존에 작성된 클래스를 재활용할 수 있다.
  2. 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면, 자식 클래스에서는 해당 멤버를 작성하지 않아도 된다.
  3. 클래스 간의 계층적 관계를 구성함으로써 상속을 통한 다형성을 구현할 수 있다.

 

단점

  1. 여러 계층을 가진 상속 구조는 복잡성을 증가시키고 코드의 가독성을 떨어트린다.
  2. 클래스간 결합도가 증가하여 부모 클래스의 변경이 자식 클래스에 영향을 미칠 수 있다.

 

Java의 상속 방식

자바에서의 클래스 간 상속은 여러 개의 부모를 상속하는 다중 상속 방식을 제외한 모든 상속을 허용하며 주로 다단계 상속, 계층적 상속 두 가지 방식을 띈다. 

 

다단계 상속

부모 클래스를 통해 자식, 손자까지 내려가는 상속 방식

 

// 부모 클래스
class Animal {
    void eat() {
        System.out.println("동물이 먹는다");
    }
}

// Animal 클래스를 상속하는 자식 클래스
class Mammal extends Animal {
    void run() {
        System.out.println("포유류가 달린다");
    }
}

// Mammal 클래스를 상속하는 자식 클래스
class Dog extends Mammal {
    void bark() {
        System.out.println("개가 짖는다");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.eat(); // Animal 클래스의 메서드 호출
        myDog.run(); // Mammal 클래스의 메서드 호출
        myDog.bark(); // Dog 클래스의 메서드 호출
    }
}

계층적 상속

하나의 부모가 여러 개의 자식을 가지는 상속 방식

// 부모 클래스
class Animal {
    void eat() {
        System.out.println("동물이 먹는다");
    }
}

// Animal 클래스를 상속하는 자식 클래스 1
class Mammal extends Animal {
    void run() {
        System.out.println("포유류가 달린다");
    }
}

// Animal 클래스를 상속하는 자식 클래스 2
class Bird extends Animal {
    void fly() {
        System.out.println("조류가 난다");
    }
}

public class Main {
    public static void main(String[] args) {
        Mammal myMammal = new Mammal();
        myMammal.eat(); // Animal 클래스의 메서드 호출
        myMammal.run(); // Mammal 클래스의 메서드 호출

        Bird myBird = new Bird();
        myBird.eat(); // Animal 클래스의 메서드 호출
        myBird.fly(); // Bird 클래스의 메서드 호출
    }
}

 

다중 상속이란?

클래스가 동시에 하나 이상의 클래스를 상속받는 것을 의미한다. C++,  Python 등 많은 프로그래밍 언어들이 다중 상속을 지원하지만 Java는 다중 상속을 지원하지 않는다.

더보기

다중 상속을 지원하는 다른 프로그래밍 언어들은 동일한 메서드를 상속받는 경우 우선순위를 정하는 규칙이 있다.

 

자바에서 다중 상속을 지원하지 않는 이유

가정) 상속받은 여러 개의 부모 클래스들에서 동일한 명칭의 필드나 메소드가 있다면 ?

  • 어떤 부모 클래스의 필드와 메소드를 상속받아야 하는가?
  • 어떤 부모 클래스에 어떻게 접근해야 하는 가?

위와 같은 모호함이 발생하므로 자바는 이러한 불명확한 부분을 애초에 제거한 언어이다.

 

 

Super 키워드

자식 클래스에서 부모 클래스를 가리킬 때 사용하는 키워드로 주로 부모 클래스의 필드에 접근하거나 메소드를 호출할 때 사용한다.

 

 

부모 클래스에서 상속되지 않는 것

  1. 부모 클래스의 private 접근 제한을 갖는 필드나 메소드는 자식이 물려받을 수 없다.
  2. 부모와 자식 클래스가 서로 다른 패키지에 있다면, 부모 클래스의 default 접근 제한을 갖는 필드나 메소드는 자식이 물려받을 수 없다.

상속을 하더라도 자식 클래스가 부모의 모든 것들을 물려받는 것은 아니다. 필드나 메소드의 접근제어자가 public, protected일 때만 상속 가능하다.

 

접근제어자

접근제어자 같은 클래스의 멤버 같은 패키지의 멤버 자식 클래스의 멤버 그 외의 영역
public o o o o
protected o o o x
default o o x x
private o x x x