개인 공부 (23.07~

클래스다이어그램을 활용한 설계

Song쏭 2023. 7. 10. 23:40

UML로 설계하는 방법 중 정말 유용한 방법이
클래스다이어그램을 그리는 것이라고 한다.
 
오늘은 클래스 하나를 가지고 필드와 메서드를 계획하는
클래스다이어그램을 만들어보았다.
 
나는 관광, 호텔, 여행쪽에 관심이 많아서 스스로 가장 그려보고 싶었던 설계이다.
그래서 제일 먼저 생각나는 관광객이라는 클래스를 그려보았다.
 
내가 추후에 이 클래스를 활용하여 객체를 만든다는 생각을 하며 만들었는데
음... 사실 수정하고 싶은 부분이 계속 생긴다ㅋㅋ
 
설계도는 프로젝트하면서 계속 고쳐나가는 것이라고!
절대 예쁜 액자에 보관하는 것이 아니라고! 배웠으니ㅎㅎ
수정하면서 나아가는 걸로 하겠다!!!!!

 

관광객을 생각하며 이것저것 넣었는데
접근제한자는 어떻게 설정하는 게 좋을지, 어떤 값을 리턴을 해야할지, 매개변수는 뭐를 넣어줘야할지 와닿지 않는다.
또한 필드와 메서드도 생각하다보면 무궁무진해서 이 클래스에 얼마만큼의 필드와 메서드를 넣을지도 고민이다!
 
클래스다이어그램에 따른 필드와 메서드 코드로 넣어보기!
(사실... 코드로 먼저짜고나서 그 바탕으로 클래스다이어그램을 만들게되었다... 이럼 안되겠지만...)

 
8/5, 8/6 업데이트
클래스 관계 표기법에 대한 공부 추가.
 
위에서 클래스 표기법에 대해서는 다뤄보았으니,
여러 클래스들 간의 클래스 관계 표기법을 알아보려고 한다.
 
다양한 표기법 중에서 아무래도 아래 종류들이 많이 쓰일 것 같다.
 
1. 집합관계
2. 의존관계
3. 연관관계
4. 실체화 관계
5. 합성 관계
 

1. 집합관계

  • 전체와 부분의 관계로, 하나의 클래스가 다른 클래스의 모임을 가지고 있는 관계이다.
  • 전체가 없어도 부분은 독립적으로 존재할 수 있다.
  • 예시: 학교와 학생의 관계
class School {
    List<Student> students; // 학생들의 집합을 가짐
}

class Student {
    //...
}

UML에서는 많이 안쓰이는건가요..?

 
 

2. 의존관계

  • 한 클래스가 다른 클래스의 기능을 일시적으로 사용하는 관계를 의미한다.
  • 의존 관계는 일반적으로 메서드 내에서 특정 작업을 수행하기 위해 다른 클래스의 객체를 사용할 때 형성된다.
  • "A 클래스가 B 클래스에 의존한다"라고 표현되며, B 클래스가 변경되면 A 클래스에도 영향을 줄 수 있다.
  • 의존 관계는 일반적으로 점선의 화살표로 표현된다.
  • 예시: 보고서 작성 클래스와 그것을 출력하는 프린터 클래스의 관계
class Report {
    //...
}

class Printer {
    void printReport(Report report) {
        // 보고서 출력 로직
    }
}

class ReportWriter {
    Printer printer;
    
    void createReport() {
        Report report = new Report();
        // 보고서 작성 로직
        printer.printReport(report); // Printer에 의존하여 보고서를 출력
    }
}

이 예시에서 ReportWriter 클래스는 Printer 클래스의 printReport 메서드를 사용하여 보고서를 출력한다. ReportWriter는 Printer에 의존하고 있으므로, Printer 클래스가 변경되면 ReportWriter에도 영향을 줄 수 있다.
의존 관계는 클래스 간의 연결을 약하게 유지하며 유연성을 높이는데 도움이 되지만, 과도한 의존 관계는 코드의 복잡성을 높일 수 있으므로 적절히 관리해야 한다.
 
 

3. 연관관계

  • 클래스들이 양방향 또는 단방향으로 서로 연관되어 있는 관계이다.
  • 일반적인 객체 참조를 통해 이루어진다.
  • 예시: 학생과 선생님 간의 관계
class Student {
    Teacher teacher; // 선생님과 연관됨
}

class Teacher {
    //...
}

 
 

4. 실체화 관계

  • 인터페이스와 그 인터페이스를 구현한 클래스 간의 관계를 나타낸다.
  • 인터페이스는 일반적으로 메서드의 시그니처만을 가지며, 구현한 클래스에서 실제 로직을 작성한다.
  • "A는 B의 계약을 실체화한다"라고 표현된다.
  • 실체화 관계는 일반적으로 점선의 화살표로 표현된다.
  • 예시: 동물의 울음 소리를 나타내는 인터페이스와 그것을 구현한 개와 고양이 클래스의 관계
interface AnimalSound {
    void makeSound(); // 동물이 어떻게 울 것인지 선언
}

class Dog implements AnimalSound {
    @Override
    public void makeSound() {
        System.out.println("Woof! Woof!"); // 개의 울음 소리를 실체화
    }
}

class Cat implements AnimalSound {
    @Override
    public void makeSound() {
        System.out.println("Meow! Meow!"); // 고양이의 울음 소리를 실체화
    }
}

이렇게 실체화 관계는 한 클래스가 인터페이스의 메서드들을 구현할 때 형성되며, 다른 클래스들에게 일관된 인터페이스를 제공하는 방법으로 사용됩니다.
 
 

5. 합성 관계

  • 전체와 부분의 강한 관계로, 전체 객체가 없어지면 부분 객체도 같이 없어진다.
  • 객체의 생명 주기가 연결되어 있다.
  • 예시: 컴퓨터와 CPU의 관계
class Computer {
    CPU cpu = new CPU(); // 컴퓨터가 없으면 CPU도 없음
}

class CPU {
    //...
}

 
 
 
* reference

클래스 다이어그램이란?

안녕하세요, 송아지할때 송아 김송아입니다. 하나의 서비스를 개발(development)하기 위한 단계 중 여러분들이 가장 중요하다고 생각하는 단계는 무엇인가요? 물론 모든 단계가 중요하지만..😇 저

songacoding.tistory.com

 
*지극히 주관적인 공부기록입니다.