Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- for문
- 접근제어지시자
- 연관관계
- Java
- 인텔리제이 기초 설정
- 시스템 환경 변수 편집
- Java데이터 타입
- 컴파일
- 메서드
- 형 변환
- java변수
- function
- JAVA객체지향
- continue문
- multi-threading
- 상수
- 자바 멀티스레딩
- While
- 생성자
- OPP개념
- 포함관계
- 메서드 오버로딩
- 집합관계
- Thread
- this예약어
- IntelliJ IDEA
- 반복문
- break문
- JAVA기초
- 인텔리제이 한글 깨짐 해결법
Archives
- Today
- Total
최원종의 개발 블로그
포함관계와 집합관계 본문
한눈에 정리
객체 관계는 크게 연관 관계라는 큰 울타리 안에 집합과 포함이 특수한 형태로 존재하는 구조.
연관관계(association):"우리는 서로 알고 지내는 사이야."(가장 넓은 개념)
집합 관계(Aggregation):"우리는 필요해서 모인 동아리 같은 사이야"(느슨한 전체 -부분)
포함 관계(Composition):"우리는 태어날 때 부터 죽을 때까지 함께하는 운명 공동체야"(강한 전체-부분)
포함관계는 연관관계의 특수한 형태이다
연관관계 (Association) : 객체들이 서로 알고 있는 모든 관계를 통칭하는 가장 넓은 개념
포함관계 (Composition) : 연관 관계 중에서도 "전체가 사라지면 부분도 사라지는" 가장 강력한 결합 관계
포함관계의 개념
객체 간의 관계를 상속으로 표현하면 논리적으로 어긋나는 관계가 있다
예시로 자동차와 엔진은 상속으로 표현하면 논리적으로 어긋나기에 포함 관계로 설계해야 한다.
(참고 : 상황에 따라 연관관계로도 설계가 가능하다)
핵심 특징
- 강한 소유권:포함하는 객체(Car)가 포함된 객체(Engine)의 생성과 소멸을 직접 관리
- 생명주기 공유: 포함하는 객체가 가비지 컬렉터(GC)에 의해 힙(Heap) 메모리에서 제고되면, 내부의 포함된 객체도 함께 소멸.
포함관계 코드
-Engine
package com.tenco.composition;
public class Engine {
String name = "V8";
void start() {
System.out.println("엔진이 가동됩니다");
}
void stop(){
System.out.println("엔진이 정지합니다");
}
}
-Car
package com.tenco.composition;
public class Car {
private String name;
private Engine engine;
public Car(String name) {
this.name = name;
//핵심! Composition 의 핵심 : 외부에서 받지 않고 내부에서 직접 생성합니다.
this.engine = new Engine();
}
public void startCar() {
engine.start();
System.out.println(name + "가 출발합니다");
}
}
-CarMain
package com.tenco.composition;
public class CarMain {
public static void main(String[] args) {
Car car = new Car("벤츠");
car.startCar();
//참조 변수 관리하는 주소값이 없다
//GC(가비지 컬렉터) 본인 스케줄에 맞춰서 메모리 해제함
car = null;
}//end of main
}//end of class
-컴퓨터와 CPU(포함관계)
package com.tenco.composition;
public class CPU {
void process(){
System.out.println("데이터를 연산 처리 합니다");
}
}
class Computer{
private CPU cpu;
public Computer(){
//포함관계 - 생성자에서 직접 생성하여 생명 주기를 함께함
this.cpu = new CPU();
}
void powerOn(){
cpu.process();
System.out.println("컴퓨터 시스템이 부팅되었습니다");
}
}
-집과 방(포함관계)
package com.tenco.composition;
import java.util.Random;
class Room {
//거실, 침실
private String type;
public Room(String type) {
this.type = type;
}
public void use() {
System.out.println(type + " 공간을 사용 중");
}
}
public class House {
private String address;
//포함관계 : House 내부적으로 Room 객체들을 소유합니다
private Room livingRoom;
private Room bedRoom;
public House(String address) {
this.address = address;
//Composition의 핵심 : 외부에서 받지 않고 생성자에서 직접 생성합니다
//집이 지어질 때 (객체 생성), 방들도 함께 만들어집니다
this.livingRoom = new Room("거실");
this.bedRoom = new Room("침실");
}
public static void main(String[] args) {
House house1 = new House("부산시 진구");
}
}
집합관계(Aggregation) 설계
외부에서 이미 만들어진 객체를 받아와서 단순히 모아두는(Collection) 형태.
ex) 도서관이 없어져도 책은 다른 곳으로 옮겨질 수 있는 느슨한 결합형태.
-코드
package com.tenco.composition;
class Book {
private String title;
public Book(String title) {
this.title = title;
}
public void display() {
System.out.println("책 제목 : " + title);
}
}
public class Library {
private Book[] books;
private int index = 0;
public Library(int size) {
this.books = new Book[size]; // 배열 공간 확보
}
//집합 관계 핵심: 외부에서 생성된 객체의 주소값을 모아서관리함
public void addBook(Book book) {
if (index < books.length) {
books[index] = book;
index++;
} else {
System.out.println("더 이상 책을 넣을 공간이 없습니다");
}
}
public void showBooks() {
//index <- 0, 1, 2
//books.length --> 무조건 배열에 크기만큼 반복
for (int i = 0; i < index; i++) {
if (books[i] != null) {
books[i].display();
}
}
}
//테스트 코드 작성 해보기
public static void main(String[] args) {
//1. 책 객체를 외부에서 생성(독립적 존재)
Book b1 = new Book("자바의 정석");
//2. 도서관 생성 및 책 추가
Library library = new Library(5);
library.addBook(b1);
System.out.println("--- 도서관 폐쇄 ---");
library = null;
//3. 집합 관계 점증 : 도서관은 사라졌지만 b1은 여전히 접근 가능함
//이유는? b1이 가리키는 객체는 힙(heap) 영역에 따로 살아있기 때문이다
if (b1 != null) {
System.out.println("살아있는지 확인");
b1.display();
}
}
}
'Java > Java 객체지향' 카테고리의 다른 글
| 추상 클래스(abstract class) (0) | 2026.03.06 |
|---|---|
| 다형성(Polymorphism) (0) | 2026.03.05 |
| 연관관계(Association) (0) | 2026.03.04 |
| 상속과 접근제어 지시자 (0) | 2026.03.04 |
| 상속(Inheritance) (0) | 2026.03.04 |
