[Java] 추상클래스 & 인터페이스

Brian·2021년 7월 4일
1

Java

목록 보기
1/6
post-thumbnail

추상클래스 인터페이스 왜 사용하는 걸까??

추상클래스와 인터페이스에 대해서 알고 있냐고 누군가가 물어 본다면 알고 있다고 답을 합니다. 그런데 "왜 사용하죠?", "차이점이 무엇인가요?", "추상 클래스와 인터페이스를 사용할지 어떻게 정하나요?" 라고 질문을 하면 상대방이 이해하기 쉽게 풀어서 내용을 전달하는게 쉽지 않다는 것을 느꼇을 겁니다. 저 또한 이런한 문제에 해답을 찾고자 공부를 하기 위해 작성합니다.

추상클래스(Abstract) ??

//일반 클래스
public class GameObject{
	...코드생략
}

//추상클래스
public abstract class GameObject {
	...코드생략
}

위 코드와 같이 일반 클래스와 별 다를 것이 없습니다. class 앞에 "abstract" 예약어을 작성하면 추상클래스를 선언 할 수 있습니다.
추상클래스는 추상메소드를 선언해서 상속을 통해 자손 클래스(child class)에서 완성하도록 유도 하는 클래스입니다.

규칙

  • 추상메소드를 하나 이상 가진 클래스
  • 하위 클래스를 참조하여 상위 클래스의 객체 생성
  • 하위 클래스를 제어하기 위해 사용
  • 자신의 생성자로 객체 생성 불가
  • 일반 클래스들의 필드와 메소드를 통일하여 일반 클래스 작성 시 시간을 절약
  • 동일한 부모를 가지는 클래스를 묶는 개념으로 상속을 받아서 기능을 확장시키는 것이 목적

Example

public abstract class GameObject {
	
    //위치 좌표 
    private int x;
    private int y;

    public GameObject(int x, int y) {
        this.x = x;
        this.y = y;
    }
	
    //GETTER & SETTER 생략 
	...
}

인터페이스 (Interface) ??

public interface Moveable {
    //코드 생략
    ...
}

인터페이스는 추상클래스 처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속이 가능합니다.

규칙

  • 껍데기만 있는 클래스
  • 인터페이스에 적는 모든 메소드들은 추상 메소드로 간주되기 때문에 abstract을 적지 않는다
  • 맴버 변수, 맴버 함수를 가질수 없고, 추상 메소드만 가질수 있다
  • 자바 8부터 default 예약어를 통해 일반 메서드구현이 가능하다
  • 인터페이스는 여러 클래스의 사용 방법이 같음을 보장한고 그렇기 때문에 자신을 implement 하는 클래스들에게 메소드 구현을 강제한다
  • implement 키워드를 사용해서 구현한다
  • 일종의 추상 클래스로 오직 추상메소드와 상수만을 맴버로 갖는다

example

//인터페이스 선언
public interface Moveable {
    public void accelerate(int speed);
}

//인터페이스 다중 상속
public class SpaceShip implements Moveable, Exploadable {
	//코드 생략
    ...
}

추상클래스 vs 인터페이스

공통점

  • new 연산자로 인스턴스 생성 불가능
  • 프로토타입만 있는 메소드를 갖는다
  • 사용하기 위해서는 하위 클래스에서 확장/구현해야 한다

차이점

  • 추상클래스(단일상속), 인터페이스(다중상속)
  • 추상 클래스 목적은 상속을 받아서 기능을 확장 시키는 것
  • 인터페이스 목적은 구현하는 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제하는 역할(부모로부터 유전자를 물려받는 것이 아니라 사교적으로 필요에 따라 결합하는 관계) 즉, 구현 객체가 같은 동작을 한다는 것을 보장하기 위함.

연결 관계

  • 클래스끼리, 인터페이스 끼리 상속 = extends
  • 클래스와 인터페이스를 상속 = implements

사용 케이스

추상클래스

  • 관련성이 높은 클래스 간에 코드 고유
  • 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많거나, public이외의 접근자(protected, private) 선언이 필요한 경우
  • non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메소드가 필요한 경우)

인터페이스

  • 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지는 신경쓰지 않는 경우.
  • 다중상속을 허용하고 싶은 경우

Example

GameObject는 SpaceShip, EnemyUFO, Rock이 공통적으로 가지고 있는 위치를 선언한다. 그리고 클래스들이 가지는 추가적인 기능들은 인터페이스로 구현한다.

SpaceShip과 EnemyUFO는 고정된 Rock과 다르게 움직일 수 있기 때문에 moveable interface를 구현했다.

SpaceShip, EnemyUFO, Rock 클래스 모두 터질수 있기 때문에 Exploadable interface를 모두 구현해다.

sample code git

!!!

공부 목적으로 작성하는 글 입니다. 수정해야 하는 부분들에 대해 알려주시면 감사하겠습니다.

reference

profile
Jiujitsu_coder

0개의 댓글