관리 메뉴

JIE0025

[C++] 구조체 본문

기타 학습/Language

[C++] 구조체

Kangjieun11 2022. 5. 10. 17:35
728x90

구조체는 연관있는 데이터를 하나로 묶어주는 씨언어 문법중 하나였다. 

 

구조체 선언, 구조체 변수 선언

struct book
{	
    char title[20];
    char author[20];
    int price;
};

struct Book mybook;

 

book 이라는 구조체를 만드는 예제이다. 

- 구조체 선언시엔 반드시 마지막에 세미콜론(;) 을 써주어야한다. 

- 구조체 안에 있는 변수는 구조체 멤버라고 한다. 

 

 

구조체 멤버로 접근

구조체변수.멤버

myBook.author

 

 

구조체 변수 초기화

구조체변수 = {멤버1초기값, 멤버2초기값...}

mybook = {"C++","윤성우",30000}

 

 

함수와 구조체

1) 함수의 인수로 구조체의 인수를 전달> 구조체의 복사본을 이용해 작업함

struct wallet{

    int card;
    int cash;
};

int calculation (int money, int used){
	return money - used;
}

int main(){
	
    wallet myWallet = {100000, 200000};
    
    int current= 0;
    current = calculation(myWallet.cash + myWallet.card, 30000);
    
    cout << current <<endl;
	
	return 0;
}

 

2) 구조체의 주소를 전달  > 호출된 함수에서 원본 구조체에 직접 접근

struct wallet{

    int card;
    int cash;
};

int calculation (wallet * w, int used ){
	int all = w -> cash + w ->card
    return all - used;
}

int main(){
	
    wallet myWallet = {100000, 200000};
    
    int current= 0;
    current = calculation(&myWallet, 30000);
    
	......
	
	return 0;
}

 

 

 

중첩 구조체 + + 구조체에 함수 정의

구조체 정의시 멤버로 다른 구조체를 포함할 수 있다.  

 

#include <iostream>
#include <string>

using namespace std;

struct Person {
	int age;
	string name;
	string address;
};

struct PartTimer {
	int salary;
	struct Person p;
	void sayHello() {
		cout << "hello" <<endl;
	}
};

int main() {
	struct Person hong = { 20, "gildong", "seoul" };
	struct PartTimer manager = { 3000000, hong };

	cout << "매니저 이름은 " << manager.p.name <<endl;
	manager.sayHello();

	return 0;
}

- 모든 PartTimer 구조체 변수는  sayHello라는 함수를 공유한다. 

각각의 변수가 자신의 함수를 가진 것과 같은 효과와 결과

 

 

 

 

enum 상수

구조체 내에서만 유효한 상수를 정의하기 위해 enum을 사용한다.

#include <iostream>
#include <string>

using namespace std;

struct Car {
	enum
	{
		ID = 1,
		MAX_SPEED = 200
	};
} c;
int main() {

	cout << c.ID;

	return 0;
}

 

 

구조체 함수 외부에 정의

#include <iostream>
#include <string>

using namespace std;

struct Car {
	enum
	{
		ID = 1,
		MAX_SPEED = 200
	};

	void ShowCarState();
	void Accel();
} c;

void Car::ShowCarState() {
	// show car state
}
void Car::Accel() {
	// accel
}

 

위의 예제를 보면 알수있겠지만

구조체 밖에 함수를 정의할경우

1) 구조체이름 :: 함수이름 (){ }   으로 정의

2) 구조체 안에 함수정의시 무조건 인라인 처리 되는데, 이 의미가 사라짐 >> 인라인 유지하기 위해 inline 키워드 사용해서 명시적으로 처리해줘야한다. 

 

인라인 함수 내용은 여기~!

inline : C++에서  C언어의 매크로함수의 기능을 그대로 이어받지만 보통 정의하는 함수와 같이 선언하는 함수

https://jie0025.tistory.com/172?category=1023432 

 

[C++] 매크로 함수와 인라인 함수 (macro, inline function)

매크로 함수? 씨언어에서 아주 간단하게 정의하는 함수 #define 함수이름(인자이름) ( 리턴할 값 ) - 매크로함수는 자료형에 의존적이지 않다. - 그러나 복잡한 return 값이 생길 경우 정의하기가 쉽

jie0025.tistory.com

 

 

 

c++ 은 클래스의 일종으로 간주된다. ( 그래서 구조체 안에 함수 정의가 가능한것)

 

이제 클래스를 알아보자.