본문 바로가기
개발

[C++,Java,C#] 오버라이딩 차이 - 메서드 숨기기

by 비손 2009. 3. 10.
전에 "메서드 숨기기" 라는 이름으로 포스팅을 한 기억이 있는데, 다시 정리해 보았습니다. 자꾸 이 언어 저 언어로 코딩하다 보니 헷갈리는 부분이 많아서 ^^;
무튼 이 오버라이딩이라는 것이 참 묘한 것입니다.

C++코드
#include "stdafx.h"
class c1
{
 public :
	void printx();
};
void c1::printx()
{
	printf("c1\n");
};

class c2:public c1
{
public :
	void printx()
	{
	    printf("c2\n");
	}
};

int main(int argc, char* argv[])
{
	c1* aa;
	aa = new c2();

	aa->printx();
	return 0;
}

이렇게 코딩하고 실행하면 'c2'라는 글자가 나와야 할 것 같은데, 어라? 'c1'이라는 글자가 나옵니다. 이상하다 이상하다 싶어서 Java로 같은 코드를 코딩해 봤습니다.

Java코드
class c1{
	void printx(){
		System.out.println("c1");
	}
}

class c2 extends c1{
	void printx(){
		System.out.println("c2");
	}
}


public class test {
	public static void main(String[] args) {
		c1 cc = new c2();
		cc.printx();
	}
}

분명히 같은 내용인데 Java로 하면 'c2'라고 나옵니다. 이쯤에서 앗! 하시는 분들도 있으리라...

그렇습니다! C++에서는 상위 클래스의 메서드에서 'virtual'이라는 키워드를 적어줘야 상속하는 클래스의 메서드에서 메서드오버라이딩이 됩니다.
만약! 'virtual'키워드를 적지 않은 경우에는 그냥 메서드 숨기기가 되는 것이죠, 그럴 경우에는 같은 이름의 메서드가 하나 숨어있는 것입니다. 그래서 클래스 형식에 따라 다른 메서드가 불려올 수 있는 것이죠!

여기까지 생각해 보니 전에 C#으로도 같은 내용의 글을 포스팅 했던 기억이 납니다. 그 때는 메서드 숨기기를 제목으로 해서 짧은 글로 적었었는데 말이죠...
아는 내용이라도 이렇게 깜빡깜빡 할 때가 있습니다. 잊지 말아야지 다짐하면서 다시 포스팅 해 봅니다. ^^