구조체(Struct)
어떤 객체를 표현할 때 1가지의 변수만으로 해당 객체를 표현하기 힘든 경우가 있다. 예를 들어 사람이라는 객체를 표현하려고 할 경우 이름, 나이, 성별, 키, 몸무게 등 다양한 정보에 대한 변수가 필요하게 된다.
// 이름, 나이, 성별, 키, 몸무게
string name;
int age;
string sex;
int height;
int weight;
사람이 1명뿐이라면 이렇게 5개의 변수를 하나하나씩 선언하여 사용해도 상관없지만, 사람이 10명, 혹은 100명이 되어 더 많아진다면 사람이 추가될 때 마다 새로운 변수를 5개 씩 만들어줘야한다. 이러한 점을 해결하기 위해 C++에서는 여러 개별 변수(이름, 나이, 성별 키, 몸무게)를 하나로 그룹화하여 데이터 유형으로 생성할 수 있는 구조체(Struct)를 제공한다.
구조체(Struct)는 다양한 타입의 변수 집합(int, string, float 등) 을 하나의 타입으로 나타낸 것이라고 이해하면 된다. 이 때 구조체(Struct)를 구성하는 변수(이름, 나이, 성별, 키, 몸무게) 등을 구조체(Struct)의 멤버, 혹은 멤버 변수라고 한다.
즉, 구조체는 사용자가 하나 이상의 기본 타입을 가지고 새로운 자료형을 정의하는 사용자 정의 타입이다.
구조체(Struct)의 선언 및 정의
구조체의 선언 문법은 아래와 같다.
struct 구조체 이름
{
타입(int, float, string 등) 멤버변수1;
타입(int, float, string 등) 멤버변수2;
};
예를 들어 사람이라는 구조체를 만든다고 하면 아래와 같다.
struct Human
{
string name;
int age;
string sex;
int height;
int weight;
};
이를 메인함수에서 원하는 이름으로 선언하여 사용하면 된다
int main()
{
Human A; // Human이라는 구조체를 A라고 명명한다.
}
구조체(Struct)의 접근 및 초기화
구조체 멤버에 접근하기 위해서는 연산자(.)를 이용하여 접근한다.
int main()
{
Human A; // Human이라는 구조체를 A라고 명명한다.
A.name = "홍길동";
A.age = 20;
A.sex = "Male";
A.height = 178;
A.weight = 78;
}
그렇지만 위와 방법으로 하나하나 선언하며 진행할 경우 매우 번거로운건 여한가지이다. 이를 통해 구조체(Struct)를 선언할 때 초기화 하는 방법도 존재한다.
int main()
{
Human A = {"홍길동", 20, "Male", 178, 78};
}
클래스(Class)
클래스는(Class) 구조체(Struct)와 마찬가지로 특정 객체를 생성하기 위해 변수(멤버 변수)와 메서드로 구성됩니다. C++ 에서 클래스(Class)는 구조체(Struct)의 상위 호환으로 이해할 수 있습니다. 구조체(Struct)와 다른 점은 접근 제어 지시자(public, private, protected)가 추가 되었고, 함수를 포함할 수 있게 된 점입니다.
클래스(Class)의 선언 및 정의
클래스의 생성 문법은 다음과 같습니다.
class 클래스 이름
{
public: // (접근 제어 지시자)
멤버 변수;
멤버 변수;
}
생성 문법을 바탕으로 하나 생성하면 다음과 같습니다
class MyCar
{
private:
// 멤버 변수
int fuel = 0;
bool power = false;
public:
// 메소드
void go()
{
this -> fuel--;
}
void oiling(int n)
{
this -> fuel += n;
}
void fuel_check()
{
std::cout << "연로 : " << fuel << std::endl;
}
};
클래스(Class)의 접근 및 초기화
클래스의 생성 또한 구조체와 유사합니다. 아래는 클래스의 생성 및 메서드 호출 예제입니다.
int main()
{
Mycar car = MyCar(); // 클래스 생성
// 메서드(함수) 호출
car.iling(100);
car.huel_check();
for (int i = 0; i < 10; i++)
{
car.go();
}
}
구조체(Struct)와 클래스(Class)의 차이점
이 둘은 특정 객체를 생성하기 위해 사용자가 임의의 사용자 변수를 만든다는 것은 기본적으로 동일합니다. 또한 구조체(Struct)와 클래스(Class) 모두 생성자와 소멸자를 가질 수 있습니다.
그렇지만 구조체(Struct)에는 기본적으로 공용 멤버와 메서드가 있으며, 클래스(Class)에는 기본적으로 전용 멤버와 메서드가 있다는 점이 다릅니다. 따라서 본질적으로는 구조체(Struct)와 클래스(Class)의 유일한 차이점은 멤버의 기본 엑세스 접근 수준입니다.
하지만 조금 더 자세하게 얘기하면 구조체(Struct)의 멤버 변수는 기본적으로 공개이며, 클래스(Class)의 멤버 변수는 기본적으로 비공개입니다. 즉 클래스(Class)에서는 각 멤버 변수에 액세스 수준을 지정하기 위해서는 접근 제어 지시자를(예:public, private 등)을 사용해야 하지만, 구조체(Struct)에서는 접근 제어 지시자를 사용하지 않고도 멤버 변수에 직접 접근할 수 있습니다.
또 다른 중요한 차이점은 C++에서 클래스(Class)와 함께 상속을 사용할 수 있지만, 구조체(Struct)에서는 사용할 수 없다는 것입니다. 즉, 클래스(Class)에서는 클래스(Class)가 멤버와 메서드를 상속할 수 있는 기본 클래스(Class)를 지정할 수 있지만, 구조체(Struct)에서는 상속을 사용할 수 없습니다.
정정합니다. 클래스도 상속할 수 있지만, 구조체 또한 상속할 수 있습니다. 잘못된 정보를 제공드려 죄송합니다. 😥
출처 : https://min-zero.tistory.com/21
출처 : https://coding-factory.tistory.com/697
'공부 > C++' 카테고리의 다른 글
가상 함수(Virtual Function)와 가상 함수 테이블(Virtual Function Table) 개념 및 차이 (0) | 2022.12.22 |
---|---|
Vector resize, reserve의 차이점 (0) | 2022.12.21 |
포인터(Pointer)와 참조자(Reference)의 차이 (1) | 2022.12.20 |
Vector push_back과 emplace_back의 차이 (0) | 2022.12.16 |
열거형(enum)과 열거형 클래스(enum class)의 개념, 사용법, 차이점 (0) | 2022.12.14 |