본문 바로가기
기본기 다지기/문법

enum & struct

by -MAYDAY- 2022. 6. 12.

enum & struct

 프로젝트 진행 중 기능 구현을 하면서 enum 처리를 해야 될 때가 많았다. enum은 서로 연관된 상수 값의 집합으로써, enum을 사용하는 주요 목적은 여러 곳에서 동일한 값을 사용할 때 중복이 발생하는 상황을 예방할 수 있다. 또한 상수 값에 변경사항이 발생할 경우 enum을 사용하면 여러 곳에서 일일이 값을 바꿔주지 않아도 된다는 장점을 가지고 있다. 이러한 enum 특성으로 인해 프로젝트 진행 시 자주 쓰이는 상수에 대해서는 enum 처리를 하여 유지보수성을 높이려고 노력하고 있다.

 일반적으로 배열은 같은 타입을 사용한 값에 한해서 열거형으로 저장할 수 있지만, 구조체 struct는 서로 다른 타입을 가진 데이터의 집합이기에 배열의 단점을 보완한 특성을 가지고 있다. 상황에 따라서 배열 대신에 struct를 사용하여 여러 타입의 데이터를 핸들링하여 로직을 설계할 수 있다. 개발하면서 심심치 않게 사용하는 enum과 struct에 대해서 실습을 통해 알아본다.

 

enum

 enum은 Enumeration의 약자로, 연관된 상수의 집합으로 주로 사용된다. enum 처리를 통해 상수가 쓰인 모든 곳을 편리하게 제어할 수 있어 적절한 enum 처리를 통해 코드의 유지보수성을 높일 수 있다.

 

#include <iostream>

using namespace std;

typedef enum Rainbow {
	Red = 1,
	Orange,
	Yellow,
	Green,
	Indigo,
	Violet,
}rb;


int main(void) {

	//enum Rainbow rainbow;
	rb rainbow;

	rainbow = Violet;

	cout << rainbow << '\n';

	return 0;
}

 예제 코드를 살펴보면, enum 키워드를 통해 Rainbow를 정의하여 맨 처음의 'Red'에 '1'이라는 값을 초기화하였다. 이후 main 함수에서 enum인 rainbow에 'Violet'이라는 값을 저장하여 'Violet'의 값을 출력하도록 작성했다. enum도 struct와 마찬가지로 typedef를 사용하여 main 함수에서 간단하게 선언하여 사용할 수 있다.

 

enum 출력 결과

 출력 결과를 확인해보면, Rainbow의 'Violet'에 아무런 값도 초기화 해주지 않았는데도 '6'이라는 값을 출력하는걸 확인할 수 있다. 이는 Rainbow를 정의할 때 'Red'에만 '1'이라는 값을 저장했음에도 불구하고 런타임 시에 'Red'의 값이 '1'이라는 것을 근거로 Rainbow의 각 색깔에 자동으로 값을 저장하여 이를 출력해준다는 것을 알 수 있다. 이뿐만 아니라 만약 enum의 각 데이터에 특정 값을 저장하고 싶으면 원하는 값을 각각 초기화하여 저장할 수 있다.

 

 enum은 언어에 따라 사용법은 차이가 있어 어떤 언어에서는 enum에 기본값을 저장하는 것을 지원하지만 그렇지 않은 언어도 있다. 하지만 이것이 enum의 단점이라고 보기는 어렵다. 언어에 따라서 enum의 기능이 다소 차이가 있을 수 있지만, 여하튼 enum의 주된 목적은 여러 곳에 작성된 하드코딩된 상수를 대체하여 사용하기 위함이다. enum을 통해 상수를 효과적으로 제어하여 코드를 설계하면 그만큼 유지보수성이 높아져 프로그램을 추적관리하기가 용이해진다.

 

 

