Java

[Java] 추상화 & 인터페이스

GenieLove! 2022. 9. 19. 00:26
728x90
반응형

추상화

클래스 정의 시, 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 개략화 하는 것

공통된 특징을 묶어 하나의 클래스로 정의하는 것

특징

  • 다중 상속이 불가능
  • 추상클래스에서 일반 메소드도 같이 사용이 가능하다.

추상 메소드

자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드

추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위해 사용한다.

  • 접근지정자 abstract 리턴타입 메소드명();

추상 클래스

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

  • 추상 클래스에서 일반 메소드도 같이 사용이 가능
  • 추상 클래스는 객체를 생성할 수 X
  • 추상 클래스를 상속 받은 자식 클래스는 무조건 추상 메소드를 오버라이딩 해야 하는데 -> 안 하려면 자식 클래스도 추상 클래스로 선언하면 된다.

 

인터페이스

모든 기능을 추상화로 정의만 하고 구현은 하지 않는 것

인터페이스를 구현하는 클래스에서 인터페이스에서 본문을 구현하지 않은 추상 메소드는 반드시 오버라이딩이 필요

특징

  • 실제 구현된 것이 전혀 없는 기본 설계도
  • 인터페이스는 인터페이스끼리만 상속이 가능하다.
  • 다중 구현이 가능하다.(implements interface1, interface2, ...)
  • 일반 메소드 사용 X

필드 선언

컴파일 시 선언이 없어도 public, static, final 제어자가 컴파일 시 자동으로 추가된다.

public interface Phone {
    int MIN_SIZE = 1;
    int MAX_SIZE = 10;
}

⬇️

public interface Phone {
    public static final int MIN_SIZE = 1;
    public static final int MAX_SIZE = 10;
}

메소드 선언

  • 본문 구현 X
  • 컴파일 시 선언이 없어도 public abstract 제어자가 자동으로 추가
public interface Phone {
    public String getName();
    public void setName(string name);
}

⬇️

public interface Phone {
    public abstract String getName();
    public abstract void setName(string name);
}

default 메소드 선언

  • 자바 8부터 본문을 가질 수 있는 메소드가 인터페이스에 존재할 수 있다.
  • 인터페이스를 사용하는 모든 클래스에서 공통으로 갖는 기능을 구현할 목적으로 사용
  • public 접근 제한자는 생략 시 자동으로 추가
  • 상속은 단일 상속 밖에 되지 않지만, 인터페이스는 여러개 구현할 수 있기 때문에 default 메소드를 지원
public default void setLogin(boolean login) {
    if (login) {
        System.out.println("로그인이다");
    else {
    	System.out.println("로그아웃이다");
    }
}

static 메소드 선언

  • 자바 8에서 추가
  • 프로그램 시작 시 메모리에 사용될 준비 완료되어 인스턴스 생성과 상관없이 바로 사용 가능
  • public 접근 제한자 생략 시 자동 추가
  • 해당 인터페이스를 구현하고 있는 모든 객체에서 자주 사용하는 유용한 기능을 제공
  • 인터페이스명.메소드명();

private 메소드 선언

  • 자바 9에서 추가
  • 동일한 인터페이스에서 선언된 default 메소드에서만 사용할 목적으로 본문을 구현하는 메소드

추상 클래스 VS 인터페이스

공통점

  • 추상 메소드를 가지고 상속, 구현하는 클래스에서 추상 메소드를 구현하도록 강제한다.
  • 인스턴스화가 불가능

차이점

추상클래스

  • 추상 클래스를 상속할 각각의 객체들의 공통점을 찾아 추상화 시켜 놓은 것
  • 부모 클래스가 가진 기능을 구현해야 할 경우 사용
  • A는 B이다.

인터페이스

  • 다른 부모 클래스를 상속하더라도, 같은 기능이 필요할 때 사용
  • 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용
  • 생성자가 없다.
  • A는 B를 가지고 있다.

사용 케이스

추상클래스

  • 관련성이 높은 클래스 간에 코드 공유를 하고 싶을 때
  • 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많거나, public 이외의 접근자인 protected, private 선언이 필요한 경우
  • non-static, non-final 필드 선언이 필요한 경우(인터페이스는 자동으로 추가되기 때문에)

인터페이스

  • 서로 관련성이 없는 클래스들이 인터페이스를 구현해야 되는 경우
    ex)Runnable, Comparable
  • 특정 데이터 타입의 행동을 명시하고 싶지만 어디서 행동이 구현되는지는 상관없을 때
  • 다중 상속을 허용하고 싶을 때

 

728x90
반응형