💡 학습 목표
|
연관관계(Association)와 포함관계(Composition)는 객체지향 프로그래밍에서 객체 간의 관계를 나타내는 두 가지 다른 개념입니다. 그러나 이 둘은 완전히 독립적인 개념이 아니며, 포함관계는 연관관계의 특수한 형태로 볼 수 있습니다. 즉, 모든 포함관계는 연관관계입니다만, 모든 연관관계가 포함관계인 것은 아닙니다.
연관 관계(Association)는 일반적으로 한 클래스의 객체가 다른 클래스의 객체와 상호작용을 하지만, 둘 사이의 생명주기에 대한 의존성은 갖지 않는 경우를 의미합니다. 예를 들어, 한 은행(Bank)과 여러 고객(Customer) 사이의 관계가 연관 관계의 사례가 될 수 있습니다. 고객은 하나의 은행에 계좌를 가질 수 있고, 은행은 여러 고객을 가질 수 있지만, 고객의 생명주기는 은행에 의존하지 않습니다.
1. 연관관계(Association) 이란?
enum
package basic.ch19;
/**
* enum - 열거형
* : 데이터의 점주화를 만들고 싶다면 사용한다.
* : domain --> 범주화
*/
public enum ServiceType {
ACOUNT_INFO,
DEPOSIT,
WITHDRAW
}
package basic.ch19;
public class Bank {
private String name;
public Bank(String name) {
this.name = name;
}
// getter
public String getName() {
return name;
}
// 대표적인 Bank 기능 , 상호작용 --> 연관관계
public void provideService(ServiceType serviceType, Customer customer) {
switch(serviceType) {
case ACOUNT_INFO:
System.out.println(customer.getName() + " 계좌 정보 조회를 합니다.");
break;
case DEPOSIT:
System.out.println(customer.getName() + " 입금을 진행 합니다.");
break;
case WITHDRAW:
System.out.println(customer.getName() + " 출금을 진행 합니다");
default:
System.out.println("해당 서비스는 제공하지 않습니다.");
}
}
// 상호 작용
public void showAccountInfo(Customer customer) {
System.out.println("사용자 이름을 출력 합니다");
System.out.println("이름 : " + customer.getName());
}
}
package basic.ch19;
public class Customer {
private String name;
public Customer(String name) {
this.name = name;
}
public String getName() {
return name;
}
// 은행 서비스를 이용하는 메서드 - 연관관계
public void useBankService(Bank bank) {
bank.provideService(ServiceType.DEPOSIT, this);
}
}
package basic.ch19;
public class BankTest {
public static void main(String[] args) {
Bank bank0 = new Bank("우리은행");
Bank bank = new Bank("그린은행"); // 독립적인 생명 주기를 가진다.
Customer customer = new Customer("홍길동"); // 독립적인 생명 주기를 가진다.
// 연관관계라고 한다.
customer.useBankService(bank);
System.out.println("----------------------");
// enum type 연습
bank.provideService(ServiceType.ACOUNT_INFO, customer);
}
}
2. 의존관계(Dependency) 에 대해 알아 보자.
- 의존관계는 한 클래스가 다른 클래스를 사용하는 관계를 나타냅니다.즉, 어떤 클래스가 다른 클래스를 참조하는 것을 말합니다. 이는 한 클래스의 변경이 다른 클래스에 영향을 줄 수 있음을 의미합니다.
- 예를 들어, 자동차 클래스가 엔진 클래스에 의존할 때, 자동차 클래스는 엔진을 사용하고 있으며, 엔진 클래스의 변경이 자동차 클래스에 영향을 줄 수 있습니다.
💡 정리 의존관계 (Dependency):
|
도전 문제 - 학생과 학급은 어떤 관계로 바라볼 수 있을까?
Classroom 객체와 Student 객체는 연관 관계를 형성하고 있습니다. 단 Classroom 안에 Student[ ] 배열을 가지고 있지만 단순히 저장하는 용도 이며 Student 필드를 가지고 있지 않습니다. 이는 직접 적인 포홤 관계를 나타내지 않습니다.
package basic.ch19;
public class Student {
// 변수 설정
private String name;
private int age;
// 생성자 : 이름과 나이를 받는다.
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// getter
public String getName() {
return name;
}
public int getAge() {
return age;
}
} // end of class
package basic.ch19;
public class ClassRoom {
private String className;
// 선언만 함
private Student[] students;
private int studentCount;
// 상수로 30을 정함.
private final int MAX_STUDENT = 30;
// 생성자 생성
public ClassRoom(String className) {
this.className = className;
// 30개의 메모리 배열을 만들었다.
students = new Student[MAX_STUDENT];
// 카운트 값을 초기화 값을 안줘도 초기화 되긴함
this.studentCount = 0;
}
// 학생을 추가하는 기능 만들기
// 기능 이름은 동사로 시작하는게 좋다. -- 통으로 넣고 싶음 student
public void addStudent(Student student) {
// 만약 학생수가 학생 최대수 보다 작다면
if (studentCount < MAX_STUDENT) {
// 학생 배열의 학생 카운트를
students[studentCount] = student;
// 1증가 시켜라
studentCount++;
// 아니면 정원초과
} else {
System.out.println("정원 초과");
}
}
// 학급에 속한 모든 학생 정보를 출력하는 기능을 만드시오.
public void showStudent() {
// 반복한다 i가 학생수 배열 만큼 i씩 증가 시켜라
for (int i = 0; i < students.length; i++) {
// (방어적 코드를 작성하는 이유 :
// -->> 널 포인트 익셉션 떳을때 객체를 생성 했는지 주소값을 넣었는지 부터 살펴라
// 만약 i가 널이 아니라면 (방어적 코드)
if (students[i] != null) {
// students[i] --> [객체주소] --- heap 영역 객체를 참조
System.out.println("name : " + students[i].getName()
+ " , age " + students[i].getAge());
}
}
}
}
package basic.ch19;
public class ClassRoomTest {
public static void main(String[] args) {
// 메모리에 올려 실제로 쓰기 위해서 객체를 생성
ClassRoom classroomA = new ClassRoom("C4");
Student student1 = new Student("엄복동", 20);
Student student2 = new Student("길복순", 25);
classroomA.addStudent(student1);
classroomA.addStudent(student2);
// 앞에 ClassRoom의 showStudent기능을 쓸 때 방어적 코드를 작성하지 않았다면 여기서
// 널 포인트 인셉션 에러가 발생할 것이다.
classroomA.showStudent();
}
}
'Java > JAVA 2 - 객체지향 핵심' 카테고리의 다른 글
JAVA 2 - 다형성(Polymorphism)의 활용 (0) | 2024.04.24 |
---|---|
JAVA 2 - 다형성(Polymorphism) (0) | 2024.04.24 |
JAVA 2 - Composition(포함관계) (0) | 2024.04.23 |
JAVA 2 - 상속(Inheritance) (0) | 2024.04.23 |
JAVA 2 - 메서드 오버로딩 (0) | 2024.04.23 |