오 놀라워라~ C언어의 확장성 VI
앞에서도 말했듯이 원래 사람은 번호보다는 이름 붙이는 걸 좋아합니다. 그래서 숫자마다 의미 있는 이름을 붙여서 관리하자는 것이 바로 열거형입니다. 이 때 열거형 데이터는 반드시 정수형 값만을 가지게 됩니다.
enum { 멤버1, 멤버2, …, 멤버n } ;
enum { 멤버1=정수형값, 멤버2=정수형값, …, 멤버n=정수형값 } 열거형변수이름 ;
enum { 멤버1, 멤버2=정수형수식, …, 멤버n } 열거형변수이름 ;
enum 열거형이름(태그) { 멤버1, 멤버2=다른멤버, …, 멤버n } 열거형변수이름 ;
보통은 생략하게 되는 열거형이름(태그)을 사용하면 같은 열거형을 선언하기 위해 멤버를 다시 나열하지 않아도 되는 장점이 있습니다. 그리고 어떤 정수형 값도 주지 않고 그냥 멤버만 나열하면 첫 번째 멤버가 0 값을 갖고 그 다음 멤버의 값은 1씩 증가하게 됩니다. 만약에 중간에 다른 값을 주게 되면 그 다음 멤버들 값은 그 값에서 1씩 증가됩니다. 같은 값을 갖는 멤버는 존재할 수 있지만 같은 멤버이름은 전체 열거형 선언을 통해 두 개 이상 가지면 문법에러가 발생합니다. 그러므로 이미 선언된 다른 열거형에 선언한 멤버이름은 사용할 수 없습니다. 일반적으로 열거형 데이터는 정수형과 같기 때문에 대부분의 연산이 모두 가능합니다.
#include <stdio.h>
/*
* copyleft (l) 2006 - 2017 programmed by Sinclair
*/
enum { red , orange , white , blue , green , black , purple } ;
enum color { /* red, */ r=red , y , w=7 , b , g=5 , o , c , v } ;
// 이미 앞에 선언된 red를 멤버로 선언할 수 없지만 값으로 줄 수는 있다.
// typedef로 새로운 타입 선언도 가능
typedef enum human
{ man=2 , woman=1 , girl=1 , boy=man , baby=0 /*,man*/} eHuman ;
// 서로 다른 멤버가 같은 값을 가질 수는 있지만 같은 멤버가 올 수 없다.
int main() {
enum color palette ; // typdef를 사용하지 않은 경우
eHuman student ; // typdef를 사용한 경우
// enum color c ;
// 이렇게 멤버와 같은 변수를 선언하면 어떻게 될까여?
// 한번 테스트해 보세요..
printf("%d %d\n", palette, student) ;
// 4199504 1628434848 쓰레기 값, 일반 변수처럼 초기화 되지 않았다.
printf("%d %d %d %d %d %d %d\n",
red, orange, white, blue, green, black, purple) ;
// 0 1 2 3 4 5 6
printf("%d %d %d %d %d %d %d %d\n", r, y, w, b, g, o, c, v) ;
// 0 1 7 8 5 6 7 8
palette = red ; // 다른 열거형 값도 받는다.
student = 1000 ; // 정수형 상수 값도 받는다.
printf("%d %d %d %x\n" , palette , student ,
(red + man) * v % 3 /* 이렇게 연산도 가능 */, &palette /* 주소값 */ ) ;
// 0 1000 1 22cce4
printf("%d %d %d %d\n", sizeof(enum color), sizeof(Human),
sizeof palette , sizeof student) ;
// 4 4 4 4
return 0 ;
} // end main()
사실 열거형 타입은 표준위원회에서도 C 표준으로 넣어야 할지 말아야 할지 가장 마지막까지 고민했던 타입이라고 알려져 있습니다.
실제로 사용할 때 일반 정수형과 전혀 다르지 않을 뿐만 아니라 때론 매크로 상수를 사용하는 것과도 비슷하기 때문입니다.
하지만 매크로 상수는 각 매크로 상수마다 라인 별로 값을 각각 따로 줘야 하며 프로그램 중 다른 값을 저장할 수 없어 실제 상수(상수일 경우가 대부분이지만)처럼 동작합니다.
하지만 열거형의 경우 선언할 때 원하는 값을 주면 나머지 멤버들은 자동증가 할 뿐 아니라 관계 있는 모든 것을 한 줄로 모아서 작성할 수도 있고, 또한 타입이므로 변수 선언이 가능한 장점이 있습니다. 일단 숫자를 그대로 사용하는 것 보다 의미 있는 이름을 사용하는 것이 프로그래밍의 커다란 이점이라는 것은 어느 누구도 부인 못할 사실입니다.
그러나 매크로 상수를 사용할지 열거형 데이터를 사용할지는 프로그래머의 취향일 뿐이라고 생각합니다. 프로그램을 사용하는 일반 사용자는 매크로 상수를 썼는지 열거형을 썼는지 궁금해하지도 않을 뿐만 아니라 전혀 알 필요가 없습니다.
다만 프로그램을 사용할 때 충분히 원하는 결과가 잘 나오는지, 저지레 없이 빠른 속도로 실행되는 지에 대해서만 관심을 가질 뿐입니다. 잦은 에러와 버그로 정당한 대가를 지불한 것이 아깝게 느껴지거나 심지어 고객을 뜨악하게 만드는 프로그램이라면 그 존재 자체가 죄악일 수 있습니다. 문제가 발생할 때 마다 "오류 보고하시겠습니까?" 라고 들입다 메시지를 뿌려주는 것도 나쁘진 않지만 아예 오류를 만들지 않는 것이 더욱 중요합니다.
그래서 프로그래머는 남 주려고 공부도 해야 합니다.
그리고 우리는 반드시 고객을 행복하게 하는 프로그램을 작성해야 합니다.
사용자가 행복해야 우리도 행복하지 않겠습니까?
C언어 및 기타 프로그래밍 관련 질문은 오픈 카톡으로
group talk - https://is.gd/yourc
1:1 talk - https://is.gd/aboutc
#Sinclair #씽클레어 #싱클레어 #씽클레어도씨 #씨언어 #씨프로그래밍 #C언어 #Cprogramming #C_Programming #C #Programming #Clanguage #C_Language