본문 바로가기

컴퓨터/JAVA

자바 고급 스터디 10. 인터페이스, 추상클래스, Enum

반응형

자바 고급 스터디 목록

공부 시간 : 2021/05/15 14:30 ~ 16:20

10주차. 인터페이스, 추상클래스, Enum

인터페이스와 추상클래스의 문법에 대해 정리하기 보단 자바8 이후 인터페이스도 default 메서드를 가질 수 있게 된 이후 차이점에 대해서 정리해보려고 한다.

인터페이스, 추상클래스 공통점

  • 인스턴스를 생성 할 수 없다.
  • 구현부가 있는 메서드, 구현부가 없는(추상 메서드)를 모두 가질 수 있다.

인터페이스, 추상클래스 차이점

  • 기능적인 부분
    • 인터페이스의 모든 변수는 public static final 이고(immutable), 모든 메서드는 public abstract이다.
    • 추상클래스의 변수는 static final 이 아닌 필드도 가질 수 있고(mutable), 메서드를 public, private, protected 로 선언 할 수 있다.
    • 인터페이스는 다중구현을 할 수 있다.
    • 추상클래스는 다중상속을 할 수 없다. (자바에서 다중상속을 지원하지 않기 때문에)
    • 인터페이스는 생성자를 정의할 수 없다.
    • 추상클래스는 생성자를 정의할 수 있다.
  • 역할적인 부분
    • 인터페이스는 동일한 기능을 다른 방식으로 구현하고자 할때 사용 할 수 있다.(구현 객체가 동일한 동작을 하는 것을 보장)
    • 추상클래스는 밀접하게 연관된 클래스들 간에 공통된 코드를 사용하고자 할때 사용 할 수 있다.(상속받은 객체가 확장된 동작을 함.)

고민 내용

  • 추상클래스로 구현 할 수 있는 것들의 대부분은 interface를 사용하면 더 유연하게 사용 할 수 있을 것 같다.
  • 자바 8 이전에는 기능적인 부분에서 명확한 차이가 있어 추상클래스와 인터페이스가 하는 역할들 명확하게 구분되어 있었다.
    자바 8 이후에는 이전 버전에서 정해진 역할에 대한 컨벤션을 따르는 것으로 이해했다.

Enum의 탄생 배경

  • Enum이 탄생하기 전, 아래와 같이 인터페이스를 만들거나 정수열거패턴을 활용했다고 한다.
public interface Season {
    int SPRING=1, SUMMER=2, AUTUMN=3, WINTER=4;
}
public interface Language {
    int JAVA=1, CPP=2, GO=3, PYTHON=4;
}

이러한 정수열거패턴에는 문제점이 있다.

  1. 가독성이 떨어진다.
  2. 타입세이프 하지 못하다. (Season.SPRING == Language.JAVA) -> true 값을 얻게되지만 논리적으로 틀린 결과이다.
  3. 해당 변수를 문자열로 출력하기 어렵다.
  4. 모든 상수를 순회하기 어렵다.

이러한 문제점을 해결하기위해 JAVA Enum이 탄생하게 되었고,
Enum을 사용하면 얻을 수 있는 장점은 아래와 같다.

  1. IDE의 지원을 적극적으로 받을 수 있다. (타입체크, 자동완성, 오타검증...)
  2. 리펙토링 범위가 줄어든다.
  3. 위 정수열거형패턴의 단점을 모두 해결가능하다.
반응형