작성자  :  윤현성
객체 포인터 Step 01 Step 02 Step 03 상속과 다형성 용어 정리
◆  객체 포인터 변수란 ? 객체의 주소 값을 저장하는 포인터 변수 객체를 가리키고 있는 포인터 변수 Person * ptr = new Person(); ◆  만약  student class  가  Person class  를 상속 받을 때 Person * ptr = new Student(); 가능 !!
 
 
◆  컴퓨터는 실제 가리키고 있는 객체가 어떤 타입인지 신경 쓰지 않는다 . 실제 대입되는 클래스도 가리키는 포인터의 타입으로 인식한다 . 즉 ,  가리키고 있는 포인터의 타입의 형태로 인식한다 . *  상속 관계에서 상위 클래스가 하위 클래스를 가리키는 경우는  100%  가능 Why?  상위 클래스에 있는 모든 변수와 함수를 상속받으니까 !
▪  Employee Class
▪  PermanentWorker Class
▪  EmployeeHandler Class 주석을 풀면 어떻게 될까 ?
▪  main
♦  함수 오버로딩 함수 이름은 같지만 전달하는 인자의 개수가 다르거나 타입을 다르게 선언 하여 기능을 여러 인자나 타입에 맞게 설계하는 방법 . ♦  함수 오버 라이딩 상속 관계에서 상위 클래스의 함수를 하위 클래스 함수에서 재정의 하는 것 . 만약 상속 관계에 있을 때 부모 함수를 오버로딩 형식으로 인자를 다르게  주어서 정의한다면 부모 함수를 쓸 수 없다 .
 
만약 부모의 맴버 함수가 여러 개로 오버로딩 되어 있을 때 자식 클래스에서 한가지를 오버 라이드 한다면 부모의 다른 오버로딩 된 함수는 상속되지 않는다 .
상속의 이점 기존 코드에 새로운 것을 추가하였을 때 ,  기존에 있던 코드의 변형을 최소화 시킬 수 있다 . 같은 것끼리 묶어서 편하게 관리할 수 있다 .  중복되는 코드 내용을 줄일 수 있다 . 2.  부모 포인터가 자식 클래스를 가리키는 것을 어디다 사용 ? -  상속 관계에 있는 객체들을 상위 클래스가 가리킴으로써  다형성 을 구현할 수 있다 . (  가상 함수를 통해서 완벽한 다형성 구현  )
▪  다운 캐스팅과 업 캐스팅 도형 원 사각형 삼각형 다운 캐스팅 업 캐스팅
도형 원 사각형 삼각형 ♦  각각의 클래스에 맞게 그려주고 싶다 !!
 
 
 
 
 
♦  문제점  각각의 도형대로 그려지기를 원하는데 그렇지 못하다 . Shape  의 소멸자만 호출되고 있다 . 만약  Rectangle  나  Circle  에 동적 할당을 했다면 해당 변수를 삭제할 수 없다 .
아주 나쁜 방법이다 . 그럼 어떻게 ? ->  가상 함수를 사용 !
♦  이 가상함수를 오버라이드 한 함수에는  virtual  을 안 붙여도 가상 함수가 된다 .
▪  Draw()  에  virtual  을 붙여서 가상함수로 만들었더니 각 클래스에 맞는 Draw()  함수가 호출되었다 . ▪  그러나 소멸자는 그대로다 .
 
 
♦  소멸자 가상함수 상위 클래스만  virtual  로 선언해주면 상속 받은 클래스들이 소멸자도  virtual 소멸자로 선언이 된다 . 상위 클래스에서 사용될 것 같은 클래스의 생성자에서 동적으로 메모리를 할당할 경우 소멸자는 가상으로 선언해야 한다 . 앞에  virtual  을 붙여주면 이 맴버 함수의 주소는 컴파일시 결정 되는 것이  아니라 실행 시에 주소를 결정한다 . (  남발 하는 건 좋지 않다 . )
♦  순수 가상 함수 가상 함수의 한 종류이다 . ♦  만드는 방법 virtual void Draw() const = 0; ♦  의미 이 함수는 정의가 없으므로 호출도 불가능 자식 함수에서 이 함수를 오버라이딩 해서 쓸 것이다 . ( 다형성 이용해서 ) 한 개 이상의 순수 가상 함수를 포함하면 그 클래스는 추상 클래스가 된다 . 추상 클래스는 인스턴스 화가 불가능하다 .
 
