Java

연관, 의존 관계

ryeonng 2024. 4. 24. 16:37

 

연관관계(Association)포함관계(Composition)는 객체지향 프로그래밍에서 객체 간의 관계를 나타내는 두 가지 다른 개념이다. 

그러나 이 둘은 완전히 독립적인 개념이 아니며, 포함관계는 연관관계의 특수한 형태로 볼 수 있다.

즉, 모든 포함관계는 연관관계이나, 모든 연관관계가 포함관계인 것은 아니다.

 


연관관계(Association)

연관 관계는 일반적으로 한 클래스의 객체가 다른 클래스의 객체와 상호작용을 하지만, 둘 사이의 생명주기에 대한 의존성은 갖지 않는 경우를 의미한다.
예를 들어, 한 은행(Bank)과 여러 고객(Customer) 사이의 관계가 연관 관계의 사례가 될 수 있다.
고객은 하나의 은행에 계좌를 가질 수 있고, 은행은 여러 고객을 가질 수 있지만, 고객의 생명주기는 은행에 의존하지 않는다.

 

 

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);

	}

}

 


 

의존관계(Dependency)

  • 의존관계는 한 클래스가 다른 클래스를 사용하는 관계를 나타낸다. 즉, 어떤 클래스가 다른 클래스를 참조하는 것을 말한다. 이는 한 클래스의 변경이 다른 클래스에게 영향을 줄 수 있음을 의미한다.
  • 예를 들어 자동차 클래스가 엔진 클래스에 의존할 때, 자동차 클래스는 엔진을 사용하고 있으며, 엔진 클래스의 변경이 자동차 클래스에 영향을 줄 수 있다.

 

도전문제

 

Classroom 객체와 Student 객체는 연관 관계를 형성하고 있다. 단 Classroom 안에 Student[ ] 배열을 가지고 있지만 단순히 저장하는 용도 이며 Student 필드를 가지고 있지 않다. 이는 직접 적인 포함 관계를 나타내지 않는다.

 

package basic.ch19;

public class Classroom {

	private String className;
	private Student[] students;
	private int studentCount; 
	private final int MAX_STUDEND = 30;
	
	public Classroom(String className) {
		this.className = className;
		students = new Student[MAX_STUDEND];
		this.studentCount = 0; 
	}
	
	// 학생을 추가하는 기능 만들기 
	public void addStudent(Student student) {
		if(studentCount < MAX_STUDEND) {
			students[studentCount] = student;
			studentCount++;
		} else {
			System.out.println("정원 초과");
		}
	}
	
	// 학습에 속한 모든 학생 정보를 출력하는 기능을 만드시오 
	public void showStudents() {
		for (int i = 0; i < students.length; i++) {
			
			if(students[i] != null) {
				// students[i] --> [객체주소] ---> heap 영역 객체를 참조 
				System.out.println("name  : " + students[i].getName() 
									+ " , age :  " + students[i].getAge());
			}
		}
	}
	
}

 

package basic.ch19;

public class Student {
	
	private String name; 
	private int age; 
	
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}
	
	public int getAge() {
		return age;
	}
	
}

'Java' 카테고리의 다른 글

추상 클래스(abstract class)  (0) 2024.04.25
다형성(Polymorphism)  (1) 2024.04.25
Composition(포함관계)  (0) 2024.04.24
상속(Inheritance)  (2) 2024.04.23
메서드 오버로딩  (1) 2024.04.23