Java에서는 다중 상속을 직접적으로 지원하지 않지만, 인터페이스를 활용하면 여러 개의 인터페이스를 구현함으로써 다중 상속의 효과를 얻을 수 있습니다. 인터페이스는 주로 클래스들 간의 공통된 기능을 정의하거나 규격을 정해주는 역할을 하며, 다양한 방식으로 활용될 수 있습니다. 본 글에서는 Java에서 인터페이스의 정의와 사용법을 쉽게 설명하고, 인터페이스 구현에 대한 예시를 통해 실용적인 이해를 돕겠습니다.
1. 인터페이스 (Interface)란?
인터페이스는 Java에서 추상 메소드와 상수만을 포함할 수 있는 특수한 형태의 클래스입니다. 인터페이스를 구현한 클래스는 인터페이스에 선언된 메소드들을 반드시 구현해야 합니다. 이를 통해 다중 상속을 가능하게 하여 다양한 기능을 추가할 수 있습니다.
- 특징
- 추상 메소드만 포함: 인터페이스 내의 메소드는 반드시 구현부 없이 선언만 되어 있어야 하며, 구현은 구현 클래스에서 해야 합니다.
- 상수만 포함: 인터페이스는 기본적으로 상수만을 가질 수 있습니다.
- 다중 구현 가능: 하나의 클래스가 여러 개의 인터페이스를 구현할 수 있습니다.
- JDK 8 이상에서는 default 메소드와 static 메소드도 포함할 수 있게 되었습니다.
2. 인터페이스 작성법
인터페이스는 interface 키워드를 사용하여 정의합니다. 기본적으로 인터페이스 내에 정의된 필드는 **public static final**로 처리되며, 메소드는 **public abstract**로 처리됩니다.
public interface 인터페이스명 {
// 상수 (public static final 생략 가능)
public static final 타입 상수명 = 값;
// 추상 메소드 (public abstract 생략 가능)
public abstract 메소드명(매개변수1, 매개변수2...);
}
✅ 인터페이스의 모든 필드는 public static final 이어야 함
-> 일반 필드로 작성하여도 컴파일시 자동으로 public static final를 붙여 생성 됨
✅ 인터페이스의 모든 메소드는 public static abstract 이어야 함
-> 일반 메소드로 작성하여도 컴파일시 자동으로 public static abstract를 붙여 생성 됨
3. 인터페이스 구현법
인터페이스는 클래스에서 implements 키워드를 사용하여 구현할 수 있습니다. 또한, 다중 구현도 가능합니다. 클래스가 인터페이스를 구현하면 인터페이스 내의 모든 추상 메소드를 구현해야 합니다.
단일 구현 예시
class 클래스명 implements 인터페이스명 {
// 인터페이스의 모든 추상 메소드를 구현해야 함
}
다중 구현 예시
class 클래스명 implements 인터페이스명1, 인터페이스명2, 인터페이스명3 {
// 여러 개의 인터페이스 메소드 구현
}
⭐ 자바의 상속과 인터페이스의 구현을 동시 진행
class 클래스명 extends 부모클래스명 implements 인터페이스명{
...
}
4. 인터페이스 사용 예시
Drawble과 Movable 인터페이스를 정의하고, 이를 각각 Circle 클래스와 DigitalPic 클래스에서 구현하는 예시를 보겠습니다.
Drawble 인터페이스
public interface Drawble {
// interface에 일반 필드로 작성하면 JVM이 알아서 변경
int MAX = 100; // 그림을 그릴수 있는 최대 숫자. public static final int MAX = 100;
// interface에 일반 메소드로 작성하면 JVM이 알아서 변경
public void drawPrint(String msg); // public abstract void drawPrint(String msg);
public void setColor(String color); // public abstract void setColor(String color);
// 인스턴스 메소드 (jdk8~)
public default void printInfo(){
System.out.println("Drawble 인터페이스의 printInfo() 호출!");
}
// static 메소드
public static void staticMethod() {
System.out.println("Drawble 인터페이스의 staticInfo() 호출!");
}
}
Movable 인터페이스
public interface Movable {
int MIN = 1;
public void move(int x, int y); // 인터페이스 구현하는 클래스에서 구현해야하는 추상메소드
public void test();
public default void printMove() { // 인스턴스 메소드
System.out.println("Movable 인터페이스의 printMove() 호출!");
}
public static void printMove2() { // static 메소드. 객체생성없이 사용가능(클래스명.printMove2())
System.out.println("Movable 인터페이스의 printMove2() 호출!");
}
}
5. 인터페이스 구현 예시
Movable 인터페이스를 구현한 DigitalPic 클래스
public class DigitalPic implements Movable {
String tools = "컴퓨터";
@Override
public void move(int x, int y) {
System.out.println("DigitalPic Move : (" + x + ", " + y + ")");
}
@Override
public void test() {
System.out.println("테스트 모드로 그림을 그립니다.");
}
}
Drawble 인터페이스를 구현한 Circle 클래스
public class Circle implements Drawble{
double radius = 10.0; // 반지름
String background;
@Override
public void drawPrint(String msg) {
System.out.println("msg : " + msg);
System.out.println("면적 : " + (radius * radius * Math.PI));
}
@Override
public void setColor(String color) {
this.background = color;
System.out.println(color + "색상으로 배경을 설정함");
}
}
Movable, Drawble 인터페이스를 모두 구현한 Shape 클래스
public class Shape implements Drawble, Movable { // Drawble, Movable의 추상메소드를 모두 구현해야 함
String name = "도형";
@Override
public void drawPrint(String msg) {
System.out.println("Shape drawPrint() 호출 : " + msg);
}
@Override
public void setColor(String color) {
System.out.println("Shape setColor() 호출 : " + color);
}
@Override
public void move(int x, int y) {
System.out.println("Shape move() 호출 : " + x + ", " + y);
}
@Override
public void test() {
System.out.println("Shape test() 호출");
}
}
5. 인터페이스 구현 예시
public class Main2 {
public static void main(String[] args) {
// Drawble drawble = new Drawble(); 에러. 인터페이스는 객체생성을 하지 못함. 메소드를 구현해야함.
Circle circle = new Circle();
circle.drawPrint("원의 넓이를 구함.");
circle.setColor("초록");
circle.printInfo(); // 인스턴스 메소드 호출
DigitalPic digitalPic = new DigitalPic();
digitalPic.move(4, 8);
digitalPic.test();
Shape shape = new Shape();
shape.move(5,7);
shape.test();
shape.drawPrint("도형을 그리고 있음");
shape.setColor("핑크");
Drawble drawble = new Shape();
// drawble.move(10,3); // Drawble 인터페이스에서 생성한 메소드만 사용가능
// drawble.test(); // Drawble 인터페이스에서 생성한 메소드만 사용가능
drawble.drawPrint("그림을 그립니다.");
drawble.setColor("골드");
Movable movable = new Shape();
// movable.drawPrint("그림을 그립니다."); // movable 인터페이스에서 생성한 메소드만 사용가능
// movable.setColor("골드"); // movable 인터페이스에서 생성한 메소드만 사용가능
movable.move(10,3);
movable.test();
// static으로 처리된 필드와 메소드. 객체 생성하지 않아도 사용가능
System.out.println("MAX : " + Drawble.MAX);
Drawble.staticMethod();
Movable.printMove2();
}
}
마무리
인터페이스는 Java에서 매우 중요한 개념으로, 다중 상속을 구현하는 유용한 도구입니다. 인터페이스를 사용하면 서로 다른 클래스들 간에 공통된 규격을 정의할 수 있으며, 이를 통해 더 유연하고 재사용 가능한 코드를 작성할 수 있습니다. default 메소드와 static 메소드도 지원되면서 더욱 강력한 기능을 제공하므로, 실제 프로젝트에서 자주 사용될 수 있습니다.
인터페이스를 적절히 활용하여, 다양한 클래스를 효율적으로 설계하고 구현하는 방법을 익혀보세요.
'Java' 카테고리의 다른 글
[Java] 예제1 - 영어 단어장 (0) | 2022.04.17 |
---|---|
[Java] 컬렉션 프레임워크 (0) | 2022.04.17 |
[Java] 추상 클래스 (Abstract Class) (0) | 2022.04.14 |
[Java] 래퍼 클래스(Wrapper Class)와 제네릭 (0) | 2022.04.14 |
[Java] 접근 제어자 (0) | 2022.04.13 |