Presentation is loading. Please wait.

Presentation is loading. Please wait.

3장,4장 발표 20401036 서정우.

Similar presentations


Presentation on theme: "3장,4장 발표 20401036 서정우."— Presentation transcript:

1 3장,4장 발표 서정우

2 3. 클래스의 기본 클래스(class) 란?  - C++ 의 가장 큰 특징은 뭐니뭐니해도 클래스란 개념의 등장이라고 볼 수가 있다.    클래스가 없다면 C++ 이라고 말할 수 없을 정도의 중요한 개념이며 구조적 프로그래밍의 한계를 넘어 비로서 OOP의 성격이 드러나는 부분이다.  - C++ 에서 새로이 탄생한 사용자정의 자료 형 또한 구조체와 비슷한 개념이며 멤버로 함수를 취할 수 있다. 이러한 함수를 멤버함수로 부른다. 한마디로 클래스는 클래스 = 멤버 변수 + 멤버 함수

3 누군가가 비디오대여점 프로그램을 개발하려고 한다고 합시다
누군가가 비디오대여점 프로그램을 개발하려고 한다고 합시다. 이때 생각할 수 있는 객체로는 크게 "회원", "비디오", "주인"이  있을 것 입니다. 먼저 "회원"부터, 살펴보면 보통 처음 비디오 가게에 가서 비디오를 빌리려고 하면 가게 주인은 온 손님에게 이름과 전화번호 주소와 같은 신상정보를 물어보고, 컴퓨터에 입력하여 회원으로 등록시킵니다.  이제, 회원이 된 손님은 원하는 비디오를 고른 후 이를 빌리게 됩니다. 이때 손님에게 행위가 발생하는데 바로 "빌린다" 입니다. 이제 납기일이 다 되었거나 비디오를 다 봤다면 손님은 비디오를 반납하게 될 것입니다. 이때의 손님의 행위는 "반납하다" 일 것입니다. 그럼, 이를 정리하면 다음과 같이 표현 가능합니다.

4 회원의 속성에는 이름, 전화번호, 주소, 행위에는 “빌린다”, “반납한다”가 존재하게 됩니다.
그럼, 이러한 추상적인 개념을 프로그램 소스로 표현해야 하는데, 이를 가능 하게 한 게 바로 클래스 입니다.

5 - 클래스의 정의 방법 : (구조체와 매우 비슷하다
- 클래스의 정의 방법 : (구조체와 매우 비슷하다.)    [ 형식 ]        class <클래스명>        {            [ 엑세스 권한 지정자 ]:              멤버 or 멤버함수;                   :        };    Ex)        class ACCESS {            public: int x; <- 멤버 변수            char c;            void sub(int a, int b, char *s); <- 멤버 함수        };

