본문 바로가기
Java

Association(연관관계)

by 개발자공부 2024. 4. 25.

연관관계(Association)

  연관관계는 일반적으로 한 클래스의 객체가 다른 클래스의 객체와 상호작용을 하지만 둘 사이의 생명주기에 대한 의존성은 갖지 않는 경우를 의미한다.

 

  예를 들어, 한 은행(Bank)과 여러 고객(Customer) 사이의 관계가 연관관계의 사례가 될 수 있다. 고객은 한 은행에 계좌를 가질 수 있고, 은행은 여러 고객을 가질 수 있지만 고객의 생명주기(Life Cycle)는 은행에 의존하지 않는다.

ex) 은행과 고객, 스포츠와 운동선수 ....

 

  연관관계와 포함관계는 객체지향 프로그래밍(OOP)에서 객체 간의 관계를 나타내는 두 가지 다른 개념이다. 그러나 이 둘은 완전히 독립적인 개념이 아니며, 포함관계는 연관관계의 특수한 형태로 볼 수 있다. 즉 모든 포함관계는 연관관계지만 모든 연관관계가 포함관계인 것은 아니다.

public class BankTest {

	public static void main(String[] args) {

		Bank bank0 = new Bank("우리은행"); //독립적인 생명주기를 가진다.
		Bank bank = new Bank("그린은행"); //독립적인 생명주기를 가진다.
		Customer customer = new Customer("홍길동"); //독립적인 생명 주기를 가진다.
		
		//연관관계라고 한다.
		customer.useBankService(bank);
		//enum type 연습
		bank.provideService(ServiceType.ACCOUNT_INFO, customer);
	}

}
public class Bank {

	// 필드(멤버 변수 = 클래스 내부 변수)
	private String name;
    
	// 파라미터(매개변수 = 외부 입력 값)가 있는 사용자 정의 생성자
	public Bank(String name) {
		this.name = name;
	}

	// name getter
	public String getName() {
		return name;
	}

	// 대표적인 Bank 기능, 상호작용 --> 연관관계를 구성하고 있는 구조.
	public void provideService(ServiceType serviceType, Customer customer) {
		// 서비스 종류
		// if, switch --> switch가 if보다 동작 속도는 조금 더 빠르다.
        	// if는 하나하나 대입해서 계산하는 반면 switch는 case에 따라 바로 찾아가기 때문.
		// 계좌정보 조회, 입금, 출금

		switch (serviceType) {
		case ACCOUNT_INFO:
			System.out.println(customer.getName() + "계좌 정보 조회를 합니다.");
			break;
		case DEPOSIT:
			System.out.println(customer.getName() + "입금을 진행합니다.");
			break;
		case WITHDRAW:
			System.out.println(customer.getName() + "출금을 진행합니다.");
			break;
		default:
			System.out.println("해당 서비스는 제공하지 않습니다.");
		}

	}

	// 상호작용
	public void showAccountInfo(Customer customer) {
		System.out.println("사용자 이름을 출력합니다.");
		System.out.println("이름 : " + customer.getName());
	}

}
/**
 * enum - 열거형
 * : 데이터의 범주화를 만들고 싶다면 사용한다.
 * : domain --> 범주화
 */
public enum ServiceType {
	ACCOUNT_INFO,
	DEPOSIT,
	WITHDRAW
}
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);
	}
	
}