순간을 기록으로

1.객체지향 모델링 본문

Computer Science/Operating System

1.객체지향 모델링

luminous13 2021. 11. 8. 21:48

 

1.1What is Model?

 

객체지향 모델링 용어가 어렵다. 모델링이 무엇인지부터 알아보자.

 

패션쇼를 상상해보자. 모델들은 관중 앞으로 나와 새로운 시즌 옷을 입고 워킹한다. 여기서 모델의 역할은 새로운 옷을 관중에게 보여주는 역할을 한다.

 

소프트웨어 개발에서의 모델도 이와 같다. 우리 앞으로 개발할 시스템을 추상적으로 생각하는게 구체적으로 명시화 해준다.

 

그렇다면 모델링은 어떻게 하는 것일까? 결론부터 말하자면 추상화를 바탕으로 모델링을 한다. 추상화란 관련있는 특징을 남기고 관련없는 특징은 제거하는 것이다.

 

예를들면 학사지원 시스템을 개발한다고 하자. 관련있는 개체인 학생을 추상화 한다고 할 때. 학생의 어떤 특징을 추상화 해야할까? 머리카락의 갯수, 학생의 전공. 당연히 후자다. 이처럼 관련있는 특성을 남기는게 추상화이다.

 

1.2 UML(United Modeling Language)

통합된 모델링 언어. 언어란 사람들 간의 서로 약속한 것이다. 즉 시스템 개발 과정에서 원활하게 소통할 수 있도록 모델링을 표현하는 언어를 표준화한 언어를 UML이라고 한다. UML은 다양한 관점의 다이어그램(선, 도형 등)으로 표현 할 수 있다. 클래스 다이어그램, 배치 다이어그램 등등이 있는데 이렇게 많은 종류의 다이어그램이 있는건 시스템을 보는 관점이 그만큼 다양하다는 말과 같다. 여기서는 가장 많이 사용되는 클래스 다이어그램을 알아보겠다.

 

1.3 클래스 다이어그램

클래스 다이어그램은 1.클래스와 2.클래스간의 관계를 2가지로 다이어그램으로 표현해 시스템을 모델링한다. 즉 클래스와 클래스 관계만으로 시스템을 표현할 수 있다!!

 

1.3.1 클래스

클래스란 동일한 속성과 행동을 같는 객체들의 집합이다.  예를들어 A 대학교에 다니는 김민혁, 곽민철, 서수현은 공통적으로 학번이 있고 대학교 수강신청을 할 수 잇으므로 '학생'이라는 클래스에 포함된다. 

 

클래스를 UML로 작성하는 방법

 

 

 

클래스는 사각형으로 표현한다. 첫번째 맨 위 작은 사각형은 클래스명이다. 두 번째 작은 사각형은 접근 제어자와 멤버변수를 작성한다. 세 번째 마지막 사각형에는 멤버함수를 적어준다.

 

