본문 바로가기

java(자바)

[java(자바)] 상속 관계, 포함 관계(is-a, has-a) _디버깅의 눈물

자바에서 클래스는 상속 관계와 포함 관계를 가질 수 있습니다.

 

  1. 상속 관계 (Inheritance)

상속 관계는 부모 클래스와 자식 클래스 간의 관계입니다. 자식 클래스는 부모 클래스의 특징을 물려받아 사용할 수 있습니다. 부모 클래스는 자식 클래스에게 공통적인 특징을 제공하며, 자식 클래스는 부모 클래스의 특징을 확장하여 사용할 수 있습니다.

상속 관계는 extends 키워드를 사용하여 선언합니다. 예를 들어, 다음과 같이 부모 클래스인 Animal 클래스와 자식 클래스인 Dog 클래스를 정의할 수 있습니다.

 

 

// Animal 클래스 정의
public class Animal {
    public void eat() {
        System.out.println("Animal is eating");
    }
}

// Dog 클래스 정의 (Animal 클래스를 상속받음)
public class Dog extends Animal {
    public void bark() {
        System.out.println("Dog is barking");
    }
}

 

위 코드에서 Animal 클래스는 eat() 메서드를 가지고 있습니다. Dog 클래스는 Animal 클래스를 상속받았으며, bark() 메서드를 추가로 가지고 있습니다. Dog 클래스는 Animal 클래스의 eat() 메서드도 사용할 수 있습니다.

 

 

  1. 포함 관계 (Composition)

포함 관계는 상속 이외의 '클래스를 재사용하는 방법 중 하나'로, 한 클래스가 다른 클래스를 멤버 변수로 가지는 관계입니다. 이러한 관계를 has-a 관계라고도 합니다. 포함 관계는 객체 지향 프로그래밍에서 객체를 조립하는 데 매우 중요한 개념입니다.

포함 관계는 클래스 내부에 다른 클래스의 인스턴스 변수를 선언하여 구현합니다. 예를 들어, 다음과 같이 Car 클래스가 Engine 클래스를 멤버 변수로 가지는 경우를 생각해보겠습니다.

 

// Engine 클래스 정의
public class Engine {
    public void start() {
        System.out.println("Engine is starting");
    }
}

// Car 클래스 정의 (Engine 클래스를 포함함)
public class Car {
    private Engine engine;
    
    public Car() {
        this.engine = new Engine(); // Engine 객체 생성
    }
    
    public void startCar() {
        engine.start(); // Engine 객체의 start() 메서드 호출
    }
}

 

위 코드에서 Car 클래스는 Engine 클래스를 멤버 변수로 가지고 있습니다. Car 클래스의 생성자에서는 Engine 객체를 생성하고, startCar() 메서드에서는 Engine 객체의 start() 메서드를 호출합니다. 이렇게 함으로써 Car 클래스는 Engine 클래스의 기능을 사용할 수 있습니다.