자바 인터페이스, 추상 클래스

JP·2021년 11월 28일
0

자바

목록 보기
1/10

사용하는 이유

  • 추상클래스와 인터페이스는 일종의 설계도이다.
  • 클래스 작성에 있어 구현부만큼 중요한 것은 선언부이다.
  • 설계도가 있기에 개발시간을 단축시킬 수 있고, 표준화가 가능하다.
  • 메서드를 사용하는 쪽에 있어서 메서드가 실제로 어떻게 구현되어 있는지 몰라도 메서드의 이름과 매개변수, 리턴타입 등 선언부만으로도 코드를 작성 가능하게 만들어주고 실제로 구현이 완성된 자손클래스에서 호출되도록 하는 역할을 한다.

추상 클래스

abstract class 추상클래스 {
	/* 이 메서드는 무엇을 한다 */
	abstract Something somesome();
    
    int a; //인스턴스 변수
    static int b; // 클래스 변수
    static void method1(){System.out.println("abcdefg");}
    void method2(){
    	int method2LV; //지역 변수
    }
    abstract void method3(); //추상 메서드
}
  • 미완성 메서드를 갖고 있는 클래스 (설계만 해두었고 구현은 안함)
  • 추상클래스는 상속을 통해서 자손 클래스에 의해서만 완성될 수 있다.
  • 새로운 클래스를 작성하는데에 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다.
  • 추상클래스로부터 상속받는 자손 클래스는 오버라이딩을 통해 조상인 추상클래스의 추상 메서드를 모두 구현해주어야 한다. (구현을 강요)
  • 인스턴스 변수, 클래스 변수, 메서드, 추상메서드 등을 가질 수 있다.

미완성 상태로 남겨두는 이유?
메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만을 작성하고, 실제 내용은 상속받는 클래스에서 구현하도록 비워두는 것이다.

인터페이스

public interface InterfaceClass {
    // int a; //인스턴스 변수를 갖는게 불가능하다.
    // static int b; //클래스 변수를 갖는게 불가능하다.
    // void method2(){ //인스턴스 메서드를 가질 수 없다.
    //     int method2LV;
    // }
    int A = 1; //상수는 가질 수 있다. == public static final int A = 1;
    void method3();// 추상 메서드를 가질 수 있다. == public abstract final void method3();
    
    
    static void method1(){System.out.println("abcdefg");}// 클래스 메서드도 가질 수 있다!
     default void method5(){System.out.println("abcdefg");} //디폴트 메서드도 가질 수 있다!
}
  • 일종의 추상클래스이다.
  • 추상클래스보다 추상화 정도가 높다
  • 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.
  • 오직 추상메서드와 상수 그리고 클래스 메서드만을 멤버로 가질 수 있다.
  • 인터페이스의 모든 멤버들은 모두 public static final 이어야 한다.(안붙히면 컴파일러가 자동적으로 추가해줌)
  • 인터페이스의 모든 메서드는 public abstract이어야 하며 이를 생략할 수 있다.(안붙히면 컴파일러가 자동적으로 추가해줌, static메서드와 default 메서드는 예외-JDK1.8부터)
  • 리턴타입이 인터페이스인 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
interface Eatable {
    public abstract void eat(String name);
}

class EatBurger implements Eatable {
    @Override
    public void eat(String name) {
        System.out.println("burger!");
    }
}

class EatPizza implements Eatable {
    @Override
    public void eat(String name) {
        System.out.println("pizza!");
    }
}

class EatMachine {
    public static Eatable eat(String name) {
        if (name.equals("burger")) {
            return new EatBurger();
        } else {
            return new EatPizza();
        }
    }
}

class EatTest{
    public static void main(String args[]){
        Eatable eater = EatMachine.eat("burger");
        eater.eat("burger"); //burger!
        
        Eatable eater2 = EatMachine.eat("pizza");
        eater2.eat("pizza"); //pizza!
    }
}

둘의 공통점

  • 추상클래스와 인터페이스는 선언만 있고 구현내용이 없다.
  • 자기 자신이 new를 해서 객체를 생성할 수 없다.
  • 추상클래스와 인터페이스는 일종의 설계도이다.
  • 추상클래스와 인터페이스 모두 상속을 받아 사용을 한다.
  • 추상클래스는 extends로 상속받고, 인터페이스는 implements로 상속받는다.
  • 추상클래스나 인터페이스를 상속받은 하위 클래스는 반드시 오버라이딩 하여야 한다.

둘의 차이점

  • 추상 클래스는 추상 메소드를 하나 이상 포함한 클래스를 말한다.
  • 인터페이스는 추상메서드와 static final 상수만 존재한다.
  • 인터페이스는 인스턴스 메서드, 생성자, 인스턴스 변수 가질 수 없음.

사용?

  • 인터페이스
    - 서로 관계 없는 클래스( 상속관계도 없고, 같은 조상 클래스를 가지고 있지도 않음 )에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어줄 수 있다.

  • 추상클래스
    - 서로 동일한 조상 클래스를 상속하는데 자손들 모두 완벽히 똑같은 기능을 필요로 할 때

profile
to Infinity and b

0개의 댓글