6 실제 회원을 클래스로 표현해 보면 아래와 같다. class member {     private:          char name[20];          char address[256];          char tel_number[50];     public:          void lend();          void giveback(); } member::member() { //내용 } member::lend() { //내용 } member::giveback() { //내용 }

7 - 내부정의와 외부정의는 다음과 같은 차이점이 있다. ┌ 내부정의 : inline속성을 가지게 된다
- 내부정의와 외부정의는 다음과 같은 차이점이 있다.     ┌ 내부정의 : inline속성을 가지게 된다.     └ 외부정의 : inline속성을 부여하지 않는 한 일반함수가 된다.

8 클래스와 객체 데이터 추상화: 현실세게의 사물을 데이터적인 측면과 기능적 측면을 통해서 정의하는 것을 말한다.
객체란: 현실세계에 존재하는 주변의 모든 것들을 말한다 예를 들면 자동차, 사람 , 강아지 등등 클래스화: 추상화된 데이터(데이터적 측면 + 기능적 측면)를 가지고 자료형을 정의하게 되는 것. 인스턴스화 : 클래스를 기반으로 객체를 생성하는 것

9 클래스란 '객체를 정의해놓은 것. ' 또는 클래스는 '객체의 설계도 또는 틀'이라고 정의할 수 있다
클래스란 '객체를 정의해놓은 것.' 또는 클래스는 '객체의 설계도 또는 틀'이라고 정의할 수 있다. 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다. 클래스의 정의 - 클래스란 객체를 정의해 놓은 것 클래스의 용도 - 클래스는 객체를 생성하는데 사용 객체의 사전적인 정의는, '실제로 존재하는 것'. 우리가 주변에서 볼 수 있는 책상, 의자, 자동차와 같은 사물들이 곧 객체. OOP에서는 사물과 같은 유형적인 것뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주 프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻함 객체의 정의 - 실제로 존재하는 것. 사물 또는 개념 객체의 용도 - 객체가 가지고 있는 기능과 속성에 따라 다름 유형의 객체 - 책상, 의자, 자동차, TV와 같은 사물 무형의 객체 - 수학공식, 프로그램 에러와 같은 논리나 개념

10 클래스와 객체의 관계를 우리가 살고 있는 실생활에서 예를 들면, 제품 설계도와 제품과의 관계라고 할 수 있다
클래스와 객체의 관계를 우리가 살고 있는 실생활에서 예를 들면, 제품 설계도와 제품과의 관계라고 할 수 있다. 예를 들면, TV설계도(클래스)는 TV라는 제품(객체)을 정의한 것이며, TV(객체)를 만드는데 사용된다. 또한 클래스는 단지 객체를 생성하는데 사용될 뿐이지 객체 자체는 아니다. 우리가 원하는 기능의 객체를 사용하기 위해서는 먼저 클래스로부터 객체를 생성하는 과정이 선행되어야 한다. 우리가 TV를 보기 위해서는, TV(객체)가 필요한 것이지 TV설계도(클래스)가 필요한 것은 아니며, TV설계도(클래스)는 단지 TV라는 제품(객체)을 만드는 데만 사용될 뿐이다. 그리고 TV설계도를 통해 TV가 만들어진 후에야 사용할 수 있는 것이다. 프로그래밍에서도 먼저 클래스를 작성한 다음, 클래스로부터 객체를 생성하여 사용한다. 객체를 사용한다는 것은 객체가 가지고 있는 속성과 기능을 사용한다는 뜻이다.

11 클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해서 제품을 만드는 이유와 같다
클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해서 제품을 만드는 이유와 같다. 하나의 설계도만 잘 만들어 놓으면 제품을 만드는 일이 쉬워진다. 제품을 만들 때마다 매번 고민할 필요 없이 설계도 대로만 만들면 되기 때문이다. 설계도 없이 제품을 만든다고 생각해보라. 복잡한 제품일 수록 설계도 없이 제품을 만든다는 것은 상상할 수도 없을 것이다. 이와 마찬가지로 클래스를 한번만 잘 만들어 놓기만 하면, 매번 객체를 생성할 때마다 어떻게 객체를 만들어야 할지를 고민하지 않아도 된다. 그냥 클래스로부터 객체를 생성해서 사용하기만 하면 되는 것이다.

12 객체와 인스턴스 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiation)라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 instance라고 한다. 예를 들면, Tv클래스로부터 만들어진 객체를 Tv클래스의 instance 라고 한다. 결국 인스턴스는 객체와 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있다. 예를 들면, '책상은 인스턴스다.'라고 하기 보다는 '책상은 객체다.'라는 쪽이, '책상은 책상 클래스의 객체이다.'라고 하기 보다는 '책상은 책상 클래스의 인스턴스다.'라고 하는 것이 더 자연스럽다. 인스턴스와 객체는 같은 의미이므로 두 용어의 사용을 엄격히 구분지을 필요는 없지만, 위의 예에서 본 것과 같이 문맥에 따라 구별하여 사용하는 것이 좋다.

13 개체(instance), 객체(object)  - 클래스는 사용자가 새로이 지정한 자료 형이라고 했으며, 이것을 변수로 선언한 것을 개체 또는 객체라고 한다고 했다.        class Man {            private:            int ki;            int mommuge;            public:            void study();        } main()        Man Seojungwoo;  <- 개체 또는 객체라고 한다.

