구조체 등장 배경
C에서 배운 구조체는 연관있는 데이터를 묶어 관리하기 편리하게 만드는 문법적 장치였다. 예를 들어 학생에 대한 정보를 관리할 때 하나의 구조체 변수에 키, 나이, 성별, 이름 등등을 관리할 수 있다.
C에서 모두 배웠기 때문에 자세한 설명은 넘어가도록 한다.
구조체 안에 함수 삽입하기
C++과 C언어 구조체의 차이점 중 하나는 C++에서는 구조체 안에 함수를 넣을 수 있다.
#include <iostream>
using namespace std;
struct person{
void test()
{
cout<<"hi";
}
};
int main()
{
person p;
p.test();
return 0;
}
person이라는 구조체 안에 test() 함수가 입력되어있고, hi라고 출력하도록 되어있다.
이와 같이 구조체 안에 함수를 삽입할 수 있다.
이를 활용한 예시를 보도록 하자. 구조체 안에 변수가 있다면 이 변수의 값을 구조체 안의 함수가 그대로 활용할 수 있다.
#include <iostream>
using namespace std;
struct person{
int a;
test(){
cout<<a*10;
}
};
int main()
{
person p;
p.a=100;
p.test();
return 0;
}
- person이라는 구조체 안에는 a라는 변수와 test() 함수가 있다. 테스트 함수는 a 값에 10을 곱한 후 출력한다.
- 실행 해 보면 test() 함수가 a 값을 그대로 사용하는 것을 알 수 있다.
C++ 구조체 선언
C에서는 다음과 같이 구조체를 선언하였다.
struct Person{
int age;
};
int main(){
struct Person p;
}
struct Person p;로 선언한다.
이 때 Person p;로 간단히 선언하고 싶다면, typedef를 선언해왔다. 바로 아래처럼이다.
아래 typedef struct p에서 p는 있어도 되고, 없어도 된다. 맨 마지막에 붙는 Person으로 선언할 수 있다.
typedef struct p{
int age;
}Person;
int main(){
Person p;
}
C++에서는 이러한 typedef 없이 선언이 가능하다.
struct Person{
int age;
};
int main(){
Person p;
}
구조체 안에 함수 삽입
구조체에 함수를 삽입하고 함수를 이용하는 방법을 알아보자.
struct Person{
int age;
int height;
void ShowInfo()
{
std::cout<<age<<std::endl;
std::cout<<height<<std::endl;
}
};
int main(){
Person p={1,2};
p.ShowInfo();
Person c={3,4};
c.ShowInfo();
}
struct Person 구조체 안에 void ShowInfo(); 함수가 정의되었다.
이 때 age와 height를 출력하고 있다. 이 때! 다른 것 없이 그대로 age와 height 변수를 참조할 수 있다.
구조체 내에서 직접 접근할 수 있는 것이다.
아래를 살펴보자.
int main(){
Person p={1,2};
p.ShowInfo();
Person c={3,4};
c.ShowInfo();
}
Person p와 Person c를 각각 1,2 / 3,4로 초기화하였고, 이를 Person 구조체 내의 함수인 ShowInfo(); 를 통해 출력할 수 있다.
출력값은 아래와 같다.
1
2
3
4
구조체 안에 enum 삽입
아래 내용에서 CUSTOMER_MAX는 4로 define되어있고 이를 구조체 내에 date의 크기를 정의하는 데 쓰이고 있다.
#include <iostream>
#define CUSTOMER_MAX 4
struct Person{
int age;
int height;
int date[CUSTOMER_MAX];
};
하지만 여기서 CUSTOMER_MAX는 Person이라는 구조체 내에서만 필요한 매크로이므로, enum으로 정의하여 사용한다.
아래와 같이 enum으로 구조체 내에서 정의한다면 구조체 내에서만 유효한 상수가 된다.
#include <iostream>
struct Person{
enum{
CUSTOMER_MAX = 4
};
int age;
int height;
int date[CUSTOMER_MAX];
};
main을 아래와 같이 정의한다면,
int main(){
Person p;
std::cout<<CUSTOMER_MAX;
std::cout<<p.CUSTOMER_MAX;
}
첫 째줄의 std::cout<<CUSTOMER_MAX;는 오류가 발생하고,
두번째줄의 std::cout<<p.CUSTOMER_MAX;는 정상적으로 4 값을 표출한다.
외부로 함수 빼기
구조체 내에 함수를 정의할 때, 선언만 하고 정의는 이후에 할 수 있다. 이렇게 하는 이유는 구조체를 봤을 때 복잡한 함수 내용 하나하나를 보는 것이 아니라 구성만 빠르게 판단할 수 있기 때문이다.
아래 구조체를 보자.
struct Person{
int age;
int height;
void print_age();
void print_height();
};
print_age함수와 print_height 함수가 있다. 이 둘은 age와 height를 출력하는 함수로 보인다. 구조체가 간단하다. 그리고 함수 정의는 그 뒤에 해 줄 수 있다. 함수 이름 앞에 Person::을 붙이는 것을 확인하자.
struct Person{
int age;
int height;
void print_age();
void print_height();
};
void Person::print_age(void){
cout<<age<<endl;
}
void Person::print_height(void){
cout<<height<<endl;
}
전체 코드는 아래와 같다.
#include <iostream>
using namespace std;
struct Person{
int age;
int height;
void print_age();
void print_height();
};
void Person::print_age(void){
cout<<age<<endl;
}
void Person::print_height(void){
cout<<height<<endl;
}
int main(){
Person p;
p.age=1;
p.height=2;
p.print_age();
p.print_height();
}
p.print_age();와 p.print_height();의 출력 결과는 아래와 같다.
1
2
함수를 구조체 내에 직접 정의하면 inline처리가 되는 데, 밖으로 빼면 inline처리가 되지는 않는다. 따라서 구조체 내에 직접 정의하고 싶은 효과도 같이 내고 싶다면, 아래처럼 정의하자.
inline void Person::print_age(void){
cout<<age<<endl;
}
inline void Person::print_height(void){
cout<<height<<endl;
}
'C C++ > C언어 기초' 카테고리의 다른 글
C언어 # - 연산자 2 증가연산자, 감소연산자, 관계연산자 (0) | 2023.05.01 |
---|---|
C언어 # - 연산자 - 1 (대입연산자, 산술연산자, 복합대입연산자) (0) | 2023.04.25 |
C언어 # - 주석 달기 (0) | 2023.03.15 |
[C/C++] 동적 메모리 할당 (malloc 함수, calloc 함수, realloc 함수) (0) | 2022.07.09 |
C언어의 메모리 구조 (0) | 2022.07.09 |
댓글