추상클래스와 인터페이스
추상클래스와 인터페이스
추상클래스
- 추상클래스란 미완성된 클래스로 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.