14 만약에 sizeof(ACCESS)을 했을 경우 결과는 4가 된다. 즉, 클래스의 크기는 데이터 멤버들의 크기의 합과 일치한다

15 멤버 함수는 공유가 되고 있음을 알 수 있다.

16 엑세스 권한 지정자(접근 제어 명시자) - C++ 에서는 엑세스 권한 지정자에 의해서 클래스의 멤버를 숨길 수가 있다
엑세스 권한 지정자(접근 제어 명시자)  - C++ 에서는 엑세스 권한 지정자에 의해서 클래스의 멤버를 숨길 수가 있다. 즉, 멤버의 공개, 비공개 여부를 지정할 수가 있다.  - 멤버의 비공개로 얻을 수 있는 이득.    - 용도가 정해진 멤버들을 프로그램의 다른 부분에서 건드리지 못하도록 할 수 있다.  이것을 정보은폐(information hiding)이라고도 한다.    - 클래스의 독립성을 보장해준다.

17 권한지정에는 다음 세가지가 있다.    - private:      - 이 속성 지정 이후의 멤버들은 오로지 이 클래스내의 멤버함수만 억        세스가 가능.  클래스 밖으로는 알려지지 않으며 클래스에 속하        지 않는 함수 또한 건드리지 못한다. 이 속성의 멤버함수 또한 호출할        수 없다.심지어 계승(후손 또는 파생)클래스에게 조차도 접근이 불허        된다. (클래스의 은폐를 가능하게 해준다.)  - public:      - 이 속성 지정 이후의 멤버들은 클래스 외부로도 알려지며 외부에서        참조와 변경이 가능하다.    - protected:      - 이 속성 지정 이후의 멤버들은 private와 마찬가지로 클래스내의 멤        버함수들에게만 공개된다. 단 클래스 계승이 될 경우 계승된 클래스        에 속한 멤버함수들도 이 속성의 멤버들을 건드릴 수 있다.       (계승이 이루어지지 않으면 private와 다를 바 없다.)

18 Ex)        class ACCESS {            private:            int  a;          <- private 속성            protected:            char c;          <- protected 속성            public:            int myfunc();    <- public 속성            void sub();        } - struct에서 엑세스 권한 지정자의 default는 -> public이고,    class에서 엑세스 권한 지정자의 default는 -> private이다. - 데이터 멤버는 private로, 멤버함수는 public으로 선언하는 것 이 '관행'이다. - 데이터의 유실을 방지하며 변경 시에는 멤버함수로만 가능하 게 한다

19 상속(Inheritance) : 상속은 이미 만들어진 클래스를 파생시켜 새로운 클래스를 정의하는 기법이다
다형성(Polymorphism) : 똑같은 호출이라도 상황에 따라, 호출하는 객체에 따라 다른 동작을 할 수 있는 능력을 다형성이라고 한다. 실제 내부 구현은 다르더라도 개념적으로 동일한 동작을 하는 함수를 하나의 인터페이스로 호출할 수 있으므로 객체들을 사용하는 코드를 일관되게 유지할 수 있다. 다형성은 동적 바인딩을 하는 가상 함수에 의해 구현된다.

20 캡슐화(Encapsulation) : 표현하고자 하는 자료(Data)와 동작(Function)을 하나의 단위로 묶는 것이며 이렇게 묶어 놓은 것을 객체(Object)라고 한다. 대상의 특징을 나타내는 데이터와 이 데이터를 관리하는 함수가 항상 하나의 묶음으로 사용되므로 객체는 스스로 독립적이며 프로그램의 부품으로 활용될 수 있다. 정보 은폐(Information Hiding) : 객체는 자신의 상태를 기억하기 위한 속성과 속성을 관리하는 동작을 정의한다. 이 중 외부에서 사용하는 기능만 공개하고 나머지는 숨길 수 있는데 이를 정보 은폐라고 한다. 외부에서 객체의 상태를 마음대로 바꾸거나 허가되지 않은 동작을 요청하지 못하도록 함으로써 스스로의 안전성을 확보하는 수단이며 정보 은폐에 의해 객체는 더욱 견고하게 캡슐화된다.

