C++ 클래스 관련 주요 키워드 정리
이번 내용에서는 C++ 클래스에서 자주 사용되는 const, mutable, explicit 키워드와 함께, 캡슐화 인터페이스에서 효율적인 반환 방식에 대해 학습한다.
1. const 키워드
const의 목적
const는 C++ 코드를 더 안전하고 명확하게 만들어 주는 키워드이다.
기본 원칙:
변경하지 않는 것은 최대한 const를 붙인다.
특히 클래스 멤버 함수가 멤버 변수를 수정하지 않는다면 const 멤버 함수로 만드는 것이 좋다.
const 멤버 함수
예를 들어 고양이 클래스의 Speak() 함수가 멤버 변수를 변경하지 않는다면:
void Speak() const;
처럼 선언한다.
const 멤버 함수에서는:
- 멤버 변수 변경 불가
- const 객체에서도 호출 가능
이라는 특징이 있다.
const 객체와 멤버 함수 호출
const Cat kitty;
와 같이 const 객체를 만들면:
- const가 붙은 멤버 함수만 호출 가능
- 일반 멤버 함수 호출 불가능
하다.
이 이유는 컴파일러가 객체의 변경 가능성을 검사하기 때문이다.
mutable 키워드
mutable은 const 규칙을 예외적으로 무시하도록 만드는 키워드이다.
예:
mutable int count;
이렇게 선언하면 const 멤버 함수에서도 값을 변경할 수 있다.
하지만:
- const의 의미를 약화시킴
- 코드 안전성을 떨어뜨림
때문에 특별한 경우가 아니면 사용하지 않는 것을 권장한다.
2. explicit 키워드
implicit conversion 문제
C++에서는 인자가 하나인 생성자가 있으면 자동 형 변환이 발생할 수 있다.
예:
Cat(int age);
이런 생성자가 있을 때:
Cat kitty = 3;
이라는 코드가 가능하다.
컴파일러가 자동으로:
Cat kitty(3);
으로 변환하기 때문이다.
이를 implicit conversion(암시적 변환) 이라고 한다.
explicit 사용
이러한 자동 변환을 막기 위해 생성자 앞에:
explicit Cat(int age);
를 붙인다.
그러면:
Cat kitty = 3;
은 컴파일 오류가 발생하고,
반드시:
Cat kitty(3);
처럼 명시적으로 생성해야 한다.
explicit 사용 권장 기준
C++에서는:
인자가 하나인 생성자는 특별한 이유가 없다면 explicit을 붙이는 것이 좋다.
자동 변환으로 발생할 수 있는 예상하지 못한 오류를 방지할 수 있기 때문이다.
3. 기타 클래스 관련 키워드
C++에는 다양한 키워드가 있지만 클래스 학습에서 중요한 부분은 따로 있다.
static
클래스 멤버에서 사용하는 static은 별도로 다룸.
friend
friend는 클래스 외부 함수가 private 멤버에 접근할 수 있도록 허용한다.
하지만:
- 캡슐화 원칙을 약화시킴
- OOP 설계를 깨뜨릴 수 있음
때문에 필요한 경우가 아니라면 사용을 피하는 것이 좋다.
volatile
volatile은 컴파일러 최적화를 제한하는 키워드이다.
일반적인 클래스 설계에서는 자주 사용하지 않는다.
inline
함수 내용을 호출 위치에 삽입하는 최적화 관련 키워드이다.
클래스 개념보다는 컴파일 최적화 영역에 가깝다.
constexpr
컴파일 시간에 값을 계산할 수 있도록 하는 키워드이다.
상수 표현식 관련 기능이며 클래스 핵심 개념은 아니다.
4. 캡슐화 인터페이스와 반환 타입
클래스에서는 보통 private 멤버 변수를 숨기고 getter 함수를 통해 접근하도록 만든다.
예:
class Cat
{
private:
string name;
int age;
public:
string Name();
};
Return by Value
일반적인 반환:
string Name()
{
return name;
}
이 방식은 객체 복사가 발생할 수 있다.
특히 큰 객체라면 불필요한 비용이 발생한다.
Return by const Reference
더 효율적인 방법:
const string& Name()
{
return name;
}
특징:
- 복사 발생 X
- 원본 데이터를 그대로 참조
- 수정은 불가능
메모리 관점 비교
Return by Value
- 기존 string 존재
- 새로운 string 생성
- 문자열 데이터 복사
- 반환
→ 복사 비용 발생
Return by const Reference
- 기존 string 반환
- 참조만 전달
→ 복사 없음
언제 사용하는가?
작은 데이터:
int GetAge();
처럼 크기가 작은 타입은 값 반환이 적합하다.
큰 객체:
string GetName();
vector<int> GetData();
같은 경우:
const T& 반환
이 효율적이다.
핵심 정리
| 개념 | 특징 |
| const | 변경하지 않는 코드임을 명시하고 컴파일러 검사를 받음 |
| mutable | const 규칙을 예외적으로 무시 (사용 최소화 권장) |
| explicit | 생성자의 암시적 변환 방지 |
| friend | private 접근 허용, 캡슐화 약화 가능 |
| return by value | 복사가 발생할 수 있음 |
| return by const reference | 큰 객체 반환 시 효율적 |
최종적으로 기억할 점
- 변경하지 않는 멤버 함수에는 const를 붙인다
- 인자가 하나인 생성자는 explicit 사용을 고려한다
- mutable은 특별한 이유가 없으면 사용하지 않는다
- 큰 객체를 반환하는 getter는 const reference 반환을 고려한다
- C++의 목적은 문법을 지키는 것이 아니라 읽기 쉽고 안전하며 유지보수하기 좋은 코드 작성이다.
'Fundamental of CS > : : C++' 카테고리의 다른 글
| [Inheritance] C++ Inheritance (0) | 2024.07.16 |
|---|---|
| [OOP] DOP (Data-Oriented Programming) (0) | 2024.07.16 |
| [OOP] Function Overloading / Operator Overloading (0) | 2024.07.16 |
| [OOP] copy / move Constructor, Assignment (0) | 2024.07.16 |
| [OOP] Member Init List (0) | 2024.07.16 |