extends
뒤에 작성class 자식클래스 extends 부모클래스 {
// 필드, 생성자, 메소드
}
super()
로 부모의 기본 생성자를 호출함// 예시
// 부모(상위) 클래스
public class People {
public String name;
public String ssn;
public People(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
}
// 자식(하위) 클래스
public class Student extends People {
public int studentNo;
public Student(String name, String ssn, int studentNo) {
super(name, ssn); // 부모클래스의 생성자를 호출
this.studentNo = studentNo;
}
}
// 예시
// 부모 클래스
public class Calculator {
double areaCircle(double r) {
System.out.println("Calculator 객체의 areaCircle() 실행");
return 3.14159 * r * r;
}
}
// 자식 클래스
public class Computer extends Calculator {
@Override // @Override 어노테이션은 생략 가능하지만 메소드가 정확히 재정의 된 것인지 컴파일러가 확인하므로 실수를 줄여줌
double areaCircle(double r) {
System.out.println("Computer 객체의 areaCircle() 실행");
return Math.PI * r * r; // 자바 표준 API
}
}
super.부모메소드()
형태 @Override
public void fly() {
if(flyMode == SUPERSONIC) {
System.out.println("초음속 비행합니다.");
}
else {
super.fly(); // 부모 클래스에 있는 메소드 실행
}
public final class 클래스이름 { . . . }
public final 리턴타입 메소드([매개변수, ...]) { . . . }
자식 -> 부모 타입으로 자동변환 가능
void 메소드이름(자식 객체) {
자식객체.메소드(); // 자식 객체가 재정의한 메소드 실행
}
// 예시
public class DriverExample {
public static void main(String[] args) {
Driver dri = new Driver();
Bus bus = new Bus();
Taxi taxi = new Taxi();
// 자동 타입 변환
dri.drive(bus);
// Vehicle vehicle = bus; 자식 객체의 메소드 실행
dri.drive(taxi);
// Vehicle vehicle = taxi; 자식 객체의 메소드 실행
}
}
Parent par = new Child(); // 자동 타입 변환 (자식 -> 부모)
Child chi = (Child) par; // 강제 타입 변환 (부모 -> 자식)
// 예시
public class ChildExample1 {
public static void main(String[] args) {
Parent1 par1 = new Child1();
par1.field1 = "data1";
par1.method1();
par1.method2();
// 부모 클래스 안에 있는 것만 사용 가능 (자동 타입 변환)
// par1.field2 = "data2";
// par1.method3();
Child1 chi1 = (Child1) par1; // 강제 타입 변환
chi1.field2 = "yyy";
chi1.method3();
}
}
Parent par = new Parent();
Child chi = (Child) par; // 불가능
instanceof
연산자 사용하기
boolean result = 좌항(객체) instanceof 우항(타입)
// 예시
public static void method1(Parent par) {
if(par instanceof Child) {
Child chi = (Child) par;
System.out.println("method1 - Child로 변환 성공");
}
else {
System.out.println("method1 - Child로 변환 실패");
}
}
1. 공통된 필드와 메소드의 이름을 통일할 목적
2. 실체 클래스를 작성할 때 시간 절약
abstract
키워드를 붙여야 함 (붙이면 new
연산자를 이용해 객체를 만들지 못하고 상속으로 자식 클래스만 만들 수 있음)상속받은 자식 클래스에서 객체를 생성할 때
super()
를 호출해서 추상 클래스 객체를 먼저 생성하므로 생성자 필수
// 추상 클래스
public abstract class Phone {
// 필드
public String owner;
// 생성자
public Phone(String owner) {
this.owner = owner;
}
// 자식 클래스
public class SmartPhone extends Phone{
// 생성자
public SmartPhone(String owner) {
super(owner);
}
abstract
키워드와 함께 메소드의 선언부만 있고 실행내용인 { }가 없는 메소드[public | protected] abstract 리턴타입 메소드이름(매개변수, ...)