21 간단하게 말하자면 아래와 같이 설명할 수 있겠다

22 클래스의 완성 객체지향은 말 그대로 모든 것이 object화 되도록 한다는 것이지요. 그래서 관련 있는 특징을 가진 것들을 하나의 객체에 몽땅 집어 넣은 것이 질리도록 듣게 되는 class입니다. 객체 중심으로 프로그래밍 한다는 말은 캡슐화, 정보은닉, 상속, 다형성 등의 성질을 적용하고 구현하기 위해서다. 예를 들어 어항에 금붕어를 기르는 게임을 만든다고 가정해 봅시다. 만약 c언어를 이용해서 금붕어를 이동하거나 죽이거나 하는 작동을 하게 하려면 다음과 같이 대략 나타내 보일 수 있다.

23 void main() { while(종료안할때까지) { check_fish(0); check_fish(1); check_fish(2); ... update_fish(0); update_fish(1); update_fish(2); display_fish(0); display_fish(1); display_fish(2); }

24 계속 루프를 돌면서 물고기들의 상태를 체크하고 업데이트 하고 화면에 그려줘야될 것입니다
계속 루프를 돌면서 물고기들의 상태를 체크하고 업데이트 하고 화면에 그려줘야될 것입니다. 즉 메인에서 모든 물고기의 세부사항까지 다 들쳐보고 처리를 해줘야 됩니다. 그러다 보면 이물고기가 어떤물고기인지 헷갈리게 되고 물고기 종류가 다르면 처리방식도 다 달라야되고 등.. 코드가 굉장히 통일성이 없어지죠. 만약 물고기의 데이타 구조가 바뀐다면 check_fish와 같은 함수들의 코드도 몽땅 달라져야 합니다. 그래서 OOP의 개념을 도입해 물고기를 하나의 class로 묶어놓습니다. 이 클래스 안에는 자신의 데이터를 체크한다던지 값을 바꾼다던지 화면에 출력한다든지 하는 operation들이 다 들어있습니다. 그래서 물고기 class에 정의된 함수들을 call하여 모든 동작을 수행하는 겁니다. 즉 main에서 일일히 신경 쓸 필요가 없다는 것이죠.

25 void main() { while(종료안할때까지) { for(모든물고기object) { fish.check(); fish.update(); fish.display(); } 이렇게 하면 훨씬 간단해 지고 유지 보수(code reuse, maintenance)가 편리해 집니다. 클래스에서 알아서 다 operation 을 수행하니 외부에서는 그 안의 내용에 신경을 쓸 필요도 없고(encapsulation) 여러 마리 물고기를 관리하는데도 배열을 쓸 필요 없이 object의 pointer만 얻어와서 함수를 호출하면 되지요.(polymorphism) 만약 기존의 물고기와 약간 다른 특징을 갖는 변종물고기를 만들고 싶다면 기존의 물고기를 상속받아 필요한 부분만 변형하여 새로운 class를 만들 수도 있습니다.(inheritance)

26 정보은닉 객체를 만들기 위해선 클래스를 디자인한다. 어떤 클래스가 좋은 클래스일까? ㅡ>
어떤 클래스가 좋은 클래스일까? ㅡ> 캡슐화, 정보은닉 만족시키는 클래스 캡슐화는? 프로그램의 작은 부분이 변함으로 서  전체적인 프로그램에 많은   영향을 끼치는 일을 방지하기 위해서 도입되었다. 캡슐화가 도입됨으로 어떤 클래스의 내부를 그 클래스와 연관된 프로그램의 다른 부분에 영향을 주지 않고 바꿀 수가 있게 된 것이다. 정보은닉이란? 객체는 자신의 상태를 기억하기 위한 속성과 속성을 관리하는 동작을 정의한다. 이 중 외부에서 사용하는 기능만 공개하고 나머지는 숨길 수 있는데 이를 정보 은닉라고 한다 왜 하여야 하는가? 외부에서 객체의 상태를 마음대로 바꾸거나 허가되지 않은 동작을 요청하지 못하도록 함으로써 스스로의 안전성을 확보하는 수단이며 정보 은폐에 의해 객체는 더욱 견고하게 캡슐화 되기 떄문이다.

27 정보은닉 예 정보은닉이 되지 않은 클래스 ------------------------------- Class Car { 이처럼
   char Engine;    char Gear;  } 이처럼 직접 제어를 하게 되면 잘못된 입력값 즉 엉뚱한 엔진을 넣어버릴 경우 이를 걸러줄 장치가 없다는 것이다. 이러한 매커니즘으로 탄생한 것이 정보은닉이다. 자동차의 부품을 C++에서 말한다면 클래스 내부에 선언되어있는 변수들을 말한다. 클래스에서 선언된 변수들이 내부에서만 사용되도록 만듬으로써 다른 외부의 조작으로부터 보호하고 잘못된 입력이 들어왔을 시에 제어해주는 역할이 바로 정보은닉의 이점이다. Car Matiz; Matiz.Engine = V; // V는 오토바이 엔진 정보은닉 하는 방법은 다음슬라이드

28 정보은닉 하는 방법 #include class Car { private: char Engine; char Gear;
class Car { private:    char Engine;    char Gear; public:    void SetEngine(char e) { Engine = e; }    void SetGear(char g) { Gear = g; }    char GetEngine() { return Engine; }    char GetGear() { return Gear; } } int main() int main() {    Car Matiz;    Matiz.SetEngine(m);  //매개변수 m은 경차엔진으로 가정    Matiz.SetGear(d); // 매개변수 d는 기어 2단 상태    cout << GetEngine() << endl;    cout << GetGear() << endl;    return 0; } Main 함수에서 직접적으로 Car 클래스 변수들을 Matiz.Engine = V; 처럼 직접 제어한 것이 아닌 Set...  ,  Get... 함수들을 통해 제어하였다.

29 Set.. Get.. 함수들을 Car 클래스 내부에서 선언하여 private으로 선언된 변수들을
제어함과 동시에 Set.. Get.. 함수들을 public으로 선언해서 외부에서 이 함수들을 통해 변수값을 넣도록 하고 있다. ㅡ> 캡슐화 이를 통해 얻을 수 있는 이점은 일단 Set.. 함수 이외에 다른 방법으로는 Car 클래스의 멤버변수들을 컨트롤 할 수 없다. 왜냐하면 변수들을 Car 클래스 내부에서만 사용하도록 private 선언을 하였기 때문에 외부에서 컨트롤 할 수 없다. ㅡ> 정보은닉 또한 Set.. 함수안에 올바른 값만들 받도록 정할 수도 있다. 예를 들면 Car 클래스의 SetEngine 함수에 void SetEngine(char e)     if(e == m)  //m 은 경차전용 엔진이라 가정     Engine = e;  } 이와 같이 추가해주면 경차전용엔진일 경우에만 Engine변수에 값을 넘기도록 설정할 수 있다. 따라서 V엔진이라든지 다른 엔진을 설정하려고 할 경우를 막아준다. (정보은닉)

30 요약하면 정보은닉이라 함은 말 그대로 정보를 은닉하는 것을 말하며 정보은닉을 통해 얻을 수 있는 이점은 클래스 내부 변수들을 외부에서 직접적으로 제어하지 못하게 막음으로써 항상 올바른 값만을 넘겨받아 작동할 수 있게 한다.

31 캡슐화 예 <예제> char Move() #include { if(Gear == 'd') class Car
class Car { private:    char Engine;    char Gear; public:    void SetEngine(char e)     {        if(e == 1)  //1 은 경차전용 엔진이라 가정        Engine = e;     }    void SetGear(int g) { Gear = g; }    char GetEngine() { return Engine; }    char GetGear() { return Gear; }    char Move()    {        if(Gear == 'd')              전진하라.        if(Gear == 'b')              후진하라.    } } int main() {    Car Matiz;    Matiz.SetEngine(m);  //매개변수 m은 경차엔진으로 가정    Matiz.SetGear(d); // 매개변수 d은 기어 2단이라 가정    Matiz.Move();    cout << GetEngine() << endl;    cout << GetGear() << endl;    return 0; }

32 자동차를 움직이는 기능을 갖는 함수 Move()를 Car 클래스 내부에서 선언해줌으로써 Car 클래스 내부에는 자동차와 관련된 기능들이 모이게 되었다.
이처럼 한 클래스 내부에 관련 있는 함수와 변수들을 두는 것을 캡슐화 한다고 말한다. 그럼 캡슐화가 가져다 주는 이점은 무엇인가? 예를 들어 위의 Car 클래스를 가지고 마티즈 자동차를 여러대 만들었다고 생각해봅시다. 그런데 만약 마티즈 자동차가 후진할 때 이상한 현상이 생겼다고 해보자. 이때 여러대의 마티즈가 후진할 때 문제를 한번에 해결할 수 있는 방법은 Car 클래스 내부에 있는 Move()함수만을 확인해 보면 해결된다. 만약 자동차와 관련된 Move()함수가 다른 클래스에 있다고 하면 문제가 생겼을 시 Move()함수를 찾기 위해 애를 써야 할 것이다.

33 ●생성자 ●생성자의 필요성 ●소멸자 ●소멸자의 필요성 클래스의 인스턴스가 만들어 질 때 자동으로 수행되는 내용이 기록되어 있는 함수 맴버 변수의 초기화가 내용이 일반적으로 기록된다. 메모리 할당, 변수값 초기화 인스턴스가 메모리에서 해제 될 경우 수행되는 함수 맴버 변수가 메모리에 할당되었을 때 해제하는 내용이 주로 처리됨 맴버 변수가 메모리 할당이 되어 있을 경우 클래스가 소멸되어도 메모리는 해제 되지 않음. 따라서 클래스가 소멸 될 때 자동으로 호출되는 함수가 필요하고 이 함수 안에 메모리 해제 내용을 기록. 동적 메모리 할당 이후에 메모리 해제를 할 때 주로 사용. 객체 지향 프로그래밍은 순차적인 형태가 아니라 데이터의 흐름에 따라 변화되는 형태이다. 객체 지향 프로그래밍에서 객체의 생성시 초기화는 분명 필요하다.

34 생성자, 소멸자 생성자 함수의 특징 소멸자 함수의 특징 1) 함수의 이름이 클래스의 이름과 같다.
2) 리턴(결과 반환)이 존재 하지 않는다 3) 사용자가 임으로 호출이 불가능 하다. 4) 사용자가 생성자 함수를 만들지 않으면 자동생성 (default 생성자 함수 - 아무기능없음) 5) 객체를 초기화 할 목적. 6) 메모리 상에 오브젝트가 생성이 될 때 자동호출 7) 생성자 함수는 오버로드화 할 수 있다. 8) 매개변수에 초기화 소멸자 함수의 특징 1) 함수의 이름이 클래스의 이름과 같다. 2) 리턴(결과 반환)이 존재 하지 않는다 3) 사용자가 생성자 함수를 만들지 않으면 자동으로 생성 (default 소멸자 함수 - 아무기능없음) 4) 인스턴스가 메모리상에서 사라질 때 자동호출 5) 메모리에 Object를 동적 할당 했을때 메모리 반환해줄 목적으로 사용. 6) 소멸자 함수는 클래스 안에 하나만 존재. 7) 매개변수가 존재하지 않는다. ※ 소멸자 함수는 이름 앞에 ( ~ )가 붙음

