티스토리 뷰


다형성

같은 모양의 코드가 상황에 따라 다른일을 하게 되는것.


오버라이딩,오버로딩,업캐스팅의 3가지 예가 존재함.


오버라이딩

부모 클래스의 메소드를 자식 클래스에서 똑같은 모양으로 재정의 하는것.

같은 모양의 함수가 어느 클래스에 속해있냐에 따라서 다른 일을 하게 되므로 다형성의 한 예이다.


동적 바인딩 

부모 클래스형 포인터로 자식클래스를 가리키는 업캐스팅 상황에서 오버라이딩 된 부모 클래스의 메소드를 호출하게 되면 실행시간에 동적으로 자식 클래스의 메소드를 호출하게 되는것을 의미한다.

자바에서는 딱히 다른 키워드를 쓰지 않아도 업캐스팅 상황에서 자동적으로 동적 바인딩이 일어나지만,

C++에서는 virtual 키워드가 붙은 가상함수에 대해서만 동적 바인딩이 일어난다.


class A
{
     virtual void print() {}
}

class B : A
{
     void print() {}
}
int main()
{
     A* a = new A();
     a->print();
 
     B* b = new B();
     a = b;
     a->print();
}

위의 코드 처럼 C++에서는 virtual키워드가 붙어야지만 동적 바인딩이 일어난다. A형 포인터로 B객체를 가리키는 업캐스팅이 일어난 상태에서 A의 가상 함수인 print()를 호출하게 되면 실행시간에 동적 바인딩이 일어나서 자식클래스인 B의 print()가 호출된다.



오버로딩


같은 이름의 함수를 매개변수의 개수나 타입에 따라서 다르게 사용하는것.

같은 이름의 함수가 매개변수에 따라서 서로 다른일을 하게 되므로 다형성의 한 예이다.

리턴값의 자료형만 다르고 나머지는 다 같은경우 그냥 같은 함수로 취급된다!




업캐스팅


부모 클래스형 포인터로 자식클래스를 가리키는 경우.

같은 자식클래스를 어떤 자료형으로 가리키냐에 따라서 호출할수 있는 메소드가 달라진다.


부모 클래스형 포인터로 자식클래스를 가리키게 될 경우 부모 클래스에 있는 메소드만 호출 가능하다.

자식 클래스형 포인터로 자식클래스를 가리키게 될 경우 부모와 자식클래스에 있는 모든 메소드를 호출 할 수 있다.


같은 객체를 어떤 자료형으로 가리키냐에 따라서 호출되는 메소드가 달라지게 되므로 업캐스팅 또한 다형성의 한 예이다.





댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함