FireDrago

[java] 상속과 다형성 개념정리 본문

프로그래밍/Java

[java] 상속과 다형성 개념정리

화이용 2023. 5. 1. 14:39

상속 

- 클래스와 클래스의 관계에서 상속받는다. > 멤버(변수와 함수)를 물려받는다.

- 상속관계가 성립하면, 코드의 양이 줄어든다.

- 자바는 단일상속만 허용한다. ( 한 클래스는 하나의 조상만을 가진다.)

class Person {
	void breath () {
		System.out.println("숨쉬기");
	}
}

class Student extends Person { // Studendt 클래스는
	void learn () {        // Person 클래스를 상속받는다. >> Person 멤버 사용가능
		System.out.println("배우기");
	}
}

 

오버라이딩

- 상속받은 멤버함수를 자손클래스에서 내용변경하는것 

- 이때 메소드의 이름, 반환값, 매개변수의 수와 타입은 변경할 수 없다

.

class Animal {
	void sound() {
		System.out.println(" ");
	}
}

class Cat extends Animal {
	@Override
	void sound() { //Animal (부모)의 sound( ) 메서드를 자손에서 재정의
		System.out.println("야옹");
	}
}

제어자

- 클래스나 멤버 (변수, 함수)의 사용을 제어하기 위해 붙인다.

public 제한없이 접근 할 수 있음
protected 같은 패키지 안, 자손 클래스에서 접근 할 수 있음
(default) 같은 패키지 안에서만 접근 할 수 있음
private 같은 클래스 내에서만 접근 할 수 있다.

 

다형성 

- 객체가 다양한 형태를 가질 수 있다는 의미로

- 클래스가 상속관계에 있을때, 부모타입의 참조변수로 자손타입의 객체를 참조할 수 있다.

- 메서드의 매개변수에 부모타입을 주면, 메서드를 호출할때 자손타입의 참조변수를 사용할 수 있다.

class A1 {
	void methodA() {
		System.out.println("methodA");
	}
}

class B1 extends A1{
	void methodB() {
		System.out.println("methodB");
	}
}

public class Ch7_6 {
	public static void main (String [] args) {
		A1 obj = new B1(); //부모 타입으로 자손 객체 참조 (다형성)
		obj.methodA();
	}
}

 

- 부모타입의 참조변수로 자손객체 참조할때 

 1. 메서드가 오버라이딩 된 경우 >>> 자손의 오버라이딩된 메서드 실행

 2. 오버라이딩 되지 않은 경우 >>> 부모의 원래 메서드 실행

class A1 {
	void methodA() {
		System.out.println("methodA");
	}
}

class B1 extends A1{
	@Override
	void methodA() {
		System.out.println("methodB");
	}
}

public class Ch7_6 {
	public static void main (String [] args) {
		A1 obj = new B1(); //다형성 
		obj.methodA();  // 결과값 "methodB" (오버라이딩 메서드 실행)
	}
}
class A1 {
	void methodA() {
		System.out.println("methodA");
	}
}

class B1 extends A1{
	//오버라이딩 된 메서드가 없다.
}

public class Ch7_6 {
	public static void main (String [] args) {
		A1 obj = new B1(); //다형성 
		obj.methodA();  // 결과값 "methodA" (부모의 메서드 실행)
	}
}

 

- 부모타입의 참조변수로 자손타입의 객체를 참조할때

 1. 변수의 경우 부모의 변수를 가져온다.

class A1 {
	int a = 10;
}

class B1 extends A1{
	int a = 20; // A1 클래스의 'a'와 다른 변수
}

public class Ch7_6 {
	public static void main (String [] args) {
		A1 obj = new B1(); //다형성 
		System.out.println(obj.a);  // 결과값 "10" (부모클래스의 int a)
	}
}

- 부모 클래스에 함수나 변수가 존재 하지 않는 경우 가져 올 수 없다. (에러)