# 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으로 명시하지 않았다면 외부에서 사용할 수 없습니다.
'Lang > C++' 카테고리의 다른 글
[C++] 컨테이너 어댑터 Stack (0) | 2022.12.07 |
---|---|
[C++] STL 연관 컨테이너 Map (0) | 2022.12.01 |
[C++] STL Vector (0) | 2022.11.22 |