열거형 은 상수의 그룹을 나타내는 특수한 데이터 타입.
열거형을 생성하기 위해선 enum 키워드를 사용하고,
이름을 선언한 뒤, 콤마로 각 아이템 을 구분해서 넣어주면 된다.
enum Level {
LOW,
MEDIUM,
HIGH
};
※ 마지막 아이템까지 콤마를 넣어줄 필요는 없고,
반드시 대문자로 통일할 필요는 없지만 이렇게 작성하는 게 권장된다.
주요점은
;가 아닌,를 사용하는 것,
예시를 보면 문자열이라고 해서""로 묶어줄 필요도 없는 모양
일단 기본적으로,
이러한 아이템 들은 각자 인덱스 값과 동일한 값을 갖고 있는데
위 예시에서는 LOW가 0 , MEDIUM이 1 , HIGH가 2 인 식이다
int main() {
enum Level myVar = MEDIUM;
cout << myVar;

열거형 내부의 값, 아무것도 설정하지 않은 상태에서는 인덱스 값이 나오게 되는데,
열거형의 경우에는 이 값도 지정해 줄 수가 있다
간단하게 열거형을 정의할 때 각 아이템에 = 로 값을 지정해주면 된다

만약 어느 하나의 아이템에만 값을 지정해 준 경우에는,
그에 따라서 인덱스처럼 나머지도 값이 지정된다enum Level { LOW = 5, MEDIUM, // 얘는 6 HIGH // 7 }이렇게 할당된 값을 확인하기 위해
switch문을 사용하기도,
ex)
enum Level {
LOW = 1,
MEDIUM,
HIGH
};
int main() {
enum Level myVar = MEDIUM;
switch (myVar) {
case 1:
cout << "Low Level";
break;
case 2:
cout << "Medium level";
break;
case 3:
cout << "High level";
break;
}
return 0;
}
열거형은 상수 로 이루어져 있기 때문에,
변하지 않고, 코드를 읽기 쉬운데다가 유지력이 있기 때문에
변하지 않을 것이라 알고 있는 정보들에 대해 사용하기 좋다.
ex) 날짜, 요일, 색상, etc.
참조 라는 개념이 존재하는데,
이 "참조 변수" 는 이미 존재하고 있는 변수의 "별명" 같은 것이며,
& 연산자를 사용해 만들 수 있다.
string food = "fried chicken"; // 이렇게 만들어진 변수에
string &dinner = food; // dinner 라는 별명을 붙여 참조, 같은 값을 주는 느낌
// & 는 연산자 지만 이렇게 참조 변수 이름에 딱 붙어서 사용된다
두 값을 출력해 보면 동일한 값이 나온다

위에서 등장한 참조 기능은,
참조 변수 외에도 변수의 메모리 주소 를 알아낼 때도 쓰인다.
정확히는 "변수가 컴퓨터의 어디에 저장이 되었는지 그 위치"
C++에서 변수가 생성되면, 해당 변수에 메모리 주소가 할당되고,
우리가 그 변수에 '값'을 지정하게 되면, 그 '값'이 이 주소에 저장된다.
이에 접근하기 위해서 똑같이 & 연산자를 사용할 수 있다.
string food = "fried chicken";
cout << &food;

메모리 주소는 16진수 형태, 환경에 따라 달라질 수 있다.
이 참조 와 아래에 다룰 Pointers 는
C++ 에서 매우 중요한 기능으로,
★ 이들을 통해 컴퓨터 메모리의 데이터를 조작할 수 있기 때문에,
코드를 줄이고 성능을 향상시킬 수 있기 때문
이러한 특징 때문에 C++ 는 다른 프로그래밍 언어, 파이썬 자바 등과 차이가 있다
포인터 는, "메모리 주소" 를 값으로 가지는 변수로,
데이터 타입에 * 연산자로 작용해 생성된다.
데이터타입 변수이름 = 값;
데이터타입* 포인터이름 = &변수이름; // 위아래 데이터타입은 같아야 한다.

일단 포인터 변수를 정의할 때
*을 반드시 데이터타입에 붙일 필요는 없지만,
이쪽이 권장되기 때문에 다른 경우는 깊게 신경쓰지 않기로.string* mystring; string *mystring; string * mystring; // 셋 다 똑같다
앞서 나온 참조 와 포인터 기능의 응용으로,
* 연산자를 다시 사용해 "역참조" 기능으로 변수의 값을 찾을 수 있다.
데이터타입 변수이름 = 값; // 변수 작성
데이터타입* 포인터이름 = &변수이름; // 포인터 생성
cout << 포인터이름 // 이건 아까 나온 '메모리 주소'
cout << *포인터이름 // 이건 '포인터로 지정한 변수의 값'

같은
*연산자가 사용되서 헷갈릴 수 있으니 주의
- 무언가를
정의하는 부분에 사용된 경우 포인터 변수의 정의- 그렇지 않은 경우
역참조 연산자
포인터 의 값을 평소에 변수 덮어쓰기 하듯이 수정해줄수 있는데,
다만 이러한 경우에는 원래 원본 변수의 값도 같이 변해버린다.
