관리 메뉴

Kim's Programming

C++ - 클래스(Class)(2/2) 본문

Programming/Cplusplus

C++ - 클래스(Class)(2/2)

Programmer. 2015. 8. 28. 19:01
인스턴스

클래스는 어디까지 타입일 뿐이지 그 자체가 정보를 저장하는 변수는 아닙니다. 구조체를 선언한다고해서 구조체 변수가 생기는 것이 아닌 것처럼 클래스를 선언한다고 해서 실제로 값을 기억할 수 있는 메모리가 할당되지 않습니다. 클래스 선언은 어떤 타입의 어떤 멤버들이 포함되어 있는지를 컴파일러에게 알리는 역할만 할 뿐이며 클래스형의 변수를 선언해야 실제 메모리가 할당됩니다.


Position Here;

Complex C;


Position Here; 선언에 의해 Position 타입의 변수 Here가 메모리에 생성되며 이후 Here는 특정 위치를 가지는 문자 하나에 대한 정보를 기억할 수 있습니다. Complex C; 선언문은 복소수를 기억하는 변수 C를 생성합니다. int i;선언에 의해 정수형 변수 i가 생성되고 double d에 의해 실수형 변수 d 가 생성되는 것과 마찬가지입니다. int i선언문에서 i 가 4바이트가 할당되는 대상인것이지 int 는 아닙니다. 선언문에 의해 생성된 클래스형의 변수를 인스턴스(Instance)라고 합니다. 인스턴스는 클래스가 메모리에 구현된 실체이며 우리가 지금까지 변수라고 불러왔던 개념과 똑같습니다. Here은 Position형의 인스턴스이며 C는 Complex형의 인스턴스 입니다. 기본형에 대해서도 똑같은 용어가 적용되는데 i는 int형의 인스턴스 등 이라고 할 수 있습니다. 클래스가 표현하는 정보를 실제로 기억하고 관리하는 주체가 바로 인스턴스이며 프로그래밍 대상은 클래스가 아니라 인스턴스입니다. 한 글래스에 대해서 여러 인스턴스를 동시에 생성이 가능합니다.


Complex A,B,C;


이 선언에 의해 Position형의 인스턴스 A,B,C가 메모리에 각각 생성됩니다. int i,j,k;선언에 의해 3개의 정수형 변수가 생성된것과 같은 의미입니다. 이때 각 인스턴스들은 클래스에 선언된 멤버 변수를 각각 따로 가집니다. 그래야 개별 인스턴스가 독립적인 정보를 저장할 수 있는 다 다른값을 가져야 하기 떄문입니다. 만약 같은 메모리를 점유중이라면 값이 달라질 수 없을 것입니다. 그래서 인스턴스의 실제 크기는 클래스에 선언된 모든 멤버 변수의 총 크기와 일치합니다. 독립된 정보 저장을 위해 멤버 변수는 각 인스턴스들이 따로 가지지만 멤버 함수는 클래스에 속한 모든 인스턴스들이 공유합니다. 인스턴스의 상태에 따라 달라질 수 있지만 동작은 모두 동일하기 떄문에 함수를 인스턴스별로 따로 가질 필요는 없습니다. 인스턴스의 다른 표현이 바로 오브젝트(object)입니다. 두 용어는 클래스형의 변수라는 같은 대상을 가리키지만 사용되는 문맥이 조금 다릅니다. 인스턴스는 클래스가 메모리상에 구현된 실체라는 뜻으로 사용되며 오브젝트는 프로그램을 구성하는 독립적인 부품이라는 뜻으로 사용됩니다.


오브젝트를 우리말로 번역시에 객체라고 하는데 직역느낌 때문에 개체라고 번역하기도 합니다.


 영어

 번역

 의미

 인스턴스(Instance)

 실체

 메모리에 구현되었습니다.

 오브젝트(Object)

 객체

 독립성을 가진 부품입니다.

이 말들을 종합해서 쉽게 표현하면 변수라고 할 수 있습니다.


클래스의 예


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
#include<stdio.h>
#include<time.h>
 
class Time
{
private:
    int hour, min, sec;
 
public:
    void setTime(int h, int m, int s)
    {
        hour = h;
        min = m;
        sec = s;
    }
    void OutTime()
    {
        printf("현재 시간은 %d:%d:%d 입니다. \n", hour, min, sec);
    }
};
 
