1. 클래스의 등장 배경
1) 초기에는 순차적으로 쭉 코드를 써내려갔습니다.
2) 하지만 같은 코드가 계속 반복되어 비효율적입니다. 그래서 같은 코드는 한번만 코딩해 주고 필요할때 불러서 쓰는 서브루틴 개념이 생겼습니다. call 과 ret 개념이 생긴거지요.
3) 역시나 서브루틴은 너무 하나의 프로그램에 종속적이기 때문에 다른 프로그램에서 재사용하기 힘듭니다. 그래서 생겨난 것이 함수입니다. 각종 인자를 넘기고 리턴값을 받을 수 있습니다. 이로서 프로그램간에 코드를 공유하기 쉬워졌습니다.
4) 하지만 여러 프로그램에서 같이 쓰기 위해서는 너무 많은 인자를 넘겨줘야 하는 경우가 생겼습니다. 그래서 생각한것이 필요한 인자를 구조체로 만들어서 구조체주소를 넘겨 주는거지요.
5) 그러나, 문제가 있었습니다. 이 구조체란게 너무 함수에 밀접하게 관계가 있어서 다른 곳에서는 쓰이지 않습니다. 게다가 이 함수를 쓰기 해서는 어떤 구조체를 쓰는지도 알아야 합니다. 반대로 이 구조체가 쓰는 함수를 알아내는 것도 쉽지 않습니다.
6) 그래서, 클래스가 등장하게 된것입니다. 위에서 본 것과 같이 클래스란 단순히 함수가 쓰는 구조체와 함수를 함께 묶어주는 역활을 하는것입니다. 이로써 구조체와 관련함수가 하나로 묶여서 코드의 재사용성이 증가합니다.
2. 클래스의 구조
1) 그럼 클래스의 구조를 보도록 하죠.
class CTest
{
1) 초기에는 순차적으로 쭉 코드를 써내려갔습니다.
2) 하지만 같은 코드가 계속 반복되어 비효율적입니다. 그래서 같은 코드는 한번만 코딩해 주고 필요할때 불러서 쓰는 서브루틴 개념이 생겼습니다. call 과 ret 개념이 생긴거지요.
3) 역시나 서브루틴은 너무 하나의 프로그램에 종속적이기 때문에 다른 프로그램에서 재사용하기 힘듭니다. 그래서 생겨난 것이 함수입니다. 각종 인자를 넘기고 리턴값을 받을 수 있습니다. 이로서 프로그램간에 코드를 공유하기 쉬워졌습니다.
4) 하지만 여러 프로그램에서 같이 쓰기 위해서는 너무 많은 인자를 넘겨줘야 하는 경우가 생겼습니다. 그래서 생각한것이 필요한 인자를 구조체로 만들어서 구조체주소를 넘겨 주는거지요.
5) 그러나, 문제가 있었습니다. 이 구조체란게 너무 함수에 밀접하게 관계가 있어서 다른 곳에서는 쓰이지 않습니다. 게다가 이 함수를 쓰기 해서는 어떤 구조체를 쓰는지도 알아야 합니다. 반대로 이 구조체가 쓰는 함수를 알아내는 것도 쉽지 않습니다.
6) 그래서, 클래스가 등장하게 된것입니다. 위에서 본 것과 같이 클래스란 단순히 함수가 쓰는 구조체와 함수를 함께 묶어주는 역활을 하는것입니다. 이로써 구조체와 관련함수가 하나로 묶여서 코드의 재사용성이 증가합니다.
2. 클래스의 구조
1) 그럼 클래스의 구조를 보도록 하죠.
class CTest
{
private:
WORD wFirst;
public:
WORD Add(WORD wValue);
};
위와 같이 클래스가 있다고 합시다. 여기서 주의해야할 점이 있습니다.
private: public: 같은 키워드에 의해 데이터가 보호되는 것은 단지 컴파일러에서 지원해 주는 기능일 뿐이지 바이너리코드 상의 차이점은 아니라는 점입니다. private: 이나 public:은 바이너리 코드상에서는 모두 같다는 겁니다. 다시 한번 말씀드리지만, 이 키워드들은 단지 컴파일 과정에서 컴파일러가 에러를 내주는 것이라는 겁니다.
이제 이 클래스를 어셈블리로 변환해 보죠..
CTest struct
wFirst word ?
AddTest dword AddFunc
CTest ends
이게 전부입니다. 간단하지요 ? 단지 함수선언은 함수포인터로 대치되는게 차이점이라면 차이점입니다. 이 함수 포인터가 바로 계승에 절대적인 도움을 주는 점입니다.
이 클래스를 계승한 자식클래스를 만든다면 다음과 같이 하면 됩니다.
CTestChild struct
CTest { ?,AddNewFunc }
CTestChild ends
단순히 자식클래스 상단에 부모구조체를 써주면 됩니다. 그리고 이 예제에서는 메서드를 자식함수로 오버라이드하고 있습니다. 자식클래스에 프로퍼티와 메소드를 추가한다면 다음과 같겠지요.
CTestChild struct
CTest { ?,AddNewFunc }
wSecond word ?
Multiply dword MultiplyFunc
CTestChild ends
이로써 자식클래스만의 프로퍼티와 메소드를 정의하였습니다. 간단하지요 ?
하지만 주의해야 할 점이 있습니다. 부모구조체가 항상 자식구조체 시작위치에 있어야 한다는 점입니다. 이렇게 하야만 계승된 필드가 같은 옵셋에 치해 있다는것을 보장할 수 있습니다.
위와 같이 클래스가 있다고 합시다. 여기서 주의해야할 점이 있습니다.
private: public: 같은 키워드에 의해 데이터가 보호되는 것은 단지 컴파일러에서 지원해 주는 기능일 뿐이지 바이너리코드 상의 차이점은 아니라는 점입니다. private: 이나 public:은 바이너리 코드상에서는 모두 같다는 겁니다. 다시 한번 말씀드리지만, 이 키워드들은 단지 컴파일 과정에서 컴파일러가 에러를 내주는 것이라는 겁니다.
이제 이 클래스를 어셈블리로 변환해 보죠..
CTest struct
wFirst word ?
AddTest dword AddFunc
CTest ends
이게 전부입니다. 간단하지요 ? 단지 함수선언은 함수포인터로 대치되는게 차이점이라면 차이점입니다. 이 함수 포인터가 바로 계승에 절대적인 도움을 주는 점입니다.
이 클래스를 계승한 자식클래스를 만든다면 다음과 같이 하면 됩니다.
CTestChild struct
CTest { ?,AddNewFunc }
CTestChild ends
단순히 자식클래스 상단에 부모구조체를 써주면 됩니다. 그리고 이 예제에서는 메서드를 자식함수로 오버라이드하고 있습니다. 자식클래스에 프로퍼티와 메소드를 추가한다면 다음과 같겠지요.
CTestChild struct
CTest { ?,AddNewFunc }
wSecond word ?
Multiply dword MultiplyFunc
CTestChild ends
이로써 자식클래스만의 프로퍼티와 메소드를 정의하였습니다. 간단하지요 ?
하지만 주의해야 할 점이 있습니다. 부모구조체가 항상 자식구조체 시작위치에 있어야 한다는 점입니다. 이렇게 하야만 계승된 필드가 같은 옵셋에 치해 있다는것을 보장할 수 있습니다.
'Assembly' 카테고리의 다른 글
[DOS] Queue (0) | 2010.01.05 |
---|---|
[DOS] 각 숫자의 on된 비트수 세기와 버블 소팅 (0) | 2010.01.05 |
[DOS] 문자열을 입력받아 끝에 $ 추가해서 출력하기 (0) | 2010.01.05 |
[DOS] 10진수를 출력하는 예제 (0) | 2010.01.05 |
[DOS] 간단한 Assembly 문법 정리 (1) | 2010.01.05 |