1995.5.25

클래스는 과연 무엇인가..
학급이라는 뜻이 있다. -_-
끝.

그럼 클래스에 대한 잡담을 시작하겠음 ^____^
> *참고* 함수라는 의미
함수 Function은 코드의 묶음을 의미한다. 그러나 이 코드 묶음은
어떤 동일한 목적을 같은 코드의 묶음을 의미한다..
int x=0;

void print()
{
    x =5;
    printf("%d",x);
}

int main()
{
x =3;
print();
  return 1;
}

print()라는 함수를 보자 x값을 초기화 하고 있다...
이는 print라는 함수의 코드 동일성을 무시한 처사(?) 이다 --;
냐하.. 그러니까 이렇게 하지말구 프린트에 해당하는 함수는
프린트만 하도록 하는 것이 좋다.
별로 어렵지도 별거 아닌 내용이지만 이것은 중요한 이야기이다.


> 클래스와 객체(object, 오브젝)의 차이점

클래스와 객체는 마치 붕어빵틀과 붕어빵과 같은 관계이다

클래스는 그 클래스자료형이 정의되어도 메모리에 잡히는 일은 없다.

class X{
public:
int a;
};

이렇게 해도 아직 메모리상에 잡히는 일은 없다.
다음같이 변수로 해야 메모리에 잡히게 된다.

X x1;   // 메모리 할당을 받음.. X라는 클래스 자료형을 이용해 만든
            // x1이라는 변수

클래스 자료형으로 만든 변수를 우리는 객체라고 말하며
일반적으로 한 클래스를 통해 여러 객체가 생길수 있다.
그럼 클래스안에 정의된 모든 코드는 각 객체 마다 적재 되는것일까?
물론 그렇다 그러나 맴버자료만 모든 객체에 새로 할당되며
맴머 함수는 그렇지 않다. 즉, 맴버 함수는 여러 객체가 있다 하더라도
단 하나의 코드만 존재한다.

> 포인터 스토리 I    int형 포인터 char형 포인터 ???
포인터란 말 그대로 어떤 메모리상의 한 주소를 가리키는 변수이다.
즉 일반변수와는 달리 내용으로 들어가는 값이 일반 값이 이니라
메모리 주소가 되는 것이다. 이것이 일반주소와의 단 유일한 차이점이다.
아래같은 코드가 있다고 하자
int i; char c;
char* cp = &c;
int* ip = &i;

자 그럼 ip와 cp의 크기는 어떻게 될까? 솔직히 말해서
같다. 분명 int형 i와 char형 c는 다른  크기이다. i는 int형이므로
16비트컴파일러에서는 2바이트를 나타낼것이며 32비트에서는
4바이트를 나타내고 char형은 1바이트를 나타낼거이다. 하여간
서로간의 크기는 다름은 확연하다 그런데 왜 포인터 변수는 같은
크기가 되는 것일까?
그것은 메모리 주소의 한 주소만 가리키는데 필요한 포인터 변수이기에
메모리 주소를 나타내는 크기는 모두 같기 때문이다.
참고) sizeof(ip) ,sizeof(cp) 해보면 크기가 나온다. sizeof() 매크로는
          변수의 바이트 크기를 나타낸다 .

그럼 이제 또 다른 질문거리가 생긴다.
그럼 왜 같은 크기의 포인터라면 굳이 int형 char형 포인터라고 나누는
것일까???

> 포인터 스토리 II  메모리와  object   ( class와 object을 말하는것 아님 )

int* ip = &i;
*ip =3;
라는 코드가 있다고 하자. 이제 i에는 의심할 바 없이 3이라는 값이 들어간다.
그럼  왜 3이라는 값이 들어가는것일까?
먼저 ip포인터에 i의 메모리주소중 첫주소가 ip에 들어간다.
i의 첫주소라 함은 i는 정수이므로 2바이트 혹은 4바이트가 된다.
그러므로 그 첫주소는 그중 처음 1바이트를 말하는 것이다.
그 번지의 주소가 ip에 들어간다.

*ip라고 하면 무엇을 의미하는 것이까? *는 Dereference 연산자로
포인터 변수 앞에 붙어서 그 변수가 가리키는 곳의 object을 의미한다.
즉 *ip는 ip가 가리키는 object이 되는 것이다.
그런데 object은 뭘까? 객체?? 클래스에서 나오는 객체는 아니다.

object이라는 명칭이 있다. 이것은 클래스와 객체 할때 그 객체를 의미한
것은 아니다. object은 메모리상에 이름지어진 특정한 부분을 의미한다.

따라서 *ip는 ip가 가리키는 첫 주소부터 시작하여 int형 포인터이므로
2바이트 혹은 4바이트길이만큼 메모리 블럭을 잡아 이를 반환해
object으로 만드는 연산자라고 할수 있다.
따라서 *ip라고 하면 이제 그 주소에서 그만큼의 길이를 더해 얻언ㄴ
메모리 블럭 object이 되며 이는 곧 i를 의미하는 것이 된 것이다.

이해가 간다면 다음에 *를 봤을때 좀더 친밀감이 가길 바란다..

> C에서의 struct C++에서의 struct
C에서의 struct는 맴버 자료 뿐 밖에 적재를 못시킨다.
다음은 뭘까 -.-

struct px : public py{
px() { cout<< "create";}
~px(){}
itn x;
virtual print() =0;
private:
int y;
};

뭔 넘의 struct가 공용 상속도 하고 생성자 소멸자도 쓰고
순수 가상함수도 쓰고 어세스 레벨용 라벨도 쓰고 정말 이상하다
그렇다. C++에서는 결국 struct도 class와 같은 개념이 된다.
union이나 struct나 class나 비슷하게 모두 클래스라고 부른다.
그리고 struct와 class의 차이점은
처음 기본으로 주어진 어세스 레벨용 라벨이 클래스는 private이며
struct는 public이라는 점이다.
class x{
int i;
public:
x(){}
};
이렇게 하면 i는 사적이된다.

struct x{
int i;
};
이렇게 하면 i는 공용이 된다.

다음번에 못다한 잡담은 계속 하기로 한다.
to be continued --;캬캬캬캬캬
99/ 1월 5일 6일인가.. 12시.. 배고프다. 아침..

'KB > C/C++' 카테고리의 다른 글

비트찍기  (0) 2004.03.19
[djgpp] class 라이브러리만들기  (0) 2004.03.19
dos에서 vga13h 쓰기  (0) 2004.03.19
this에 대하여  (0) 2004.03.19
rtti  (0) 2004.03.19

+ Recent posts