35 예제는 책으로

36 클래스와 배열 객체 배열이란 객체로 구성된 배열이다. 예제는 책으로
객체 포인터 배열이란 객체를 가리킬 수 있는 포인터로 구성된 배열이다. 예제는 책으로

37 This 포인터 class ACCESS { private: int a; int b; Public:
void myfunc(int aa, int bb) {     a = aa;     b = bb; } }; Main(){ ACCESS A,B,C; } 여기서 중요한 것은 아무리 많은 인스턴스가 만들어 진다 하여도 위의 ACCEAA::myfunc() 함수는 한번만 뿌려지게 됩니다.

38 ACCESS A; ACCESS B; ACCESS C; 와 같은 코드가 있을 때, A, B, C라는 이름만으로도 충분히 first, second 의 맴버 변수에 접근 가능하죠? 어떻게 다를까요? myfunc() 함수가 뿌려져 있는 하나의 공간에 대해서 여러 다른 인스턴스들이 “myfunc()" 라는 인터페이스를 통하여 계속적으로 접근하는 하는 꼴로써 나타난다는 겁니다. 그렇다면 접근하는 기준은 변수 이름? 정답은 A, B, C가 같은 클래스 형식이기 때문에  찾아갈 수가 있는 것입니다. ACCESS 클래스에서 만들어지는 모든 인스턴스 들은 myfunc()에 대해서 접근할 수 있는 주소를 가지게 됩니다. 근데 위의 A, B, C가 myfunc() 맴버 함수에 접근하는 방법은 조금 다릅니다.