void main()
{
    Time T;
    T.setTime(12323);
    T.OutTime();
}
cs

시간이란 시, 분, 초로 구성되어 있는데 Time 클래스는 이 속성들을 hour, min, sec 멤버 변수로 기억합니다. 시간을 설정하는 가능과 현재 저장된 시간을 문자열로 출력하는 동작을 SetTime, OutTime 멤버 함수로 표현합니다. 시간을 구성하는 요소가 세 개나 되기 떄문에 단순한 정수에 비해서는 훨씬 더 다루기 까다로운데 이렇게 클래스로 정의해놓으면 간편하게 사용할 수 있습니다. Time형 객체 Now를 선언하고 SetTime멤버 함수를 호출하여 시간을 설정하였습니다. 이 시간을 출력 할 필요가 있으면 OutTime함수만 호출하면됩니다. 필요하다면 시간값을 증가, 감소시키는 EllapseTime 함수와 시간끼리 비교하는 CompareTime을 작성할 수 있습니다. 시간이라는 개념적인 대상을 하나의 객체로 다룰 수 있으므로 시간을 함수의 인수로 전달하거나 다른 구조체의 멤버로 포함시키는 것도 가능합니다. 비슷한 방법으로 날짜를 다루는 Date형 클래스도 만들 수 있습니다. 날짜는 년, 월, 일의 요소로 구성되는데 월마다 일수가 다르고 2월의 경우 윤년의 영향을 받으므로 윤년을 계산하는 좀 더 복잡한 처리가 필요합니다. 꼭 사물만 표현 할 수 있는 것 뿐만 아니라 개념적인 것들도 모델링 할 수 있습니다. 다음 클래스는 인치와 밀리미터 단위로 길이를 표현합니다.

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
31
32
33
34
35
36
37
38
39
#include<stdio.h>
#include<time.h>
 
class Length
{
private:
    double mili;
public:
    void SetMil(double m)
    {
        mili = m;
    }
    double GetMili()
    {
        return mili;
    }
    void OutMili()
    {
        printf("길이 = %fmil\n", GetMili());
    }
    void SetInch(double i)
    {
        mili = i*25.4;
    }
    double GetInch()
    {
        return mili / 25.4;
    }
    void OutInch()
    {
        printf("길이 = %finch\n", GetInch());
    }
};
void main()
{
    Length Len;
    Len.SetInch(3);
    Len.OutMili();
}
cs

SetInch 함수는 인수 3에 25.4를 곱하여 3인치에 대한 밀리미터 값을 mili에 대입해 놓으며 이렇게 대입된 값을 OutMil로 출력하면 3인치가 몇 밀리미터인지 알 수 있습니다. 밀리미터로 넣고 인치를 구하는 반대의 변환도 물론 가능합니다. 클래스가 인치와 밀리미터의 관계를 정확하게 알고 있고 멤버 함수들이 두 단위 사이를 자동으로 변환하므로 사용하는 측에서는 세부 구현에 신경쓸 필요없이 멤버 함수로 원하는 단위의 값을 넣고 빼기만 하면 됩니다. 클래스가 변환 공식을 내부에 포함하고 있으므로 1인치가 25.4밀리미터라는 것을 몰라도 이 클래스를 이용할 수 있습니다. 여기에 기능을 더 추가한다면 포인트, 트윕스, 마일 등의 단위도 같이 다룰 수 있도록 확장가능합니다. Length클래스는 길이나 거리를 표현하는 여러 가지 단위와 복잡한 변환 공식을 멋지게 캡슐화하고 있는 것입니다. 많은 단위를 다룰려면 만들기는 번거롭지만 일단 완성되면 사용하기는 광장히 편리해집니다.

'Programming > Cplusplus' 카테고리의 다른 글

C++ - 파괴자(Destructor)  (0) 2015.08.30
C++ - 생성자(Constructor)  (0) 2015.08.29
C++ - 클래스(Class)(1/2)  (0) 2015.08.28
C++ - 구조체의 확장  (0) 2015.08.27
C++ 에서의 동적 할당 new/delete  (0) 2015.08.27