♦  추상 클래스는 인스턴스화가 불가능 하다 .
♦  다형성이란 객체 지향 프로그래밍에서 다형성이란 타입에 관계 없이 동일한 방법 으로 다룰 수 있는 능력을 말한다 . Circle  이나  Rectangle  객체 들을 각각의 타입에 상관 없이  Shape  객체 인 것처럼 다룰 수 있는 능력이 다형성이다 .
♦  순수 가상 함수 다형성을 위해서 함수의 원형만 필요한 경우라면 순수 가상 함수로 만든다 . 다형성은 가상 함수로도 구현이 가능하다 . ♦  추상 클래스 하나 이상의 순수 가상 함수를 가지고 있는 클래스 . 인스턴스화가 불가능하다 . 이 클래스는 객체를 생성할 필요가 없고 인터페이스로서의 역할만 한다면  추상클래스로 선언
♦  동적 바인딩 바인딩이란 함수를 호출하는 명령과 실제로 호출되는 함수를 짝지어 주는 일을 말한다 . 프로그램을 실행한 후에 어떤 함수를 호출할 수 있을지 알 수 있는 경 우를 동적 바인딩 또는 후기 바인딩 이라고 한다 . void Runc(Shape* pc) { pc->Draw(); } < 동적 바인딩 > Circle c; c.Draw(); < 정적 바인딩 >
감사합니다 .

