1. C언어의 구조체

C언어의 구조체를 다시한번 살펴보도록 합시다. 우리는 C언어 12강에서 구조체를 사용하여 관련있는 변수들끼리 묶어 손쉽게 관리를 할 수 있었습니다. 예를 한번 보도록 합시다.

#include <stdio.h>

struct student {
  int id;
  char *name;
  float percentage;
}; // 구조체 뒤에 세미콜론이 와야함
 
int main() {
  struct student s={1, "김철수", 90.5};
  printf("아이디: %d \n", s.id);
  printf("이름: %s \n", s.name);
  printf("백분율: %f \n", s.percentage);
  return 0;
}

결과:

아이디: 1
이름: 김철수
백분율: 90.500000
계속하려면 아무 키나 누르십시오 . . .

기억을 되짚어, student 구조체 내에 있는 4~6행에 있는 변수들은 멤버 변수 혹은 필드 등으로 부른다고 했습니다. 그리고, 구조체 변수 선언 시 struct 키워드를 생략하려면 따로 typedef 선언을 추가해야 했습니다. 이런 C언어의 구조체가 C++에 와서는 어떻게 바뀌었을지 한번 보도록 합시다.


2. C++의 구조체

아래 예제는 위에 있는 C언어의 구조체의 예제를 C++로 작성한 것입니다. C언어의 구조체가 C++에 와서는 어떻게 달라졌는지 유심히 살펴보도록 합시다.

#include <iostream>

using namespace std;

struct student {
  int id;
  char *name;
  float percentage;
}; // 구조체 뒤에 세미콜론이 와야함
 
int main() {
  student s={1, "김철수", 90.5};

  cout << "아이디: " << s.id << endl;
  cout << "이름: " << s.name << endl;
  cout << "백분율: " << s.percentage << endl;
  return 0;
}

결과:

아이디: 1
이름: 김철수
백분율: 90.5
계속하려면 아무 키나 누르십시오 . . .

먼저 12행을 보도록 합시다. struct 키워드가 생략된 것을 확인하실 수 있는데, 구조체 정의부분을 보시면 typedef 선언을 따로 하지 않아도 struct 키워드를 생략할 수 있게 되었습니다. 이번에는, 조금더 수정해보도록 하겠습니다.

#include <iostream>

using namespace std;

struct student {
  int id;
  char *name;
  float percentage;

  void Show() {
	  cout << "아이디: " << id << endl;
	  cout << "이름: " << name << endl;
	  cout << "백분율: " << percentage << endl;
  }
}; // 구조체 뒤에 세미콜론이 와야함
 
int main() {
	student s={1, "김철수", 90.5};

	s.Show();
  return 0;
}

결과:

아이디: 1
이름: 김철수
백분율: 90.5
계속하려면 아무 키나 누르십시오 . . .

이번에는 10~14행과 20행을 보도록 합시다. 구조체 내에 함수가 등장한것이 보이시죠? C언어에서는 이렇게 구조체 내에 함수를 선언하는 행위를 허용하지 않았습니다. 그러나 C++에 와서는 이것이 허용됩니다. 구조체 내에 정의된 함수는 아래와 같이 밖으로 빼낼 수 있습니다. 그리고 20행을 보시면, 구조체 내의 함수를 구조체 변수에 접근하듯이 .를 이용해 호출을 하고 있습니다.

#include <iostream>
 
using namespace std;
 
struct student {
  int id;
  char *name;
  float percentage;

  void Show();
}; // 구조체 뒤에 세미콜론이 와야함

void student::Show() {
    cout << "아이디: " << id << endl;
    cout << "이름: " << name << endl;
    cout << "백분율: " << percentage << endl;
}

int main() {
    student s={1, "김철수", 90.5};
 
    s.Show();
  return 0;
}

결과:

아이디: 1
이름: 김철수
백분율: 90.5
계속하려면 아무 키나 누르십시오 . . .

10행을 보시면 함수의 원형 선언을 구조체 내에 두고, 13~17행에서 함수의 정의를 밖으로 빼낸 것을 볼 수 있습니다. 이 역시 아까의 결과와 다른게 없습니다.


3. 접근 제어 지시자

C언어의 구조체와 또다른 차이점, 바로 접근 제어 지시자입니다. 함수를 구조체 내에 정의하거나, struct 키워드가 생략되는것 외에도 멤버의 접근에 제한을 둘 수 있습니다. 만약 접근 제어가 생략될 경우, 기본적으로 공용(public)멤버로 간주합니다. C++의 접근 제어 지시자에는 public, private, protected가 있습니다.

public: 어디서든 접근이 가능합니다.

private: 외부에서 접근이 불가능합니다.

protected: 외부에서 접근이 불가능하나, 상속된 파생 클래스에서는 접근이 허용된다.

protected는 상속을 배우고 나서 다시 알아보도록 하고, 오늘은 public과 private에 대해서 알아보도록 하겠습니다. 아래 예제에서 private 지시자와, public 지시자가 무엇이 다른지 살펴보도록 합시다.

#include <iostream>

using namespace std;

struct student {
private:
  int id;
  char *name;
  float percentage;
public:
  void Show();
  void SetInfo(int _id, char * _name, float _percentage);
}; // 구조체 뒤에 세미콜론이 와야함
 
void student::Show() {
  cout << "아이디: " << id << endl;
  cout << "이름: " << name << endl;
  cout << "백분율: " << percentage << endl;
}

void student::SetInfo(int _id, char * _name, float _percentage)
{
	id = _id;
	name = _name;
	percentage = _percentage;
}

int main() {
	student s;
	//s.id = 1;

	s.SetInfo(1, "김철수", 90.5);
	s.Show();
  return 0;
}

결과:

아이디: 1
이름: 김철수
백분율: 90.5
계속하려면 아무 키나 누르십시오 . . .

여기서 6행과 10행을 보시면, 각각 private와 public 지시자가 쓰였습니다. 이는, 멤버 변수인 id, name, percentage의 접근이 private로 제한되었음을 의미합니다. 그리고 지시자를 쓸때는 private:, public: 이런식으로 지시자 뒤에 :를 붙여서 사용합니다. 그리고 Show, ShowInfo는 public 지시자로 지정되었죠.


30행을 보시면 s.id = 1;이란 코드가 주석처리 되어있는것을 보실 수 있습니다. 위에서 private 지시자는 외부에서 접근할 수 없고, 내부에서만 접근이 가능하다는 것이라고 알고 있었죠? 7행을 보시면 id는 접근이 private로 제한되어 있으므로, 내부가 아닌 외부에서는 접근을 할 수 없습니다. 만약 접근을 하려 한다면 컴파일러는 아래와 같은 오류를 내보낼 것입니다.


오류 1 error C2248: 'student::id' : private 멤버('student' 클래스에서 선언)에 액세스할 수 없습니다. c:\users\h4ckfory0u\documents\visual studio 2012\projects\consoleapplication59\consoleapplication59\소스.cpp 30 1 ConsoleApplication59


32행을 보시면 함수를 이용해 구조체 내의 변수에 접근을 하고 있습니다. 이렇게 함수를 통해 우리가 입력한 값이 대입되고 난 뒤에, 33행의 Show 함수를 거쳐 아이디, 이름, 백분율을 출력하고 프로그램은 종료됩니다. 아시겠나요? 다시한번 말하자면 private 지시자는 외부에서 접근할 수 없고, public 지시자는 프로그램 어디서나 접근이 가능합니다. 


오늘 강좌는 여기서 마치도록 하겠습니다. 수고하셨습니다.


다음 강좌는 클래스(class)에 대해 배워보도록 하겠습니다.