Polymorphism
Abstract Class
Interface
SOLID Principles
instanceof 현재 참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인할 때 사용하는 연산자, 클래스 타입이 맞으면 true, 아니면 false를 반환if (animal instanceof dog) {
Dog dog = (Dog) animal;
dog.bark();
}
// Java 16+
if (animal instanceof Dog dog) {
dog.bark();
}
Car[] 배열에 다양한 자동차 객체를 저장하고 자식에서 drive()를 오버라이딩 하는 경우, 호출할 때 실제 객체 타입에 맞는 메소드가 실행됩니다.Car[] carArr = new Car[5];
carArr[0] = new Sonata();
carArr[1] = new Avante();
carArr[2] = new Grandure();
for (Car car : carArr) {
car.drive();
}
public void execute() {
driveCar(new Sonata());
driveCar(new Avante());
driveCar(new Grandure());
}
public void driveCar(Car c) {}
public Class Car {
public void run() {
System.out.println("Car Run");
}
}
public class Sonata extends Car {
@Override
public void run() {
System.out.println("Sonata Run");
}
}
public class Main {
public static void driveCar(Car c) {
c.run(); // 이 부분이 동적 바인딩에 해당
}
public static void main(String[] args) {
driveCar(new Sonata()); // Sonata의 run() 호출
}
}
[Access modifier] abstract class ClassName {
// 추상 메소드
[Access modifier] abstract [ReturnType] MethodName([Parameters]);
// 일반 메소드
public void method() {}
}
public static final로 자동 선언됨)[Access modifier] interface InterfaceName {
// 상수(암묵적으로 public static final)
int CONSTANT_VALUE = 0;
// 추상 메소드(암묵적으로 public abstract)
void abstractMethod();
// Java8+
// default 메소드(공통적으로 사용할 메소드, 오버라이딩 가능)
default void defaultMethod() {}
// private 메소드(인터페이스 내부에서만 사용할 메소드, 오버라이딩 불가능)
private void privateMethod() {}
// static 메소드(정적 메소드, 오버라이딩 불가능)
static void staticMethod() {}
}
default method의 이름이 겹칠 경우 클래스에서 오버라이딩하지 않으면 컴파일 에러가 발생합니다.