상속
class 자식클래스 extends 부모클래스 {
}
상속을 받을경우 상위 클래스의 자원을 사용가능하다.
생성자 함수에 super() 가 생략되어있음.
기본 생성자 함수에 항상 생략되어있음
지역변수
-> 상위 클래스의 객체의 주소값
참고) this : 현재 클래스의 객체의 주소 값
public class C extends B {
int numC = 30;
public C() {
super(); //B클래스에 정의된 B();
System.out.println("C 생성자!");
}
}
하위 클래스의 객체 -> 상위 클래스의 자료형으로 자동 형변환 : 다형성
C -> A, C -> B
C c = new C();
A a = c;
==
A a = new C();
같음
참고)
instance: 실체
-클래스하고 하는 객체의 정의(존재X) -> new -> 힙공간에 존재 : 생성된 객체
C c = new C();
B b = new B();
System.out.println(c instanceof B);
-> true
같은 상위객체를 부모로 갖더라도 하위클래스가 다르면 형변환이 어려울 수 있다.
A ad = new D(); //ad객체는 D의 주소를 가리킴
A ac = new C();
//불가
if (ad instanceof C) {
C c = (C) ad;
}
//가능
if (ac instanceof C) { //상위 클래스로 올라갈 수 있는지 확인
C cc = (C) ac; //상위클래스로 올라감
System.out.println(cc.numC);
}
상위클래스: 일반적인 개념
하위클래스: 구체적인 개념
부모 클래스와 자식 클래스에서 같은 명의 다른 기능을 가진 메서드가 존재한다면 자식 클래스에서 그 메서드를 호출한다면, 자식 클래스의 메서드로 호출된다. 자식 클래스에서 존재하지 않을경우 부모 클래스의 메서드가 호출된다.
(상속시에 인스턴스 메서드에만 가능)
애노테이션: 주석, 주해
정보전달
@Override : 재정의된 메서드임을 컴파일러에게 알려주는 정보
-오타 방지
@Override
public void Move() {
System.out.println("두발로 직립 보행");
}
ex) 실수로 함수명을 잘못 입력했을 경우 알려줌
좁은 범위 -> 넓은 범위 변경 가능
상위 클래스에서 하위 클래스로 캐스팅한다. (확장)
instanceof와 if를 사용한다.
if (animal instanceof Human) {
Human human = (Human) animal;
human.reading();
} else if (animal instanceof Tiger) {
Tiger tiger = (Tiger) animal;
tiger.hunting();
}
생성자함수가 정의되어 있을 경우 super에 파라미터를 직접 입력해주어야한다.
//부모
public Student(int id, String name) {
this.id = id;
this.name = name;
}
//자식
public HighSchoolStudent() {
super(1000, "이이름");
}
추상적: 어떤일을 해야할지 결정되지 않음
공통적인
1. 추상 클래스란?
구성 요소 중에서 정해지지 않은 클래스
-함수가 수행할 내용이 결정되지 않은 클래스
-함수의 정의만 있는 클래스
-하위 클래스가 공유해야할 공통적인 자원 정의 가능
public abstract class Calculator {
public abstract int add(int num1, int num2);
}
클래스와 추상메서드 앞에 모두 abstract 기입.
상위클래스에서 어떤 작업을 실행할지 정하지 않은 메서드를 하위클래스에서 @Override를 통해 어떤 작업을 실행할지 추가 한다.
상속이 진행되려면 객체가 되어야한다.
그래서 상속을 진행하는 부모와, 자식 클래스는 객체가 된다.
-변수 : 상수
-메서드 : 재정의 불가
템플릿 메서드 패턴
절차에 대한 메서드
public abstract class Car {
public abstract void start();
public abstract void press();
public abstract void turnoff();
//밑 메서드는 하위 클래스에서 모두 변경없이 따라야함
public final void run() { //템플릿 메서드 패턴
start();
press();
turnoff();
}
}
-클래스 : 상속 불가
//부모 클래스에서
public final void commonMethod() {
}
//상속받은 클래스에서
public void commonMethod(){ //에러 발생
}
public final class Car { //상속불가
}