예습
[예습] 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는 외부로부터 데이터를 은닉하면서, 상속받은 자식 클래스가 부모의 내부 데이터에 접근하거나 동작을 확장할 수 있도록 돕는 역활이다.