반응형

추상 클래스 란?

  • 하나 이상의 추상 메소드를 포함한 클래스

추상 메소드 란?

  • 선언부만 존재하고, 구현부는 존재하지 않는 메소드
  • 자식 클래스가 추상 클래스를 상속받고, 자식 클래스에서 추상 메소드를 오버라이딩을 통해 직접 구현해야 함
  • 반드시 특정 메소드를 만들도록 에러를 발생시켜서 강제성 부여
abstract static class Animal {
    abstract void speak();
}

static class Dog extends Animal {
    @Override
    void speak() {
        System.out.println("멍멍");
    }
}
  • 만약 위 코드에서 Animal을 상속받은 Dog 클래스에 speak 메소드가 구현되지 않았으면 에러 발생
  • 또한 추상 클래스로는 객체를 생성할 수 없음
    • Animal animal = new Animal(); 안 됨

인터페이스 란?

  • 클래스와 유사하게 다형성을 적용할 수 있음
  • 클래스는 extends로 상속받는 반면, interface는 implements로 구현
  • 추상 메소드만을 가질 수 있음
  • 컴파일러가 interface의 메소드들에 자동으로 public abstract 붙여줌
  • 인터페이스도 추상클래스와 마찬가지로 객체 생성 불가능
  • JAVA는 클래스 다중 상속을 지원하지 않는데, 인터페이스는 다중 상속이 가능
    • 사용 예시) OS회사가 프린터 interface를 제공하면 프린터 회사들은 interface 규격에 맞게끔 메소드 생성

인터페이스 예제 1 - 프린터 예제

public class Test {

    public static void main(String[] args) {
        Printer printer = new SPrinterDriver();
        printer.print("출력 메세지");

        printer = new LPrinterDriver();
        printer.print("출력 메세지");
    }

    interface Printer {
        void print(String message);
    }

    static class SPrinterDriver implements Printer {
        @Override
        public void print(String message) {
            System.out.println("삼성 프린터 출력 : " + message);
        }
    }
    static class LPrinterDriver implements Printer {
        @Override
        public void print(String message) {
            System.out.println("LG 프린터 출력 : " + message);
        }
    }
}

인터페이스 예제 1 결과

삼성 프린터 출력 : 출력 메세지
LG 프린터 출력 : 출력 메세지

인터페이스 예제 2 - 다중 상속 예제

public class Test {

    public static void main(String[] args) {
        FlyingCar flyingCar = new FlyingCar();
        flyingCar.drive();
        flyingCar.fly();
    }

    interface Drivable { void drive(); }
    interface Flyable { void fly(); }

    static class FlyingCar implements Drivable, Flyable {
        @Override
        public void drive() {
            System.out.println("Drive");
        }
        @Override
        public void fly() {
            System.out.println("Fly");
        }
    }
}

인터페이스 예제 2 결과

Drive
Fly

interface에서의 default method

  • Java 8부터 추상메소드가 아닌 메소드를 interface 안에 넣을 수 있게됨
public class Test {

    public static void main(String[] args) {
        FlyingCar flyingCar = new FlyingCar();
        flyingCar.drive();
        flyingCar.fly();
        flyingCar.defaultMethod();
    }

    interface Drivable {
        void drive();
        default void defaultMethod() {
            System.out.println("default method 실행됨");
        }
    }
    interface Flyable { void fly(); }

    static class FlyingCar implements Drivable, Flyable {
        @Override
        public void drive() {
            System.out.println("Drive");
        }
        @Override
        public void fly() {
            System.out.println("Fly");
        }
    }
}

default method 예제 결과

Drive
Fly
default method 실행됨
반응형

↓ 클릭시 이동

복사했습니다!