Chapter8 상속과다형성(윤현성)

  • 1.
    작성자 : 윤현성
  • 2.
    객체 포인터 Step01 Step 02 Step 03 상속과 다형성 용어 정리
  • 3.
    ◆ 객체포인터 변수란 ? 객체의 주소 값을 저장하는 포인터 변수 객체를 가리키고 있는 포인터 변수 Person * ptr = new Person(); ◆ 만약 student class 가 Person class 를 상속 받을 때 Person * ptr = new Student(); 가능 !!
  • 4.
  • 5.
  • 6.
    ◆ 컴퓨터는실제 가리키고 있는 객체가 어떤 타입인지 신경 쓰지 않는다 . 실제 대입되는 클래스도 가리키는 포인터의 타입으로 인식한다 . 즉 , 가리키고 있는 포인터의 타입의 형태로 인식한다 . * 상속 관계에서 상위 클래스가 하위 클래스를 가리키는 경우는 100% 가능 Why? 상위 클래스에 있는 모든 변수와 함수를 상속받으니까 !
  • 7.
  • 8.
  • 9.
    ▪ EmployeeHandlerClass 주석을 풀면 어떻게 될까 ?
  • 10.
  • 11.
    ♦ 함수오버로딩 함수 이름은 같지만 전달하는 인자의 개수가 다르거나 타입을 다르게 선언 하여 기능을 여러 인자나 타입에 맞게 설계하는 방법 . ♦ 함수 오버 라이딩 상속 관계에서 상위 클래스의 함수를 하위 클래스 함수에서 재정의 하는 것 . 만약 상속 관계에 있을 때 부모 함수를 오버로딩 형식으로 인자를 다르게 주어서 정의한다면 부모 함수를 쓸 수 없다 .
  • 12.
  • 13.
    만약 부모의 맴버함수가 여러 개로 오버로딩 되어 있을 때 자식 클래스에서 한가지를 오버 라이드 한다면 부모의 다른 오버로딩 된 함수는 상속되지 않는다 .
  • 14.
    상속의 이점 기존코드에 새로운 것을 추가하였을 때 , 기존에 있던 코드의 변형을 최소화 시킬 수 있다 . 같은 것끼리 묶어서 편하게 관리할 수 있다 . 중복되는 코드 내용을 줄일 수 있다 . 2. 부모 포인터가 자식 클래스를 가리키는 것을 어디다 사용 ? - 상속 관계에 있는 객체들을 상위 클래스가 가리킴으로써 다형성 을 구현할 수 있다 . ( 가상 함수를 통해서 완벽한 다형성 구현 )
  • 15.
    ▪ 다운캐스팅과 업 캐스팅 도형 원 사각형 삼각형 다운 캐스팅 업 캐스팅
  • 16.
    도형 원 사각형삼각형 ♦ 각각의 클래스에 맞게 그려주고 싶다 !!
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
    ♦ 문제점 각각의 도형대로 그려지기를 원하는데 그렇지 못하다 . Shape 의 소멸자만 호출되고 있다 . 만약 Rectangle 나 Circle 에 동적 할당을 했다면 해당 변수를 삭제할 수 없다 .
  • 23.
    아주 나쁜 방법이다. 그럼 어떻게 ? -> 가상 함수를 사용 !
  • 24.
    ♦ 이가상함수를 오버라이드 한 함수에는 virtual 을 안 붙여도 가상 함수가 된다 .
  • 25.
    ▪ Draw() 에 virtual 을 붙여서 가상함수로 만들었더니 각 클래스에 맞는 Draw() 함수가 호출되었다 . ▪ 그러나 소멸자는 그대로다 .
  • 26.
  • 27.
  • 28.
    ♦ 소멸자가상함수 상위 클래스만 virtual 로 선언해주면 상속 받은 클래스들이 소멸자도 virtual 소멸자로 선언이 된다 . 상위 클래스에서 사용될 것 같은 클래스의 생성자에서 동적으로 메모리를 할당할 경우 소멸자는 가상으로 선언해야 한다 . 앞에 virtual 을 붙여주면 이 맴버 함수의 주소는 컴파일시 결정 되는 것이 아니라 실행 시에 주소를 결정한다 . ( 남발 하는 건 좋지 않다 . )
  • 29.
    ♦ 순수가상 함수 가상 함수의 한 종류이다 . ♦ 만드는 방법 virtual void Draw() const = 0; ♦ 의미 이 함수는 정의가 없으므로 호출도 불가능 자식 함수에서 이 함수를 오버라이딩 해서 쓸 것이다 . ( 다형성 이용해서 ) 한 개 이상의 순수 가상 함수를 포함하면 그 클래스는 추상 클래스가 된다 . 추상 클래스는 인스턴스 화가 불가능하다 .
  • 30.
  • 31.
    ♦ 추상클래스는 인스턴스화가 불가능 하다 .
  • 32.
    ♦ 다형성이란객체 지향 프로그래밍에서 다형성이란 타입에 관계 없이 동일한 방법 으로 다룰 수 있는 능력을 말한다 . Circle 이나 Rectangle 객체 들을 각각의 타입에 상관 없이 Shape 객체 인 것처럼 다룰 수 있는 능력이 다형성이다 .
  • 33.
    ♦ 순수가상 함수 다형성을 위해서 함수의 원형만 필요한 경우라면 순수 가상 함수로 만든다 . 다형성은 가상 함수로도 구현이 가능하다 . ♦ 추상 클래스 하나 이상의 순수 가상 함수를 가지고 있는 클래스 . 인스턴스화가 불가능하다 . 이 클래스는 객체를 생성할 필요가 없고 인터페이스로서의 역할만 한다면 추상클래스로 선언
  • 34.
    ♦ 동적바인딩 바인딩이란 함수를 호출하는 명령과 실제로 호출되는 함수를 짝지어 주는 일을 말한다 . 프로그램을 실행한 후에 어떤 함수를 호출할 수 있을지 알 수 있는 경 우를 동적 바인딩 또는 후기 바인딩 이라고 한다 . void Runc(Shape* pc) { pc->Draw(); } < 동적 바인딩 > Circle c; c.Draw(); < 정적 바인딩 >
  • 35.