[Java] 자바의 메소드 오버라이딩(method overriding)과 다형성(Polymorphism)


♦ 자바의 메소드 오버라이딩과 다형성
메소드 오버라이딩(method overriding)
일반적으로 상속 관계시 상위 클래스의 메소드를 하위 클래스에서 선언 없이 사용 가능하다. 이때 하위 클래스에서 상위 클래스의 메소드를 수정해서 사용할 수 있는데 이런 형태의 메소드를 오버라이딩 메소드 라고 한다.

메소드 오버라이딩 규칙
상속이 전제되어야 한다.
메소드 이름이 반드시 동일해야 한다.
메소드 리턴타입이 반드시 동일해야 한다.
메소드 인자 리스트가 반드시 동일해야 한다.
접근 지정자는 확대만 가능하다.
예외 클래스를 축소만 가능하다.
static, final, private 지정자를 가진 메소드는 오버라이딩이 불가능하다.

메소드 오버라이딩

class AA {
	String name;

	public AA(String name) {
		this.name = name;
	}

	public String getInfo() {
		return name;
	}

}

class BB extends AA {

	int age;

	public BB(String name, int age) {
		super(name);
		this.age = age;
	}

	public String getInfo() {	// 오버라이딩 메소드 
		return name + " " + age;
	}

}

 

다형성(Polymorphism)
long 타입의 변수는 정수형 변수 중 데이터 형이 가장 큰 타입이기 때문에 byte, short, int 타입의 데이터도 저장할 수 있다.
기본 데이터 형과 마찬가지로 참조 데이터 형에서도 같은 계열이고 큰 타입이면 하나의 변수가 여러 클래스타입의 객체를 저장할 수 있다. 같은 계열은 상속 관계를 의미하고 큰 타입은 상위클래스를 의미한다. 이 개념을 다형성 이라고 한다.

다형성의 특징
반드시 상속관계가 성립되어야 한다.
‘큰 타입 = 작은 타입’ 형식으로 사용한다.
‘작은 타입 = 큰 타입’ 형식으로 사용하기 위해서는 강제 형변환을 해야한다. 이때 데이터형을 식별하기 위해서 instanceof 연산자를 사용한다.
일반적으로 중복제거 및 재사용성을 위해서 메소드의 인자를 지정할 때 다형성을 많이 적용한다.

class AA {
	String name;

	public AA(String name) {
		this.name = name;
	}

	public String getInfo() {
		return name;
	}

}

class BB extends AA {

	int age;

	public BB(String name, int age) {
		super(name);
		this.age = age;
	}

	public String getInfo() {	// 오버라이딩 메소드 
		return name + " " + age;
	}

}

public class Test01 {
	public static void main(String[] args) {
		// AA 클래스와 BB 클래스 모두 AA 형 참조변수로 저장한다. 
		AA aa = new AA("정대만");
		AA bb = new BB("서태웅", 23);

		System.out.println(aa.getInfo());
		System.out.println(bb.getInfo()); // BB 클래스에서 재정의된 즉, 오버라이딩 메소드가 호출된다. 

	}

}

 

instanceof 연산자의 활용

public class Test01 {
	public static void main(String[] args) {
		AA aa = new AA();
		AA bb = new BB();
		AA cc = new CC();

		aa.test(aa);
		bb.test(bb);
		cc.test(cc);
	}

}

class AA {
	public void test(AA aa) {
		if (aa instanceof CC) {
			System.out.println("CC 의 인스턴스");
		} else if (aa instanceof BB) {
			System.out.println("BB 의 인스턴스");
		} else if (aa instanceof AA) {
			System.out.println("AA 의 인스턴스");
		}
	}

}

class BB extends AA {
}

class CC extends AA {
}

 

답글 남기기