표기 방법
속성(멤버변수, 필드) [접근제어자]멤버변수이름 : 타입
연산(멤버함수) [+|-|#|~]이름(인자1:타입1, ..., 인자n:타입n): 반환 타입

1.3.2 두 클래스간의 관계

 

UML으로 두 클래스 사이의 다양한 관계를 표현할 수 있습니다.

 

관계 설명
연관 관계(association) 두 클래스가 관련이 있음. 실선, 화살표로 표시. 보통은 한 클래스가 다른 클래스의 기능을 사용하는 상황
일반화 관계(generalization) 객체 지향에서는 상속관계라고 부른다. 속이 빈 화살표로 표시 한 클래스가 다른 클래스를 포함하는 IS-A관계. 
집합 관계(Composite, aggregation) 전체-부분 관계. 집약관계(aggregation)과 합성관계(composition)으로 나뉜다.
의존 관계(dependency) 연관 관계와 같이 한 클래스가 다른 클래스에서 제공하는 기능을 사용할 때 나타나는 관계. 차이점은 두 클래스의 관계가 메소드를 사용하는 동안과 같은 짧은 시간에만 유지된다. 점선 화살표로 표시.
실체화 관계(realization) 인터페이스와 구현체 관계. 상속과 공통적으로 빈 삼각형이나 몸체는 점선이다.

 

 

1.연관관계

  • 두 클래스가 관련이 있으면 연관 관계라고 하고 실선이나 화살표로 표시한다.
  • 클래스의 객체는 어떤 역할을 수행한다.
  • 연관 관계의 역할 이름은 실제로 구현할 때 서로 참조 할 수 있도록 멤버변수명이 된다.

 

두 클래스는 '상담한다'라는 연관관계를 가진다. 그리고 Proessor의 객체는 조언자 역할을 Student의 객체는 학생역할을 한다.

위 클래스에서 알 수 있는 것은.다음과 같다

  • Professor 클래스와 Student 클래스는 '상담한다'라는 연관 관계를 가진다.
  • Professor의 객체는 조언자 역할을 Student 객체는 학생 역할을 한다.
  • 화살표가 없는걸로 보아 양방향 관계이다.
  • 숫자가 없는걸로보아 일대일 관계이다.
public class Professor {
    private Student student;

    public void setStudent(Student student) {
        this.student = student;
    }

    public void advise() {
        student.advise("상담 내용은 여기에...");
    }
}

class Student {
    private Professor advisor;

    public void setAdvisor(Professor advisor) {
        this.advisor = advisor;
    }

    public void advise(String msg) {
        System.out.println(msg);
    }
}

 

화살표 유무(방향성 유무)
실선(화살표X) 양방향 연관관계, 두 클래스 객체는 서로 존재를 인식
화살표O 단방향 연관관계, 가리킴을 당하는 클래스는 상대 클래스를 모른다.
선에 숫자 유무
숫자X 일대일 관계
숫자O 다중성
다중성(multiplicity) 의미: 연관되어있는 객체의 수
1 하나
* 이상을 의미함 (단독으로 쓰이면 0이상)
0..* 0 이상
1..* 1 이상
0..1 0 또는 1
2..5 2 또는 3 또는 4 또는 5
1, 2, 6 1 도는 2 또는 6
1, 3..5 1 또는 3 또는 4 또는 5

클래스 다이어그램 보고 코드로 구현 연습하기

 

public class Person {
    private Phone[] phones;

    public Person() {
        phones = new Phone[2];
    }

    public Phone getPhone(int i) {
        if(i == 0 || i == 1)
            return phones[i];   // i == 0이면 집 전화, i == 1이면 사무실 전화

        return null;
    }
}

class Phone {

}

public class Person {
    private Phone homePhone;
    private Phone officePhone;

    public Person() {
        homePhone = new Phone();
        officePhone = new Phone();
    }
    
    public void setHomePhone(Phone phone) {
        homePhone = phone;
    }

    public void setOfficePhone(Phone phone) {
        officePhone = phone;
    }
}

class Phone {

}

다대다 연관 관계은 자연스럽게 양방향 연관 관계가 된다. 그리고 양방향 연관 관계는 구현하기 어렵다. 따라서 보통 다대다 연관관계는 단방향 연관관계로 바뀌고 구현한다. 여기서 연관 클래스라는 용어가 등장한다.

 

연관 클래스는 연관 관계에 추가할 속성이나 행위가 있을 때 사용한다. 표현 방법은 연관 관계 선 중앙에서 연관 클래스까지 점선으로 연결한다.

 

연관 클래스 Transcript

연관 클래스인 Transcript는 Student 객체와 Course 객체를 연관시키는 객체이다. 따라서 두 객체를 참조할 수 있는 속성을 포함한다. 또한 성적과 과목 개설년도도 Student와 Course 클래스에 속하지 않으므로 이것 또한 연관 클래스의 속성이다. 

 

결국 위의 다대다 관계는 아래의 일대다 관계로 변환된다.

 

 

 

 


2. 일반화 관계

 

일반화 관계란 한 클래스가 다른 클래스를 포함하는 상위 개념일 때 두 클래스의 관계를 말한다. 객체지향 관점에서 상속이라고 말한다. IS-A(is a kind of)관계라고도 말한다.

 

 

예를들어 세탁기, 청소기, TV는 모두 가전제품의 한 종류이다. 

  • 세탁기 is a kind of '가전제품'
  • 청소기 is a kind of '가전제품'
  • TV is a kind of '가전제품'

모두 맞는 말이다. 이때 가전제품을 부모클래스(슈퍼클래스)라고 하며 세탁기, 청소기, TV를 자식클래스(서브 클래스)라고한다. 빈삼각형을 부모클래스를 향하게 함으로써 일반화 관계를 표현할 수 있다.

 

일반적으로 부모클래스는 공통 속성이나 행위를 제공한다. 예를들어 가전제품은 모두 turnOn, turnOff 기능을 제공한다. 하지만 구체적으로 청소기, 세탁기, TV의 turnOn, turnOff 기능 구현이 다르기 때문에 주의해야한다. 따라서 보통 부모클래스는 추상클래스로 둔다. 추상클래스란 추상 메서드를 하나 이상 가지는 클래스이다. UML에서 추상 클래스는 이텔릭체로 표현하거나 '<<' '>>' 기호 안에 이름을 넣어 표현한다.

 


3. 집합 관계

두 클래스가 전체와 부분의 관계를 가진다. 코드로 보면 전체에 해당하는 클래스는 부분 클래스를 속성을 가진다.집합관계는 1.집약관계(aggregation)과 2.합성관계(composition)으로 나뉜다.

 

 

집약관계

집약관계는 전체 객체와 부분 객체가 독립적인 관계를 말한다. 독립적이라서 전체 객체가 사라진다고 해서 부분 객체가 사라지지 않는다. 표현은 빈 마름모로 표현한다.

 

합성관계

합성 관계는 부분 객체가 전체 객체에 속하는 관계이다. 따라서 전체 객체가 사라지면 부분 객체도 사라진다. 표현은 꽉찬 마름모가 전체 클래스를 가리킨다.

 


집약 관계를 코드로 보자

 

public class Computer {
    private MainBoard mb;
    private CPU c;
    private Memory m;
    private PowerSupply ps;
    // 집약관계: 부분 객체를 매개변수로 받는다. 
    public Computer(MainBoard mb, CPU c, Memory m, PowerSupply ps) {
        this.mb = mb;
        this.c = c;
        this.m = m;
        this.ps = ps;
    }
}

집약 관계는 부분 객체를 생성자 매개변수로 받는다. 그렇기에 전체 객체와 부분 객체의 소멸 시기가 다르다.

 

합성 관계

public class Computer {
    private MainBoard mb;
    private CPU c;
    private Memory m;
    private PowerSupply ps;
    // 합성관계: 생성자에서 부분 객체를 직접 생성한다.
    public Computer() {
        this.mb = new MainBoard();
        this.c = new CPU();
        this.m = new Memory();
        this.ps = new PowerSupply();
    }
}

4.의존관계

다음과 같은 상황일 때 두 클래스는 의존 관계에 있다고 말한다. 연관 관계와 차이를 보자면, 연관 관계는 오랜 시간동안 같이할 객체와의 관계이며 의존 관계는 짧은 시간 동안 이용하는 관계이다. 점선을 이용해 표현한다.

 

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

5.실체화 관계

인터페이스와 구현체의 관계를 말한다. 일반화 관계는 'Is a kind of'라면 실체화 관계는 'can do this'관계다. 빈삼각형을 인터페이스를 향해 놓고 점선으로 몸체를 그린다.

 

Comments