예습

[예습] 11월 18일 예습

k-codestudy 2024. 11. 18. 17:39

1. UML 클래스 다이어그램

1.1 정의

  • 클래스 다이어그램은 UML(Unified Modeling Language)의 구조 다이어그램 중 하나로, 클래스의 내부 구성 요소와 클래스 간의 관계를 시각적으로 표현하여 시스템의 특정 모듈, 일부, 또는 전체를 구조화하는 데 사용됩니다.

주요 목적:

  • 클래스 간의 의존성 파악: 설계 초기 단계에서 클래스 간의 관계를 명확히 함.
  • 효율적 의사소통: 팀원 간 설계 내용을 효과적으로 공유할 수 있음.

활용 단계:

  • 개념: 클래스 도출과 관계 단순화가 주 목적.
  • 명세/구현: 개발 직전 설계 및 구현 후 설명 목적으로 사용.
    • 명세 단계: 다이어그램 기반으로 코드를 설계.
    • 구현 단계: 작성된 코드를 시각화해 다이어그램을 생성.

 

1.2 요소

1.2.1 클래스

클래스는 이름, 속성(변수), 메서드 순으로 작성하며 속성과 메서드는 생략이 가능하나, 이름은 필수로 입력해야 합니다.

  • 접근 제어자 표기법
    • +: public
    • -: private
    • #: protected
    • ~: default
    • {readonly}: 상수(finals)
    • 밑줄: 정적(static)
  • 배열 및 리스트의 크기 표기법
    • [*]: 크기 미지정 (ex: 리스트)
    • [0..1]: 0개 또는 1개 (ex: Optional)
    • [n]: 정적 크기 지정 (ex: 배열 n개의 요소)

속성(변수)를 보면 접근 제어자, 필드명, 타입 순으로 작성한다.

{접근제어자} {필드명}: {타입}

메소드는 접근제어자, 메소드명(파라미터 타입), 반환 타입 순으로 작성한다 .

{접근제어자} {메소드명}({파라미터타입}): {반환타입}

 

1.2.2 스테레오 타입

스테레오 타입은 추상 클래스 또는 인터페이스와 같은 요소를 표현하기 위해 사용되며, << >> 구문(길러멧)을 사용한다.
길러멧은 클래스 이름 위에 작은 글씨로 작성되며, 다음을 나타낼 때 사용된다.

  • 추상 클래스 (<<abstract>>)
  • 인터페이스 (<<interface>>)
  • 열거형 (<<enum>>)
  • 사용자 정의 확장 클래스

 

1.3 클래스 간 관계

클래스 간 관게를 정확하게 하는 것이 클래스 다이어그램을 그리는 주된 목적이다.

 

1.3.1 Association

 

  • 두 클래스 간 참조 관계를 나타낸.
  • 방향성을 포함하거나 생략할 수 있다
  • 나중에 결합하는 방식 
    • A → B: A가 B를 참조.
    • A - B: 서로 참조하거나 참조 관계가 없음을 의미.

 

1.3.2 Inheritance

 

  • 부모 클래스와 자식 클래스 간의 상속 관계를 나타낸다.
  • 일반화(Generalization)라고도 불리며, 자식 클래스는 부모의 속성과 메서드를 상속받는다.

 

1.3.3 Relization / Implementation

 

  • 인터페이스를 상속받아 실제 기능을 구현할 때 사용된다.
  • 클래스가 인터페이스의 정의를 구현(Realization)하는 관계를 나타낸다.

 

1.3.4 Dependency

 

  • 클래스 간 의존성을 나타낸다.
  • Association과 달리, 메서드의 파라미터나 반환 값에 사용되는 일시적 관계를 표현한.
    • Association: 멤버 변수로 참조.
    • Dependency: 메서드 실행 중 일시적으로 유지.

 

1.3.5 Aggregation

 

  • 약한 포함 관계를 나타낸.
  • 전체(Whole) 클래스가 삭제되어도 부분(Part) 클래스는 독립적으로 존재.
  • UML에서 빈 다이아몬드(◊)로 표시한다.
  • 수명 주기가 다르다

1.3.6 Composition

 

  • 강한 포함 관계를 나타낸다.
  • 전체 클래스가 삭제되면 부분 클래스도 함께 삭제된다.
  • UML에서 검은색 다이아몬드(◆)로 표시한다.
  • 수명 주기가 똑같다

 

2. protected


2.1 정의 

protected는 C++에서 클래스 멤버의 접근을 제어하는 접근 지정자 중 하나이다.

  • 외부에서는 접근 불가능
  • 클래스 내의 멤버 함수와 이를 상속받은 자식 클래스의 멤버 함수에서 접근 가능

 

2.2 차이점 

  • protected는 private와 유사하지만, 자식 클래스에서 접근이 가능하다는 점에서 차이가 존재하며, protected는 외부로부터 은닉성을 유지하면서도 상속 관계에서 활용성을 제공한다.

 

2.3 예시

#include <iostream>


class C_A
{
private:
    int m_a{5};         // 외부 및 자식 클래스에서 접근 불가능
protected:
    int m_b{6};         // 자식 클래스에서 접근 가능
public:
    int m_c{7};         // 외부 및 자식 클래스에서 접근 가능
};

class C_B : protected C_A
{

};


int main()
{
	C_B cB{};

    cB.m_a; // 에러: private 멤버 접근 불가
    cB.m_b; // 에러: protected 멤버는 외부에서 접근 불가
    cB.m_c; // 에러: protected 상속으로 인해 외부에서 접근 불가
}

 

2.4 설명

  • protected 상속의 영향
    C_B 클래스는 C_A를 protected로 상속을 받은상태이다.
  • private 멤버: 자식 클래스에서도 접근 불가능.
  • protected 멤버: 자식 클래스에서 접근 가능.
  • public 멤버: 자식 클래스에서 protected로 변경되어 외부 접근 불가.

따라서 main 함수에서는 C_B의 모든 멤버에 접근하려고 하면 컴파일 에러가 발생한다.

 

  • protected의 역할
    protected는 외부로부터 데이터를 은닉하면서, 상속받은 자식 클래스가 부모의 내부 데이터에 접근하거나 동작을 확장할 수 있도록 돕는 역활이다.