๐ Java์ has-a ๊ด๊ณ๋?
"has-a" ๊ด๊ณ๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋ ์ค ํ๋๋ก,
ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ํฌํจํ๊ณ ์๋ ๊ด๊ณ๋ฅผ ๋ํ๋ ๋๋ค.
์ด๋ ์ปดํฌ์ง์ (composition)๊ณผ ์ฐ๊ด(composition and aggregation)์ด๋ผ๊ณ ๋ ๋ถ๋ฆฝ๋๋ค.
"has-a" ๊ด๊ณ๋ ํ ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ ์ ๋ฉค๋ฒ ๋ณ์๋ก ํฌํจํ๋ ๊ด๊ณ๋ฅผ ๋งํฉ๋๋ค.
์ด ๊ด๊ณ๋ ๋ ํด๋์ค ๊ฐ์ ์์กด์ฑ์ ๋ํ๋ด๋ฉฐ, ์์(inheritance)๊ณผ ๋๋น๋๋ ๊ฐ๋ ์ ๋๋ค.
์์์ด "is-a" ๊ด๊ณ(์: A๋ B์ด๋ค)๋ฅผ ๋ํ๋ธ๋ค๋ฉด, "has-a" ๊ด๊ณ๋ "A๋ B๋ฅผ ๊ฐ์ง๊ณ ์๋ค"๋ฅผ ์๋ฏธํฉ๋๋ค.์์์ ์ถํ ํฌ์คํ ์์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
๐has-a์ ํน์ง
์ปดํฌ์ง์
(Composition) |
์ปดํฌ์ง์ ์ ๊ฐํ "has-a" ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, ํฌํจ๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๊ฐ ํฌํจํ๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ์ข ์๋ฉ๋๋ค. ์ฆ, ํฌํจํ๋ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๋ฉด ํฌํจ๋ ๊ฐ์ฒด๋ ํจ๊ป ์๋ฉธ๋ฉ๋๋ค. |
์ฐ๊ด (Aggregation) |
์ฐ๊ด์ ์ฝํ "has-a" ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, ํฌํจ๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๊ฐ ํฌํจํ๋ ๊ฐ์ฒด์ ๋ ๋ฆฝ์ ์ ๋๋ค. ์ฆ, ํฌํจํ๋ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๋๋ผ๋ ํฌํจ๋ ๊ฐ์ฒด๋ ๋ณ๋๋ก ์กด์ฌํ ์ ์์ต๋๋ค. |
๐has-a ์์
์ปดํฌ์ง์ ์์ )
์๋๋ ์ปดํฌ์ง์ ์ ์ฌ์ฉํ "has-a" ๊ด๊ณ์ ์์ ์ ๋๋ค.
'Car' ํด๋์ค๋ 'Engine" ํด๋์ค๋ฅผ ํฌํจํฉ๋๋ค.
class Engine {
//Engine ํด๋์ค๋ type์ด๋ผ๋ ํ๋๋ฅผ ๊ฐ์ง.
private String type;
public Engine(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
class Car {
//Car ํด๋์ค๋ engine์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง.
private Engine engine;
//์์ฑ์์์ ๊ฐ์ฒด ์ด๊ธฐํ(์์ฑ)
public Car(String engineType) {
this.engine = new Engine(engineType);
}
//์๋์ฐจ ์๋ ์
public void start() {
System.out.println("Starting the car with " + engine.getType() + " engine.");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car("V8");
car.start(); // ์ถ๋ ฅ: Starting the car with V8 engine.
}
}
์ ์์ ์์ Car ํด๋์ค๋ Engine ๊ฐ์ฒด๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ์ด๋ "Car has an Engine"์ด๋ผ๋ "has-a" ๊ด๊ณ๋ฅผ ๋ํ๋ ๋๋ค. Car ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๋ฉด Engine ๊ฐ์ฒด๋ ํจ๊ป ์๋ฉธ๋ฉ๋๋ค.
Car๋ Engine์ด ์์ผ๋ฉด ๋ฌ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฅผ Compsition ๊ด๊ณ๋ผ ํฉ๋๋ค.
์ฐ๊ด ์์ )
์ฐ๊ด์ ์ฌ์ฉํ "has-a" ๊ด๊ณ์ ์์ ์ ๋๋ค.
Library ํด๋์ค๋ ์ฌ๋ฌ Book ๊ฐ์ฒด๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
class Book {
//์ฑ
์ ์ ๋ชฉ์ ํ๋๋ก ๊ฐ์ง๋ค.
private String title;
public Book(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
}
class Library {
//๋์๊ด์ ์ฑ
'๋ค'์ ๊ฐ์ง๋ค.
private Book[] books;
private int count;
public Library(int size) {
this.books = new Book[size];
this.count = 0;
}
//์ฑ
์ ์ถ๊ฐํ ๋, ์ฒ์ ์ ํ๋ ์ฑ
์ฅ์ ์ฌ์ด์ฆ (์์ฑ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์)
//์ ๋์ผ๋ฉด ์๋ฌ์ฒ๋ฆฌ.
public void addBook(Book book) {
if (count < books.length) {
books[count] = book;
count++;
} else {
System.out.println("Library is full, cannot add more books.");
}
}
//์ฑ
๋ค์ ๋ชจ๋ ํ์ธํ๋ ๋ก์ง
public void showBooks() {
for (int i = 0; i < count; i++) {
//์ฑ
๋ค์ ์ ๋ชฉ ์ถ๋ ฅ
System.out.println("Book: " + books[i].getTitle());
}
}
}
public class Main {
public static void main(String[] args) {
Library library = new Library(5); // ์ต๋ 5๊ถ์ ์ฑ
์ ์ ์ฅํ ์ ์๋ ๋์๊ด
//์ฑ
๋๊ถ ์์ฑ
Book book1 = new Book("Effective Java");
Book book2 = new Book("Clean Code");
library.addBook(book1);
library.addBook(book2);
//์ถ๋ ฅ
library.showBooks();
}
}
์ ์์ ์์ Library ํด๋์ค๋ ์ฌ๋ฌ Book ๊ฐ์ฒด๋ฅผ ํฌํจํ ์ ์์ผ๋ฉฐ, ์ด๋ "Library has Books"๋ผ๋ "has-a" ๊ด๊ณ๋ฅผ ๋ํ๋ ๋๋ค. Library ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๋๋ผ๋ Book ๊ฐ์ฒด๋ ๋ณ๋๋ก ์กด์ฌํ ์ ์์ต๋๋ค. ๋์๊ด์ "Effective Java"๋ผ๋ ์ฑ ์ด ์์ด๋ ๋์๊ด์ ์ด์ ๋ถ๊ฐ๋ฅํ ๊ฒ ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
" ์์ฝ "
- "has-a" ๊ด๊ณ: ํ ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ ์ ๋ฉค๋ฒ ๋ณ์๋ก ํฌํจํ๋ ๊ด๊ณ
- ์ปดํฌ์ง์ (Composition): ํฌํจ๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๊ฐ ํฌํจํ๋ ๊ฐ์ฒด์ ์ข ์๋๋ ๊ฐํ "has-a" ๊ด๊ณ.
- ์ฐ๊ด(Aggregation): ํฌํจ๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๊ฐ ํฌํจํ๋ ๊ฐ์ฒด์ ๋ ๋ฆฝ์ ์ธ ์ฝํ "has-a" ๊ด๊ณ.
- ์์ : Car์ Engine์ ๊ด๊ณ๋ ์ปดํฌ์ง์ ์, Library์ Book์ ๊ด๊ณ๋ ์ฐ๊ด์ ๋ํ๋.
has-a ๊ด๊ณ๊ฐ ์ผ์ ์ํ์์ ๋ฌด์์ด ์์์ง ์๊ฐํด ๋ณด๊ณ ,
์ง์ ์ฝ๋๋ฅผ ๊ตฌํํด ๋ณด์ธ์!
์ง๋ฌธ์ ์ธ์ ๋ ์ง ๋๊ธ์ ๋จ๊ฒจ์ฃผ์ธ์.
๐ฉต๐ฐ๐ฉต
'โJava' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java ์ดํดํ๊ธฐ] 21. Java์ ์์ (0) | 2024.05.31 |
---|---|
[Java ์ดํดํ๊ธฐ] 19. Java๋ก ๋ํ ๋ฉด์ ๊ตฌํ๊ธฐ (1) | 2024.05.27 |
[Java ์ดํดํ๊ธฐ] 18. Java์ ์ค๋ฒ๋ก๋ฉ (2) | 2024.05.27 |
[Java ์ดํดํ๊ธฐ] 17. Java์ this (1) | 2024.05.27 |
[Java ์ดํดํ๊ธฐ] 16. Java์ ์์ฑ์ (2) | 2024.05.27 |