일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- jupyter
- Python
- dart 언어
- 유니티
- 플러터
- HTML
- c#
- C++
- C언어 포인터
- Unity
- c# winform
- c# 윈폼
- 다트 언어
- vim
- c# 추상 클래스
- docker
- Flutter
- c언어
- gitlab
- 도커
- 포인터
- Algorithm
- 구조체
- github
- Houdini
- git
- Data Structure
- 깃
- jupyter lab
- C# delegate
- Today
- Total
nomad-programmer
[Programming/C++] 클래스에 넣을 수 있는 것들 본문
멤버 변수와 멤버 함수 외에 클래스의 정의 안에 포함할 수 있는 것들이 있다. 그 중에서도 자주 사용하는 열거체와 typedef에 대해 알아보자.
열거체
클래스의 정의 안에 열거체를 넣는 것은 클래스 밖에서 정의하는 것과 크게 다르지 않다. 클래스에 소속된다는 점에서 차이가 있을 뿐이다. 예를 들어 클래스의 안에서만 사용하거나 클래스와 관련된 열거체의 경우에는 클래스의 소속으로 두는 것이 좋다. 관련된 것은 끌어 모을수록 좋은 것이다.
다음의 예제를 보자. x, y값의 범위를 열거체를 사용해서 정의했다. 상수 대신 심볼을 사용하면 소스 코드를 읽기도 쉽고 관리하기도 쉽다.
#include <iostream>
#include <string>
using namespace std;
class Point{
public:
enum {MIN_X=0, MAX_X=100, MIN_Y=0, MAX_Y=100};
// 멤버 함수
void Print() const;
void Offset(int x_delta, int y_delta);
void Offset(const Point& pt);
// 생성자
Point();
Point(int initialX, int initialY);
Point(const Point& pt);
// 접근자
void SetX(int val);
void SetY(int val);
int GetX() const {return x;};
int GetY() const {return y;};
private:
// 멤버 변수
int x, y;
};
inline void Point::SetX(int val){
if(val < MIN_X) x = MIN_X;
else if(val > MAX_X) x = MAX_X;
else x = val;
}
inline void Point::SetY(int val){
if(val < MIN_Y) y = MIN_Y;
else if(val > MAX_Y) y = MAX_Y;
else y = val;
}
int main(int argc, const char * argv[]) {
return 0;
}
만약에 이 열거체의 심볼을 클래스의 외부에서 참조하고 싶다면 영역 지정 연산자를 사용해서 Point::MAX_X 와 같은 방식으로 사용할 수 있다. 하지만 그것도 이 열거체가 public으로 지정되었을 때문 가능한 일이다. 열거체를 private나 protected로 지정한 경우에는 외부에서 접근할 수 없다.
static const 멤버 변수의 사용
클래스 안에서 사용할 심볼을 만드는 방법 중 static const 멤버 변수를 사용하는 방법도 있다. 정확하게 말하자면 const 속성을 가진 정적 멤버 변수라고 할 수 있다.
class Point{
public:
static const MIN_X = 0;
static const MAX_X = 100;
static const MIN_Y = 0;
static const MAX_Y = 100;
...
typedef
typedef도 마찬가지로 클래스 안에서만 통용하는 타입을 재정의하는 데 사용할 수 있다. Point 클래스를 보면 멤버 변수 x, y가 현재 int 타입인데 경우에 따라서는 실수 타입이 필요할 수도 있다. 그렇기 때문에 x, y의 타입을 typedef로 정의해두면 나중에 소스 코드를 수정하기가 쉽다.
#include <iostream>
#include <string>
using namespace std;
class Point{
public:
enum {MIN_X=0, MAX_X=100, MIN_Y=0, MAX_Y=100};
// 좌표 타입
typedef int COOR_T;
// 멤버 함수
void Print() const;
void Offset(COOR_T x_delta, COOR_T y_delta);
void Offset(const Point& pt);
// 생성자
Point();
Point(COOR_T initialX, COOR_T initialY);
Point(const Point& pt);
// 접근자
void SetX(COOR_T val);
void SetY(COOR_T val);
COOR_T GetX() const {return x;};
COOR_T GetY() const {return y;};
private:
// 멤버 변수
COOR_T x, y;
};
inline void Point::SetX(COOR_T val){
if(val < MIN_X) x = MIN_X;
else if(val > MAX_X) x = MAX_X;
else x = val;
}
inline void Point::SetY(COOR_T val){
if(val < MIN_Y) y = MIN_Y;
else if(val > MAX_Y) y = MAX_Y;
else y = val;
}
int main(int argc, const char * argv[]) {
return 0;
}
멤버 변수 x, y의 타입과 관련된 것은 모두 COOR_T로 바꿨다. 기존의 소스 코드와 완벽하게 동일하다. COOR_T가 결국은 int타입이기 때문이다. 하지만 나중에 x, y의 타입을 float으로 바꾸고 싶다면 다음과 같이 수정하면 된다.
typedef float COOR_T;
이렇게 멤버 함수와 멤버 변수만이 아니라 열거체, typedef 같은 것들도 클래스와 관련된 것이라면 클래스의 정의 안쪽에 위치시키는 것이 좋다. 소프트웨어 공학 용어 중에 응집력(Cohesion)이라는 것이 있는데 관련된 것들이 얼마나 잘 모여있는지를 일컫는 말이다.
응집력이 좋을수록 좋은 프로그램이 된다.
소프트웨어 공학의 기본적인 규칙
객체지향 프로그램의 개넘이 나오기 이전부터 소프트웨어 공학에서 주장하는 가장 기본적인 규칙이 바로 응집력(Cohesion)을 높이고 연관성(Coupling)을 줄이는 것이다.
응집력을 높이는 것은 방금 설명한 것처럼 관련된 것을 한 곳에 모아서 함께 관리하는 것을 말한다. 연관성을 줄이는 것은 관련 없는 것끼리는 서로를 모르게 만드는 것을 말한다. 이는 객체지향 프로그래밍에서의 정보 은닉과 상당히 비슷한 의미다. 약속된 부분 외의 세부적인 내용을 감춤으로써 객체 간의 관계를 최대한 단순하게 유지해야 한다.
사전적인 의미로는 Coupling을 '결합성' 정도의 용어로 해석하는 것이 알맞겠지만 비슷한 의미로 연관성이라고 표현했다.
'Programming > C++' 카테고리의 다른 글
[Programming/C++] const 멤버 함수와 비 const 멤버 함수 (0) | 2023.01.19 |
---|---|
[Programming/C++] C++ Standard Library (aka. STL) (0) | 2023.01.19 |
[Programming/C++] 정적 멤버 함수에서 객체 생성 (0) | 2023.01.17 |
[Programming/C++] virtual, override, final 키워드 (0) | 2023.01.16 |
[Programming/C++] 멤버 함수에 대한 포인터 (0) | 2023.01.16 |