부모의 메소드를 자식이 상속받을 수 있다
public class Car {
// run 메소드
public void run() {
System.out.println("달린다");
}
}
// Car 클래스 extends로 상속
public class Bus extends Car {
// stop 메소드
public void stop() {
System.out.println("멈춘다");
}
}
// Java 메인
main {
Bus bus = new Bus();
bus.run(); // "달린다"
bus.stop(); // "멈춘다"
car.stop(); // 오류
}
외부에 노출시키지 않고싶은 메소드와 필드가 있을 것 이다
public - 어떤 클래스던 접근할 수 있다.
protected - 같은 패키지인 경우 접근 가능, 다른 패키지라도 상속을 받은 경우 접근 가능
default - 아무것도 쓰지 않은 경우, 자기 자신과 같은 패키지만 접근 할 수 있다
private - 자기 자신만 접근 가능
public > protected > default > private
public class Access {
public int a = 1;
protected int b = 2;
int c = 3;
private int d = 4;
}
추상클래스는 구체적이지 않은 클래스를 의미한다. 독수리, 파랑새, 참새는 구체적인 새 이지만, 새, 포유류 등은 구체적이지 않다.
// 클래스명과 메소드 리턴 타입에 abstract를 적어준다
public abstract class Bird {
// 추상 메소드 생성
public abstract void sing();
// 추상 메소드가 아닌 일반 메소드도 만들 수 있다.
public void fly() {
system.out.println("날다");
}
}
// Bird 클래스를 상속받는 Duck 클래스 생성
public class Duck extends Bird {
public void sing() {
System.out.println("꽥꽥");
}
}
// Java 메인
main {
Duck duck = new Duck();
duck.sing(); // 꽥꽥
duck.fly(); // 날다
Bird b = new Bird(); // 오류 - 추상클래스는 인스턴스를 생성할 수 없음
}
부모 클래스를 상속받는 자식 클래스의 인스턴스가 만들어 진다면 부모 클래스의 기본 생성자를 실행한 후 자식클래스의 기본 생성자를 실행한다. 이때 자식 클래스에는 super(); 함수가 없어도 자동으로 super(); 함수가 실행된다. 직접 적어줄 수도 있다.
하지만 부모 클래스에 기본 생성자가 없다면 super();에 부모의 생성자에 맞는 인자를 넣어서 꼭 호출해줘야 한다
나를 가르키는 키워드가 this라면 부모를 가르키는 키워드는 super 이다
// 부모 클래스를 생성한다
public class Car1 {
// 생성자 생성
public Car () {
System.out.println("기본 생성자")
}
}
// 자식 클래스를 생성한다
public class Truck1 extend Car1 {
// 부모에게 기본 생성자만 있다면
// super()이 없어도 자동으로 super() 실행
}
// ----------------------------------------------- //
// 부모 클래스를 생성한다
public class Car2 {
String name;
// 생성자 생성
public Car (String name) {
this.name = name;
}
}
// 자식 클래스를 생성한다
public class Truck2 extend Car2 {
int num;
// 부모에게 기본 생성자가 없고 매개변수를 받는 생성자가 있다면
// super()에 인자를 넣어서 적어줘야한다
public Truck2 (String name,int num) {
super(name);
}
}
// ----------------------------------------------- //
// Java 메인
main {
Truck1 t1 = new Truck1(); // "기본 생성자"
Truck2 t2 = new Truck2("트럭2");
}
오버라이딩이란 부모가 가지고 있는 메소드와 똑같은 모양의 메소드를 자식이 가지고 있는 것이다. 즉 오버라이딩이란 메소드를 재정의 하는 것이다.
// 부모 클래스를 생성한다
public class Car {
// 메소드 생성
public void run() {
System.out.println("달려");
}
}
// 자식 클래스를 생성한다
public class Truck extend Car {
// 오버라이딩
public void run() {
System.out.println("트럭달려");
// super.run() 을 할 경우 부모의 run 메소드를 실행한다
}
}
// Java 메인
main {
Truck t = new Truck();
t.run() // 트럭달려
// super가 있을 경우
t.run() // 달려 트럭달려
}
부모 객체 Car와 그 부모를 상속받는 객체 Bus가 있다고 하자 이럴때
Car c = new Bus(); 로 인스턴스를 생성한다면 Car 클래스에 있는 메서드는 사용할 수 있지만 Bus클래스 내부에 있는 인스턴스는 사용할 수 없다. 이럴때
Bus bus = (Bus)c 로 형 변환 하여 사용할 수 있다