본문 바로가기

Programming/JAVA

java : 특정 객체를 부모로 상속하는 객체들을 파라미터로 하는 메소드를 쓸 땐 부모 객체를 파라미터로.

제목이 무척 기네요. ㅎㅎ

제목을 보면 알 수 있듯이 상속에 대해 작성할까 합니다.
사실 상속보다는 다형성이란 표현이 어울리지 않을까 하기도 하네요.

우선 소스부터 보겠습니다.

package test2;

class Parent{	int age;     }
class Son1 extends Parent{
	public Son1(){		super.age = 28; 	}
}
class Son2 extends Parent{
	public Son2(){		super.age = 25; 	}
}
class Son3 extends Parent{
	public Son3(){		super.age = 22; 	}
}

public class PolymorphismTest1 {
	public static void main(String[] args) {
		PolymorphismTest1 pTest = new PolymorphismTest1();
		
                Son1 s1 = new Son1();
		Son2 s2 = new Son2();
		Son3 s3 = new Son3();
		pTest.grow(s1);
		pTest.grow(s2);
		pTest.grow(s3);
		pTest.showAge(s1);
		pTest.showAge(s2);
		pTest.showAge(s3);
		
 		/*//부모 배열에 순서대로 자식객체들을 참조시키기. (위의  긴 코드를 이렇게 짧게 줄일 수 있습니다.
		Parent[] par = {new Son1(), new Son2(), new Son3()};
		for(Parent parInstance : par){
			pTest.grow(parInstance);
			pTest.showAge(parInstance);
		}*/

	}
	public void grow( Parent par ){
		par.age += 1;
	}
	public void showAge( Parent par ){
		System.out.println(par.getClass().getName()+"'s age : "+par.age);
	}
}
---------------------------출력-------------------------
test2.Son1's age : 29
test2.Son2's age : 26
test2.Son3's age : 23

잡담 : 예제를 위한 예제를 만들다보니 주석처리한 부분처럼 사용을 하면 무척 간결해지는 구나 라는 배움을 얻었네요 ㅎㅎ

위의 소스를 보면 우선 age 라는 int타입의 변수하나를 가지고 있는 Parent 클래스를
상속받는 자식클래스 Son1, Son2, Son3 이 있습니다.
그리고 PolymorphismTest1 (이하 PT1) 이라는 클래스가 있죠.

PT1 클래스는 main method 이외에 grow과 showAge라는 메소드가 있는데
이 메소드들의 파라미터를 보시면 Parent 를 받고 있습니다.

그럼 이 코드를 실행하면 결과가 나오기까지 무슨 일이 일어나는지 보겠습니다.
PT1 의 grow 메소드와  showAge 라는 메소드를 위해 PT1 객체를 생성합니다.
Son1, Son2, Son3 역시도 객체를 생성해주고 참조변수도 모두 Son1, Son2, Son3 의 타입으로 만들어줍니다.

그리고 깜짝! grow와 showAge 메소드를 호출하는데 이때 파라미터로 Son1, Son2, Son3 타입을 그대로 넣네요.
이것이 바로 매개변수의 다형성 이라고 합니다.
매개변수의 다형성은 사실, 예전에 포스팅하였던 참조변수의 다형성 등에 대해 포스팅하면서 이미 한번 언급했는데요,
형변환 등에 대해 이해하고 계신다면 바로 이해하실 수 있습니다.

뻔한 다형성의 성질에 대해 포스팅하고자 하는 것은 아니구요, 만약 이러한 다형성의 성질을 몰랐다면
위의 코드는 무척이나 번거로워질 수 있습니다.
        public void grown(Son1 son){
		son.age += 1;
	}
	public void grown(Son2 son){
		son.age += 1;
	}
	public void grown(Son3 son){
		son.age += 1;
	}
	public void showAge(Son1 son){
		System.out.println(son.getClass().getName()+"'s age : "+son.age);
	}
	public void showAge(Son2 son){
		System.out.println(son.getClass().getName()+"'s age : "+son.age);
	}
	public void showAge(Son3 son){
		System.out.println(son.getClass().getName()+"'s age : "+son.age);
	}

위와 같이 메소드들을 여러번 오버로딩하며 재정의해주어야 되겠죠;;
딱 보기에도... 엄청난 체력적 정신적 고통을 수반하는 노가다가 느껴지십니까? 

늘 생각하는 것으로... 다형성은 정말 사랑할 수 밖에 없는 개념이네요.