부모 클래스에 정의된 필드와 메서드를 자식 클래스가 물려받는 것
java.lang.Object
extends
키워드 활용
public class Person {
public void tell();
public void eat();
public void walk();
public void sleep();
}
public class Student extends Person {
public void study();
}
super(arg1, arg2, ...)
로 불러서 사용 public class ColorPoint extends Point {
private String color;
// 생성자
public ColorPoint(int x, int y, String color) {
super(x, y); // 부모 생성자 중 특정 생성자 이용
this.color = color;
}
}
super()
로 명시적 호출super
키워드 사용
부모 클래스의 메서드를 동일한 이름으로 재 작성 (Re-Writting)
※ 같은 이름, 같은 리턴타입, 같은 시그니처 (내용만 변경)
@Overriding
: 부모에게 메서드가 있는지 확인 (진짜로 오버라이딩 유무 컴파일러에게 체크) @Override // 컴파일러에게 이 메서드가 오버라이딩한 메서드인지 확인
public void draw(boolean bDraw) {
// 부모로부터 물려 받은 메서드를 덮어 쓰기
String message = String.format("색깔점[x=%d, y=%d, color=%s]을 ", super.getX(), y, color);
message += bDraw ? "그렸습니다." : "지웠습니다.";
System.out.println(message);
// 부모의 메서드 호출
super.draw(bDraw);
}
new
로 생성한 객체의 메소드/생성자 호출부모 객체로 자식 객체를 참조 : Person p1 = new Student();
자식의 생성자 사용 가능
Person p1 = new Student(); Student s1 = new Student();
p1.getName(); ⭕ s1.getName(); ⭕
p1.getAge(); ⭕ s1.getAge(); ⭕
p1.getShoolName(); ❌ s1.getSchoolName(); ⭕
// p1은 Person의 Instance이므로 getShoolName()이라는 method가 존재하지 않음
❗ p1
의 경우 Type(객체)는 Person Type이며, 참조 하고 있는 Instance
는 Student이다.
➡ 따라서 p1
은 getShoolName()
이라는 Method를 가지고 있지 않으므로 호출 불가
이해가 잘 안되니 더 공부해보자
overriding
된 경우)업 캐스팅
자식 클래스가 부모 클래스 타입으로 변환되는것
명시적으로 타입 변환을 하지 않아도 됨 Person p1 = new Student();
다운 캐스팅
업캐스팅된 것을 원래대로 되돌리는 것
명시적 타입 변환 필요 ((Student) p1) : 일시적 형 변환
다운캐스팅시 어떤 클래스를 객체화 한것인지 알고자 한다면 instanceof
를 사용
❗ 자식 클래스간의 횡이동 캐스팅은 불가능