-
java 인터페이스대학/객체지향프로그래밍 2022. 10. 9. 16:54
interface Car { int wheels = 4; void start(); void stop(); default void newFeature(int n) { print(n); } private void print(int n) { for (int i = 0; i < n; i++) { System.out.println("This is new feature"); } } } interface Color { void setColor(String s); String getColor(); static void info() { System.out.println("Color interface info"); } } class Bmw implements Car, Color { private String color; Bmw() { color = "None"; } public void start() { System.out.println("engine start!"); } public void stop() { System.out.println("engine stop..."); } public void setColor(String s) { color = s; } public String getColor() { return color; } } public class App { public static void main(String[] args) { System.out.println(Car.wheels); Car car = new Bmw(); car.start(); car.stop(); // car.setColor(); // car.getColor(); car.newFeature(2); // car.print(2); Color.info(); Color color = new Bmw(); // color.start(); // color.stop(); color.setColor("red"); System.out.println(color.getColor()); // color.newFeature(); // car.print(2); System.out.println(Bmw.wheels); Bmw bmw = new Bmw(); bmw.start(); bmw.stop(); bmw.setColor("Green"); System.out.println(bmw.getColor()); bmw.newFeature(4); // car.print(4); } } 실행 결과 4 engine start! engine stop... This is new feature This is new feature Color interface info red 4 engine start! engine stop... Green This is new feature This is new feature This is new feature This is new feature
클래스, 추상 클래스와 마찬가지로 인터페이스 변수로 구현 클래스 인스턴스를 참조할 수 있다.
단, 이 경우에는 인터페이스에 선언된 메서드만 참조할 수 있다.
인터페이스의 가장 큰 특징은 인터페이스에 선언된 추상 메서드는 모두 구현체 클래스에서 구현되어야 한다는 사실이다.
즉, 인터페이스에 선언된 메서드를 implements 한 클래스에서 구현하지 않을 시 에러가 발생한다.
인터페이스에서 선언된 변수와 메서드는 컴파일시 자동적으로 몇 개의 키워드가 추가된다.
즉 써줘도 되고 안써줘도 자동으로 추가해준다.
int wheels = 4; => public static final int wheels = 4; void start(); => public abstract void start();
따라서 인터페이스의 변수의 경우 static 키워드가 붙기 때문에, 인스턴스화를 안 해도 바로 참조할 수 있다.
추가로 JDK8부터 메서드에 static 키워드를 허용해 줬는데, 이 역시 인스턴스화를 안 해도 바로 참조할 수 있다.
단, 구현체 클래스 자료형에서는 바로 참조할 수 없고, 인터페이스 자료형에서만 바로 참조할 수 있다.
JDK8부터 default 키워드가 추가됬는데, 추가된 배경은 이렇다.
이미 Car라는 인터페이스를 만들어 배포했고, 여러 프로그램에서 이 인터페이스를 이용해여 구현했는데,
newFeature 기능을 넣고싶어서 이를 abstract 하게 인터페이스로 구현했다면,
기존에 Car 인터페이스를 구현한 프로그램에서 newFeature 기능을 구현하지 않았다는 이유로 에러가 발생할 것이다.
즉, newFeature 기능을 강제하는 꼴이 되어 유지보수 측면에서 불편함이 생긴다.
이 때, default 키워드를 사용하면 구현체 클래스에서 newFeature을 구현하지 않아도 에러가 발생하지 않을 뿐더러,
그냥 사용할 수 있고, 오버라이딩 해서 사용할 수도 있다.
JDK9부터 private 키워드가 추가됬는데, 추가된 배경은 이렇다.
default 키워드를 이용해 새로운 함수 newFeature를 구현했는데, 반복해서 처리해야할 작업이 너무 많았다.
이런 작업들을 private 키워드로 따로 print함수로 빼고, newFeature에서는 print함수를 호출하는 방법으로
코드를 단순화 시킬 수 있었다.
- 인터페이스 vs. 추상 클래스
인터페이스 추상 클래스 구현 메서드 포함 불가능(default, private, static 제외) 포함 가능 인스턴스 변수 포함 불가능(생성한다면 상수 취급됨) 포함 가능 다중 상속 가능(implements) 불가능(extends) 추상 클래스는 이 기능은 포함되면 좋지만, 당장은 구현하기 힘들기 때문에 뒤로 미룰 때 유용하고,
인터페이스는 개발자가 이 구현사항을 강제하여 구현하도록 의도할 때 유용하다.
- 중첩 인터페이스
interface Hello { void helloPrint(); } class IFClass { public interface NestedIF extends Hello { void NIFPrint(); } } class IMClass implements IFClass.NestedIF { public void helloPrint() { System.out.println("IFClass.NestedIF extneds Hello.helloPrint implement"); } public void NIFPrint() { System.out.println("IFClass.NestedIF.NIFPrint implement"); } } public class App { public static void main(String[] args) { Hello hello = new IMClass(); hello.helloPrint(); // hello.NIFPrint(); IFClass.NestedIF nif = new IMClass(); nif.helloPrint(); nif.NIFPrint(); // IFClass ifc = new IMClass(); IMClass imc = new IMClass(); imc.helloPrint(); imc.NIFPrint(); } } 실행 결과 IFClass.NestedIF extneds Hello.helloPrint implement IFClass.NestedIF extneds Hello.helloPrint implement IFClass.NestedIF.NIFPrint implement IFClass.NestedIF extneds Hello.helloPrint implement IFClass.NestedIF.NIFPrint implement
위 코드처럼 클래스 내부에 인터페이스를 중첩하여 만들 수도 있고,
인터페이스 사이에 extends 키워드를 통해 상속도 가능하다.
'대학 > 객체지향프로그래밍' 카테고리의 다른 글
java 멀티스레딩 (2) 2022.10.18 java 예외 처리 (0) 2022.10.09 java 패키지 (0) 2022.10.09 java 클래스 (0) 2022.10.09 java 연산 및 제어 (0) 2022.10.07