▸JAVA/기본 문법

다형성의 활용 (오버라이딩)

코데방 2019. 12. 10.
728x90

게임에서 각 캐릭터가 각자 주어진 무기를 들고 발사하는 프로그램을 만든다고 가정해 보겠습니다. 절차지향언어인 C언어에서는 각 캐릭터(변수)에 맞춰서 무기를 발사(함수)하도록 합니다. 하지만 객체지향언어인 Java에서는 각 캐릭터마다 자신의 무기를 이미 가지고 있고(클래스), 어떻게 발사해야할지(메소드)도 미리 알고 있습니다.

따라서 C언어에서는 캐릭터를 먼저 소환한 후 무기 발사를 명령해야하지만(절차대로) Java에서는 무기를 발사한다라는 명령을 내려두고 캐릭터를 소환합니다. 그럼 그 캐릭터가 알아서 자신의 무기를 발사하게 됩니다. 그래서 객체지향언어인 것이죠. 이렇게 미리 명령을 내려 두고 캐릭터를 소환해주기 위해 사용하는 방식이 다형성의 성질 중 하나인 오버라이딩입니다.

 


 

먼저 위의 예시를 구현하기 위한 오버라이딩을 하기 위해서는 필수적으로 "상속" 관계가 되어야만 합니다. 상속 관계가 아닌 이상 어차피 클래스 소속이 다른 메소드는 이름이 같아도 겹칠 일이 없습니다. 메소드 사용 시 소속을 명확히 밝혀줘야하기 때문입니다.

일반 클래스 상속을 사용해도 무방하고 추상클래스나 인터페이스를 사용해도 동일합니다. 상속을 통해 오버라이딩하기 위한 계층 관계를 형성해주는 것입니다. 아래와 같이 자식 클래스 두 개를 생성했다고 해보겠습니다.

 

 

 


 

다형성의 특징에 의해 부모클래스는 자식클래스의 형질을 가져와서 사용할 수 있습니다. 이 말인즉슨, 부모 클래스가 물려준 필드나 메소드의 값을 자식 클래스에 있는 내용으로 다시 채울 수 있다는 의미입니다. 자식 클래스에서 따로 추가한 필드나 메소드는 영향을 미치지 않습니다.

즉 부모 클래스의 타입으로 인스턴스를 하나 만들어두고, 거기에 자식클래스를 넣어주면 상속해준 껍데기에 내용물을 받아오는 것이죠. 부모클래스가 따로 없는 클래스들은 각자 공통되는 부분이 명확하지 않기 떄문에 이러한 방식을 사용할 수 없습니다. 공통된 부모클래스를 가진 상속 관계에서는 모두 "부모클래스라는 공통분모"가 있기 때문에 부모 클래스 껍데기 안에 자식 클래스의 내용물을 넣어줄 수 있는 것이죠.

Test t1 = null;  // 자식클래스를 수용할 수 있는 부모 클래스 인스턴스를 생성해준다.
		
if (조건)
	t1 = new TestSub1();  // 조건에 따라 자식클래스 1번 내용으로 채워준다.
else if (조건)
	t1 = new TestSub2();  // 조건에 따라 자식클래스 2번 내용으로 채워준다. 
				
t1.fire();  // 무기발사 명령을 미리 해둔다.

 

 

 

 


 

위의 예시에서 어떤 캐릭터가 어떤 무기를 발사할지는 모르지만 일단 무기 발사 명령 (fire 메소드)를 시켜 두었습니다. 그리고 설정해둔 조건에 따라 캐릭터(자식클래스)가 결정되면 부모 클래스에 그 내용을 넣어주고 적힌 내용대로 메소드를 실행하게 됩니다. 이렇게 같은 필드 또는 메소드를 다른 내용으로 실행시키는 것이 바로 다형성의 특징 중 하나인 오버라이딩 입니다. 간단히 상속해준 부분에 한해 내용(값)을 덮어쓴다라고 이해하면 됩니다.

728x90

댓글

💲 추천 글