39 지금 myfunc() 함수에서는 맴버 변수의 값을 수정하고 있습니다.
아래와 같이 A 인스턴스가 myfunc() 함수를 호출했고 보겠습니다.   A.myfunc(2,3); 분명한것은, myfunc() 함수는 p1인스턴스와, 메모리적으로 봤을 때는 어떠한 연속적인 관련도 없습니다. 이해가 잘 안되죠? 만약 함수가 연속적으로 관련이 있어서 인스턴스마다 하나하나 다 붙어 있다면, 이 함수가 과연 뭘 수정하면 되나요?? 당연히 자기 인스턴스를 수정하면 되겠지요. 하지만!! 인스턴스는 무한이고! 함수는 하나라는거죠! 이제 감이 좀 옵니까?

40 간단한 말로 함수는 한개. 인스턴스는 무한입니다.
생성되어있는 수많은 인스턴스중에 하나가 myfunc() 함수를 부르고~ 그것이 바로 위의 A.myfunc(2,3); 정도 되겠네요 여기서 myfunc(int, int) 의 함수body를 다시 한번 보겠습니다. body 어디에서도 특정한 인스턴스를 지정해주는 코드는 없어여~ 단지 a= a; b = b; 라는 말밖에 없죠. 그렇다면 이 함수는 무엇을 수정하나요??