struct (구조체)

 struct(구조체)는 Structure의 약자로, 기존 기본 타입들만 나열하여 저장할 수 있었던 배열의 한계를 극복하여 여러 타입의 데이터를 저장할 수 있는 사용자 정의의 데이터 집합이라고 볼 수 있다. struct를 통해 여러 데이터 타입을 저장할 수 있는 데이터 집합을 구현할 수 있어 마치 Java에서 객체를 생성하여 사용하는 것처럼 C/C++에서 비슷하게 구현할 수 있다. C/C++에서 객체지향스러운 코드 설계가 필요할 때 심심치 않게 쓰이는 개념이므로 struct에 대해 알아둘 필요가 있다.

 

#include <iostream>

using namespace std;

typedef struct Student {
	string name;
	int age;
	int grade;
	bool graduate;
}S;


int main(void) {

	//struct Student student1 = { "홍길동", 21, 2, false };
	//struct S student2 = { "김철수", 24, 4, true };
	S student1 = { "홍길동", 21, 2, false };
	S student2 = { "김철수", 24, 4, true };

	cout << student1.name << '\n';
	cout << student1.age << '\n';
	cout << student1.grade << '\n';
	cout << student1.graduate << '\n';

	cout << student2.name << '\n';
	cout << student2.age << '\n';
	cout << student2.grade << '\n';
	cout << student2.graduate << '\n';

	return 0;
}

실습 코드를 보면, Student라는 구조체에 각각 2명의 학생 정보를 저장하여 각 학생 정보를 출력하도록 작성한 것을 확인할 수 있다. 각 학생의 데이터 타입에 상관없이 여러 정보를 저장할 수 있는 것을 볼 수 있고, 원하는 정보만 호출하여 출력하도록 코드를 작성할 수 있다. 또한 구조체에 typedef를 활용하면 struct 키워드 대신에 typedef를 활용하여 정의한 키워드로 main 함수에서 간단하게 구조체를 사용할 수 있다.

 

struct 출력 결과

 출력 결과를 보면, student1과 student2에 저장한 각각의 여러 데이터들이 출력된 것을 확인할 수 있다. 이렇게 구조체를 사용하여 여러 데이터 타입을 저장하고 이를 활용할 수 있다는 것을 알 수 있다.  

 

 예제에서 알아보았듯이 struct는 Java에서 객체를 생성할 때와 비슷하게 쓰여 해당 struct에 저장되어 있는 특정 타입의 데이터의 값을 파악할 수 있다. 앞서 이야기하였듯이 일반적인 배열 타입에서 저장할 수 없었던 다양한 타입의 데이터를 구조체를 사용하여 저장할 수 있어 여러 데이터 타입을 활용하여 기능을 구현할 때 유용하게 쓰일 수 있다.

 

 

 간단한 예제를 통해서 enum과 struct에 대해서 알아봤다. enum은 실제 프로젝트 진행할 때에 언어에 상관없이 유용하게 쓰이는 개념이므로, 소스 코드에서 상수를 사용할 때 하드코딩을 지양하고 enum을 사용하여 유지보수가 용이하도록 염두해야 한다. struct는 C언어의 특성에 의한 일부 한계를 극복하기 위한 등장한 개념으로 여러 데이터 타입을 하나의 데이터 집합에 저장하려고 할 때 유용하게 쓰일 수 있기에 알아둘 필요가 있다. 개발자로서 여러 기초 문법을 익히면서 느끼는거지만, 언어에 상관없이 필요한 문법은 익혀두는 것이 여러모로 장점이 많은 것 같다. 이러한 생각을 바탕으로 이번에 enum과 struct에 대해서 알아본 것도 앞으로 개발 활동하면서 유용하게 활용할 수 있을 것 같다.

'기본기 다지기 > 문법' 카테고리의 다른 글

Thread 실습 - Java  (0) 2022.04.16
Thread란?  (0) 2022.04.03
추상클래스(abstract class)와 인터페이스(interface)  (0) 2022.03.27
static 이란?  (0) 2022.03.13