인터페이스(Interface)를 이용하면 앞으로 만들 클래스의 규격을 선언할 수 있다.
interface Calculable {
int sum(int v1, int v2);
}
class RealCal implements Calculable {
// 오류 발생
}
public class InterfaceApp {
public static void main(String[] args) {
RealCal c = new RealCal();
System.out.println(c.sum(2, 1));
}
}
위 코드를 보면, Calculable 인터페이스를 implements 하는 RealCal 클래스가, Calculable 인터페이스가 규제하고 있는 형태를 정확하게 엄수하고 있지 않기 때문에 컴파일조차 안 된다. 심지어 Calculable 인터페이스의 메소드인 sum 이름도 동일해야 한다. (가령, 'sum'으로 이름을 짓지 않고 'plus'라고 메소드를 명명하면 오류가 발생한다.)
implements는 인터페이스를 구현하는 것이다. extends 키워드가 클래스를 확장하는 것과 차이가 있다. 인터페이스와 보통 클래스의 차이는 인터페이스는 정의한 메소드를 구현하지 않아도 된다. 인터페이스를 상속받는 클래스에서 인터페이스에 정의된 메소드를 구현하면 된다.
interface Calculable {
int sum(int v1, int v2);
}
class RealCal implements Calculable {
public int sum(int v1, int v2) {
return v1 + v2;
}
}
public class InterfaceApp {
public static void main(String[] args) {
RealCal c = new RealCal();
System.out.println(c.sum(2, 1)); // 3
}
}
이렇게 RealCal 클래스 내부에 Calculable 인터페이스에서 정해준 규격대로 메소드를 설정해야 컴파일이 정상적으로 된다.
인터페이스의 이름은 클래스와 마찬가지로 보통 첫 글자를 대문자로 만들고, "~을 할 수 있는" 것들의 규격이라는 의미에서 형용사로 이름을 붙이기도 한다.
그리고 클래스를 상속할 때는 하나의 클래스로부터 상속받을 수 있는 것과 대조적으로 인터페이스는 여러 개를 모두 적용할 수 있다. 이 경우 적용한 인터페이스들의 메소드를 모두 구현해야 한다.
C++에서는 다중상속을 허용하지만 자바에서는 다중상속을 지원하지 않는다. 그래서 그 대안으로 인터페이스를 제공하는 것이다.
인터페이스에는 변수를 정의할 수 있다. 다만 변수는 반드시 초기화되어야 한다. 인터페이스를 적용한 클래스는 변수를 다시 대입할 수 없다.
interface Calculable {
double PI = 3.14; // 변수를 인터페이스에 정의할 때에는 내용이 들어간다.
int sum(int v1, int v2);
}
interface Printable {
void print(); // 메소드를 인터페이스에 정의할 때에는 내용이 들어가지 않는다.
}
class RealCal implements Calculable, Printable { // 2개의 인터페이스 모두 implements
public int sum(int v1, int v2) {
return v1 + v2;
}
public void print() {
System.out.println("this is RealCal!!!");
}
}
public class InterfaceApp {
public static void main(String[] args) {
RealCal c = new RealCal();
System.out.println(c.sum(2, 1));
c.print();
System.out.println(c.PI);
}
}
위 코드를 보면, 인터페이스에는 변수와 메소드를 정의할 수 있는데, 변수의 경우 인터페이스 내에서 내용이 들어가고, 메소드의 경우 인터페이스 내에서 내용이 들어가지 않는다는 것을 알 수 있다.
RealCal 클래스가 Calculable, Printable 인터페이스 두 개를 모두 implements 했을 때, 적용한 두 개의 인터페이스의 메소드들을 모두 구현해야 하는 것이다.
인터페이스는 규제이지만, 그 목적은 자유이다. 어떠한 규칙을 준수하기만 한다면 무엇을 하건 자유롭게 할 수 있게 하는 것이다.
[참고자료]
https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html
Interfaces (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com
implements와 Extends의 차이점이 뭐고 각각 언제 쓰는건가요?
implements와 Extends의 차이점이 뭐고 각각 언제 쓰는건가요? 기본적인 질문인데 이 두개의 차이를 잘 모르겠어요. 이해하기 쉽게 설명좀 해주세요.
hashcode.co.kr
'Language > Java' 카테고리의 다른 글
예외 (Exception) (0) | 2022.11.26 |
---|---|
다형성 (Polymorphism) (0) | 2022.11.20 |
상속과 생성자 (0) | 2022.11.14 |
this, super (0) | 2022.11.14 |
Overriding, Overloading (0) | 2022.11.14 |