41 제가 이 함수를 부르면서 A.myfunc(2,3); 이라고 했으니 당연히 A인스턴스의 값이 바뀌기를 바랬을 것입니다 그럼 인스턴스들 중 아무거나 잡아서 수정하면 되나요?? 당연히 안되죠... 그리나 결과적으로도 A이 수정됩니다. 어떻게 이것이 가능할까요?? 내부적으로 this 포인터가 전달이 되기 때문에 그것이 가능해집니다. this는 인스턴스 자신을 가리키는 포인터죠

42 그럼 숨겨진 코드를 모두 적어보겠습니다. (단, 이것은 내부적으로 구현이 되어있는 방식이기때문에 실제로 이렇게 적어버리면 컴파일 에러가 발생하게 됩니다~) void myfunc(test* this, int aa, int bb) {  this->a = aa;  this->b = bb; } 클래스 내부의 모든 함수는 0번째 전달인자를 내부적으로 가지며 그 전달인자는 위와 같이 해당 클래스의 this 포인터입니다. 결과적으로 this 포인터는 클래스의 인스턴스들이 멤버 함수를 공유 하기 때문에 존재 하는 것 입니다.

43 Friend 함수 설명은 책으로


Download ppt "3장,4장 발표 20401036 서정우."

Similar presentations


Ads by Google