기초지식

08-1. 사용자 정의 자료형

로만주 2023. 5. 16. 19:59

▶ 사용자 정의 자료형이란?

 

- 기존의 자료형을 기반으로 새로운 자료형의 조합을 만드는 기능

ㄴ 사용자 정의 자료형을 활용하면 특정 데이터의 집합을 표현하는 것이 가능하다.

 

C / C++ 언어의 사용자 정의 자료형의 종류

 

- 열거형 (심볼릭 상수를 정의하는 자료형)

- 구조체 (특정 데이터의 집합을 정의하는 자료형)

- 공용체 (특정 데이터의 집합을 정의하는 자료형)

- 클래스 (OOP에서 특정 객체를 생성하고 관리하는 자료형)

 

※ C: 구조체                              /                            C++: 클래스

ㄴ 둘의 차이를 알아 가기 위해서는 자료구조부터 메모리, OS 영역으로 넘어감.

EX) 표기법 주의 -> 파스칼

enum EUnitType
{
	Unit_Type_A,
    Unit_Type_B,
    Unit_Type_C
};

▷ C / C++ 언어의 구조체 선언 방법

 

- 하나 이상의 변수를 묶어서 새로운 자료형을 정의하는 도구

- C++ 에서는 클래스가 도입되었지만 C언어와의 호환성 때문에 구조체를 그대로 사용할 수 있다.

- C++ 구조체는 C언어의 구조체에 기능을 확장하여 기존의 클래스와 동일한 구조와 기능을 가진다.

 

EX) 표기법 주의 -> 헝가리안 + 스네이크

struct STUnitData
{
	int m_nID;
    int m_nLevel;
};

▷ C / C++ 언어의 공용체 선언 방법

 

EX)

union STUnitData
{
	int m_nID;
    int m_nLevel;
};

ㆍ 구조체 vs 공용체

 

- 구조체는 구조체를 구성하는 각각의 필드가 서로 별개의 메모리를 사용하는 반면 공용체는 하나의 메모리를 가지고 각각의 필드가 서로 공유하는 구조를 지닌다.

 

- 그렇기 때문에 공용체에서는 각 필드의 값이 할당 될 경우 마지막으로 할당한 필드의 값만 유효하다.

ㄴ do ~ while 과 비슷함... 특정 로직에 사용할 경우 강력하게 작용한다.

 

◇ 사용자 저으이 자료형부터는 접근 범위(영역)에 대해서 신경을 많이 써야 한다.

ㄴ 접근 범위란? Ex) 지역, 전역, 정적 지역, 정적 전역 등....

ㄴ 복수의 자료형이 사용되므로 메모리 손해가 막심한.

 

namespace EXAMPLE_3
{
	//0.설계 + 추상화
    //1. 선언
    //2. 구현화 부분
    //3. 실제 사용되는 부분
    
    struct tagFamily
    {
    	char* name;
        int age;
        int height;
        float weight;
        bool wedding;
	};
    
=====================================
열거형 상수는 기본적으로 특정 값을 할당하지 않으면 컴파일러에 의해서 자동으로 값을 할당한다.
(0부터 -> 순서대로 부여한다.)
단, 특정 상수에 값을 할당했을 경우 해당 상수 밑으로는 차례대로 해당 상수에
할당 된 값에서 +1씩 증가해서 할당이 이뤄진다.

enum class EColor_Type : uint16_t
{
	RED,
    GREEN,
    BLUE = 1000,
    BLACK,
    WHITE
};
// class가 붙어서 별도의 namespace를 갖는다.
// uint16_t 의 경우 데이터 량을 조절을 자료형으로 명시
// 나중에 다른 객체와 만나 모호함을 만날 수 있다면 생각해봐야 한다.

추가된 기능으로 열거형에는 반드시 이름을 명시할 필요가 없어졌다.

ㄴ 익명의 개념

ㄴ 익명, annonymous, 1회성 데이터가 떠오른다.

 

해당 방식으로 선언된 열거형은 식별 할 수 있는 이름이 당연히 존재하지 않기 때문에 따로 변수화 시키는 건 불가능하다.

 

이러한 규칙은 개정이 되면서 다르사용자 정의 자료형에도 적용된다.

enum
{
	UNIT_SIZE = 5
};

매크로 상수와의 차이점? 컴파일 타임 시간에 영향이 있다.

union STData
{
	int m_nDataA;
    int m_nDataB;
    int m_fData;
};

공용체는 특정 부분에서 사용하면 메모리 절약이 가능하다.

- 일단은 사용하기 위해서는 정의가 필요하고 구조체 멤버 변수에 접근하기 위해서는 '.'연산자를 사용한다.

- 그 외에는 일반적인 변수와 동일 시 되기 때문에 사용을 위해서 초기화가 필요하다.

- 또 다른 특징이 있다면 구조체의 초기화는 배열의 초기화와 같이
지정 된 값이 순서대로 들어간다는 특징이 있다.

cout << "블랙: " << BLACK << endl;
ㄴ 블랙이 무슨 블랙인지 모호함을 일으킴
ㄴ 객체 지향 파괴 코드

◇ 사용자 정의 자료형 중 열거형은 switch문과 궁합이 좋다.

 

◇열거형 자료에 수가 정해져 있어 for와 같이 쓰이기 애매하다.

 

대부분의 게임에서 방향 잡을 때 필수로 사용이 된다.

ㄴ Why? 편리함 + 유지보수 용이함 

'기초지식' 카테고리의 다른 글

09. 포인터  (0) 2023.05.17
08-2. 4대 문자열  (0) 2023.05.17
07. 삼항 연산자 + 문자열  (0) 2023.05.15
06-2. 난수 + 셔플  (0) 2023.05.13
06-1. 배열  (0) 2023.05.11