C++ < Class 개념 >

2026. 3. 5. 20:18TIL

현업에서 프로젝트를 할 때, 한 번 사용된 프로젝트는 쭉 사용되는 경우가 많다. 그렇기에 개발보다 유지 보수를 하는데 더 많은 시간을 사용하고, 수정 비용도 크게 늘어난다.

그래서 유지보수가 용이하고 재사용성 높게 코드를 구현해야 한다.

 

이를 위해서 C++의 객체지향 프로그래밍을 활용한다. 

객체지향의 시작으로 Class를 알아보자.

 

간단한 클래스의 형태이다.

위는 멤버함수, 아래는 멤버변수라고 한다.

 

그럼 클래스는 왜 사용하는가?

더보기

자동차를 예를 들어 설명하면, 자동차를 사용하는데 페달, 브레이크, 기어변속 등 핵심 기능만 사용할 수 있으면 자동차를 이용하는 데 전혀 문제가 없다.

하지만 엔진의 구조, 바퀴의 구조 등 자동차 회사마다 다른 자동차의 제조법을 전부 알아야 사용할 수 있다면 사용성이 떨어진다.

 

또한 코드를 작성할 때 발생할 수 있는 예외를 모두 고려해서 코드를 작성해야 하기에 길어지고, 복잡해져 가독성이 떨어진다.

필수적인 기능을 제외하고 세부 사항을 숨기는 것이 사용자와 개발자 모두에게 좋다.

 

세부사항 등은 클래스로 구현해 메인함수 내에는 핵심기능만 나오도록 하는 것이 보기에도, 관리하기에도 편하다.

 

클래스에서 필요한 동작은 멤버함수로 정의한다. 보통 멤버함수는 public으로 작성하여 외부에서도 접근하게 하는 것이 일반적이다.

 

세부 데이터는 멤버 변수로 관리한다. 멤버 함수에서 필요한 정보나 class 자체에서 내부 연산시 필요한 정보를 멤버 변수로 관리한다. 멤버변수는 내부에서만 사용하도록 private로 작성하는 것이 일반적이다.

 

그럼 클래스를 구현해보자.

클래스를 구현하는 방법은 크게 두 가지로 나뉜다.

 

  1. 클래스 내부에서 멤버함수와 함께 구현하는 방법
  2. 클래스 내부에서 함수만 선언하고 외부에서 구현하는 방법

본인은 Unity로 C#을 다룰 때 외부에서 작성하는 방법을 주로 사용했다.

 


접근 제어

위에서 설명했 듯 멤버함수는 보통 public, 멤버변수는 보통 private로 접근의 방법을 제한한다는 표현을 했다.

 

이 부분에 대해서 알아보겠다.

 

클래스의 멤버에 접근하는 방법은 객체 뒤에 멤버 접근 연산자 . 을 사용한다. 

이 접근을 제한하는 지정자는 다음과 같다.

  • public : 클래스 외부에서도 멤버 접근 연산자를 통해 접근할 수 있다.
  • private : 클래스 내부에서만 접근할 수 있고 외부에서 직접 접근할 경우 컴파일 에러가 난다.
  • protected : 같은 클래스 내부에서, 혹은 이 클래스를 상속받은 클래스에서만 접근할 수 있다.

이러한 접근 지정자를 통해 데이터를 보호하고 프로그램 구조를 더 안전하게 설계할 수 있다.
특히 게임 개발이나 대규모 프로그램에서는 캡슐화와 유지보수를 위해 매우 중요하게 사용된다.

 

이런식으로 사용할 수 있다.

 

그런데 예를 들어 학생 클래스 내에 점수를 입력받아야 하는 변수가 private로 지정되어 있으면 오류가 나게 될 것이다.

그러면 어떻게 접근해야 할까?

 

Getter, Setter

이때 사용하는 것이 Getter와 Setter이다.

  • Getter : 멤버 변수의 값을 가져오는 함수
  • Setter : 멤버 변수의 값을 변경하는 함수

다음과 같이 함수에 이름 앞에 get, set을 설정하여 사용하면 private에 접근할 수 있다.

 


생성자

생성자는 객체를 생성할 때 한 번씩 자동으로 호출되는 멤버 함수이다.

 

보통 생성자는 필요한 멤버 변수를 초기화하거나 객체가 동작할 준비를 하기 위해 사용한다.

 

생성자를 정의하는 방법은 반환형을 명시하지 않으며 class 이름과 동일한 이름을 가진 함수로 정의한다.

 

위에서 student s; 처럼 클래스를 변수로 선언하면 객체가 메모리에 올라가게 되는데, 이를 인스턴스화라고 한다.

이렇게 객체가 생성될 때 멤버 변수를 포함해 필요한 정보들이 메모리에 올라가게 되는데 이 작업 후에 생성자가 호출된다.

 

 

생성자는 이렇게 선언하고, 호출한다. 

 

 

User() 안에 매개변수를 넣으면 반드시 매개변수의 개수에 맞게 변수를 넣어 호출해야한다.

 

매개변수를 생성자 안에서 초기화하면 디폴트값이 저장되어 호출할 때 변수를 넣어 호출하지 않아도 디폴트 값이 호출되게 된다.

 


코드 나누기

클래스를 지금은 한 파일에 전부 선언 - 작성했지만, 내부에서 구현하는 방법은 사용자가 알 필요 없는 부분이므로 보통은 선언부분, 구현부를 분리해 필요한 곳에서 헤더파일을 include해서 가져오는 방식을 사용한다.

 

 

이런 형태로 왜 나누는 것인가?

처음에 작성할 때는 잘 몰랐다. 코드가 많아질수록 같은 클래스가 선언되는 경우도 있는데 중복으로 클래스가 선언되면 컴파일 에러가 난다.

그래서 파일을 나누고, 나눈 헤더파일에 #ifndef ~ #endif를 넣어 중복 선언을 방지한다.

 

#ifndef User_h_의 의미는 User_h_가 정의되어 있지 않은 경우에만 아래 코드를 수행한다는 의미이다.

 

그 아래에는 #define User_H_로 클래스를 정의할텐데, 클래스가 #ifndef가 있으면 정의되지 않았을 때만 이 함수가 실행되므로 중복 선언을 막고 한 번만 실행된다.

 

#endif는 #ifndef가 끝났다는 것을 알려준다.

 

이런식으로 나누어서 사용하고, 소스파일에 #include "User.h"를 헤드 부분에 선언하여 헤더 파일을 선언한다.

 


C++의 클래스와 클래스의 구조에 대해서 알아봤다.

 

클래스는 아직 많이 익숙하진 않지만 구조에 대해서는 명확하게 이해한 것 같다.

 

아직 많이 부족하고 어려운 부분이 많지만 자주 사용해보면 익숙해질 것 같다.