상속과 다형성 - 3. 메소드 오버라이딩(Overriding)

Ⅲ. 메소드 오버라이딩(Overriding)

1. 메소드 오버라이딩(Overriding)

 - 메소드 오버라이딩

    - 부모클래스에게 상속받은 메소드를 재정의하여 사용 (덮어쓰기 개념)

 - 메소드 오버라이딩을 위한 조건

    - 부모클래스의 메소드와 시그니처리턴 타입 동일

    - 부모클래스의 메소드보다 접근지정자는 같거나 넓어야 함

 

2. 메소드 오버라이딩 (Method Overriding)의 메모리 구조

 - 객체내에 동일한 멤버가 두개 이상 있는 경우 :

    참조변수가 가리키는 객체의 바깥쪽부터 안쪽으로 들어가면서 첫번째 만나는 멤버가 실행

    ※ 메소드 오버라이딩 효과

        - 메모리를 재사용하므로 메모리 절약

        - 메소드명을 재사용하므로 기능 파악 용이

 

// Example1
package sample;

class A {
	void print() {
		System.out.println("A 클래스");
	}
}
class B extends A {
	@Override 			// (@Override : 이 구문은 Override 라고 표시 (선택사항))
	void print() {
		System.out.println("B 클래스");
	}
}
public class Test {
	public static void main(String[] args) {
		// 1. A 타입 / A 생성자
		A aa = new A();
		aa.print(); 		//A 클래스
		
		// 2. B 타입 / B 생성자
		B bb = new B();
		bb.print(); 		//B 클래스
		
		// 3. A 타입 / B 생성자
		A ab = new B();
		ab.print(); 		//B 클래스
	}
}

 

// Example 2
package sample;

class Animal {
	void cry() {
		System.out.println("끄앙");
	}
}
class Chicken extends Animal {
	@Override
	void cry() {
		System.out.println("꼬끼오");
	}
}
class Dog extends Animal {
	@Override
	void cry() {
		System.out.println("멍멍");
	}
}

public class Main {
	public static void main(String[] args) {
		Animal aaa = new Animal();
		aaa.cry();			// 끄앙
		Chicken bbb = new Chicken();
		bbb.cry();			// 꼬끼오
		Dog ccc = new Dog();
		ccc.cry();			// 멍멍
		Animal abb = new Chicken();
		abb.cry();			// 꼬끼오 (메소드 오버라이딩 되어 Chicken안에 메소드가 실행됨)
		Animal acc = new Dog();
		acc.cry();			// 멍멍 (메소드 오버라이딩 되어 Dog안에 메소드가 실행됨)
	}
}

 

3. 메소드 오버라이딩 (Method Overriding) vs. 메소드 오버로딩 (Method Overloading)

 

4. 메소드 오버라이딩 (Method Overriding)과 접근지정자

 - 오버라이딩 시 자식클래스의 메소드 접근지정자부모의 접근지정자보다 같거나 커야 함 (즉, 좁혀질 수 없음)

    ※ 접근 지정자의 범위 : public > protected > 안씀 > private

// Example
package sample;

class A {
	protected void abc() {}
}

class B1 extends A {
	public void abc() {}
}
class B2 extends A {
	protected void abc() {}
}
class B3 extends A {
	//void abc() {} //default 접근지정자 (좁아져서 불가능)
}
class B4 extends A {
	//private void abc() {} //private 접근지정자 (좁아져서 불가능)
}

public class Test {
	public static void main(String[] args) {
		
	}
}