본문 바로가기
My Image
프로그래밍/Java

[Java] 다형성 (Polymorphism)

by Lim-Ky 2017. 10. 25.
반응형

자바의 다형성 (Polymorphism)


자바에선 반드시 알아야 할 OOP라는 개념이 있습니다. 캡슐화, 상속, 추상화, 다형성! 그 중 오늘은 다형성에 대해서 조금 자세히 알아보도록 하겠습니다. 


자바에서 말하는 다형성은 상위클래스와 하위클래스 사이에서 설명 할 수 있는 다형성과 인터페이스와 구현클래스 사이에서도 설명 할 수 있는 다형성 등이 있습니다. 하지만, 기본적으로 자바의 다형성에 대해서 설명해보세요. 라고 질문을 받게 된다면, 오버로딩(Overloading)과 오버라이딩(Overriding)을 설명하면 됩니다. 자바의 가장 기본적인 다형성이기 때문이지요..


우선 오버로딩과 오버라이딩을 구별해 보겠습니다.


1. 같은 메서드 이름, 같은 인자 목록에서 상위 클래스의 메서드를 재정의

2. 같은 메서드 이름, 다른 인자 목록에서 다수의 메서드를 중복 정의 


어떤 것이 오버로딩이고 오버라이딩일까요???

네 맞습니다. 1 번이 오버라이딩이고, 2번이 오버로딩입니다!! 


오버라이딩과 오버로딩을 한번에 설명 할 수 있는 예제를 보겠습니다. 


Animal.java

public class Animal {

	public String name;

	public void showName() {
		System.out.printf("안녕 나는 %s야. 반갑다.\n", name);
		
	}

}

Tiger.java

public class Tiger extends Animal {

	public String habitat;
	
	public void showHabitat(){
		System.out.printf("%s는 %s에 살아\n",name,habitat);
	}
	
	//오버라이딩
	public void showName(){
		System.out.println("오버라이딩!! 보안상 이름을 말할 수 없습니다.");
	}
	
	//오버로딩
	public void showName(String yourName){
		System.out.printf("오버로딩!! %s 안녕, 나는 %s라고 해\n",yourName, name);
	}
}

Main.java

public class Main {

	public static void main(String[] args) {
		
		Tiger hodol = new Tiger();
		
		hodol.name ="호돌이";
		hodol.habitat = "시베리아";
		
		hodol.showName();
		hodol.showName("기아타이거즈");
		hodol.showHabitat();
		
		Animal kiaTiger = new Tiger();
		
		kiaTiger.name = "기아타이거즈";
		kiaTiger.showName();

	}

}

**결과**


오버라이딩!! 보안상 이름을 말할 수 없습니다.

오버로딩!! 기아타이거즈 안녕, 나는 호돌이라고 해

호돌이는 시베리아에 살아

오버라이딩!! 보안상 이름을 말할 수 없습니다.


위 코드에 대한 분석을 간단하게 말씀드리면, Animal 상위 클래스에 있는 메소드를 Tiger라는 하위 클래스가 오버라이딩하여 자신의 스타일에 맞게 재정의 하였고, 같은 메서드 이름으로 매개변수 타입 or 매개변수 갯수를 다르게 줘서 오버로딩 중복 정의를 하였습니다.


마치며...


그럼 도대체 왜 자바에서 다형성을 할까요??? 즉 왜 오버로딩과 오버라이딩을 해야할까요???

바로 코드 재사용성이 높아지기 때문입니다. 개발자는 귀차니즘성향(?)이 강한 직업 중에 하나입니다. 썼던 코드 다시 살짝만 바꿔서 목적과 용도에 맞게끔 설계하면 개발자 편의성이 높아집니다. 덩달아 유지보수도 높아지지요... 또한, 객체지향 설계원칙에 부합됩니다. 사람이 사고하는 생각의 흐름처럼 자연스럽게 코드에도 적용할 수 있으니까요....동시에 한 가지 기능에 대해 용도와 목적에 맞게끔 커스터마징할 수 있습니다. 예를 들어 사람 클래스라는 상위클래스가 있습니다. 사람 클래스를 상속받은 하위클래스 홍길동은 생각하다 메서드를 오버라이딩해서 꿈을 생각하는데 사용합니다! 반면, 길동이의 친구 철수는 생각하다 메서드를 오버라이딩해서 오늘 퇴근하고 뭐하고 놀지 생각합니다. 각자에 스타일에 맞게 구현하는 것입니다. ㅎㅎ 



워낙 중요하기 때문에 다시 한번 복습하고 마무리하겠습니다..


크게 자바프로그래밍 객체지향에서 다형성의 개념을 녹여내는 방법은 두가지인데, 

바로 오버라이딩(Overriding)오버로딩(Overloading)이다.

간단하게 설명하자면,

오버라이딩은 부모클래스에서 상속받은 서브클래스 즉 자식클래스에서 부모클래스,즉 상위클래스에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는 것을 말한다.

오버로딩은 하나의 클래스 안에서 같은이름의 메서드를 사용하지만 각 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현할 수 있게 만드는 개념인데 오버로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 갯수나 데이터타입이 다르면 오버로딩이 적용되어 메서드 이름이 같아도 문법 에러가 나지않는다..

같은 행위를 하지만 용도와 목적에 부합하여 다양한 기능수행과 처리, 결과를 낳을 수 있는 것이다.




반응형

댓글