본문 바로가기

Language/Java 기본

상속과 다형성, 오버라이딩

상속 - 이어받다

 

기존 클래스의 변수 (데이터) 와 메서드(로직) 을 물려받아 새로운 클래스를 구성하는 것.

 

기존클래스(부모 클래스, 슈퍼클래스)

 

새로운 클래스(자식 클래스, 서브 클래스): 기존 클래스의 클래스를 재사용,대체, 추가 가능.

 

따라서 자식 클래스가 더 많은 데이터를 가지고 있을 수 있다.

 

자식클래스의 동일메서드를 지우고 싶을경우, 부모 클래스의 메서드를 지우면 된다.

 

 

상속의 장점

 

-기존 클래스의 변수, 필드, 코드를 재사용

 

- 먼저 작성된 검증된 프로그램을 재사용

 

- 클래스간 계층적 분류 및 관리 

 

 

 

class 서브클래스(자식클래스) extends 슈퍼클래스(부모클래스)

 

package Inheritance;

public class Devilla {

	private int hp;
	private int attack;
	private String name;

	public Devilla(int hp, int attack, String name) {
		super(); //
		this.hp = hp;
		this.attack = attack;
		this.name = name;
	}

	public void front_walk() {

		System.out.println(name + "is walkface");
	}

	public void back_walk() {

		System.out.println(name + "is walkback");
	}

	public void jump() {
		System.out.println(name + "is jump");

	}

	public void a_attack() {
		System.out.println(name + "is Attack!");
	}

	public void show() {

		System.out.printf("hp is %d\n", hp);
		System.out.printf("power is %d\n", attack);
		System.out.printf("name is %s\n", name);
	}

}

 

 

부모 클래스의 구성

 

package Inheritance;

public class super_Devilla extends Devilla { // 부모클래스가 디폴트 생성자가 아닌 다른 생성자를 가지면
//	         반드시 그 생성자를 정의해야함 Devilla 생성자가 있음

	public super_Devilla(int hp, int attack, String name) {
		super(hp, attack, name); // 부모 클래스의 생성자를 가져옴
		// TODO Auto-generated constructor stub
	}
// devilla's SubClass

	public void skill() {
		System.out.println("overclock");
	}
}

 

 

자식 클래스의 구성

 

 

자식 클래스에 정의되지 않은 메서드를 사용할 수 있는데

부모 클래스로부터 기능을 물려받아 사용할 수 있게되기 때문에 그런 것이다.

 

오버라이드는 해당 메서드를 동일 클래스 내, 혹은 자식 클래스가 부모 클래스에서 물려받은 메서드 등을 

재정의 하는 것인데, 오버라이딩 할 때에는 안의 접근제한자, 인자개수, 리턴값의 자료형 등이 모두 같아야 하며,

빨간 원과 같이 초록색 화살표로 표기된다.

암묵적으로 오버라이딩에는 @Override 로 표기하여 알아보기 쉽게 하자는 규칙이 존재한다.

 

이 때, first와 second는 동일한 메서드를 사용하지만, second의 클래스에서 attack 메서드는 오버라이딩 되었기 때문에 다른 결과를 보인다.

 

모든 기능의 검사 순서는

 

서브클래스 -> 슈퍼클래스 이다. 

이 경우, 서브 클래스에 a라는 변수가 있는지 확인하고 없으면 슈퍼클래스로 가서 검사하기 때문에

서브클래스에서 슈퍼클래스의 메서드 혹은 변수를 사용할 수 있다.

 

 

 

 

【 상속 특징 】

 

1. 다중 상속을 지원하지 않는다.

 

- 하나의 자식 클래스는 여러 부모를 가질 수 없다.

- 단, 하나의 부모 클래스는 여러 자식을 가질 수 있다.

 

2. 상속의 횟수에 제한을 두지 않는다

 

- 하위 클래스의 하위 클래스 식으로 내려가면서 횟수제한이 없다.

 

3. 모든 클래스는 java.lang.object를 상속받는다.

 

