인터페이스(Interface)와 추상 클래스(Abstract Class)는 Java에서 추상화를 구현하는 두 가지 방법입니다. 이들은 객체 간의 계약을 정의하고, 다형성을 실현하는 데 사용됩니다.
1. 인터페이스(Interface)
인터페이스는 추상 메소드와 상수로 이루어진 추상 타입입니다. 인터페이스는 클래스가 구현해야 하는 메소드의 시그니처를 정의합니다. 클래스는 implements
키워드를 사용하여 인터페이스를 구현할 수 있습니다.
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println(“Drawing a circle.”);
}
}
public class Rectangle implements Drawable {
@Override
public void draw() {
System.out.println(“Drawing a rectangle.”);
}
}
Drawable circle = new Circle();
circle.draw(); // Output: Drawing a circle.
Drawable rectangle = new Rectangle();
rectangle.draw(); // Output: Drawing a rectangle.
|
cs |
2. 추상 클래스(Abstract Class)
추상 클래스는 하나 이상의 추상 메소드를 포함하는 클래스입니다. 추상 클래스는 abstract
키워드로 선언되며, 인스턴스화할 수 없습니다. 추상 클래스를 상속받은 하위 클래스는 모든 추상 메소드를 구현해야 합니다.
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
public abstract double getArea();
}
public class Square extends Shape {
private double side;
public Square(String color, double side) {
super(color);
this.side = side;
}
@Override
public double getArea() {
return side * side;
}
}
Shape square = new Square(“Red”, 5);
System.out.println(“Area: “ + square.getArea()); // Output: Area: 25.0
|
cs |
3. 인터페이스와 추상 클래스의 차이점
인터페이스와 추상 클래스는 몇 가지 중요한 차이점이 있습니다.
- 다중 상속: 클래스는 하나의 추상 클래스만 상속받을 수 있지만, 여러 개의 인터페이스를 구현할 수 있습니다.
- 구현: 인터페이스는 모든 메소드가 추상 메소드이며 구현을 포함할 수 없습니다. 추상 클래스는 추상 메소드와 구현된 메소드를 모두 포함할 수 있습니다.
- 필드: 인터페이스는 상수만 포함할 수 있습니다. 추상 클래스는 일반 필드도 포함할 수 있습니다.
4. 인터페이스의 기본 메소드(Default Methods)
Java 8부터는 인터페이스에 기본 메소드를 정의할 수 있습니다. 기본 메소드는 구현을 포함하며, 인터페이스를 구현하는 클래스에서 재정의할 수 있습니다.
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public interface Clickable {
void click();
default void doubleClick() {
click();
click();
}
}
public class Button implements Clickable {
@Override
public void click() {
System.out.println(“Button clicked.”);
}
}
Button button = new Button();
button.click(); // Output: Button clicked.
button.doubleClick(); // Output: Button clicked. Button clicked.
|
cs |
5. 함수형 인터페이스(Functional Interface)
함수형 인터페이스는 단 하나의 추상 메소드를 갖는 인터페이스입니다. 함수형 인터페이스는 람다 표현식과 메소드 참조에 사용될 수 있습니다. @FunctionalInterface
어노테이션을 사용하여 함수형 인터페이스를 나타낼 수 있습니다.
예제 코드
1
2
3
4
5
6
7
8
|
@FunctionalInterface
public interface Calculator {
int calculate(int a, int b);
}
Calculator adder = (a, b) –> a + b;
int result = adder.calculate(5, 3);
System.out.println(“Result: “ + result); // Output: Result: 8
|
cs |
인터페이스와 추상 클래스는 Java에서 추상화를 구현하는 강력한 도구입니다. 인터페이스는 객체 간의 계약을 정의하고 다중 상속을 지원하는 데 사용되며, 추상 클래스는 공통된 속성과 동작을 정의하고 코드 재사용을 촉진하는 데 사용됩니다. 이들을 적절히 활용하면 유연하고 확장 가능한 객체지향 설계를 구현할 수 있습니다.
관련사이트
- Oracle Java Tutorials – Interfaces
- Oracle Java Tutorials – Abstract Classes
- Baeldung – Interface vs Abstract Class in Java
- Baeldung – Guide to Functional Interfaces in Java