클래스 디자이너 는 프로젝트의 코드 요소에 대한 시각적 표현을 제공하는 클래스 다이어그램 이라는 시각적 디자인 화면을 표시합니다. 클래스 다이어그램을 사용하여 프로젝트의 클래스 및 기타 형식을 디자인하고 시각화할 수 있습니다.
클래스 디자이너 는 다음 C++ 코드 요소를 지원합니다.
클래스(여러 상속 관계를 가질 수 있다는 점을 제외하고 관리되는 클래스 셰이프와 유사)
익명 클래스(익명 형식에 대해 클래스 뷰의 생성된 이름을 표시)
템플릿 클래스
구조체
Enum
매크로(사후 처리된 매크로 보기 표시)
Typedef (타입 정의)
비고
이는 모델링 프로젝트에서 만들 수 있는 UML 클래스 다이어그램과 다릅니다. 자세한 내용은 UML 클래스 다이어그램: 참조를 참조하세요.
클래스 디자이너의 C++ 클래스
클래스 디자이너 는 C++ 클래스를 지원하고 C++ 클래스가 여러 상속 관계를 가질 수 있다는 점을 제외하고 Visual Basic 및 C# 클래스 셰이프와 동일한 방식으로 네이티브 C++ 클래스를 시각화합니다. 클래스 셰이프를 확장하여 클래스에 더 많은 필드와 메서드를 표시하거나 축소하여 공간을 절약할 수 있습니다.
비고
클래스 디자이너 는 공용 구조체를 지원하지 않습니다(할당된 메모리가 공용 구조체의 가장 큰 데이터 멤버에 필요한 양인 특수 클래스 형식).
단순 상속
둘 이상의 클래스를 클래스 다이어그램에 끌어다 놓으면, 클래스들 사이에 상속 관계가 있는 경우 화살표로 연결됩니다. 화살표는 기본 클래스의 방향을 가리킵니다. 예를 들어 다음 클래스가 클래스 다이어그램에 표시되면 화살표가 B에서 A로 연결합니다.
class A {};
class B : A {};
클래스 B만 클래스 다이어그램으로 끌어온 다음 B에 대한 클래스 셰이프를 마우스 오른쪽 단추로 클릭한 다음 기본 클래스 표시를 클릭할 수도 있습니다. 기본 클래스 A가 표시됩니다.
여러 상속
클래스 디자이너 는 다중 클래스 상속 관계의 시각화를 지원합니다. 파생 클래스에 둘 이상의 기본 클래스의 특성이 있는 경우 여러 상속이 사용됩니다. 다음은 여러 상속의 예입니다.
class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};
둘 이상의 클래스를 클래스 다이어그램으로 끌어다 놓으면 클래스에 다중 클래스 상속 관계가 있으면 화살표가 해당 클래스를 연결합니다. 화살표는 기본 클래스의 방향을 가리킵니다.
클래스 셰이프를 마우스 오른쪽 단추로 클릭한 다음 기본 클래스 표시 를 클릭하면 선택한 클래스의 기본 클래스가 표시됩니다.
비고
파생 클래스 표시 명령은 C++ 코드에 대해 지원되지 않습니다. 클래스 뷰로 이동하여 형식 노드를 확장하고 파생 형식 하위 폴더를 확장한 다음 해당 형식을 클래스 다이어그램으로 끌어 파생 클래스를 표시할 수 있습니다.
다중 클래스 상속에 대한 자세한 내용은 다중 상속 및 다중 기본 클래스를 참조하세요.
추상 클래스
클래스 디자이너 는 추상 클래스("추상 기본 클래스"라고도 함)를 지원합니다. 인스턴스화하지 않지만 다른 클래스를 파생시킬 수 있는 클래스입니다. 이 문서의 앞부분에 있는 "다중 상속"의 예제를 사용하여 다음과 같이 클래스를 Bird 개별 개체로 인스턴스화할 수 있습니다.
int main()
{
Bird sparrow;
Bird crow;
Bird eagle;
}
그러나 클래스를 개별 개체로 인스턴스화 Swimmer 하지 않을 수도 있습니다. 다른 유형의 동물 클래스(Penguin, Whale, Fish 등)을 파생시키기 위한 용도로만 사용할 수 있습니다. 이 경우 클래스를 Swimmer 추상 기본 클래스로 선언합니다.
클래스를 추상으로 선언하려면 키워드를 abstract 사용할 수 있습니다. 추상 클래스로 표시되거나 추상 클래스에 포함된 멤버는 가상이며 추상 클래스에서 파생된 클래스에 의해 구현되어야 합니다.
class Swimmer abstract
{
virtual void swim();
void dive();
};
하나 이상의 순수 가상 함수를 포함하여 클래스를 추상으로 선언할 수도 있습니다.
class Swimmer
{
virtual void swim() = 0;
void dive();
};
클래스 다이어그램에 이러한 선언을 표시하면 클래스 이름
추상 기본 클래스에서 파생된 클래스는 기본 클래스의 각 순수 가상 함수를 재정의해야 합니다. 그렇지 않으면 파생 클래스를 인스턴스화할 수 없습니다. 예를 들어, Swimmer 클래스에서 Fish 클래스를 파생할 경우, swim 메서드를 Fish 재정의해야 합니다.
class Fish : public Swimmer
{
void swim(int speed);
};
int main()
{
Fish guppy;
}
클래스 다이어그램에 이 코드를 표시하면 클래스 디자이너 에서 FishSwimmer상속 선을 그립니다.
익명 클래스
클래스 디자이너 는 익명 클래스를 지원합니다. 익명 클래스 형식 은 식별자 없이 선언된 클래스입니다. 생성자 또는 소멸자를 가질 수 없고, 함수에 인수로 전달될 수 없으며, 함수의 반환 값으로 반환될 수 없습니다. 다음 예제와 같이 익명 클래스를 사용하여 클래스 이름을 typedef 이름으로 바꿀 수 있습니다.
typedef struct
{
unsigned x;
unsigned y;
} POINT;
구조체는 익명일 수도 있습니다. 클래스 디자이너 는 익명 클래스 및 구조체가 해당 형식을 표시하는 것과 동일하게 표시됩니다. 익명 클래스 및 구조를 선언하고 표시할 수 있지만 클래스 디자이너 는 지정한 태그 이름을 사용하지 않습니다. 클래스 뷰에서 생성하는 이름을 사용합니다. 클래스 또는 구조체는 클래스 뷰 및 클래스 디자이너 에서 __unnamed 요소로 나타납니다.
익명 클래스에 대한 자세한 내용은 익명 클래스 형식을 참조하세요.
템플릿 클래스
클래스 디자이너 는 템플릿 클래스의 시각화를 지원합니다. 중첩된 선언이 지원됩니다. 다음 표에서는 몇 가지 일반적인 선언을 보여 줍니다.
| Code 요소 | 클래스 디자이너 보기 |
|---|---|
template <class T>class A {}; |
A<T>템플릿 클래스 |
template <class T, class U>class A {}; |
A<T, U>템플릿 클래스 |
template <class T, int i>class A {}; |
A<T, i>템플릿 클래스 |
template <class T, template <class K> class U>class A {}; |
A<T, U>템플릿 클래스 |
다음 표에서는 부분 특수화의 몇 가지 예를 보여 줍니다.
| Code 요소 | 클래스 디자이너 뷰 |
|---|---|
template<class T, class U>class A {}; |
A<T, U>템플릿 클래스 |
template<class T>class A<T, T> {}; |
A<T, T>템플릿 클래스 |
template <class T>class A<T, int> {}; |
A<T, int>템플릿 클래스 |
template <class T1, class T2>class A<T1*, T2*> {}; |
A<T1*, T2*>템플릿 클래스 |
다음 표에서는 부분 특수화에서 상속의 몇 가지 예를 보여 줍니다.
| Code 요소 | 클래스 디자이너 보기 |
|---|---|
template <class T, class U>class A {};template <class TC>class A<T, int> {};class B : A<int, float>{};class C : A<int, int>{}; |
A<T, U>템플릿 클래스 B클래스 (클래스 A를 가리킵니다.) C클래스 (클래스 A를 가리킵니다.) |
다음 표에서는 부분 특수화 템플릿 함수의 몇 가지 예를 보여 줍니다.
| Code 요소 | 클래스 디자이너 뷰 |
|---|---|
class A{template <class T, class U>void func(T a, U b);template <class T>void func(T a, int b);}; |
Afunc<T, U> (+ 1 오버로드) |
template <class T1>class A {template <class T2>class B {};};template<> template<>class A<type>::B<type> {}; |
A<T1>템플릿 클래스 B<T2>템플릿 클래스 (B는 중첩 형식 아래의 클래스 A에 포함되어 있음) |
template <class T>class C {};class A : C<int> {}; |
A클래스 -> C<int> C<T>템플릿 클래스 |
다음 표에서는 템플릿 상속의 몇 가지 예를 보여 줍니다.
| Code 요소 | 클래스 디자이너 보기 |
|---|---|
template <class T>class C {};template<>class C<int> {class B {};}class A : C<int>::B {}; |
A클래스 ->B C<int>클래스 (B는 중첩 형식에서 C 클래스 내에 포함됨) C<T>템플릿 클래스 |
다음 표에서는 정식 특수 클래스 연결의 몇 가지 예를 보여 줍니다.
| Code 요소 | 클래스 디자이너 보기 |
|---|---|
template <class T>class C {};template<>class C<int> {};class A : C<int> {};class D : C<float> {}; |
A클래스 ->C<int> C<int>클래스 C<T>템플릿 클래스 D클래스 ->C<float> |
class B {template <class T>T min (const T &a, const T &b);}; |
Bmin <T> |
클래스 디자이너의 C++ 열거형
클래스 디자이너 는 C++ enum 및 범위가 지정된 형식을 enum class 지원합니다. 다음은 예제입니다.
enum CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
// or...
enum class CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
클래스 다이어그램의 C++ 열거형 셰이프는 구조체 셰이프와 비슷하게 보이고 작동합니다. 하지만, 레이블은 열거형 또는 열거형 클래스로 나타나며, 파란색이 아닌 분홍색이고, 왼쪽과 위쪽 여백에 색상이 있는 테두리가 있습니다. 열거형 셰이프와 구조체 셰이프에는 모두 사각형 모서리가 있습니다.
형식 사용에 enum 대한 자세한 내용은 열거형을 참조하세요.
클래스 디자이너의 C++ typedefs
Typedef 문은 이름과 해당 내부 형식 간에 하나 이상의 간접 참조 계층을 만듭니다.
클래스 디자이너 는 키워드 typedef로 선언되는 C++ typedef 형식을 지원합니다. 예를 들면 다음과 같습니다.
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
} COORD;
그런 다음 이 형식을 사용하여 인스턴스를 선언할 수 있습니다.
COORD OriginPoint;
클래스 및 구조체 셰이프
클래스 디자이너에서 C++ typedef에는 typedef에 지정된 형식의 모양이 있습니다. 소스가 typedef class를 선언하면, 셰이프는 모서리가 둥글어지고 레이블은 Class가 됩니다. 셰이프의 경우 typedef struct사각형 모서리와 레이블 구조체가 있습니다.
클래스 및 구조체에는 중첩된 typedef가 선언되어 있을 수 있습니다. 클래스 디자이너에서 클래스 및 구조체 셰이프는 중첩된 typedef 선언을 중첩된 셰이프로 표시할 수 있습니다.
Typedef 셰이프는 오른쪽 클릭 메뉴(상황에 맞는 메뉴)에서 연결로 표시 및 컬렉션 연결로 표시 명령을 지원합니다.
Class typedef 예제
class B {};
typedef B MyB;
구조체 typedef 예제
typedef struct mystructtag
{
int i;
double f;
} mystruct;
명명되지 않은 typedefs
이름 없이 typedef를 선언할 수 있지만 클래스 디자이너 는 지정한 태그 이름을 사용하지 않습니다. 클래스 디자이너 는 클래스 뷰 에서 생성하는 이름을 사용합니다. 예를 들어 다음 선언은 유효하지만 클래스 뷰 및 클래스 디자이너 에 __unnamed 개체로 나타납니다.
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
};
비고
클래스 디자이너 는 소스 형식이 함수 포인터인 typedef를 표시하지 않습니다.
C++ 코드 요소의 제한 사항에 대해 알아보기
C++ 프로젝트가 로드되면 클래스 디자이너 는 읽기 전용 방식으로 작동합니다. 클래스 다이어그램을 변경할 수 있지만 클래스 다이어그램의 변경 내용을 소스 코드로 다시 저장할 수는 없습니다.
클래스 디자이너 는 네이티브 C++ 의미 체계만 지원합니다. 관리 코드로 컴파일되는 C++ 프로젝트의 경우 클래스 디자이너 는 네이티브 형식인 코드 요소만 시각화합니다. 따라서 클래스 다이어그램을 프로젝트에 추가할 수 있지만 클래스 디자이너에서는
IsManaged속성이true로 설정된 요소(즉, 값 형식 및 참조 형식)를 시각화할 수 없습니다.C++ 프로젝트의 경우 클래스 디자이너 는 형식의 정의만 읽습니다. 예를 들어 헤더(.h) 파일에서 형식을 정의하고 구현(.cpp) 파일에서 해당 멤버를 정의한다고 가정합니다. 구현(.cpp) 파일에서 "클래스 다이어그램 보기"를 호출하는 경우 클래스 디자이너 는 아무 것도 표시하지 않습니다. 또 다른 예로 문을 사용하여
#include다른 파일을 포함하지만 실제 클래스 정의를 포함하지 않는 .cpp 파일에서 "클래스 다이어그램 보기"를 호출하는 경우 클래스 디자이너 는 다시 아무 것도 표시하지 않습니다.COM 인터페이스 및 형식 라이브러리를 정의하는 IDL(.idl) 파일은 네이티브 C++ 코드로 컴파일되지 않는 한 다이어그램에 표시되지 않습니다.
클래스 디자이너 는 전역 함수 및 변수를 지원하지 않습니다.
클래스 디자이너 는 공용 구조체를 지원하지 않습니다. 이는 할당된 메모리가 공용 구조체의 가장 큰 데이터 멤버에 필요한 양에 불과한 특수한 유형의 클래스입니다.
클래스 디자이너는
int및char와 같은 기본 데이터 형식을 표시하지 않습니다.클래스 디자이너 는 프로젝트에 해당 형식에 대한 올바른 참조가 없는 경우 현재 프로젝트 외부에서 정의된 형식을 표시하지 않습니다.
클래스 디자이너 는 중첩된 형식을 표시할 수 있지만 중첩된 형식과 다른 형식 간의 관계는 표시할 수 없습니다.
클래스 디자이너 는 void이거나 void 형식에서 파생된 형식을 표시할 수 없습니다.
형식 해상도 및 디스플레이 문제 해결
원본 파일의 위치
클래스 디자이너 는 원본 파일의 위치를 추적하지 않습니다. 따라서 프로젝트에서 프로젝트 구조를 수정하거나 소스 파일을 이동하는 경우 클래스 디자이너 는 형식(특히 typedef, 기본 클래스 또는 연결 형식의 원본 형식)을 추적하지 못하면 됩니다. 클래스 디자이너가 이 형식을 표시할 수 없는 등의 오류가 표시될 수 있습니다. 이렇게 하면 수정되거나 재배치된 소스 코드를 클래스 다이어그램으로 다시 끌어 다시 표시합니다.
업데이트 및 성능 문제
C++ 프로젝트의 경우 소스 파일의 변경 내용이 클래스 다이어그램에 표시되는 데 30~60초가 걸릴 수 있습니다. 이 지연으로 인해 클래스 디자이너 에서 선택 영역에서 형식을 찾을 수 없다는 오류가 발생할 수도 있습니다. 이와 같은 오류가 표시되면 오류 메시지에서 취소 를 클릭하고 코드 요소가 클래스 뷰에 나타날 때까지 기다립니다. 이렇게 하면 클래스 디자이너 에서 형식을 표시할 수 있어야 합니다.
클래스 다이어그램이 코드에서 변경한 내용으로 업데이트되지 않는 경우 다이어그램을 닫고 다시 열어야 할 수 있습니다.
타입 해석 문제
클래스 디자이너 는 다음과 같은 이유로 형식을 해결하지 못할 수 있습니다.
형식은 클래스 다이어그램이 포함된 프로젝트에서 참조되지 않는 프로젝트 또는 어셈블리에 있습니다. 이 오류를 해결하려면 형식이 포함된 프로젝트 또는 어셈블리에 대한 참조를 추가합니다. 자세한 내용은 프로젝트의 참조 관리를 참조하세요.
형식이 올바른 범위에 없으므로 클래스 디자이너 에서 찾을 수 없습니다. 코드에
using,imports, 또는#include문이 누락되지 않았는지 확인합니다. 또한 원래 위치했던 네임스페이스에서 형식(또는 관련 형식)을 이동하지 않았는지 확인합니다.형식이 존재하지 않거나 주석 처리되었습니다. 이 오류를 수정하려면 유형을 주석 처리하거나 삭제하지 않았는지 확인하십시오.
형식은 #import 지시문에서 참조하는 라이브러리에 있습니다. 가능한 해결 방법은 생성된 코드(.tlh 파일)를 헤더 파일에 #include 지시문에 수동으로 추가하는 것입니다.
클래스 디자이너가 입력한 형식을 지원하는지 확인합니다. C++ 코드 요소에 대한 제한 사항을 참조하세요.
형식 확인 문제가 발생할 가능성이 가장 큰 오류는 클래스 다이어그램 '요소<'>에서 하나 이상의 셰이프에 대한 코드를 찾을 수 없다는 것입니다. 이 오류 메시지가 반드시 코드가 오류임을 나타내는 것은 아닙니다. 클래스 디자이너가 코드를 표시할 수 없음을 나타냅니다. 다음 측정값을 시도합니다.
타입이 있는지 확인합니다. 소스 코드를 의도치 않게 주석 처리하거나 삭제하지 않았는지 확인합니다.
형식을 해결하려고 시도합니다. 형식은 클래스 다이어그램이 포함된 프로젝트에서 참조되지 않는 프로젝트 또는 어셈블리에 있을 수 있습니다. 이 오류를 해결하려면 형식이 포함된 프로젝트 또는 어셈블리에 대한 참조를 추가합니다. 자세한 내용은 프로젝트의 참조 관리를 참조하세요.
클래스 디자이너에서 찾을 수 있도록 형식이 올바른 범위에 있는지 확인합니다. 코드에
using,imports또는#include문이 누락되지 않았는지 확인합니다. 또한 원래 위치했던 네임스페이스에서 형식(또는 관련 형식)을 이동하지 않았는지 확인합니다.
팁 (조언)
추가 문제 해결 정보는 클래스 디자이너 오류를 참조하세요.