-
[JAVA] 인터페이스와 추상클래스개발/JAVA 2021. 10. 1. 00:16
1. 인터페이스(interface) 와 추상클래스(abstract class)
- 인터페이스
- 상수(static final)와 추상 메서드(abstract method)의 집합.
- 생성자를 가질 수 없음. 객체화 불가능.
- 인터페이스에 선언된 상수와 추상 메서드는 public static final 과 public abstract 를 생략해도 됨. 컴파일시 자동 생성된다.
- interface를 implements 함으로써 구현체에서 사용 가능.
- 보통 ~able 로 네이밍함.
- 다중상속 가능.
- 자바8부터 Defulat Method 사용 가능
- Defulat Method는 interface를 구현한 구현체에서 해당 method를 override 할 필요가 없음. 모두 같은 메소드.
-
interface playable { public abstarct void play(); // Default Method public default void printAction(String action){ System.out.println(action); } }
- 추상클래스
- 추상 클래스는 필드, 생성자, 추상메서드를 가질 수 있음.
- 객체화 가능.
- 추상 클래스는 추상 메소드를 가지지 않아도 되지만, 추상 메소드가 하나라도 존재하는 클래스는 추상클래스.
- 다중상속 불가.
- 추상 클래스는 상속(extends)을 통해서만 사용이 가능하며, 하위 클래스의 생성자에서 super()변수를 사용해서 추상 클래스의 생성자를 부르고 초기화 시킴.
-
public abstract class AbstractClass { private String name; private String id; // Constructor public AbstractClass(String name, String id){ this.name = name; this.id = id; } // Abstract Method public method() { } } public class RealClass extends AbstractClass { private String number; public RealClass(String name, String id, String number) { super(name, id); this.number = number; } }
2. 인터페이스 vs 추상클래스
- 추상클래스와 인터페이스는 인스턴스화 하는 것은 불가능하며, 구현부가 있는 메소드와 없는 메소드 모두 가질 수 있다는 점에서 유사하다.
- 인터페이스에서 모든 변수는 기본적으로 public static final 이며, 모든 메소드는 public abstract 인 반면
추상클래스에서는 static 이나 final 이 아닌 필드를 지정할 수 있고, public, protected, private 메소드를 가질 수 있다. - 인터페이스를 구현하는 어떤 클래스는, 다른 여러개의 인터페이스들을 함께 구현할 수 있다. 추상클래스는 상속을 통해 구현되는데, 자바에서는 다중상속을 지원하지 않으므로 추상클래스를 상속받은 서브클래스는 다른 클래스를 상속받을 수 없다.
3. 추상클래스, 인터페이스의 적절한 사용 케이스
- 추상클래스
- 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
- 추상클래스를 상속받은 클래스들이 공통으로 가지는 메소드와 필드가 많거나, public 이외의 접근제어자(protected, private) 사용이 필요한 경우
- non-static, non-final 필드 선언이 필요한 경우. 즉, 각 인스턴스에서 state 변경을 위한 메소드를 선언할 수 있다.
- 인터페이스
- 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우에 사용한다. 예를 들어, Comparable, Cloneable, Runnable 인터페이스는 여러 클래스들에서 구현되는데, 구현클래스들 간에 관련성이 없는 경우가 대부분이다.
- 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지는 신경쓰지 않는 경우.
- 다중상속을 허용하고 싶은 경우
'개발 > JAVA' 카테고리의 다른 글
[JAVA] Exception (0) 2021.09.30 JVM (Java Virtual Machine) (0) 2021.08.19