ProgramingLagnuage/C++

[C++] Class 주요 개념

TSpoons 2024. 9. 22. 07:00

1. 멤버 변수 (Member Variables)

  • 정의: 클래스의 인스턴스(객체)에 속하는 변수를 말합니다. 각 객체는 고유한 상태를 유지하기 위해 멤버 변수를 가집니다.
class Person {
public:
    std::string name;  // 멤버 변수
    int age;          // 멤버 변수
};

2. 멤버 함수 (Member Functions)

  • 정의: 클래스의 멤버 변수에 접근하거나 조작하는 기능을 가진 함수입니다. 객체에 대한 동작을 정의합니다.
class Person {
public:
    std::string name;
    int age;

    void introduce() {  // 멤버 함수
        std::cout << "안녕하세요, 제 이름은 " << name << "이고, 나이는 " << age << "세입니다." << std::endl;
    }
};

 


 

코드 구조

  • 클래스 안에서 정의:
    • 멤버 함수의 선언과 정의가 함께 있어서 코드가 더 간결하고 한눈에 보기 쉬움
    • 모든 코드가 한 곳에 있어 유지보수와 이해가 쉬움
class Example {
public:
    void show() {  // 클래스 안에서 정의
        std::cout << "Hello, World!" << std::endl;
    }
};

 

  • 클래스 밖에서 정의
    • 클래스와 함수의 정의가 분리되어 있어, 코드가 더 길어질 수 있지만, 함수 구현을 다른 파일로 분리하는 것이 더 유리할 때가 있습니다. 예를 들어, 큰 프로젝트에서 코드의 모듈화를 도와줍니다.
    • 정의를 나중에 구현하거나, 복잡한 로직을 가진 경우 더 명확하게 나눌 수 있습니다.
class Example {
public:
    void show();  // 클래스 안에서 선언
};

void Example::show() {  // 클래스 밖에서 정의
    std::cout << "Hello, World!" << std::endl;
}

인라인 함수

  • 클래스 안에서 정의된 함수는 컴파일러에 의해 인라인(inline) 함수로 간주될 수 있습니다. 이는 성능 최적화를 위해 호출되는 곳에 직접 코드가 삽입될 수 있음을 의미합니다. 단, 이 것은 컴파일러의 결정에 따라 다릅니다.

가독성과 유지보수

  • 가독성: 클래스 안에서 정의하면, 클래스의 전체적인 구조와 멤버 함수를 한눈에 파악할 수 있어 가독성이 좋아질 수 있습니다.
  • 유지보수: 클래스 밖에서 정의하면, 각 함수의 구현을 별도로 관리할 수 있어 코드의 유지보수가 용이할 수 있습니다. 대규모 프로젝트에서는 구현과 인터페이스를 분리하는 것이 좋습니다.

요약

  • 클래스 안에서 정의: 간결함과 가독성이 좋지만, 큰 프로젝트에서는 코드가 복잡해질 수 있음.
  • 클래스 밖에서 정의: 코드의 모듈화와 유지보수가 용이하지만, 가독성이 떨어질 수 있음.

각 방식은 상황에 따라 장단점이 있으므로, 프로젝트의 규모와 팀의 코딩 스타일에 따라 적절히 선택


3. 생성자 (Constructor)

  • 정의: 객체가 생성될 때 자동으로 호출되는 특수한 함수입니다. 객체의 초기 상태를 설정하는 데 사용됩니다.
  • 특징:
    • 클래스와 같은 이름을 가집니다.
    • 반환형이 없습니다.
    • 매개변수를 가질 수 있습니다.
class Person {
public:
    std::string name;
    int age;

    Person(std::string n, int a) {  // 생성자
        name = n;
        age = a;
    }
};

// 객체 생성
Person person("홍길동", 30);

4. 소멸자 (Destructor)

  • 정의: 객체가 파괴될 때 자동으로 호출되는 특수한 함수입니다. 메모리 해제 및 자원 정리에 사용됩니다.
  • 특징:
    • 클래스 이름 앞에 '~'를 붙입니다.
    • 반환형이 없고 매개변수를 가질 수 없습니다.
class Person {
public:
    std::string name;
    int age;

    Person(std::string n, int a) {
        name = n;
        age = a;
    }

    ~Person() {  // 소멸자
        std::cout << name << "의 소멸자 호출" << std::endl;
    }
};

// 객체 생성 후 파괴
{
    Person person("홍길동", 30);
}  // 이 블록을 벗어나면 person의 소멸자가 호출됨