자바(Java) - 오버라이딩이란??

안녕하세요

이번 시간에는 자바에서 역시나 중요한 개념 중 하나인 오버라이딩(Overriding)에 대해서

글을 써봅니다.


오버라이딩은 메소드 재정의로, 부모의 메소드를 자식 클래스에서 다시 정의하여 구성하는 것입니다.

오버라이딩에는 5가지의 규칙이 있습니다.

1) 부모의 메소드와 이름을 동일하게
2) 매개변수의 자료형, 갯수, 순서 모두 동일하게
3) 반환타입도 부모의 것과 동일하게
4) 접근지정자는 부모의 것과 동일하거나 더 넓은 범위의 지정자 사용이 가능하다
5) Exception의 경우 부모 클래스의 메소드와 동일하거나 더 구체적인 Exception을 발생시켜야 한다.  (대신 메소드 바디는 부모와 다르게 구성)

아래에 오버라이딩 예제를 올려봅니다.

public class Human{
	String name;
	int height;
	
	public Human(String name, int height){
		this.name=name;
		this.height=height;
	}
	public void showInfo(){
		System.out.println("이름 : "+name);
		System.out.println("키 : "+height);
	}
}
class Superman extenhds Human{
	int power;
	public Superman(){
		super("슈퍼맨", 170); // super 명령어를 사용하여 부모 Human 클래스를 호출함
	}
	public Superman(String name, int height, int power){
		super(name, height);
		this.power=power; // power는 Superman 클래스에서 설정
	}
	//오버라이드
	@Override
	public void showInfo(){
		super.showInfo();
		System.out.println("초 능 력 : "+ power);
	}
	//오버로드
	public void showInfo(String title){
		System.out.println(title);
		this.showInfo(); // 위의 showInfo() 메소드로 이동
	}
	public String showInfo(String title, int pw){
		String str="";
		this.showInfo(title); // 위의 showInfo(String title) 메소드로 이동
		power+=pw;
		str+=">>>초능력 UP>>"+power+"<<<\n";
		return str;
	}
}

아래 소스는 Overriding이라는 메인 클래스에서 위의 Human, Superman 클래스를 불러온 소스 코드입니다.

부모와 자식의 상속관계를 맺을 경우, 객체를 생성할 때

------------------------------------------------------
부모타입의 변수선언 = new  자식객체생성자();
------------------------------------------------------
가능합니다.

하지만 자식의 고유한 변수나 메소드는 접근할 수 없습니다.

또 자식클래스에 오버라이드한 메소드가 있을 때는

자신의 클래스보다 오버라이드한 자식의 메소드를 우선 호출하니 주의 바랍니답


public class Overriding {
	public static void main(String[] args) {
		Human h1 = new Human("홍길동", 160);
		Superman s1 = new Superman("리차드", 170, 220);
		h1.showInfo();
		s1.showInfo();
		
		s1.showInfo("##슈퍼맨 정보");
		String info = s1.showInfo("-- 슈퍼맨 정보 --", 300);
		System.out.println(info);
		Human hs = new Superman("토마스", 180, 300);
		System.out.println("hs.name="+hs.name);
		System.out.println("hs.height="+hs.height);
		hs.showInfo(); // human 타입이라도 Override 된 메소드를 우선
		
		// 강제 형변환도 가능, .의 우선순위가 높기 때문에 괄호로 처리하여 먼저 형변환
		((Superman) hs).showInfo("$$슈퍼맨 정보$$");
		// Human 타입의 배열을 생성하여 저장, for루프를 이용하여 출력
		Human[] h_arr = {h1, s1, a1, hs, ha};
		/* 참조변수 instanceof 클래스명
		   참조변수가 클래스의 객체면 true를 반환, 아니면 false를 반환
		*/
                // for문을 돌려야 하는데 에러가 나서 위에 간단히 구현하세요~
		// h_arr[i]가 Superman 객체이면..
			if(h_arr[i] instanceof Superman){
				((Superman)h_arr[i]).showInfo("####슈퍼맨####");
			}else if(h_arr[i] instanceof Aquaman){// Aquaman 객체면..
				((Aquaman)h_arr[i]).showInfo("~~~~~아쿠아맨~~~~~~");
			}else{
				System.out.println("----------");
				h_arr[i].showInfo();
			}
		}
	}
}

댓글 없음:

댓글 쓰기