Language/C++

📌 Chapter 03 – 클래스 기초

e-cko 2025. 8. 6. 09:40
반응형
반응형

1. 구조체 (struct)

1) 구조체 개념과 C++에서의 확장

· 구조체(struct)는 관련된 데이터를 하나로 묶기 위한 문법이다.
· C
언어와 달리, C++에서는 typedef 없이도 구조체 변수를 선언할 수 있다.
· C++
에서는 구조체 안에 함수를 포함할 수 있다. (⚠️ C언어에서는 불가능)
·
구조체 안에 정의된 함수는 자동으로 inline 함수 처리된다.
·
, 구조체 외부에서 정의한 함수는 inline 처리가 되지 않는다. 이 경우 inline 키워드를 명시적으로 붙여야 한다.
·
구조체 내 함수는 구조체 내 멤버 변수에 직접 접근이 가능하다.
·
모든 구조체 변수는 구조체 함수(멤버 함수)공유한다.

C++에서는 구조체 내부에 enum 또는 enum class를 선언할 수 있다.
구조체 내부에 선언된 enum은 스코프가 격리되어 이름 충돌 방지에 유리하다.
하지만 복잡도가 올라갈 경우, namespace를 활용한 enum 선언이 더 가독성이 좋다.


💻 예제 코드 (구조체 + 함수 + enum class 포함)

#include <iostream>

 

struct Person {

    std::string name;

    int age;

 

    // 멤버 함수 선언

    void introduce();

 

    // 구조체 내부 enum class

    enum class Gender { MALE, FEMALE };

};

 

// 멤버 함수 정의 (구조체 외부)

inline void Person::introduce() {

    std::cout << "이름: " << name << ", 나이: " << age << std::endl;

}

 

int main() {

    Person p1 = {"홍길동", 30};

    p1.introduce();

 

    // enum class 사용 시 스코프 필요

    Person::Gender gender = Person::Gender::MALE;

    if (gender == Person::Gender::MALE) {

        std::cout << "성별: 남성" << std::endl;

    }

 

    return 0;

}


2. 클래스 (class)

1) 클래스 개념

· 클래스는 구조체와 문법상 거의 유사하며, struct 대신 class 키워드를 사용한다.
·
클래스와 구조체의 유일한 차이점은 접근 제한자의 기본값이다.
struct의 기본 접근 제어는 public
class의 기본 접근 제어는 private

2) 멤버 구성

· 클래스 안에 선언된 변수는 멤버 변수,
·
클래스 안에 선언된 함수는 멤버 함수라고 한다.
·
이 둘을 합쳐 하나의 단위로 사용하는 것을 객체(Object)라고 한다.
·
객체를 선언하면 해당 클래스의 틀을 기반으로 실체화된다.

3) 생성자

· 클래스는 생성자(Constructor)를 통해 초기화를 수행한다.
·
생성자는 클래스명과 동일한 이름을 가지며 반환형이 없다.
·
객체가 생성될 때 자동으로 호출된다.


4) 접근 제어 지시자

키워드 설명
public 어디서든 접근 가능
protected 상속 시 유도 클래스에서 접근 가능
private 클래스 내부에서만 접근 가능 (기본값: class)

🔸 :: 연산자는 스코프 지정 연산자(scope resolution operator)이며, 클래스 외부에서 멤버를 정의할 때 사용한다.


3. 파일 분할 (헤더와 소스 파일 분리)

· C++에서는 객체지향을 구현할 때, 보통 헤더(.h)와 소스(.cpp) 파일로 선언과 정의를 분리한다.
·
헤더 파일: 클래스 선언, 멤버 함수의 원형, 상수 등
·
소스 파일: 실제 함수의 정의, 실행 로직
· inline
함수는 호출 위치에서 코드가 삽입되어야 하므로 헤더 파일에 정의해야 한다.
·
최종적으로 링커가 각 소스를 하나의 실행 파일로 결합한다.


💻 예제 코드 (클래스 + 접근 제어 + 파일 분할 구조 예시)

🗂️ MyClass.h (헤더 파일)

#pragma once

#include <string>

 

class MyClass {

private:

    std::string name;

    int age;

 

public:

    MyClass(std::string name, int age);

    void printInfo() const;

};

 

🗂️ MyClass.cpp (소스 파일)

#include <iostream>

#include "MyClass.h"

 

// 생성자 정의

MyClass::MyClass(std::string name, int age) : name(name), age(age) {}

 

// 멤버 함수 정의

void MyClass::printInfo() const {

    std::cout << "이름: " << name << ", 나이: " << age << std::endl;

}

 

🗂️ main.cpp (메인 파일)

#include "MyClass.h"

 

int main() {

    MyClass obj("이순신", 45);  // 객체 생성

    obj.printInfo();           // 멤버 함수 호출

    return 0;

}


4. 객체지향 프로그래밍

· C언어는 절차지향(Procedure-Oriented) 언어이다.
· C++
객체지향(Object-Oriented) 언어이다.

⛏️ 객체지향의 구성 요소

객체(Object): 데이터(멤버 변수)와 기능(멤버 함수)을 묶은 실체
클래스(Class): 객체를 만들기 위한 설계도
메시지 전달(Message Passing): 객체 간 함수 호출을 통해 상호작용하는 방식
객체는 일반적인 선언 외에도 동적 할당으로도 생성 가능하다.


마무리 정리

1️ C++ 구조체는 함수 포함이 가능하며, 자동 inline 처리된다.
2️
class는 기본 접근 제어자가 private이고, struct public이다.
3️
멤버 변수와 함수는 객체 내부에서 직접 접근 가능하다.
4️
클래스는 생성자를 통해 멤버 변수 초기화를 수행한다.
5️
파일 분할 시 선언은 .h, 정의는 .cpp에 위치시킨다.
6️
inline 함수는 반드시 헤더 파일에 정의해야 한다.
7️
객체지향의 핵심은 클래스 기반의 데이터와 기능 통합이며, 메시지 전달로 객체 간 상호작용이 이루어진다.


✳️ 클래스를 기반으로 한 객체 설계는 대규모 소프트웨어 구조에 있어 필수적인 개념이다.
⚠️ 접근 제어자 기본값에 따른 접근 오류를 방지하려면 명시적으로 public, private을 선언하는 습관을 들이는 것이 좋다.

 

반응형