연관 관계
- 연관된 클래스 상에 실선을 그어 표시
- 두 클래스 사이의 관계가 명확한 경우에 이름을 사용안해도 됨
- 각 클래스 객체의 역할은 클래스 바로 옆 선 가까이 기술
- 역할 이름은 연관된 클래스의 객체들이 서로 참조할 수 있는 속성의 이름으로 활용
</br>
체크 포인트
</br>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Person
{
private Phone[] phones;
public Person()
{
phones = new Phone[2];
}
public Phone[] getPhone()
{
return phones;
}
}
public class Phone
{
}
</br>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Person
{
private Phone HomePhones;
private Phone OfficePhones;
public Phone homePhone
{
get => HomePhones;
set => HomePhones = value;
}
public Phone officePhones
{
get => OfficePhones;
set => OfficePhones = value;
}
}
public class Phone
{
}
다중성
</br>
- 1명의 교수, 1명 이상의 학생.
- 1명의 학생이 2명 이상의 교수한테 상담 못받음.
양방향 연관 관계
- 두 클래스를 연결한 선에 화살표 x
- 서로의 존재를 인지
단방향 연관 관계
- 한쪽으로만 방향성이 있는 관계
- 한 쪽은 알지만 다른 쪽은 상대방의 존재를 모른다는 의미
체크 포인트
</br>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Student
{
private List<Course> courses;
public Student()
{
courses = null;
}
public void registerCourse(Course course)
{
courses.Add(course);
}
public void dropCourse(Course course)
{
courses.Remove(course);
}
}
public class Course
{
}
</br>
</br>
연관 클래스
- 연관 관계에 추가할 속성이나 행위가 있을 때 사용
</br>
Student에 저장
-> 홍길동, 신다민, etc..
Course에 저장
-> 영어, 수학, etc..
그럼 각 인원이 듣는 수업은? 홍길동에 대한 영어 성적은?
이래서 연관 클래스가 필요하다.
Transcript 객체는 Student 객체와 Course 객체를 연관시키는 객체
따라서 Student,Course 객체를 참조할 수 있는 속성을 포함해야 한다.
ex) 홍길동이 수학에서 A+을 받았다.
연관 클래스를 일반 클래스로 변환하면?
Student ㅡ Transcript ㅡ Course
- 사건 이력 표현
</br>
Student가 오늘도 빌렸고, 1년전에도 빌렸어도 표현이 가능하다.
Borrowing 객체가 2개가 된다.
재귀적 연관 관계
- 재귀적 연간 관계란?
동일한 클래스에 속한 객체들의 관계
- 역할을 클래스로 할 때 문제가 생긴다.
만약 A가 B를 관리한다고 하자.
B가 C를 관리하면, B는 사원이면서 관리자이다.
이럴때 문제가 생겨서 생겨넌 것이 재귀적 연관 관계다.
문제의 원인 : 역할로 클래스를 나눴기 때문에
해결 : 역할로 연관 관계를 보자
</br>
여기서도 문제점 !
재귀적으로 가다보면 루프가 생길 수 있다. (제약이 없기 때문에)
ex) a -> b -> c -> a
</br>
따라서 이렇게 제약을 설정해줘야 한다.
{} -> 제약 설정할 때 자연어로 수식을 달면 된다.