본문 바로가기

Java

추상클래스와 인터페이스

추상 클래스

 

추상클래스는 new 연산자를 사용해서 인스턴스를 생성시키지 못한다.

Animal animal = new Animal(); // (X)

 

추상 클래스는 새로운 실체 클래스를 만들기 위해 부모 클래스로만 사용된다.

코드로 설명하면 extends 뒤에만 올 수 있는 클래스이다.

class Ant extends Animal {...} // (O)

 

추상 클래스도 생성자가 반드시 있어야 한다. - 자식 객체가 생성될 때 super(..)를 호출해서 추상 클래스 객체를 생성하기 때문.

 

 

추상 클래스의 용도

- 실체 클래스마다 다른 점만 실체 클래스에 선언하게 되면 실체 클래스를 작성하는데 시간을 절약할 수 있다.

 

 

 

인터페이스

- 구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제한다.

- 인터페이스는 데이터를 저장할 수 없기 때문에 데이터를 저장할 인스턴스 또는 정적필드를 선언할 수 없고 상수 필드만 선언할 수 있다.

- 모든 멤버변수는 public static final이어야 한다. 단, 이를 생략할 수 있다.

- 모든 메서드는 public abstract 여야 한다. 이 또한 생략할 수 있다.

 

인터페이스도 상속이 가능하지만

상속은 인터페이스 끼리만 가능하다.

인터페이스는 구현 하여야 하며

상속의 extends와 달리 implements 키워드를 사용한다.

 

- 다중 상속이 가능하다

 class Class implements Interface1, Interface2

 

인터페이스도 다형성으로 다음과 같이 할 수 있다.

 public interface MyInterface {
   int VALUE = 5;

   int calculate(int a);
 }

위와 같은 인터페이스가 있다고 할 때

 

 public CalCulA implements MyInterface {
   int calculate(int a) {
     return VALUE+a;
   }
 }

 public CalCulM implements MyInterface {
   int calculate(int a) {
     return VALUE*a;
   }
 }

이와 같이 구현한 두개의 클래스가 있다고 할 때,

 MyInterface add = new CalCulA();
 MyInterface add = new CalCulM();
 int target = 5;

 System.out.println(add.calculator(target));
 System.out.println(mul.calculator(target));

다형성으로 인해 이렇게 사용할 수 있다.

단, 다형성에서 언급한 것처럼

인터페이스에 없는 메서드를 사용하면 에러가 발생한다.

 

둘의 차이점으로는 인터페이스는 클래스가 아니지만 추상 클래스는 클래스다.