is-a 관계와 has-a 관계는 모두 객체(클래스) 간의 관계를 정의한다.
is-a 관계
상속 관계를 표현할 때 사용
'A는 B이다' 로 해석할 수 있는 관계
has-a 관계보다 밀접하게 연관된 관계
개체 간의 일반화(Generalization) 또는 특수화(Specialization) 관계를 나타냄
예시 : 강아지는 동물이다, 학생은 인간이다 ...
// 부모 클래스 (Super Class)
class Animal {
void eat() {
System.out.println("동물이 음식을 먹습니다.");
}
}
// 자식 클래스 (Sub Class)
class Dog extends Animal { // 상속 (is-a 관계)
void bark() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat(); // 부모 클래스의 메서드 사용
myDog.bark(); // 자식 클래스의 메서드 사용
}
}
has-a 관계
포함 관계 또는 구성 관계를 표현할 때 사용
'A는 B를 가진다' 로 해석할 수 있는 관계
is-a 관계보다 덜 밀접하게 연관된 관계
일반적으로 is-a 관계보다 has-a 관계를 고려하는 것이 유연성과 유지 보수 측면에서 유리함
두 클래스가 독립적으로 존재할 때, 한 클래스 내에서 다른 클래스를 속성(변수)로 포함할 때 사용
개체 간의 객체 포함(Composition/Aggregation)을 나타냄
예시 : 자동차는 엔진을 가진다, 스마트폰은 배터리를 가진다 ...
// Engine 클래스 (독립적인 클래스)
class Engine {
void start() {
System.out.println("엔진이 시작됩니다.");
}
}
// Car 클래스는 Engine을 '가지고 있음' (Composition)
class Car {
private Engine engine; // Engine 객체를 포함 (has-a 관계)
// 생성자를 통해 Engine 객체를 주입
Car(Engine engine) {
this.engine = engine;
}
void startCar() {
System.out.println("자동차 시동을 겁니다.");
engine.start(); // 포함된 Engine 객체의 기능 사용
}
}
public class Main {
public static void main(String[] args) {
Engine myEngine = new Engine(); // Engine 객체 생성
Car myCar = new Car(myEngine); // Car 객체에 Engine 포함
myCar.startCar(); // Car의 기능 실행
}
}
'Programming > Java' 카테고리의 다른 글
[Java] 상속 (Inheritance) (1) | 2025.03.04 |
---|---|
[Java] 생성자 (Constructor) (0) | 2025.03.04 |
[Java] 클래스 변수, 인스턴스 변수, 로컬 변수, 매개 변수 (0) | 2025.02.28 |
[Java] Java란? (1) | 2025.02.28 |