[C언어] 열거형 enum

C 2018.08.24 19:56

열거형이란?

- 열거형은 enumeration의 약자로 enum(이넘)이라고 읽는다.

- 데이터들을 열거한 집합이다. 

- 컴파일러는 열거형 멤버들을 정수형 상수로 취급한다.




열거형의 사용법

- 키워드는 enum을 사용하여 정의한다.   

#include 

enum Week
{
	sun = 0,
	mon,
	tue,
	wed,
	thu,
	fri,
	sat
};

int main(void)
{
	int day;
	printf("요일을 입력하세요(1.일, 2.월, 3.화, 4.수, 5.목, 6.금, 7.토) : ");
	scanf("%d", &day);

	switch (day)
	{
	case sun:
		printf("sunday");
	case mon:
		printf("monday");
	case tue:
		printf("tueday");
	case wed:
		printf("weday");
	case thu:
		printf("thuday");
	case fri:
		printf("friday");
	case sat:
		printf("atday");
	default:
		printf("err");
	}
	return 0;
}


- 열거형의 멤버들은 각 요일을 나타낸다.

- 첫번째 멤버 sun을 0으로 설정하면 다음 멤버 mon은 각 1씩 증가한다.

Posted by 루우지

1. 구조체란?

- 하나 이상의 서로 다른 종류의 변수들을 묶어서 새로운 자료형을 정의하는 것이다.



구조체를 사용하는 이유

- 연관된 변수들을 하나로 묶어서 관리함으로써 데이터 관리에 유용하다.

- 데이터의 양이 많아지면 궂체가 유리하다.

- 예를 들어 학생정보 관리 변수를 생성할때 이름, 나이, 성별 등의 정보들은 모두 변수로 선언하여 각각의 변수를 별도로 관리하면 연관성을 알 수가 없다. 



구조체 정의 방법

#include 
struct student
{
	char name[10];
	int age;
	int height;
};	// 구조체 정의

int main(void)
{
	struct student st1;	// 구조체 선언
	struct student st2;
}


- struct 키워드는 구조체라는 자료형을 의미

- student 는 만든 구조체의 이름

- name, age, height는 구조체 멤버 변수

- 구조체는 사용자가 정의한 새로운 자로형이다.



구조체 멤버 접근 방법

- 구조체 변수를 통해 구조체 멤버의 값을 참조해야 한다.

- 멤버에 접근시 . 콤마를 사용하는데, 이를 직접 접근이라 한다.


[구조체 변수명].[구조체 멤버]

ex) st1.name, st1.age, st1.height




2. 공용체란?

- 공용체도 사용자가 정의한 자료형이다

- 구조체와의 차이점은 메모리 공간을 공유한다는 점이다.


struct stTemp
{
	char a;
	int b;
	double c;
}st;


위와 같은 구조체가 있을때 메모리가 차지하는 용량은

a = 1byte, b = 4byte, c = 8byte 로 총 13byte가 메모리에 적재된다.

union unTemp
{
	char a;
	int b;
	double c;
}un;


위의 공용체와 같은 경우는 구조체와는 전혀 다른 메모리 적재방식이 적용된다.

제일 큰 멤버변수 double형 c가 8byte가 메모리에 적재되어 각각의 변수가 1회용으로 8byte 메모리안에 적재된다.

구조체는 멤버변수가 각각의 메모리 공간을 할당받고 있지만 공용체는 같은 메모리공간을 모든 변수가 공유하는 형태이다.


#include 

union unTemp
{
	char a;
	int b;
	double c;
}un;

int main(void)
{
	printf("문자형 a의 주소와 크기 : %x, %d\n", &un.a, sizeof(un.a));
	printf("정수형 b의 주소와 크기 : %x, %d\n", &un.a, sizeof(un.b));
	printf("실수형 c의 주소와 크기 : %x, %d\n", &un.a, sizeof(un.c));

	un.a = 'A';
	printf("문자형 a의 값 : %c\n", un.a);
	un.b = 100;
	printf("정수형 b의 값 : %d\n", un.b);
	un.c = 3.14;
	printf("실수형 c의 값 : %.2f\n", un.c);
	printf("문자형 a의 값 : %c\n", un.a);
	return 0;
}



- 시작 주소는 세 변수가 모두 같다.

