이번 포스팅에서는 Interface에 대해서 알아볼 것인데요.
Interface는 추상클래스와 비슷한 개념으로,
추상 클래스에서 조금 더 심화적으로 추상화 된 개념이라고 할 수 있습니다.
추상클래스와 다른 점을 설명하자면,
1. 멤버변수는 상수형으로 선언되어야 하며
2. 다중상속이 가능하다.
라는 점입니다.
그리고 이러한 점때문에, 인터페이스를 사용하는 것인데요.
Interface는 다음과 같이 정의할 수 있습니다.
public interface 인터페이스명 [extends 부모인터페이스명, ...] {
// 상수
// 추상 메서드
}
// 예제
public interface Drwable {
public static final int PLAIN_PEN = 1
public static final int BOLD_PEN = 2
public static final int ITALIC_PEN = 3
public abstract void draw();
public abstract void move(int x, int y);
}
이때, 인터페이스의 멤버변수는 상수형이고, 메서드는 추상메서드여야 하기 때문에
static final과 abstract를 사용해주었지만,
쓰지 않아도 컴파일러가 생성해주기 때문에 생략 가능합니다.
그렇다면 이제 인터페이스를 사용하는 방법에 대해 알아봅시다.
인터페이스는 추상 클래스와 유사하기 때문에 직접 객체화 되지 못합니다.
따라서 다음의 순서를 거쳐서 사용할 수 있는데요.
1. 인터페이스의 상속
2. 자식 클래스의 생성
3. 자식 클래스의 객체 생성
1,2번 과정을 수행할 때에는, extends가 아닌 implements를 사용합니다.
그리고 주의할 점이 한가지 존재하는데,
인터페이스는 추상 메서드를 가지고 있기 때문에
인터페이스를 상속하는 클래스는 인터페이스에 정의된 추상 메서드를 항상 Overriding해야 합니다.
[modifiers] class 클래스명 [extends 부모 클래스]
[implements 인터페이스1, 인터페이스2, ...] {
}
// 예제
interface Drawable {
public int PLAIN_PEN = 1;
public int BOLD_PEN = 2;
public int ITALIC_PEN = 3;
public void draw();
public void move(int x, int y);
}
class Shape {
int x = 0;
int y = 0;
Shape(int x, int y) {
this.x = x;
this.y = y;
}
}
class Circle extends Shape implements Drawable {
int radius;
Circle(int x, int y, int radius) {
super(x, y);
this.radius = radius;
}
// draw(), move(int x, int y)메서드 오버라이딩
public void draw() {
System.out.println("(" + x +", " + y + ") radius = " + radius);
}
public void move(int x, int y) {
System.out.println("(" + (this.x + x) + ", " + (this.y + y)+ ")
radius = " + radius);
}
}
public class InterfaceTest {
public static void main(String args[]) {
Circle c = new Circle(10, 10, 100);
c.draw();
c.move(5, 5);
}
}
그리고 결과를 보자면, 결과는 다음과 같습니다.
(10, 10) radius = 100
(15, 15) radius = 100
이처럼, 인터페이스는 추상클래스와 같이 변수와 메서드를 설계만 해두는데요.
이를 통해, 유지보수의 편의성을 높일 수 있습니다.
예를 들어, S_TV, L_TV가 있다고 가정을 합시다.
그리고 S_TV를 이용하려고 하는데, S_TV에 기능상 문제가 생겨서 L_TV의 기능으로 변경하려고 합니다.
하지만 두 티비에 정의된 변수와 메서드가 다르기 때문에 많은 소스코드들을 수정해야 하고,
그렇다면 유지보수는 어려워지게 됩니다.
하지만, 추상클래스나 인터페이스를 통해 변수와 메서드를 정의만 해놓고,
S_TV와 L_TV가 인터페이스를 상속받게 한다면,
변수와 메서드는 동일하게 되고 유지보수는 훨씬 쉬워질 것입니다.
그래서 결론적으로 말하자면, 인터페이스는 유지보수를 위해서 또는 팀프로젝트 작업을 할때, 다중상속을 하고 싶을 때
매우 유용할 것입니다.
'CS > Java' 카테고리의 다른 글
Toast (0) | 2020.05.14 |
---|---|
객체지향 프로그래밍 (1) | 2020.05.08 |
Scanner (0) | 2020.05.07 |
BufferedReader (0) | 2020.05.07 |
InputStreamReader (1) | 2020.05.07 |