[ 헷갈려서 적어놓는 ] UML 다이어그램

soohee·2022년 4월 2일
0

📚 클래스간의 관계

클래스의 관계는 7가지 정도가 존재한다.

📕 Generalization ( 일반화 )

슈퍼(부모)클래스와 서브(자식)클래스간의 상속관계를 나타낸다.
부모클래스는 자식클래스를 일반화한 방식이고, 자식클래스는 부모클래스를 구체화한 방식이라고 생각하면 된다.
상속은 슈퍼클래스의 필드 및 메서드를 사용해 구체화하고, 필요할 때 메서드를 오버라이딩해서 재정의 한다.

📗 Realization ( 실체화 )

실체화는 인터페이스의 명세/정의만 있는 메서드를 오버라이딩해서 실제 기능을 구현하는 것이다.
한마디로, 인터페이스에 구현없이 적혀만 있는 메서드를 (JAVA일 경우) Implements를 써서 인터페이스를 상속해온다음, 구현하는것이다.

실체화를 표기하는 방법은 두 가지 있다고 한다. (👀 원으로 표기하는 것은 처음 알았다.)

📓 Dependency ( 의존 )

의존은 어떤 클래스가 다른 클래스를 참조하는 것을 말한다.
참조 형태는, 객체생성/객체 사용/메서드 호출/객체 리턴/매개변수로 해당 객체를 받는 것 등 다양하다.
객체 참조를 계속 유지하지는 않는다.

화살표 방향은, 얘를 참조했다!! 이런 느낌으로 받아들이면 쉽다.

📙 Association ( 연관 ) , Directed Association ( 직접 연관 ) 📌

연관 때문에 헷갈려서 이글을 작성했다고 해도 과언이 아닐 정도로 헷갈렸던 이 녀석!!!!
연관은 한 클래스가 다른 클래스에서 제공하는 기능을 사용하는 상황일 때 사용된다고 적혀있다.

연관과 의존의 설명을 읽어보면, 너무 비슷한 느낌을 받을 수 있다.

그러나 극명한 차이가 있다. ( 객체가 유지되느나 사라지느냐 차이 )

관계차이점
의존참조하는 객체나 클래스가 사용 후 사라짐 ( 지역변수에 객체가 보관되어 메서드 종료시 사라진다 )
연관참조하는 객체나 클래스가 사용 후에도 계속 유지됨 (전역변수에 객체가 보관되어 클래스 생명 주기까지 유지된다.)


그럼 이제 의존과 연관의 차이를 알아봤으니, 연관의 종류에 대해서도 알아보자.
연관은 그냥 연관, 직접 연관 두가지가 있다. ( 복합연관도 있는데 이는 나중에 살펴보자 )

왼쪽은 연관, 오른쪽은 직접연관을 UML로 그린 것이다.

  • 연관은 양방향(실선)의 경우 두 클래스의 객체들이 서로를 인지한다. 상담의사와 환자를 예로 들 수 있다.

  • 직접연관은 방향이 있는 연관이다. 단방향(화살표)을 가리키며, 한 쪽은 알지만 다른 쪽은 상대방의 존재를 모른다.

    Student는 Grade 클래스의 grade라는 변수를 List형식으로 가져와서 사용한다. 따라서, Multiplicity가 *가 되는것이다.
    그에 비해, Grade는 Subject의 객체를 사용했기 때문에, 1개만 가져와서 객체화 했기 때문에 Multiplicity가 1이 되는것이다.

📘 Aggregation ( 집합 )

정말 헷갈리는 관계 2번째, 집합과 직접연관...
실제로 코드상에서 차이를 구분하기 힘들어서 요즘은 가급적 사용하지 않는 방향으로 되어가고 있다고 한다.
몸통 ◇-> 부분 형식으로 이어져 있으며, 몸통이 죽어도 부분은 살아남는 관계이다.
(예시 코드도 너무 똑같음)

📒 Composition ( 합성 )


합성은 표시는 집합과 비슷하지만, 차이점이 있다.
몸통 ◆-> 부분 으로 표기하며, 몸통 인스턴스가 부분의 수명을 책임진다.
수명을 책임진다는 얘기는 몸통 인스턴스가 복사되면, 부분 인스턴스도 복사되고, 소멸되면 같이 소멸한다는 뜻이다.

User을 clone해서 만든 객체 clonedUser는 부분인스턴스에 해당되는 address를 같이 공유한다.
이를 얕은 복사라고 한다.
그러나, 이는 부분 인스턴스도 복사된다는 조건을 충족시키기 못했다.

깊은 복사라고 하며, user 객체를 복사한 cloneUser가 생겨날때, user 객체의 부분 인스턴스인 address 또한 clonedAddress로 복사된다.

profile
🐻‍❄️

0개의 댓글