새발블로그

[JAVA] 상속 본문

Language/Java

[JAVA] 상속

EUG 2025. 5. 4. 20:54

1. 상속의 개념

상속은 "IS-A 관계" 또는 "Kind-Of 관계"라고도 불린다.

예를 들어, Employee 클래스는 Person 클래스를 상속받으면, Employee는 "Person"이라는 특성을 지닌 "Employee IS A Person"이 된다.

상속 예시

class Person {
    String name;
}

class Employee extends Person {  // Employee IS A Person
    String employeeId;
}

class Student extends Person {  // Student IS A Person
    String studentId;
    String major;
}

 

2. 상속의 특징

  1. 자식 클래스는 부모 클래스의 모든 멤버 변수와 메서드를 상속받음
    • 자식 클래스는 부모 클래스의 public 또는 protected 접근 제어자를 가진 멤버에 접근할 수 있다. private 멤버는 상속되지만 직접적으로 접근할 수는 없다.
  2. 업캐스팅 (Upcasting)
    • 자식 객체를 부모 타입으로 변환하는 것을 업캐스팅이라고 한다. 이는 자식 클래스의 인스턴스를 부모 클래스 타입으로 다룰 때 사용된다.
    class Parent { }
    class Child extends Parent { }
    
    Parent p = new Child();  // Upcasting
    
  3. 다운캐스팅 (Downcasting)
    • 부모 객체를 자식 타입으로 강제 형변환하는 것을 다운캐스팅이라고 한다. 다만, 다운캐스팅은 타입 오류를 방지하기 위해 주의해야 하며, 항상 instanceof 연산자로 타입을 확인한 후에 해야 안전하다.
    Parent p = new Child();
    Child c = (Child) p;  // Downcasting
    

3. 상속과 super 키워드

  • super 키워드는 부모 클래스의 생성자나 메서드에 접근할 때 사용된다. 자식 클래스에서 부모 클래스의 생성자를 호출하거나, 부모 클래스의 메서드를 오버라이딩했을 때 부모 클래스의 메서드를 호출하는 데 사용된다.
class Parent {
    Parent() {
        System.out.println("Parent constructor");
    }

    void display() {
        System.out.println("Parent display");
    }
}

class Child extends Parent {
    Child() {
        super();  // 부모 클래스의 생성자 호출
        System.out.println("Child constructor");
    }

    void display() {
        super.display();  // 부모 클래스의 메서드 호출
        System.out.println("Child display");
    }
}

public class Test {
    public static void main(String[] args) {
        Child child = new Child();
        child.display();
    }
}

 

4. 상속과 다형성 (Polymorphism)

상속은 다형성(Polymorphism)과 밀접한 관계가 있다. 다형성은 하나의 메서드가 여러 방식으로 동작할 수 있게 해주는 특성이다. 이를 위해 메서드 오버로딩(Overloading)메서드 오버라이딩(Overriding)을 활용할 수 있다.

 

1. 메서드 오버라이딩 (Method Overriding)

  • 부모 클래스의 메서드를 자식 클래스에서 재정의하는 방법.
  • 오버라이딩된 메서드는 자식 클래스의 객체를 통해 호출된다.
class Parent {
    void display() {
        System.out.println("Parent display");
    }
}

class Child extends Parent {
    @Override
    void display() {
        System.out.println("Child display");
    }
}

public class Test {
    public static void main(String[] args) {
        Parent p = new Child();
        p.display();  // "Child display" 출력
    }
}

 

 

2. 업캐스팅과 다형성

  • 업캐스팅을 통해 부모 클래스 타입의 변수로 자식 클래스의 객체를 참조할 수 있고, 이때 호출되는 메서드는 실제 객체의 클래스에 따라 결정된다. 
class Parent {
    void display() {
        System.out.println("Parent display");
    }
}

class Child extends Parent {
    @Override
    void display() {
        System.out.println("Child display");
    }
}

public class Test {
    public static void main(String[] args) {
        Parent p = new Child();
        p.display();  // "Child display" 출력
    }
}

 

 

5. 상속 vs 컴포지션

상속은 "IS-A" 관계를 표현하며, 자식 클래스가 부모 클래스의 특성을 물려받는 방식이다.

자식 클래스가 부모 클래스의 구현을 그대로 물려받는 방식이라 코드 간 결합도가 높아지며, 코드 수정 시 문제가 발생할 수 있다.

반면, 컴포지션(Composition)"HAS-A" 관계를 표현하며, 클래스가 다른 객체를 포함하여 기능을 확장하는 방식이다. 컴포지션은 유연성과 확장성을 제공하지만, 구조적으로 복잡할 수 있다.

상속 예시

class Animal {
    void eat() {
        System.out.println("Eating...");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("Barking...");
    }
}

Dog dog = new Dog();
dog.eat();  // Animal 기능 사용
dog.bark(); // Dog 고유 기능

"Dog is an Animal" 이 성립

컴포지션 예시

class Engine {
    void start() {
        System.out.println("Engine starts...");
    }
}

class Car {
    private Engine engine = new Engine();

    void drive() {
        engine.start();
        System.out.println("Car is moving...");
    }
}

Car car = new Car();
car.drive(); // Engine의 기능을 포함하여 사용

"Car has an Engine" 이 성립

6. 상속의 장단점

장점:

  • 코드 재사용성: 부모 클래스에서 정의한 메서드나 변수를 자식 클래스가 그대로 사용할 수 있어 코드의 중복을 줄일 수 있다.
  • 계층 구조화: 클래스 간 계층을 구성하여 코드 구조를 더 명확하게 만들 수 있다.

단점:

  • 강한 결합: 자식 클래스가 부모 클래스에 의존하므로, 부모 클래스의 변경이 자식 클래스에 영향을 미칠 수 있다.
  • 다중 상속 문제: 자바는 다중 상속을 허용하지 않지만, 복잡한 상속 구조에서는 문제를 일으킬 수 있다.

'Language > Java' 카테고리의 다른 글

[JAVA] 멀티스레드  (1) 2025.05.04
[JAVA] SOLID 원칙  (0) 2025.05.04
[JAVA] 클래스  (0) 2025.05.04
[JAVA] 변수 위치 및 메모리 구조  (0) 2025.05.04
[JAVA] JVM  (0) 2025.05.04