- 예제의 마지막줄 a값을 다시 출력 시 쓰레기값이 출력된다. 

- 그 이유는 double형 8byte에 저장된 값은 3.14인데 그중 1byte의 값만 읽어와 출력하는것이니 쓰레기값이 출력된다.


공용체를 사용하는 이유

- 메모리 절약을 위해서

- 구조체는 각 가정의 화정실, 공용체는 공원의 공중 화장실이라 생각하면 된다. 


공용체 사용 시 유의 사항

- 공용체 멤버는 동시에 사용하게 되면 데이터가 별질될 우려가 있으므로 따로 따로 사용해야한다.




Posted by 루우지


void CAVI_PROJECTDlg::OnBnClickedBtnFind()
{ 
	BROWSEINFO BrInfo;
	TCHAR szBuffer[512];                                      // 경로저장 버퍼 

	::ZeroMemory(&BrInfo,sizeof(BROWSEINFO));
	::ZeroMemory(szBuffer, 512); 

	BrInfo.hwndOwner = GetSafeHwnd(); 
	BrInfo.lpszTitle = _T("파일이 저장될 폴더를 선택하세요");
	BrInfo.ulFlags = BIF_NEWDIALOGSTYLE | BIF_EDITBOX | BIF_RETURNONLYFSDIRS;
	LPITEMIDLIST pItemIdList = ::SHBrowseForFolder(&BrInfo);
	::SHGetPathFromIDList(pItemIdList, szBuffer);				// 파일경로 읽어오기

	CString str;
	str.Format(_T("%s"),szBuffer);
	AfxMessageBox(str);
}


MFC 버튼컨트롤에 클릭이벤트를 건뒤 해당 함수에 위의 소스를 복붙해서 실행하시면 폴더 찾기 다이얼로그가 생성되는걸 확인 할 수있습니다. 





Posted by 루우지

1. OCI (Oracle Call Interface)

 - Application과 Oracle Database와 상호작용할 수 있도록 오라클에서 지원하는 Low-Level api이다. 일반적으로 C/C++에서 많이 사용된다. 그런데 OCI 프로그래밍은 Low-Level  API를 사용하는것이라 매우 어렵다. 다만 ODBC처럼 Oracle Client를 설치하지 않고 oci 관련된 dll을 같이 배포할때 포함해주면 되기 때문에 사용자가 oracle 을 설치하지 않아도 된다는 이점이 있다. 물론 단점은 위에서 언급했듯이 개발자가 사용하기 쉬운 API는 아니라른점.




2. OCCI (Oracle C++ Call Interface)

 - 약자와 같이 OCCI는 C++에서 오라클DB를 조작할 수 있게금 도와주는 API다. Low-Level로 작성된 OCI를 C++로 랩핑하여 API를 제공해주는데 공식 도큐먼트에서의 OCCI의 장점을 아래와 같이 설명하고 있다.




1) C++과 같은 객체지향 프로그래밍 활용

2) 사용하기 쉽다.

3) JDBC에 익숙한 사람들에게 배우기가 쉽다.









실제로 OCI와 OCCI의 사용 문법은 판이하게 다른다. JDBC에 익숙한 나에게는 OCCI에서 제공해주는 API가 더 친숙하고, 친절하다. 


하지만 OCCI는 단점이 있다..


VS2015에서 사용하면 버그가 생긴다. 

- 정확히는 OCCI가 VS2010 (V100) 까지의 라이브러리 파일을 제공해준다. (dll도 같이)하지만 나는 vs2015를 사용하는데 OCCI(oraocci11d.lib)를 사용할때 getString() 함수를 사용하는데 힙커런트 에러가 뜬다. 이는 내부적으로 2번 메모리를 delete해주는 현상이라고 한다. (정확히는 모름) 무려 저 에러때문에 하루를 다 날려먹었지만 결국 vs2010 으로 갈아타고 작업하는데 성공했다.


해당 에러를 잡으면서 많은 생각을 했다. OCCI를 버리고 OCI로 갈것이냐, ODBC방식으로 갈것이냐, 혹은 JVM을 위에올려서 JDBC로 갈것이냐 등,, 결국 VS2010으로 다운그레이드하여 OCCI를 끝까지 가져가보자라는 방식으로 마음 먹었다.


























Posted by 루우지