상속 - 이어받다
기존 클래스의 변수 (데이터) 와 메서드(로직) 을 물려받아 새로운 클래스를 구성하는 것.
기존클래스(부모 클래스, 슈퍼클래스)
새로운 클래스(자식 클래스, 서브 클래스): 기존 클래스의 클래스를 재사용,대체, 추가 가능.
따라서 자식 클래스가 더 많은 데이터를 가지고 있을 수 있다.
자식클래스의 동일메서드를 지우고 싶을경우, 부모 클래스의 메서드를 지우면 된다.
상속의 장점
-기존 클래스의 변수, 필드, 코드를 재사용
- 먼저 작성된 검증된 프로그램을 재사용
- 클래스간 계층적 분류 및 관리
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 |