- object 클래스는 equals, getclass, hashcode, notify, toString 등 클래스 운용에 필요한 기본적인 메서드들을 지원한다.

 

- 따라서 최상위 부모는 object 가 된다.

 

 

 

【 캐스팅 】

 

기존 데이터 타입을 다른 데이터타입으로 형변환 하는 것.

 

기본 타입 : 데이터 공간의 크기에 따라 (Double[8바이트] -> int [4바이트])

 

레퍼런스 타입 : 객체 내 필드, 메소드의 접근 권한 업 캐스팅, 다운 캐스팅

 

 

업 캐스팅 : 하위 클래스가 상위클래스 타입으로 자동 타입 변환 하는 것 (다형성)

 

- 객체 내 모든 변수, 메서드에 접근할 수 없고

상위 클래스의 변수, 메서드에만 접근 가능. 

 

- 단 하위클래스가 상위 클래스의 메서드를 오버라이딩 한 경우는 예외로 하위 클래스 메서드 호출

 

 

super.Sandy() 처럼 super라는 수식어를 붙이는 경우 부모 클래스 중 Sandy() 메서드의 기능을 그대로 

쓰겠다는 의미이다.

 

 

package Inheritance;

public class Main_Cpu {
public static void main(String[] args) {
	
	parent first = new parent();
	
	// parent = parent
	son second = new son();
	// second = second
	
	parent third = new son(); //UpCasting
	first.Sandy();
	second.Sandy();
	
	third.Sandy();
	
}
}

 

 

my name is sandy 라는 문장은 부모 클래스에서

i'm super sandy 는 자식 클래스가 오버라이딩 한 것이다.

이것을 업캐스팅하여 parent = son 과 같이 객체를 생성하였을 경우

오버라이딩 한 메서드는 자식클래스의 것을 그대로 쓰지만,

부모 클래스에 없는(자식클래스로 생성 한(자식클래스의 메서드) 객체 내 있는 메서드) 메서드는 사용할 수 없다.

 

즉 부모 클래스의 메서드만을 사용할 수 있으며

예외적으로 자식 클래스에서 오버라이딩 된 메서드를 반영한다는 것이다.

 

업 캐스팅이 가능한 이유는 부모 클래스가 필요한 메소드와 필드를 자식 클래스가 전부 가지고 있기 때문이다.

 

 

다운 캐스팅 : 업 캐스팅 된 것을 강제(명시적) 타입 변환으로 다시 되돌리는 것

- 업 캐스팅 된 객체를 대상으로만 가능

 

업 캐스팅된 객체 third에 대해 forth 라는 객체를 다운캐스팅으로 생성하였다

따라서 자식클래스가 가진 메서드에 접근 할 수 있다.

 

 

 

package test;

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

		Doll doll = new Doll();

		doll.pick();

		pikachu doll2 = new pikachu();

		doll2.pick();

		Doll doll3 = new firely();

		doll3.pick();

		Doll doll4 = (Doll) doll3; // downcasting

		doll4.pick();

		machine machi = new machine();
		pikachu pika = new pikachu();
		machi.game(pika);

	}
}

메인

 

package test;

public class Doll {

	public void pick() {

		System.out.println("pickpick");
	}

}

doll 클래스

 

각각 doll 클래스를 상속받는 클래스

 

package test;

public class machine {
//다형성
	public void game(Doll doll) {
		doll.pick();

	}

}

machine 클래스

 

 

 

 

결과, 

 

machine 클래스에서 game 메서드는 다른 클래스(객체)가 상속받은 Doll 클래스의 

속성을 가지고 있으므로, 객체에 대한 doll.pick() 또한 수행 가능하다.

'Language > Java 기본' 카테고리의 다른 글

인터페이스  (0) 2021.01.11
JDBC 1  (0) 2021.01.11
생성자 및 접근제한자  (0) 2021.01.08
ArrayList  (0) 2021.01.08
메서드 오버로딩(Overloading)  (0) 2021.01.08