본문 바로가기

[게임 개발자를 위한 C++ 문법] Class 개념

@iamrain2025. 8. 14. 15:06

Class

일반적으로 완성된 프로젝트는 계속해서 사용되고, 유지 보수하는 기간과 수정에 필요한 비용이 함께 증가한다.

유지 보수하기 쉬운 코드를 만들기 위해서 객체지향적으로 코드를 작성해야 하는데, 대표적인 객체지향 언어로 `C++`과 `Java`가 있다.

 

객체지향에서는 클래스 `Class`를 사용하는데, 이 클래스는 일종의 포장 같은 것이다.

세부적인 사항을 숨기고 필수적인 기능 또는 동작만 공개하게 만들어서 변화에 유연하게 대처하고 재사용성을 높힐 수 있다.

 

클래스에서 필요한 동작은 멤버 함수로 정의하고 세부 데이터는 멤버 변수로 관리한다.

  • 멤버 함수
    필요한 동작. 외부에서 접근 가능.
  • 멤버 변수
    세부 데이터. 외부에서 접근 불가능.

Class 내부 구현

클래스의 멤버 함수를 구현하는 방법은 2가지가 있다.

  • 클래스 내부에서 멤버 함수의 본문까지 직접 정의
#include <iostream>
#include <string>

using namespace std;

class ClassName
{
	double memberFun()
	{
		return memberVal / 1.0;
	}
    
	int memberVal;
};
  • 클래스 내부에서 멤버 함수의 선언만 작성. 클래스 외부에서 구현.
#include <iostream>
#include <string>

using namespace std;

class ClassName
{
	double memberFunc;
    
	int memberVal;
};

double ClassName::memberFunc();
{
	return memberVal / 1.0;
}
`C++`에서 클래스 정의는 선언문으로 취급한다. 따라서 마지막에 세미콜론 `;`을 넣어줘야 한다.
그렇지 않으면 이후에 오는 내용을 클래스 정의에 포함된다고 인식하기 때문이다.

접근 제어

구현한 클래스의 멤버에 접근할 때 객체 뒤에 멤버 접근 연산자 `.`을 사용한다.

 

클래스는 접근 지정자를 사용하여 멤버의 접근 권한을 제어할 수 있다.

`C++`의 접근 지정자로 `public`, `private`, `protected`가 있다.

 

접근 지정자를 명시하지 않으면 기본적으로 `private`으로 설정된다.

  • `private` 멤버는 클래스 외부에서 직접 접근할 경우 컴파일 에러가 발생한다.
  • `public` 멤버는 클래스 외부에서 멤버 접근 연산자로 접근할 수 있다.

getter와 setter

`private`에 있는 변수를 제어해야 할 때, 직접 변수에 접근하지 않고 `getter` / `setter` 함수를 통해 제어할 수 있다.

값을 가져올 때 `getter`, 멤버 변수를 바꿀 때 `setter`를 사용하면 된다.

생성자

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

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

 

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

 

정의된 `class`를 변수로 선언하면 메모리에 올라가고 이를 객체라고 한다.

이렇게 메모리에 올리는 행위를 인스턴스화라고 한다.

객체가 생성될 때, 멤버 변수를 포함해 필요한 정보들이 메모리에 올라가고 이 작업이 완료되면 생성자가 호출된다.

 

매개변수가 있는 생성자의 경우, 생성자를 선언하고 정의하지 않으면 컴파일 에러가 발생한다.

매개변수가 있는 생성자를 선언하고 기본 생성자를 선언하지 않은 경우, 기본 생성자를 호출하면 에러가 발생한다.

코드 나누기

내부 구현은 사용자가 알 필요가 없는 부분이므로 보통 클래스의 선언부(헤더)구현부(소스 파일)로 구분한 뒤, 필요한 곳에서 헤더를 `include`하여 제공하는 방식을 사용한다.

`#ifndef`, `#define`, `#endif`

  • `#ifndef 헤더`
    헤더가 정의되어 있지 않은 경우에만 아래 코드를 수행하라는 의미
  • `#define 헤더`
    헤더를 정의한다는 뜻. `#ifndef`일 때만 `#define`이 수행되므로 단 한 번만 수행될 수 있다.
  • `#endif`
    `#ifndef`가 끝나다는 의미
iamrain
@iamrain :: Annals of Unreal

iamrain 님의 블로그 입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차