충남대학교 컴퓨터공학과 김현수 교수님의 "소프트웨어 공학" 강의를 필기한 내용입니다.

다소 잘못된 내용과 구어적 표현 이 포함되어 있을 수 있습니다.

UML

  • 객체지향 소프트웨어를 모델링하기 위한 표준 그래픽 언어

종류

  • 클래스 다이어그램 : 클래스들과 그들의 관계
  • 상호작용 다이어그램 : 객체(인스턴스)들이 상호작용하는 방식에 대해 그들의 동작을 표현
  • 상태 / 활동 다이어그램 : 시스템으로 어떻게 행동하는지를 보여줌 - 객체(인스턴스)들이 상호작용할때가 아닌 내부적으로 어떻게 행동하는지를 말하는 거인듯
  • 컴포넌트 / 배치 다이어그램 : 시스템을 구성하는 컴포넌트와 그들이 (논리적으로 혹은 물리적으로)배치되는 방식

기능

  • 각각의 표기법(도형, 선 등등)마다 의미(Semantics)를 가지고 있음
  • 확장 매커니즘을 가지고 있음 - 뭐 새로운 Semantic을 정의해서 사용한다던지 이런게 가능함
  • 관련 텍스트 언어가 있음
  • 방법론이 아니고 개발을 돕는 하나의 툴이다

모델이란

  • 일단 UML등의 모델링이 필요한 이유는
  • 지금까지 한 요구사항 수집, 명세, 유스케이스 명세 등의 과정은 Real World에서의 일들을 기술하기 위한 것이었다면
  • 이제는 위에서 명세한 저러한 것을을 Computer World에서 분석하고 명세하기 위한 모델링이 시스템 모델링이고 이들중 하나가 UML인 것이다
  • 이 과정을 거치게 되면 그 다음에는 설계과정을 뒤이어 하게 되고 그 다음에는 구현을 하게 되는 것이다

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image1.png

  • 위의 그림이나 읽어봐라

클래스

  • 뭔지는 알제? 자료 타입으로 Property와 Method로 구성됨

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image2.png

  • 속성, Property 같은말이고
  • Method, Operation 같은말인거 당연히 알고있어야되고
  • 맨 위에 클래스 이름, 중간에 프로퍼티, 마지막에 메소드가 들어간다
  • 가시성(Visibility) 표현 : -는 private, + 는 public, # 는 protected이다
  • 프로퍼티는 이름: 타입으로 명시한다
  • 메소드는 이름(인자: 타입): 반환타입으로 명시한다
  • 참고로 프로퍼티와 메소드를 생략하고 클래스의 이름만 적는 것도 가능 하다

추상 클래스

  • 뭐 당연히 알겠지만
  • 추상 오퍼레이션(메소드) 는 정의만 있고 구현이 없는 것을 의미하고
  • 추상 클래스는 인스턴스를 만들지 못하는 클래스를 의미함
  • 또한 인터페이스는 추상 클래스와 비슷하게 구현된 메소드가 없고 인스턴스를 생성하지 못하는 경우를 의미한다.

연관관계

  • 클래스와 객체(인스턴스) 사이의 연관 관계
  • 실선으로 이어 둘 간의 관계가 있음을 표현하게 된다

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image3.png

  • 일단 위의 그림에는 안나와있지만 관계 이름을 지어줄 수 있다 - 선 위에다가 동사나 동사구로 지어준다
  • 그리고 다중성은 위에서 보다시피 연관되는 인스턴스의 갯수를 의미한다
  • 일반화라는 것은 클래스들간의 상속관계를 말함
  • 역할 이름은 클래스에 의해 수행되는 역할이라는데 걍 위 그림보고 감잡는게 좋다 - 걍 변수(프로퍼티)이름임
  • 방향성은 뭐 별거 없음 - 위 그림에서 보는거처럼 저런식으로 연관성의 방향을 명시하는게 가능하다 이거야
    • 방향성에서의 화살표 방향이 헷갈린다면 이렇게 생각하면 된다 - PhoneBook에서는 PhoneNumber를 참조할 수 있으니까 화살표 방향이 저래되어있는 것
    • 연관관계의 방향성은 기본적으로 양방향 관계이다. 그리고 화살표를 통해 방향을 제한해주는 셈

