SW Engineering - UML

윤형·2025년 4월 19일

Sofrware Engineering

목록 보기
4/9
post-thumbnail

서론

자 이제 본격적으로 개발 설계에 대해서 알아보도록 하겠다. 보통 클래스 그림이나 UML등을 이용해서 설계를 진행하기 때문에 이번 시간에는 이러한 부분들에 대해서 다뤄보고자 한다.

UML (Unified Modeling Language)

소프트웨어 모델링에 사용되는 표준이다.
다이어그램을 표현하기 위한 기본 모델 요소를 표준적으로 정의함.

총 14개 정도의 유형이 존재한다.

UML 모델링 과정

  1. 요구를 정리하고, 유스케이스 다이어그램을 그린다.
  2. 유스 케이스로부터 클래스 후보를 추출해 클래스 다이어그램을 밑그림 한다.
  3. 유스 케이스로부터 행위 다이어그램을 만든다.
  4. 행위 다이어그램을 통해 클래스 다이어그램을 완성한다.

클래스 다이어그램

각 클래스의 간의 관계를 포함해 나타내는 것.

클래스 표시

박스로 표시하고 위에는 클래스 이름, 중간은 속성 (멤버 변수), 하단에는 메서드를 표시한다.

규칙 1 - 클래스 이름

  • 클래스의 이름은 대문자로 시작하고 굵은 글씨여야 한다.
  • 클래스 이름은 유일하게 식별되어야 한다. -> 겹치는 이름이 있으면 경로명으로 작성해도 된다.

규칙 2 - 속성

  • 형식: 가시성 변수이름 : 타입 [다중성] =디폴트값 {추가속성}

  • 가시성 = 접근 권한을 의미

    • public : +
    • private : -
    • protected : #
  • 다중성 = 객체의 수

    • k : 정확히 k개 의미
    • k..m : k개 이상 m개 이하 의미
    • * : 0개 이상
    • k..* : k개 이상
  • 추가속성
    : orderd, unique, readonly....

규칙 3 - 메서드

  • 형식: 가시성 이름(매개변수들) : 리턴타입 {추가속성}
  • 매개 변수 형식: 방향 변수이름 : 타입 =디폴트값
  • 매개변수에서 방향은 선택이다.
    • in : 입력용 변수라는 의미
    • out : 출력용 변수라는 의미(주소, 참조를 넘긴다.)
    • inout : 입출력 변수라는 의미
    • out이나 inout은 매개 변수가 포인터나 참조가 되어야 함을 의미한다.
    • ex) +SetName(inout name : string) : void
  • 추가 속성 : ordered(리턴값 정렬), unique(반환값들 중 중복 없음)등이 있다.

규칙 4 - 추상 클래스

이렇게 기울여진 글씨(이탤릭체) 혹은 abstract를 표시하는 방법으로 추상클래스 임을 나타낼 수 있다.

마찬가지로 추상 메서드는 이탈릭체로 표시하거나, 맨 뒤에 {abstract}를 붙여서 명시적으로 표시해주면 된다.

추가로, interface는 클래스 앞에 interface를 표시하는 방법으로 표현한다.

규칙 5 - static 속성

만약 모든 객체가 공유하는 static속성이 존재한다면, 밑줄을 쳐서 표현한다.


클래스 간의 관계

지금까지 클래스 박스를 어떻게 만드는지를 배워봤다. 이번에는 각 클래스마다 상속이나 관계들을 어떻게 표현하는지 알아보도록 하겠다.

이 그림을 숙지하고 하나씩 설명해보도록 하겠다.

관계 1 - 연관

객체 사이의 참조 관계가 있는 경우 사용한다.

  • 학생이 수업을 등록하는 연관관계
  • 만일 참조에 방향성이 있으면 화살표를 넣을 수 있다.
  • 학생만 수업을 참조할 경우.
  • Student의 classes 속성을 이용해 course를 참조할 경우 표시 가능.
  • 또한 다중성을 기재할 수 있다.
  • Student객체는 0개 이상의 Course를 가지고 있어야 한다.
  • Course객체는 10~30개의 Student를 가지고 있어야 한다.

관계 2 - 상속

상속 관계를 나타냄.

  • 상속관계는 이렇게 표시한다.
  • 객체지향에서 Parent 는 Children의 일반화(generalization)형태이고, Child 는 Parent의 구체화(Specialization) 형태다.

  • 다형성을 표현하기 위해서는 오버라이드를 이렇게 표현할 수 있다.
//C++로 구현해보기
class User {
  private:
    std::string id;
    std::string password;
  public:
    virtual void login() {}
};
class Customer : public User {
  public:
    void login() {}
};
class Administrator : public User {
  public:
    void login() {}
};

관계 3 - 구현

interface 를 구현할 때 사용된다.
-> 점선안에 빈 삼각형을 넣어서 사용한다.

//java로 구현
public interface CanFly {
  public void fly();
}

public class Parrot implements CanFly {
  @Override
  public void fly() { }
}

public class KakaoOAuthHandler
implements OAuthProvider, Serializable {
  @Override
  public String serialize() { }
  @Override
  public Boolean authorize(String credential) { }
}
  • 클래스 박스를 보고 코드로 옮길 줄 아는 능력은 매우 중요하기 때문에 잘 숙지하도록 하자.

관계 4 - 의존

한 클래스가 다른 클래스에 의존적인 관계일 때 사용한다.
-> 점선을 이용해 표현한다. interface랑 비슷하지만 빈 삼각형이 아니다.

관계 5 - 집합

전체와 부분의 관계를 나타낸다.

  • 전체 쪽에 빈 다이아몬드를 표시한다.
  • 화살표는 생략 가능
  • 또한 다이아몬드 색이 차있으면 합성을 의미한다.

이렇게 되어있을 경우

class Email;
class User {
  private:
    std::vector<Email *> emails;
  public:
    User(const User &user) {
      int size = user.email.size();
      emails.resize(size);
      for (int i = 0; i < size; ++i) {
        emails[i] = new Email(user.emails[i]);
      }
    }
};

이렇게 표현할 수 있다. 합성관계일 경우 깊은 복사로 구현해야 한다.


순차 다이어그램

액터, 객체, 컴포넌트들의 상호 작용을 "시간 순서"대로 표현하기 위해서 사용됨.

  • 표현되는 정보 : 상호작용 주체, 교환 메시지, 반환 값.

이렇게 사용하는 것이다. 이 부분은 다음에 정리하도록 하겠다.

profile
제가 관심있고 공부하고 싶은걸 정리하는 저만의 노트입니다.

0개의 댓글