본문 바로가기
  • Let's study
알고리즘/Java

[Java] 구성

by 코딩고수이고파 2026. 7. 15.

구성(Composition)

구성(Composition)은 객체가 다른 객체를 가지고 있으면서 필요한 기능을 협력하여 수행하는 객체지향 설계 방식이다.

즉, 어떤 객체가 직접 기능을 구현하지 못하더라도 다른 객체에게 일을 맡겨 기능을 수행할 수 있다.

예를 들어 홍길순은 자바 개발을 할 수 없지만, 홍길동 객체를 멤버 변수로 가져와 홍길동에게 자바 개발을 요청하여 기능을 수행할 수 있다.

class 홍길동 {
    void 자바개발() {
        System.out.println("자바 25 개발을 합니다.");
    }

    void C언어개발() {
        System.out.println("C언어 개발을 합니다.");
    }
}

class 홍길순 {
    홍길동 홍길동연락처 = new 홍길동();

    void 자바개발() {
        홍길동연락처.자바개발();
    }

    void 파이썬개발() {
        System.out.println("파이썬 개발을 합니다.");
    }
}
 

위 코드에서 홍길순은 홍길동 객체를 가지고 있으며, 자바개발()이 호출되면 직접 구현하는 대신 홍길동 객체의 자바개발()을 호출한다.

이처럼 객체 간의 협력을 통해 기능을 수행하는 방식을 구성(Composition)이라고 한다.

상속보다 구성을 선호하는 이유

상속은 공통 기능을 재사용하는 좋은 방법이지만, 부모 클래스와 자식 클래스가 강하게 연결되는 단점이 있다.

반면 구성은 필요한 객체를 멤버 변수로 사용하여 기능을 위임하기 때문에 더 유연한 설계가 가능하다.

구성의 장점

  • 객체 간 협력을 통해 기능을 수행할 수 있다.
  • 클래스 간의 결합도가 낮아져 변경에 유연하다.
  • 캡슐화를 유지하기 쉽다.
  • 실행 중에도 다른 객체로 교체하여 동작을 변경할 수 있다.
  • 다중 상속에서 발생할 수 있는 문제를 피할 수 있다.

객체의 형변환(Upcasting)

객체의 형변환은 상속 관계에서만 가능하다.

자식 객체를 부모 타입으로 변환하는 것을 업캐스팅(Upcasting)이라고 하며, 이는 자동으로 이루어지고 안전한 형변환이다.

무기 weapon = new 칼();
 

위 코드에서 실제 객체는 칼이지만, 참조 변수의 타입은 부모 클래스인 무기이다.

이처럼 하위 타입(자식) → 상위 타입(부모) 으로의 형변환은 자동으로 이루어진다.

부모 타입으로 자식 객체 참조하기

하나의 부모 타입 변수로 여러 종류의 자식 객체를 참조할 수 있다.

무기 weapon = new 칼();
weapon = new 활();
 

weapon의 타입은 항상 무기이지만, 실제 가리키는 객체는 칼이 될 수도 있고 활이 될 수도 있다.

오버라이딩

부모 클래스의 메서드를 자식 클래스에서 오버라이딩하면, 부모 타입으로 참조하더라도 실제 객체의 메서드가 실행된다.

public class Main {
    public static void main(String[] args) {

        무기 weapon = new 칼();
        weapon.공격(); // 칼로 공격합니다.

        weapon = new 활();
        weapon.공격(); // 활로 공격합니다.
    }
}

class 무기 {
    void 공격() {
        System.out.println("무기로 공격합니다.");
    }
}

class 칼 extends 무기 {
    void 공격() {
        System.out.println("칼로 공격합니다.");
    }
}

class 활 extends 무기 {
    void 공격() {
        System.out.println("활로 공격합니다.");
    }
}

부모 타입 변수는 여러 자식 객체를 가리킬 수 있으므로 공통 인터페이스(리모컨) 역할을 한다.

무기 weapon = new 칼();
weapon.공격();

weapon = new 활();
weapon.공격();
 

같은 공격() 메서드를 호출했지만, 실제 객체가 무엇인지에 따라 실행되는 메서드가 달라진다.

즉, 부모 타입 하나로 다양한 자식 객체를 제어할 수 있다.

'알고리즘 > Java' 카테고리의 다른 글

[Java] 캡슐화(Encapsulation)  (0) 2026.07.15
[Java] 추상 클래스 / 추상 메서드  (0) 2026.07.15
[Java] 상속  (0) 2026.07.14
[Java] static 변수 / 메서드  (0) 2026.07.14
[Java] 리스트(List) / 맵(Map)  (0) 2026.07.14

댓글