본문 바로가기

Java

연관 관계 ( Association )란?

연관관계 (Association) 란?

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

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

 

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) {
		// 서비스 종류
		// if, switch
		// 계좌정보 조회, 입금, 출금
		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() + "출금을 진행합니다.");
			break;
		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 bank = new Bank("그린은행"); // 독립적인 생명 주기를 가진다.
		Customer customer = new Customer("홍길동"); // 독립적인 생명 주기를 가진다.
		
		// 연관관계라고 한다.
		customer.useBankService(bank);
		System.out.println("----------------------------------");
		
		// enum type 연습
		bank.provideService(ServiceType.ACOUNT_INFO, customer);
		
	}// end of main

}// end of class

연습문제

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

}
package basic.ch19;

public class Classroom {

	private String className;
	private Student[] students;
	private int studentCount;
	private final int MAX_STUDENT = 30;

	public Classroom(String className) {
		this.className = className;
		students = new Student[MAX_STUDENT];
		this.studentCount = 0;
	}

	// 학생을 추가하는 기능 만들기
	public void addStudent(Student student) {
		// 방어적 코드
		if (studentCount < MAX_STUDENT) {
			students[studentCount] = student;
			studentCount++;
		} else {
			System.out.println("정원 초과");
		}
	}

	// 학급에 속한 모든 학생 정보를 출력하는 기능을 만드시오
	// nullpoint 
	// 1. 객체 생성이 되었나
	// 2. 참조변수에 주소값을 넣지 않았다
	public void showStudents() {
		for (int i = 0; i < students.length; i++) {
				// 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("벌",24);
		
		classroomA.addStudent(student1);
		classroomA.addStudent(student2);
		classroomA.showStudents();
		
	}// end of class
	
}// end of class

이렇게 작성하면 NullPointerException 이 뜨는데 확인해보아야 하는것

1. 객체가 생성이 되었나

2. 참조 변수에 주소값을 넣었나

showStudents 가 문제인데 객체는 생성 됨

참초 변수의 주소값을 넣었냐 라는 게 우리가 배열 안에 30명을 넣겠다고 선언했는데

학생1, 2만 만들었다 -> 그럼 인덱스 번호가 0, 1 만 있는건데 그 뒤로 객체가 없어서 뜨는거!

그래서 방어적 코드를 작성

낫 널이 아니라면~ 즉 비어있지 않다면 출력해라 -> 값이 있다면 출력해라로 작성하면 된다


NullPointerException 수정코드

package basic.ch19;

public class Classroom {

	private String className;
	private Student[] students;
	private int studentCount;
	private final int MAX_STUDENT = 30;

	public Classroom(String className) {
		this.className = className;
		students = new Student[MAX_STUDENT];
		this.studentCount = 0;
	}

	// 학생을 추가하는 기능 만들기
	public void addStudent(Student student) {
		// 방어적 코드
		if (studentCount < MAX_STUDENT) {
			students[studentCount] = student;
			studentCount++;
		} else {
			System.out.println("정원 초과");
		}
	}

	// 학급에 속한 모든 학생 정보를 출력하는 기능을 만드시오
	// nullpoint 
	// 1. 객체 생성이 되었나
	// 2. 참조변수에 주소값을 넣지 않았다
	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());
			}
		}

	}

}

 

728x90

'Java' 카테고리의 다른 글

다형성 ( Polymorphism )  (0) 2024.04.24
의존 관계 ( Dependency )  (0) 2024.04.24
Composition ( 포함 관계 )  (0) 2024.04.23
오버라이드 ( Override )  (0) 2024.04.23
상속 ( Inheritance )  (1) 2024.04.23