
자 이제 본격적으로 개발 설계에 대해서 알아보도록 하겠다. 보통 클래스 그림이나 UML등을 이용해서 설계를 진행하기 때문에 이번 시간에는 이러한 부분들에 대해서 다뤄보고자 한다.
소프트웨어 모델링에 사용되는 표준이다.
다이어그램을 표현하기 위한 기본 모델 요소를 표준적으로 정의함.
총 14개 정도의 유형이 존재한다.

각 클래스의 간의 관계를 포함해 나타내는 것.
박스로 표시하고 위에는 클래스 이름, 중간은 속성 (멤버 변수), 하단에는 메서드를 표시한다.
형식: 가시성 변수이름 : 타입 [다중성] =디폴트값 {추가속성}
가시성 = 접근 권한을 의미
다중성 = 객체의 수
추가속성
: orderd, unique, readonly....

이렇게 기울여진 글씨(이탤릭체) 혹은 abstract를 표시하는 방법으로 추상클래스 임을 나타낼 수 있다.
마찬가지로 추상 메서드는 이탈릭체로 표시하거나, 맨 뒤에 {abstract}를 붙여서 명시적으로 표시해주면 된다.
추가로, interface는 클래스 앞에 interface를 표시하는 방법으로 표현한다.
만약 모든 객체가 공유하는 static속성이 존재한다면, 밑줄을 쳐서 표현한다.
지금까지 클래스 박스를 어떻게 만드는지를 배워봤다. 이번에는 각 클래스마다 상속이나 관계들을 어떻게 표현하는지 알아보도록 하겠다.

이 그림을 숙지하고 하나씩 설명해보도록 하겠다.
객체 사이의 참조 관계가 있는 경우 사용한다.
상속 관계를 나타냄.

//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() {}
};
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) { }
}
한 클래스가 다른 클래스에 의존적인 관계일 때 사용한다.
-> 점선을 이용해 표현한다. interface랑 비슷하지만 빈 삼각형이 아니다.
전체와 부분의 관계를 나타낸다.
이렇게 되어있을 경우
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]);
}
}
};
이렇게 표현할 수 있다. 합성관계일 경우 깊은 복사로 구현해야 한다.
액터, 객체, 컴포넌트들의 상호 작용을 "시간 순서"대로 표현하기 위해서 사용됨.


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