본문 바로가기

UML

클래스 다이어 그램

객체지향 시스템에서도 여러 개의 클래스가 긴말한 관계를 맺어 기능을 수행한다. 

UML에서 제공하는 클래스들 사이의 관계를 간략하게 정리해 본다.

 

연관 관계(Association)

연간관계

    class Professor {
        Student student;

    }

    class Student {
        Professor professor;
    }

클래스들이 개념상 서로 연결되어있음을 나타낸다. 실선이나 화살표로 표시하며 보통은 한 클래스가 다른 클래스에서 제공하는 기능을 사용하는 상황일 때 표시한다.

단방향 연관 관계

    class Student {
        Course course;
        public void registerCourse(Course course){

        }
        public void dropCourse(Course course){

        }
    }

    class Course {

    }

연관 관계는 방향성을 가질 수 있다.  Course 연관 관계는 Student 클래스에서 Course로 향하도록 되어 있다. 

Student는 자신이 수강 하는 Course를 알지만 과목은 자신이 수강하는 학생들의 존재를 모른다는 사실을 의미 한다.

 

일반화 관계(Generalization)

객체지향 개념에서는 상속 관계라고 한다. 한 클래스가 다른 클래스를 포함 하는 상위 개념일 때 이를 IS-A관계라고 하며 UML에서는 일반화 관계로 모델링 한다.

일반화 관계

    abstract class HomeAppliance {
        private int serialNo;
        private String manufacture;
        private int year;
        abstract void turnOn();
        abstract void turnOff();
    }

    class Washer extends HomeAppliance{
        @Override
        void turnOn() {        }
        @Override
        void turnOff() {        }
    }

    class TV extends HomeAppliance{
        @Override
        void turnOn() {        }
        @Override
        void turnOff() {        }
    }

    class Refrigerator extends HomeAppliance{
        @Override
        void turnOn() {        }
        @Override
        void turnOff() {        }
    }

가전 제품과 세탁기 사이의 관계 혹은 TV, 식기세척기와 가전 제품의 관계는 모두 가전 제품과 'is a kind of 관계'다.

  • '세탁기' is a kind of '가전제품'
  • 'TV' is a kind of '가전제품'
  • '냉장고' is a kind of '가전제품'

이 때 가전 제품은 부모 클래스라 하며 세탁기, TV, 내장고를 자식 클래스라 한다.

UML에서는 추상 클래스와 메서드를 이탤릭체로 써서 구분하거나 스테레오 타입(Stereotype) ('<<', '>>' 기호안에 원하는 이름을 넣음)으로 표시한다.

HomeAppliance와, turnOn, turnOff 는 이텔릭체로써 추상 클래스 메서드로 표현하였다.

 

집합관계 (Aggregation, Composition)

클래스들 사이의 전체 또는 부분 관계를 나타낸다. 집약(Aggregation)관계와 합성(Composition) 관계가 존재한다.

집약 관계(Aggregation)

집약 관계는 한 객체가 다른 객체를 포함하는 것을 나타낸다.

'전체', '부분'과의 관계며 '전체'를 가리키는 클래스 방향에 빈 마름모로 표시한다.

집약 관계

    class Computer {
        private MainBoard mb;
        private CPU c;
        private Memory m;
        public Computer(MainBoard mb, CPU c, Memory m){
            this.mb = mb;
            this.c = c;
            this.m = m;
        }
    }

    class MainBoard{
    }

    class CPU {
    }

    class Memory {
    }

전체 객체와 부분 객체의 생명 주기가 다르다.  부분 객체를 여러 전체 객체가 공유할 수 있다.

합성 관계(Composition)

합성 관계는 전체를 가리키는 클래스 방향에 채워진 마름모로 표시되,며 부분 객체가 전체 객체에 속하는 관계다.

합성 관계

    class Computer {
        private MainBoard mb;
        private CPU c;
        private Memory m;
        public Computer(){
            this.mb = new MainBoard();
            this.c = new CPU();
            this.m = new Memory();
        }
    }

    class MainBoard{
    }

    class CPU {
    }

    class Memory {
    }

전체 객체가 없어지면 부분 객체도 없어진다.  부분 객체를 여러 전체 객체가 공유할 수 없다.

 

실체화 관계 (Realization)

책임들의 집합인 인터페이스와 이 책임들을 실제로 실현한 클래스들 사이의 관계를 나타낸다. 상속과 유사하게 빈 삼각형을 사용하여 머리에 있는 실헌 대신 점선을 사용해 표시한다.

일반적으로 한 클래스가 다른 클래스를 사용하는 경우는 다음과 같이 3가지가 있다.

  • 클래스의 속성에서 참조 할 때
  • 연산의 인자로 사용될 때
  • 메서드 내부의 지역 객체로 참조될 때

한 클래스의 객체를 다른 클래스 객체의 속성에서 참조하는 경우 참조하는 객체가 변경되지 않는 한 두 클래스의 객체들이 오랜 기간 동안 협력 관계를 통해 기능을 수행한다고 볼 수 있다. 

    class Car {
        GasPump pump;
       public void fillGas(GasPump p){
           pump = p.getGas();
       }
    }

    class GasPump{
        public GasPump getGas(){
            return new GasPump();
        }
    }

예를 들면 '자동차'를 소유한 '사람'이 자동차를 이용해 출근 한다고 할 경우 한 번 출근한 후 다음 날 출근할 때도 어제 사용한 자동차를 타고 출근할 것이다. 매번 출근할 때마다 다른 자동차의 사용하는 경우는 거의 없을 것이다. 이런 경우 사람과 자동차의 관계는 연관 관계(Association)며 '사람'의 속성으로 '차' 객체를 참조 한다.

그리고 '자동차'와 '주유기' 의 관계는 또 다르다. 자동차에 주유할 때 특정 주유소에 있는 특정 주유기만 고집해서 주유할수는 없을 것이다. 이런 경우라면 주유소를 이용할 때마다  달라지는 것을 의미하며 객체지형 프로그램에서는 사용되는 주유기를 인자나 지역 객체로 생성해 구현할 것이다.