유블로그

[Java] 다형성, 상속 본문

Java

[Java] 다형성, 상속

yujeong kang 2020. 8. 10. 15:19

다형성 : 하나의 이름으로 여러 개의 형태를 구성할 수 있는 OOP 특징 

            - Type 

            - Method


- Method

overloading name이 같아도, parameter가 다르면 별개의 method로 간주함. 생성자도 동일
+ 접근제한자가 달라도 오버로딩(상속 때 말고!!!)
overriding 상속 관계에서 부모 Class의 method를 자식 Class에서 재정의 할 수 있음

오버라이딩 시 부모 클래스 method 접근제한자와 자식 클래스 method 접근제한자가 같아야 한다.

그래서 public String toString(){} 함수 같은 경우에 public 을 변경할 수 없다. Object의 메소드를 오버라이딩하는 것이기 때문.

 


- Type

부모 Type으로 자식 Type의 객체를 Reference 할 수 있다. = 부모는 자식을 받을 수 있다!!

즉, 한 개의 Type으로 여러 하위 Type의 객체를 할당 받을 수 있다.

 

Object ← A ← B  상속관계일 때,

Object o = new A(); // 가능

B b = new A(); // 불가능

A a = new B();  // 가능

Object o = new B(); // 가능

 

** 부모 = 자식 은 가능하지만 (묵시적 형변환), 자식 = 부모는 가능하지 않다. **

자식 = 부모 -> 명시적형변환 시 가능.. ex) b = (B)new A();


** 같은 메서드 기준 : parameter 와 함수 이름 **

public class A {
	int a = 1, b = 2;
	public String toString() {
		return a + " " + b;
	}
}

public class B extends A{
	int c = 3;
	public String toString() {
		return a + " " + b + " " + c;
	}
	
	public static void main(String[] args) {
		A a2 = new B();
		System.out.println(a2.toString());	// 1 2 3
        // B의 toString 이 실행됨
	}
}

 

 

class A {
	void a(int i) {
		System.out.println("A");
	}
}
class B extends A {
	void b() {
		System.out.println("B");
	}
}
class C extends B {
	void a() {
		System.out.println("C");
	}
	void b(int i) {
		System.out.println("C");
	}
}
class D extends C {
	void a(int i) {
		System.out.println("D");
	}
	void b() {
		System.out.println("D");
	}
}
class E extends D {
	void a() {
		System.out.println("E");
	}
	void b() {
		System.out.println("E");
	}
}

public class Test {
	public static void main(String[] args) {
		A x0 = new C();	x0.a();		// 에러 : A의 a는 매개변수가 필요한데 C에는 매개변수 있는 a함수가 없기 때문에 오류.
		C x1 = new E();	x1.b(3);	// C의 b함수 호출
		D x2 = new B();	x2.b();		// 에러 : D는 B의 하위 클래스이다.
		B x3 = new D();	x3.a(3);	// D의 a함수 호출
	}
}

부모 A = 자식 B

이런 상황일 때 A.func() 하면,

먼저 A가 가진 func()를 기본적으로 호출한다.

하지만 부모를 상속받은 자식이 오버라이딩한 함수가 있다면 그 함수 호출.

오버라이딩 함수 제외한 모든 것은 부모의 것을 호출한다.


< @Override Annotation >

method 를 재정의 할 때 사용 권장

부모 Class의 특정 method를 재정의 한다고 compiler에게 명시하는 것.

만약 부모 Class에 해당 method 가 없는 경우 compile 오류 발생.

부모 Class 에서 변경이 생기고 a 함수가 지워졌다면

a 함수를 override 한 자식 클래스에서 오류가 나서 변경된 것을 알 수 있다.

'Java' 카테고리의 다른 글

[Java] Inner class  (0) 2020.08.10
[Java] Interface - 추상화  (0) 2020.08.10
[Java] 상속과 접근제한자  (0) 2020.08.10
[Java] 입출력 처리 - Scanner, BufferedReader  (0) 2020.08.10
[Java] StringBuilder 사용법  (0) 2020.07.29