본문 바로가기

Lang/C++

[C++] 구조체를 확장하면? 클래스!

728x90

# C의 구조체는 서로 다른 타입의 집합입니다.

#include <iostream>
#include <string.h> 

struct Student{		// 구조체
	int age;
	char name[25];
};

void printStudent(Student s){
	printf("나는 %d살, %s입니다.\n", s.age, s.name);
}

int main() {
	Student s;
	s.age = 20;
	strcpy(s.name, "홍길동");
	printStudent(s);
	return 0;	
}
출력 결과: 나는 20살, 홍길동입니다.

 

# 여기에서 구조체 Student와 함수 printStudent 는 서로 상호의존적입니다.

Student는 printStudent가 없으면 화면에 출력할 수가 없고,

printStudent도 Student가 없으면 인수를 받을 수 없어 동작하지 않습니다.

 

이 구조체를 다른 프로그램에서 사용하려면 함수까지 같이 가지고 다녀야합니다.

 

C++은 이렇게 연관성있는 코드를 하나의 범위에 포함할 수 있도록 해줍니다.

이것이 바로 캡슐화입니다.

구조체가 다양한 타입의 변수를 가질 수 있듯이, 함수도 가질 수 있습니다.

#include <iostream>
#include <string.h> 

struct Student{
	int age;
	char name[25];
	
	void printStudent(){		// 밖에 있던 함수가 구조체 안으로 이동했습니다.
		printf("나는 %d살, %s입니다.\n", age, name);
	}
};

int main() {
	Student s;
	s.age = 20;
	strcpy(s.name, "홍길동");
	s.printStudent();
	return 0;	
}
출력 결과: 나는 20살, 홍길동입니다.

연관성있는 변수들과 함수를 하나의 구조체로 묶었습니다.

이렇게 구조체에 포함된 변수를 멤버 변수.

구조체에 포함된 함수를 멤버 함수라고 합니다.

 

printfStudent 함수가 구조체에 포함되면서 바뀐점 들

  • 인수를 받지 않는다. 
    printfStudent(s)   >>   printfStuden()

  • 함수 내부에서 소속 구조체를 명시하지 않는다.
    printf("나는.. \n", s.age, s.name)   >>   printf("나는.. \n", age, name)

  • 함수가 소속된 구조체 변수가 앞에 생겼다.
    printfStudent()   >>   s.printStudent()

이렇게 구조체가 함수를 포함했기에 스스로 동작할 수 있는 독립성이 생겼습니다.

이제 다른 프로그램으로 구조체를 가져가도 쉽게 재사용할 수 있습니다.

 

이것이 바로 OOP 캡슐화의 기본 개념입니다.

 

 

# 이렇게 멤버함수를 포함할 수 있게 되었다는 점에서 C의 구조체에 비해 의미가 확장되었습니다.

C++에서는 이렇게 확장된 구조체를 클래스(class) 라고 부르기로 했습니다.

 

그래서 구조체 선언문의 struct를 class로 바꾸면 클래스가 됩니다.

class Student{		// struct 부분을 class로 변경
public:			// 액세스 지정자가 추가됨
	int age;
	char name[25];
	
	void printStudent();	// 함수 원형만 선언하고 외부에 정의 함
};

구조체는 별다른 액세스 지정자가 없다면 기본적으로 public 속성을 가집니다.

C 언어와의 호환성때문입니다.

 

클래스는 디폴트 액세스 지정자가 private이기 때문에

public으로 명시하지 않았다면 외부에서 사용할 수 없습니다.

728x90

'Lang > C++' 카테고리의 다른 글

[C++] 컨테이너 어댑터 Stack  (0) 2022.12.07
[C++] STL 연관 컨테이너 Map  (0) 2022.12.01
[C++] STL Vector  (0) 2022.11.22