반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

UML Class Diagram 이란? 본문

오뚝이 개발자

UML Class Diagram 이란?

rriver2 2022. 11. 23. 15:37
반응형

UML (Unified Modeling Language) 통합 모델링 언어라는 뜻으로, 객체 지향 소프트웨어 엔지니어링 분야의 표준화된 범용 모델링 언어를 말한다.

 

 어쩌다 공부를 하게 되었는가.. 

프로젝트를 진행하는 팀원들과 내가 지금 작업하게 될 issue에 대해 설명을 할 때 자세히 설명하기로 해서,

이렇게 설명을 하면서, 아래와 같이 그림을 그려서 설명을 했었다. 하지만, 이렇게 하는 경우, 내가 전달하고 싶었던 내용을 설명하기 위해서 설명이 더 많이 필요했고, ArtworkRepository가 protocol이었는지, 구현체였는지.. 등등 헷갈리는 부분이 생겼던 거 같다. (해당 깃헙 PR 링크)

 

 

근데 우리팀 슈퍼 짱짱 팀원들을 보면 이렇게 UML을 사용해서 해당 객체들의 관계에 대해 명확하게 작성해주었다.

 

그래서 나도 UML을 공부해서 명확하게 내가 작성하려고 하는 코드의 구조를 표현하고 싶었다.

사실 이렇게 다이어그램을 그리고 싶은 나의 needs가 팀원들에게 더 잘 전달하기 위한 바람도 있었지만, code를 짜기 전 issue를 팀원들과 공유할 때 발생하는 문제들을 미리 발견했기 때문에 코드를 다시 작성하는 이슈들을 미리 방지할 수 있었던 점이 더 컸던 것 같다. 그리고 열심히 하는 팀원들을 만났을 때 다 같이 열심히 할 수 있는 기회가 있는 것도 좋았다. 마지막으로는, 이렇게 다이어그램을 그리면서 코드를 어떻게 짜면 좋을 지 더 많이 고뇌하게 되는 것 같아서 굉장히 만족스러웠다.

 

 

서론은 여기까지만 하고, UML의 Class Diagram에 대해서 알아보자.

UML Diagram의 종류는 7가지 정도 있는데 그 중에 나는 Class 다이어그램에 대해 알아봤다.

 UML의 Class Diagram 

Class Diagram이란 통합 모델링 언어(UML)에서 시스템의 클래스, 클래스의 속성, 동작 방식, 객체 간 관계를 표시함으로써 시스템의 구조를 기술하는 정적 구조 다이어그램의 일종이다. (출처)

 

화살표의 방향

A > B        or        A ▷ B

A가 B를 바라본다.

A가 변경되면 B는 아무 영향이 없지만

B가 변경되면 B를 바라보고있는 A는 영향을 받는다.

 

앞서 봤던 이미지를 확인하면, 해당 말을 쉽게 이해할 수 있다. (점선은 신경쓰지 말고, 화살표의 방향만 집중을 해보자.)

PlansRoomRepository는 protocol이고, FirebasePlansRoomRepository는 구체 클래스이다.

따라서 FirebasePlansRoomRepository에서 PlansRoomRepository을 따르는 함수 내부 구현이 수정되어도 PlansRoomRepository에는 영향이 가지 않는다. 하지만 반대로 PlansRoomRepository가 변경되면 FirebasePlansRoomRepository는 수정되어야만 한다.

실선과 점선

실선이 점선보다 더 연관성이 크다

 

 클래스 간 관계의 종류 

Generalization (일반화)

A(자식)가 B(부모)를 상속을 한 관계를 가르킨다.

B 클래스가 A 클래스를 포함하는 상위 개념일 때 이를 일반화 관계라고 한다.

// B 클래스가 A 클래스를 상속하는 관계
class B {
  
}

class A: B {
  
}

Realization (실체화)

A가 B(interface)를 구현하였다. (A implements B)

객체지향 개념에서 (인터페이스) 구현을 나타내는 관계이다.

A 클래스가 B 인터페이스를 구현할 경우 이를 실체화 관계라고 한다.

// A 클래스가 B 프로토콜을 구현하는 관계
protocol B {
  
}

class A: B {
  
}

Dependendy (의존)

A의 메서드에 매개변수로 B가 있거나 A의 메서드에서 B의 메서드를 실행한다.

A 클래스가 B 클래스를 참조하는 관계이다.

A 클래스의 내부 프로퍼티에 저장하지 않고 사용하는 관계를 의존 관계라고 한다.

// A 클래스가 B 클래스를 의존하는 관계
class B {
    func bfunc() {
      
    }
}

class A {
    func createB() -> B {
        B()
    }
  
    func useSchedule(b: B) {
        b.bfunc()
    }
}

Association (연관)

실선의 화살표로 나타내며 연관과 차이는 화살표의 유무로 참조하는쪽과 참조되는쪽으로 구분된다.

집합 관계 안에 아래의 집합 연관 관계, 합성 연관 관계가 포함되어 있다.

집합 관계는 클래스들 사이의 전체 또는 부분 같은 관계를 나타낸다.

A의 멤버로 B가 있다.

B 객체의 참조를 가지는 인스턴스 변수를 가지고 있을 때 두 클래스는 연관 관계라고 하다. 

// A 클래스가 B 클래스를 참조하는 연관 관계
class A {
    let b: B
}

class B {
    
}

Aggregation (집합연관)

클래스 사이에서 전체 또는 부분 같은 관계를 나타낸다.

한 클래스가 다른 클래스를 내부 프로퍼티로 가지고 있지만 라이프 타임이 독립적인 관계를 집합 관계이다.

// A 클래스와 B 클래스의 직얍 관계
class B {
  
}

class A {
    let b: B
		// 외부에서 b 받아오기 때문에, A 클래스가 deinit이 되어도 B deinit 되지 않는다.
    init(b: B) {
        self.b = b
    }
}

 

Composition (합성연관)

클래스 사이에서 전체 또는 부분 같은 관계를 나타낸다.

한 클래스가 다른 클래스를 직접 생성하고 내부 프로퍼티에 할당하여 가지고 있어 라이프 타임이 종속적인 관계를 합성 관계라고 한다. 

// A 클래스와 B 클래스가 합성 관계
class B {
  
}

class A {
		// A 클래스가 deinit이 되면 B도 deinit 됩니다.
    let b: B = B()
}

 

참고 문헌

https://wikidocs.net/16073

https://m.blog.naver.com/icbanq/221781238065

https://zdodev.github.io/uml/swift/UML-Class-Diagram/

반응형
Comments