하나 이상의 추상메서드를 포함한 클래스. 추상 메서드는 선언만 되어 있고 구체적인 동작은 이를 상속받은 하위 클래스에서 구현해야 한다. 추상 클래스 자체는 인스턴스를 생성할 수 없고 반드시 상속을 통해서만 사용할 수 있다.
abstract class Animal {
abstract void sound(); // 추상 메서드 (구현 X)
void sleep() { // 일반 메서드 (구현 O)
System.out.println("잠을 잡니다.");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹");
}
}
부모 클래스의 메서드의 내용을 재정의 하는 것
오버라이딩을 하기 위해서 만족해야 하는 것들
@Override
public void testMethod() {}
부모 클래스의 멤버를 참조할 수 있는 키워드
여러가지 형태를 가질 수 있는 능력
Tire tire = new HankookTire("HANKOOK");
Tire tire = new KiaTire("KIA");
예제코드 처럼 부모 타이어 변수 = 자식 타이어 객체; 를 선언하여 자동 타입 변환된 변수를 사용하여 각각의 자식 타이어 객체에 재정의 된 메서드를 통해 다양한 타이어를 생성할 수 있다.
public Car(Tire tire) {
this.tire = tire;
}
...
Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));
Car 생성자에서 매개변수의 타입이 부모 타이어이기 때문에 자식 타이어 객체들을 매개값으로 전달 할 수 있다.
Tire getHankookTire() {
return new HankookTire("HANKOOK");
}
Tire getKiaTire() {
return new KiaTire("KIA");
}
...
Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire();
변환 타입이 부모 타이어이기 때문에 자식 타이어 객체들을 반환값으로 지정할 수 있다.
또한 자동 타입 변환이 된 반환값인 자식 타이어 객체를 강제 타입 변환할 수도 있다.
인터페이스는 클래스가 구현해야 하는 메서드들의 집합을 정의하는 하나의 청사진이다. 인터페이스는 메서드를 선언만 하며 메서드의 실제 구현은 인터페이스를 구현하는 클래스에서 담당한다.
public interface Animal {
void makeSound();
}
public class Dog implements Animal, Pet {
public void makeSound() {
System.out.println("Bark");
}
}
public interface MathConstants {
public static final char A = 'A'
final int NUMBER = 300;
static char B = 'B'
double PI = 3.14159;
}
public class Main implements A {
@Override
public void a() {
System.out.println("A");
}
public static void main(String[] args) {
Main main = new Main();
main.a();
// 디폴트 메서드 재정의 없이 바로 사용가능합니다.
main.aa();
}
}
interface A {
void a();
default void aa() {
System.out.println("AA");
}
}
public class Main implements A {
@Override
public void a() {
System.out.println("A");
}
public static void main(String[] args) {
Main main = new Main();
main.a();
main.aa();
System.out.println();
// static 메서드 aaa() 호출
A.aaa();
}
}
interface A {
void a();
default void aa() {
System.out.println("AA");
}
static void aaa() {
System.out.println("static method");
}
}