프로그래밍 공부
작성일
2024. 1. 4. 14:44
작성자
WDmil
728x90

1.1.6 데이터 타입

 

C++에서는 int, bool 과 같은 기본 데이터 타입을 이용하여, 좀 더 복잡한 데이터 타입을 정의할 수 있다.

 

C++에 익숙해지고 나면 C언어에서 상속받은 데이터 티입보다 class를 이용한 더 효과적인 방법을 이용하게 될 것 이다.

 

다음 설명하는 두가지 방법은 데이터 타입을 정의하기 위한 기초적인 내용이다.


열거타입

 

정수(int) 타입은 엄밀히 말하면 특정 범위에 속한 숫자들의 나열이다. 열거타입(enumeration type)은 어떤 숫자들을 나열할지 프로그래머가 마음대로 정할 수 있게 해준다.

 

예를들어 enum마냥, 객체의 고유번호를 int값을 할당하여 종류를 나타내는 고유번호로 이용할 수 있다.

 

const 제한자를 붙이면, 해당 변수값이 절대 바뀌지 않음을 명시적으로 나타낼 수 있다.

const int PieceTypeKing = 0 ;
const int PieceTypeQueen = 1;
const int PieceTypeRook = 2 ;
const int PieceTypePawn = 3 ;
// …
in t myPiece = PieceTypeKing;

 

이와같이 값을 정의해도 무방하지만, 잘못사용될 수 있는데,

 

위 예시에서는 프로그래머가 실수로 값을 1씩 더해서 사용하게 되면, 왕이 왕비가 되는 상황이 발생할 수 있다.

또는 -1객체값이 나타남으로써 프로그램이 어떤 값과도 매칭되지 않아 폭파될 수 있다.

 

열거타입은 나열하는 값 목록과 범위를 엄격하게 관리함으로써 이러한 문제를 사전에 방지한다.

 

다음 코드는 새로운 타입을 정의하고, 4개의 말을 대표하는 값 목록을 정의한다.

enum PieceType { PieceTypeKing, PieceTypeQueen, PieceTypeRook, PieceTypePawn };

실제 열거 타입은 컴파일러 안에서 정수타입으로 처리된다.

 

예를들어, PiceTypeKing의 실제 정수타입은 0이다. 하지만, PieceType의 가능한 값 목록을 정의함으로써,

PieceType 변수가 정해진 값 목록 이외의 값으로 설정될 때, 변경될 때 컴파일러가 에러 메세지를 출력하게 한다.

 

해당 열거타입의 각 항목에 대해 개별 특정 정수값을 할당할수도 있다.

enum PieceType { PieceTypeKing = 1, PieceTypeQueen, PieceTypeRook = 10, PieceTypePawn };

위와같이 정의하면, PiceTypeKing은 1, PieceTypeQueen은 컴파일러에 의해 1 증가한 2를 할당받는다.

 

명시적으로 10을 할당받은 PieceTypeRook은 10으로, 그 뒤의 PieceTypePaun은 11을 자동으로 할당받는다.

 

컴파일러는 열거타입 항목의 값으로 직전 항목의 값에 1을 더한 값을 지정한다.

첫 항목의 경우 아무 값을 지정하지 않았다면 0을 지정한다.


엄격한 열거 타입.

위의 열거타입은 타입이 안정적이지 않다. 기본적으로 정수취급을 받기 때문에, 서로 완전 별개인 열거타입 간에도 비교연산이 가능하기 때문이다.

 

enum Class를 사용하면, 이러한 문제에서 해방될 수 있다.

 

enum class MyEnum
{
    EnumValue1,
    EnumValue2 = 10,
    EnumValue3
};

MyEnum은 타입이 안정적이기 때문에, 열거값이 다른 정수타입 변수로 자동으로 캐스팅되지 않고, class 이름으로 스코프 설정하지 않으면, 참조가 불가능하다.

 

즉, 다음과 같이 설정해야 사용할 수 있다.

MyEnum value1 = MyEnum::EnumValue1;

 

다음과 같이 비교하면 오류가 난다.

if(MyEnum::EnumValue3 == 11) {...}

 

열거 타입은 기본적으로 int 타입과 연계되지만, enumClass에서는 다음과 같이 형태를 바꿀수도 있다.

enum class MyEnum : unsigned long
{
    EnumValue1,
    EnumValue2 = 10,
    EnumValue3
};

구조체

 

구조체는 하나 이상의 기본타입, 또는 다른 구조체를 조합하여 새로운 타입을 만든다.

 

구조체의 가장 흔한 예는 데이터베이스의 레코드를 나타내는 것이다.

 

에를들어 직원의 신상 명세를 기록하는 데이터베이스라면 직원별로 이름과 성의 첫 글자와 직원 등록 번호, 급여 정보가 있고, 다음과 같이 구조체로 정의하여 임의의 헤더파일로 생성할 수 있다.

struct Employee{
    char firstInitial;
    char lastInital;
    int employeeNumber;
    int salary;
    };

 

Employee 타입으로 변수를 선언하면, 위 항목들을 모두 가진 데이터가 된다.

 

구조체의 각 항목은 '.' 연산자를 통해 접근이 가능하다.

728x90