Coding/Java

Java Abstract Class & Interface

heyoon2j 2020. 9. 17. 02:37

■ Java Abstract Class & Interface

1. 추상 클래스 (Abstract Class)

• 일부 메소드가 구현되지 않고, 선언만 되어있는 클래스(abstract 키워드)

 - 자식 클래스에서 구현되지 않은 메소드를 반드시 구현하도록 강제하는 것

 - 상속한 모든 클래스가 구현하도록 하기 때문에 안정성을 높임

 

• 추상 클래스는 객체를 생성할 수 없다.

 - 그렇기 때문에 구현된 자식 클래스 객체를 받아야 한다.

abstract class AbstractFoo{
    int x, y;

    public void method(){
        System.out.println("method");
    }
    public abstract void abstractMethod();  // 세미콜론을 잊지말아야 한다
                                            // 선언만 하고 구현하지 않음
}

class Foo extends AbstractFoo{

    @Override
    public void abstractMethod() {
        System.out.println("implemented abstractMethod");
    }
}

 


2. 인터페이스 (Interface)

- 클래스가 사용되는 방식(접점)만을 선언하는 클래스와 유사한 틀

- 아무런 구현이 되어 있지 않으며, 모든 메소드가 추상 메소드이다.

 

• 인터페이스 특징

 - interface 키워드 사용

 - 멤버 변수는 항상 public static final 이다(생략 가능)

 - 멤버 메소드는 항상 public abstract 이다(생략 가능)

 - 클래스는 하나만 상속할 수 있으나, 인터페이스는 다중 상속이 가능

 

 

• 인터페이스 변수명 작성법

 - interface IFoo : 한마디로 표현하기 힘든 경우, I를 맨 앞에 붙여준다.

 - interface Printable : 형용사 형태로 표현, Runnable 등

public interface IFoo {
    public static final int MEMBER_VAR = 10;
    int MEMBER_VAR2 = 20; // public static final

    public abstract void methodA(int param);
    void methodB(int param); // public abstract
}

public class Foo implements IFoo {
    @Override
    void methodA(int param) {
        System.out.println(param);
    }

    @Override
    void methodB(int param) {
        System.out.println(param);
    }
}

 

 

• 인터페이스 상속

 - 인터페이스로 인터페이스를 상속하는 경우, extends 키워드 사용

 - class와 다르게 다중 상속 가능 

interface Walkable {
    void walk();
}

interface  Runnable{
    void run();
}

interface  Jumpalbe extends Walkable, Runnable{
    void jump();
}

 


3. JDK 1.8 이후

• Default Method

- 항상 public 이다.

- 인터페이스 철학과 맞지 않다.

- 기존에 사용하던 인터페이스가 개선되어, 모든 자식 클래스에 동일하게 구현되어야 하는 메소드가 생긴 경우에 쉽게 기능을 추가하기 위해 만들어짐

- 부모와 인터페이스 모두에 같은 메소드가 있는 경우, 상속 시 부모 클래스의 메소드를 실행한다.

interface IFoo {
    void abstractMethod();

    default void defaultMethod() { // 구현 클래스에서 구현할 필요가 없다.
        System.out.println("Default method");
    }
}

class SuperFoo {
    void defaultMethod() {
        System.out.println("Super method");
    }
}

class FooOne implements IFoo {
    void abstractMethod() {
        return;
    }
}

class FooTwo extends SuperFoo implements IFoo {
    void abstractMethod() {
        return;
    }
}

public class Main {
    public static void main(String[] args) {
        FooOne fooOne = new FooOne();
        fooOne.defaultMethod(); // Default method

        FooTwo fooTwo = new FooTwo();
        fooTwo.defaultMethod(); // Super method
    }
}

 

 

• static 메소드

 - 인터페이스 이름으로 호출 가능

 - 클래스 구현체의 이름으로는 호출 불가능

interface IBar {
    static void staticMethod(){
        System.out.println("Static Method");
    }
}

class Bar implements IBar{

}

public class Interface {
    public static void main(String[] args) {
        IBar.staticMethod();    // 인터페이스 명으로 클래스 메소드 호출 가능
        // Bar.staticMethod(); // 구현체인 자식 클래스로는 클래스 메소드 호출 불가능
    }
}

 

 

 

'Coding > Java' 카테고리의 다른 글

Java Generic(제네릭)  (0) 2020.09.17
Java Enumeration(열거형)  (0) 2020.09.17
Java Polymorphism(다형성)  (0) 2020.09.17
Java Modifier(제어자)  (0) 2020.09.16
Java Inheritance(상속)  (0) 2020.09.16