일반화
일반화 : 한 클래스가 다른 클래스를 포함하는 ‘상위 개념’일 때 사용
일반화는 상속 관계라고 볼 수 있죠.
</br>
보이는 것처럼 세탁기,TV,식기세척기는 가전제품안에 속한다고 표현할 수 있습니다.
가전 제품이라는 부모 클래스(슈퍼 클래스)
세탁기,TV,식기세척기 자식 클래스(서브 클래스)
서브 클래스를 슈퍼 클래스 방향으로 공백 화살표로 표현
UML에서 추상화 표현 : 이탤릭채
집합 관계
연관 관계의 special case
집약(aggregation)
-
전체를 나타내는 객체와 부분을 나타내는 객체의 라이프 타임이 ‘독립적’
-
부분을 나타내는 객체를 다른 객체와 공유 가능
-
빈 마름모로 표시
-
연관 관계보다 조금 더 강함
-
전체가 날라가도 부분 안날라감 (공유 개념)
A <- B 상태에서, A가 망가져도 B는 멀쩡함
</br>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Computer
{
private MainBoard mb;
private CPU c;
private Memory m;
private PowerSupply ps;
public Computer(MainBoard mb, CPU c,Memory m, PowerSupply ps)
{
this.mb = mb;
this.c = c;
this.m = m;
this.ps = ps;
}
}
이런식으로 생성자에서 파라미터로 받게 되면, Computer Class가 망가져도 나머지는 살아있게 됩니다.
합성(composition)
-
전체를 나타내는 객체에 부분을 나타내는 개체의 라이프 타임이 ‘종속적’
-
채워진 마름모로 표시
-
집약보다 더 강함
-
전체 객체가 사라지면 부분 객체도 사라짐
A <- B 상태에서, A가 망가지면 B도 망가짐
</br>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Computer
{
private MainBoard mb;
private CPU c;
private Memory m;
private PowerSupply ps;
public Computer()
{
this.mb = new MainBoard();
this.c = new CPU();
this.m = new Memory();
this.ps = new PowerSupply();
}
}
이런식으로 생성자에서 새로 다 만들어주면, Computer Class가 망가지면 다 망가지게 된다.
이제 합성과 집약의 명확한 차이를 알겠죠?!
체크 포인트
동아리와 학생의 관계에서 다음 사실을 모두 클래스 다이어그램으로 표현하라.
-
학생은 한 동아리에만 가입할 수 있다.
-
한 동아리에는 여러 명의 학생들이 있다.
-
동아리가 없어지면 동아리에서 활동했던 학생들의 정보도 없어진다.
</br>
동아리가 없어지면 동아리에서 활동했던 학생들의 정보도 없어진다.
-> 종속적(합성)을 생각하면 쉽죠잉~~?!
의존 관계
- 한 클래스에서 다른 클래스를 사용하는 경우
-
클래스의 속성에서 참조
-
연산의 인자로 참조
-
메소드의 지역 개체로 참조
- 연관 관계보다 약한 의존 관계
차에 기름 넣는 상황을 상상해보자!
차는 기름을 넣기 위해 잠시 주유소를 들린다.
주유가 끝나면 떠난다.
여기서 보면 정말 찰나의 순간만 필요하다.
이게 바로 ‘의존 관계’
** 의존 관계의 반대 = 지속적 관계 **
의존 관계 = 점선으로 표현
</br>
Person은 Car = 연관 관계
Car는 GasPump = 의존 관계.
코드 짜볼까요?!
1
2
3
4
5
6
public class Car{
public void fillGas(GasPump p) {
p.getGas(amount);
}
}
여기서 보면, 지역변수 p는 fillGas 메서드가 끝나면 바로 없어집니다.
이게 바로 의존 관계
인터페이스와 실체화 관계
- 인터페이스란 책임이다.
리모콘 인터페이스가 있다고 하자.
리모콘의 책임은 가전 기기를 켜거나 끄거나 볼륨을 높이거나 낮춘다.
- 어떤 공통되는 능력이 있는 것들을 대표하는 관점
여기저 잠깐!!!! “다 상속으로 표현하면 되지 왜 인터페이스가 있어?”
상속은 제한적이다. Interface를 사용하면 말도 안되는것들도 묶을수가 있다.
예를 들자면 Computer, Cat, Cow 이 셋을 보자.
뭐로 묶을지 감이 안온다.
하지만 Interface로 말도 안되게 ‘C로 시작하는 글자’ 로 묶을 수 있다.
묶을때는 항상 그들의 공통적인 것들로!!!
-
상속이랑 비슷하지만, 점선이다.
-
«interface» 로 interface 표현
</br>
연습문제
연습문제 1개만 풀어보자.
다음 설명에 맞는 클래스 다이어그램을 연관 클래스를 사용해 작성하라.
-
사원은 여러 개의 작업을 수행한다.
-
한 작업은 여러 명의 사원에 의해 실행될 수 있다.
-
작업 일시와 작업 기간이 관리 되어야 한다.
</br>
‘연관 클래스’에 집중하자!!
추상화
복잡한걸 복잡한 형태로 다루면 힘들다.
복잡한걸 우리 관점상에서 필요한것만 뽑아내고
나머지는 현재로서는 고려하지 않겠다.
똑같은 대상을 바라보더라도, 추상화는 다를 수 있다.
추상화를 일종의 그룹화하는 수단으로 볼 수 있다.
C언어 = Struct
자바 or C++ = Class
캡슐화
소프트웨어 개발 = 부분 부분 기능들을 합쳐서 만들어진다.
기능들을 캡슐화를 하면 다 갖다 쓸 수 있다.
그래서 캡슐화를 한다.
나중에 개발을 할때 api만 갖다 써서 (그 용법은 알아야 함) 만든다.
하드웨어에 비해 소프트웨어는 변경하는것이 많다.
따라서 변경을 다 대비하고 만들어야 한다.
-> 의존을 덜 해야 한다. (캡슐화를 한다, 집약)
-> 그 안에 무슨 코드가 있는지 모르게 코딩하자.
높은 ‘응집도’ 낮은 ‘결합도’를 갖는 설계를 하자.
일반화(상속) = 일종의 캡슐화