다중성(Multiplicity)

  • Cardinality Constraint와 비슷하다
  • 왜 클래스가 아니고 인스턴스라고 표현하는지 궁금하다면 배열에는 클래스가 아닌 객체가 들어가기 때문이다
  • 다중성은 표현하지 않으면 1로 간주된다
  • 그리고 임의의 다수를 표현할때는 * 를 이용하고
  • 일대일(One-to-One) 은 만약 A와 B가 일대일의 관계라면, A는 반드시 하나의 B와 관게를 맺어야되고 반대로 B또한 반드시 하나의 A와 관계를 맺어야 할때이다
  • 다대다(Many-to-Many) 은 만약 A와 B가 다대다의 관계라면, A는 여러개의 B와 관계를 맺을 수 있고 반대로 B도 여러개의 A와 관계를 맺을 수 있을 때이다
  • 얘는 예시로 감을 잡는게 좋음

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image4.png

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image5.png

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image6.png

  • 범위를 지정할때는 예를들어 1이상이면 1 … * 로 표현하고 3이상 5이하면 3 … 5 이런식으로 표현한다
  • 불필요한 일대일 관계를 제거하고 그 둘을 그냥 하나의 클래스로 묶는 것이 더 좋다는 점 주의할것

연관 클래스

  • 연관 클래스는 언제 사용하면 되냐면 두 클래스가 연동되었을때 의미가 있는 속성들에 대해 해당 속성을 클래스로 감싸면 된다
  • 예를들면

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image7.png

  • 학생과 수업 두개의 클래스가 있을 때 학생이 수업을 수강해야 해당 과목에 대한 학점이 나오기 때문에 이때 수강 클래스에 학점이라는 속성을 둘 수 있는 것

재귀 연관관계

  • 클래스 자신과 연관관계를 맺되 해당 관계의 선후가 있는 경우
  • 예를들면

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image8.png

  • 과목 A는 과목 B의 선행과목일때 A와 B는 모두 과목이므로 과목 클래스를 재귀 연관관계로 표현해줄 수 있는 것

인스턴스 다이어그램

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image9.png

  • 위 그림처럼 클래스만 명시하는 것이 아닌 클래스로 생성되는 인스턴스들간의 관계도 명시할 수 있다
  • 그리고 반드시 해줘야할 것이 인스턴스명:클래스명 의 형식을 지켜주는 것이다
  • 즉, : 로 클래스명과 인스턴스 명을 구분해주고 밑줄을 그어줘야 인스턴스 다이어그램으로 인식한다는 소리임

전체 / 부분 관계

  • Aggregation관계는 전체와 부분(Whole-Part)관계를 나타내는 특수한 연관관계이다

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image10.png

  • 전체에 해당하는 놈을 Aggregate 혹은 Assembly 라고 부른다
  • 뭐 그리고 당연한 내용이지만 전체를 제어하거나 소유하면 부분도 제어하거나 소유한다

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image11.png

  • 그리고 다른 관계와는 다르게 이런식으로 계층구조로 표현할 수도 있다

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image12.png

  • 그리고 Aggregation이 강한 경우에는 Composition 이라고 부른다
  • 즉, 전체가 소멸되면 부품도 소멸되게 되고
  • A가 B에 포함되면 A는 B와 무관한 C에 포함될 수는 없다 - 온전히 전체에 포함되는 경우

일반화

  • 클래스들간의 상속관계
  • 뭐 뭔지 알제? - 공통부분을 묶어 수퍼클래스로 만드는 것은 일반화, 수퍼클래스의 자식으로 서브클래스를 구체화하는 것을 구체화, 상세화, Specialization이라고 한다
  • 불필요한 상속을 피해야 한다는 점에 주의하라 - 상속을 한다는 것은 수퍼클래스와 다른점이 있다는 것인데 다른점이 없으면 굳이 할 필요가 없다는 것
  • 또한 어찌보면 당연한얘긴데 인스턴스는 클래스가 변경되어서는 안된다

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image13.png

  • 위와 같은 예시일때
  • FullTime을 뛰다가 PartTime으로 옮겨가면 클래스가 변경되는 것이므로 문제가 됨
  • 이때는 FullTime이냐 PartTime이냐를 상태로 두고 상태의 변경으로 처리하는게 맞다
  • 이렇듯 상태와 상속을 혼동하면 안된다

Object Constraint Language(OCL)

  • 이건 소프트웨어 모듈의 제약사항을 명세하기 위한 용도로 만들어진 언어이다
  • 시스템에 대한 논리적인 사실(참인 명제들)만을 나타냄
  • side-effect가 없음 - 참이나 거짓이 아닌 결과를 낼 수 없으며 데이터(상태)를 수정하지도 않음
  • 속성값이 무엇인지, 연관관계가 존재해야 하는지 등에 대해 명세할 수 있음

%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A9%E1%86%AB06%20-%20%E1%84%8F%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A2%E1%84%89%E1%85%B3%20%E1%84%86%E1%85%A9%E1%84%83%E1%85%A6%E1%86%AF%E1%84%85%E1%85%B5%E1%86%BC%20d6bec56bc0fd401486099d6bbd487f80/image14.png