여러가지 관계

여러가지 관계 설명

Posted by Damin on September 4, 2019

일반화

일반화 : 한 클래스가 다른 클래스를 포함하는 ‘상위 개념’일 때 사용

일반화는 상속 관계라고 볼 수 있죠.

그림1-19</br>

보이는 것처럼 세탁기,TV,식기세척기는 가전제품안에 속한다고 표현할 수 있습니다.

가전 제품이라는 부모 클래스(슈퍼 클래스)

세탁기,TV,식기세척기 자식 클래스(서브 클래스)

서브 클래스를 슈퍼 클래스 방향으로 공백 화살표로 표현

UML에서 추상화 표현 : 이탤릭채

집합 관계

연관 관계의 special case

집약(aggregation)

  • 전체를 나타내는 객체와 부분을 나타내는 객체의 라이프 타임이 ‘독립적’

  • 부분을 나타내는 객체를 다른 객체와 공유 가능

  • 빈 마름모로 표시

  • 연관 관계보다 조금 더 강함

  • 전체가 날라가도 부분 안날라감 (공유 개념)

A <- B 상태에서, A가 망가져도 B는 멀쩡함

그림1-21</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도 망가짐

그림1-21</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가 망가지면 다 망가지게 된다.

이제 합성과 집약의 명확한 차이를 알겠죠?!

체크 포인트

동아리와 학생의 관계에서 다음 사실을 모두 클래스 다이어그램으로 표현하라.

  • 학생은 한 동아리에만 가입할 수 있다.

  • 한 동아리에는 여러 명의 학생들이 있다.

  • 동아리가 없어지면 동아리에서 활동했던 학생들의 정보도 없어진다.

38쪽CP</br>

동아리가 없어지면 동아리에서 활동했던 학생들의 정보도 없어진다.

-> 종속적(합성)을 생각하면 쉽죠잉~~?!

의존 관계

  • 한 클래스에서 다른 클래스를 사용하는 경우
  1. 클래스의 속성에서 참조

  2. 연산의 인자로 참조

  3. 메소드의 지역 개체로 참조

  • 연관 관계보다 약한 의존 관계

차에 기름 넣는 상황을 상상해보자!

차는 기름을 넣기 위해 잠시 주유소를 들린다.

주유가 끝나면 떠난다.

여기서 보면 정말 찰나의 순간만 필요하다.

이게 바로 ‘의존 관계’

** 의존 관계의 반대 = 지속적 관계 **

의존 관계 = 점선으로 표현

38쪽CP</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 표현

그림1-25</br>

연습문제

연습문제 1개만 풀어보자.

다음 설명에 맞는 클래스 다이어그램을 연관 클래스를 사용해 작성하라.

  • 사원은 여러 개의 작업을 수행한다.

  • 한 작업은 여러 명의 사원에 의해 실행될 수 있다.

  • 작업 일시와 작업 기간이 관리 되어야 한다.

문제10번</br>

‘연관 클래스’에 집중하자!!

추상화

복잡한걸 복잡한 형태로 다루면 힘들다.

복잡한걸 우리 관점상에서 필요한것만 뽑아내고

나머지는 현재로서는 고려하지 않겠다.

똑같은 대상을 바라보더라도, 추상화는 다를 수 있다.

추상화를 일종의 그룹화하는 수단으로 볼 수 있다.

C언어 = Struct

자바 or C++ = Class

캡슐화

소프트웨어 개발 = 부분 부분 기능들을 합쳐서 만들어진다.

기능들을 캡슐화를 하면 다 갖다 쓸 수 있다.

그래서 캡슐화를 한다.

나중에 개발을 할때 api만 갖다 써서 (그 용법은 알아야 함) 만든다.

하드웨어에 비해 소프트웨어는 변경하는것이 많다.

따라서 변경을 다 대비하고 만들어야 한다.

-> 의존을 덜 해야 한다. (캡슐화를 한다, 집약)

-> 그 안에 무슨 코드가 있는지 모르게 코딩하자.

높은 ‘응집도’ 낮은 ‘결합도’를 갖는 설계를 하자.

일반화(상속) = 일종의 캡슐화