|
전 이렇게 이해하고 있습니다.
근데 아직 C만 하고 있어서 들어서 아는것이지
실행해보고 확인한것은 아닙니다.
잘못된 부분이 있으면 지적바랍니다.
프로그램에서 (x,y)좌표를 옮기는 부분을 생각해보겠습니다.
먼저 C 에서
struct _st {
int x;
int y;
} st;
이런 좌표구조체를 선언했을때
(x,y)좌표를 정해진 위치로 이동시키기 위해서
void Move(struct _st *st);
라는 함수를 만들어 사용할 수 있을겁니다.
사용할때는
Move(&st);
이렇게 사용할수 있을거구요.
단순히 어느 좌표로(어디로) 옮기라는 말없이 Move함수를 사용했다는것은 Move함수 구현 부분을 보면 특정 위치로 가도록 했을것입니다.
C 에서는 이렇듯 특정 데이타와 그 데이타에만 적용되는 실행코드가 분리 되어 있습니다.
그말은 다른 실행코드가 st구조체의 좌표를 옮길수 있다는 얘기죠.
이걸 C++ 에서는
struct _st {
int x; // public
int y; // public
void Move(void); // public
} st;
라고 쓰고
사용할때는
st.Move();
라고 하면 같은 결과를 만들수 있습니다.
보시는바와 같이 데이타와 실행코드가 붙어있습니다.
Move함수 자신이 어떤 좌표를 처리 해야 하는지 알고 있다는 것입니다.
중요한건 여기서는 표현만 분리가 안되었을뿐 다른 실행코드에서 특정 데이타인 x와 y를 옮길수 있다는 얘기입니다.
AnotherMove(&st);
이렇게 말이죠.
C 에서랑 별반 다를게 없습니다.
이걸 해결하려면
struct _st {
void Move(void); // public
private:
int x; // private
int y; // private
} st;
라고 구조체를 선언하시면 다른 실행코드에서 x와 y를 다른곳으로 옮기지 못합니다.
st.Move();
라는 표현 이외에는 x와 y를 옮기지를 못합니다.
한마디로 st는 비밀번호와 같은 것입니다.
비밀번호인 st를 st.이렇게 먼저 써넣어야 그 안에 있는 x와 y라는 돈을 마음대로 쓸수 있습니다.
근데 여기서 또 문제는 C++ 에서 중요하게 생각하는 상속이란걸 사용할 수 없습니다.
(상속이나 기타 등등 C++ 에 추가된 여타의 기능들 포함해서...)
(사실 이부분이 저도 확신없이 알고 있는 부분입니다...)
이걸 해결하려면
class _st {
int x; // private
int x; // private
public:
void Move(void); // public
} st;
라고 구조체가 아닌 클래스를 선언하시면 상속도 가능 하겠습니다.
C++ 에서 struct와 class의 근본적인 차이점은
struct는 디폴트가 public이고
class는 디폴트가 private입니다.
결론을 말씀드리자면
구조체에서 3단계쯤 발전한 것이 클래스가 아닌가 생각합니다.
책에 있는 구절을 옮겨보겠습니다.
"모듈화 프로그래밍은 계층적 구조를 갖는 함수를 구현해서
처리순서에 따라 해당 함수들을 호출한다.
그러나
객체지향 프로그래밍은 관련이 있는 데이터들과 이들을 처리할 함수들을
사용자 정의형으로 정의해서 프로그램에서 사용할 하나의 데이터형을 구현한다."
써놓고 보니 질문하신 답변에 딱맞는건지 의문이네요...
리플 부탁드립니다.
|