Post

추상클래스와 인터페이스

추상클래스와 인터페이스

추상클래스

  • 추상클래스란 미완성된 클래스로 abstract 키워드로 선언된 클래스이다.
  • 한 개 이상의 추상 메소드를 포함하는 경우 반드시 추상 클래스로 선언해야 한다.
  • 추상 메소드가 없어도 abstract 키워드를 통해 추상 클래스를 선언할 수 있다.

추상 메소드(Abstract Method)

abstract 키워드와 함께 원형만 선언되고 코드는 작성되지 않은 메소드이다.

추상 클래스의 목적

  • 객체(인스턴스)를 생성하기 위함이 아니며, 상속을 위한 부모 클래스로 활용하기 위한 것이다.
  • 여러 클래스들의 공통된 부분을 추상화(추상 메서드) 하여 상속받는 클래스에게 구현을 강제화하기 위한 것이다. (메서드의 동작을 구현하는 자식 클래스로 책임을 위임)
  • 즉, 추상 클래스의 추상 메서드를 자식 클래스가 구체화하여 그 기능을 확장하는 데 목적이 있다.

추상 클래스의 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
abstract class Shape { // 추상 클래스
  Shape() {...}
  void edit() {...}
  abstract public void draw(); // 추상 메소드
}

/* 추상 클래스의 구현 */
class Circle extends Shape {
  // 추상 메소드 (오버라이딩)
  @Override
  public void draw() { System.out.println("Circle"); } 
  
  void show() { System.out.println("동그라미 모양"); }
}
  • 추상 클래스인 Shape는 추상 메소드인 draw()를 가지고 있으며 Shape를 상속받는 자식 클래스 Circle은 draw() 메소드를 오버라이딩 해야 인스턴스 생성이 가능하다.

인터페이스

  • 추상 메소드와 상수만으로 구성되며 interface 키워드를 사용하여 선언한다.
  • 모든 메소드는 추상 메소드로 abstact public 속성을 가지고 있으며 생략 가능하다.
  • 상수는 public static final 속성을 가지고 있으며 생략 가능하다.
  • 인터페이스를 상속받아 새로운 인터페이스를 만들 수 있다.

인터페이스의 목적

  • 상속받을 서브 클래스에게 구현할 메소드들의 원형을 모두 알려주어, 클래스가 자신의 목적에 맞게 메서드를 구현하도록 하는 것이다.
  • 구현 객체의 같은 동작을 보장하기 위한 것이다.
  • 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우에 사용한다.

인터페이스의 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 /* 인터페이스 */
interface Phone {
  int BUTTONS = 20; // 상수 필드 (public static final int BUTTONS = 20;과 동일)
  void sendCall(); // 추상 메소드 (abstract public void sendCall();과 동일)
  abstract public void receiveCall
  (); // 추상 메서드
}

/* 인터페이스 구현 */
class FeaturePhone implements Phone {
  // Phone의 모든 추상 메서드를 구현한다.
  public void sendCall() {...}
  public void receiveCall() {...}

  // 추가적으로 다른 메서드를 작성할 수 있다.
  public int getButtons() {...}
}

  • 만약 모든 추상 메소드의 구현을 원하지 않는다면 클래스에 abstract 키워드를 붙여 추상 클래스로 선언해야 한다.
This post is licensed under CC BY 4.0 by the author.