https://github.com/whiteship/live-study/issues/8
목표
자바의 인터페이스에 대해 학습하세요.
학습할 것 (필수)
- 인터페이스 정의하는 방법
- 인터페이스 구현하는 방법
- 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
- 인터페이스 상속
- 인터페이스의 기본 메소드 (Default Method), 자바 8
- 인터페이스의 static 메소드, 자바 8
- 인터페이스의 private 메소드, 자바 9
인터페이스 정의하는 방법
public interface MyInterface extends MyInterface1,
MyInterface2, MyInterface3 {
void doExample(int i, double x);
int doExampleSomething(String s);
}
출처: https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
인터페이스 선언은 접근 지시자, interface 키워드, 인터페이스 이름, 쉼표로 구분된 상위 인터페이스 목록(있는 경우) 및 인터페이스 본문으로 구성
서브 클래스처럼 다른 인터페이스를 확장하거나 다른 클래스를 확장 가능
클래스는 하나의 다른 클래스만 확장할 수 있지만 인터페이스는 여러 인터페이스를 확장 가능
Interface Body
인터페이스 본문에는 추상 메소드, 기본 메소드, static 메소드가 포함될 수 있다.
인터페이스의 모든 추상, 기본, static 메소드는 암시적으로 공용이므로 public을 생략 가능
인터페이스에 정의된 모든 상숫값은 암시적으로 public, static 및 final
인터페이스 구현하는 방법
샘플 인터페이스, MyInterface
public interface MyInterface {
public int isCompareTo(MyInterface other);
}
MyInterface 인터페이스 구현
public class MyRectangle implements MyInterface {
// 가로 * 세로
public int getArea() {
return width * height;
}
// MyInterface 인터페이스 구현을 위한 메소드
@Override
public int isCompareTo(MyInterface other) {
MyRectangle otherRect
= (MyRectangle)other;
if (this.getArea() < otherRect.getArea())
return -1;
else if (this.getArea() > otherRect.getArea())
return 1;
else
return 0;
}
}
출처: https://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html
MyInterface 인터페이스를 구현(implements)해 MyRectangle 클래스 안에서 사각형의 크기를 계산하는 메소드 isCompareTo()를 오버라이딩(overriding;재정의)
MyRectangle는 MyInterface을 구현(implements)하기 때문에 두 MyRectangle 객체의 크기를 비교 가능
Note: isCompareTo 메소드는 MyInterface 타입의 객체를 사용합니다. MyRectangle 타입 캐스팅은 컴파일러에 실제 객체가 무엇인지 알려줍니다. 다른 인스턴스(other.getArea())에서 직접 getArea를 호출하면 다른 인스턴스가 실제로 MyRectangle 인스턴스임을 이해하지 못하기 때문에 컴파일에 실패합니다.
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
새로운 인터페이스를 정의할 때 새로운 레퍼런스 데이터 타입으로 정의할 수 있다. 데이터 타입 이름을 사용할 수 있는 모든 곳에서 인터페이스 이름을 사용할 수 있다.
public Object findLargest(Object object1, Object object2) {
MyInterface obj1 = (MyInterface) object1;
MyInterface obj2 = (MyInterface) object2;
if ((obj1).isLargerThan(obj2) > 0)
return object1;
else
return object2;
}
object1을 MyInterface 타입으로 캐스팅하여 isLargerThan 메소드를 호출할 수 있다.
다양한 클래스에서 MyInterface을 구현(implementing)하려는 경우 두 객체가 동일한 클래스인 경우 클래스 중 하나에서 인스턴스화 된 객체를 findLargest()로 비교가 가능하다. 비슷하게 다음과 같이 비교할 수 있다.
public Object findSmallest(Object object1, Object object2) {
MyInterface obj1 = (MyInterface) object1;
MyInterface obj2 = (MyInterface) object2;
if ((obj1).isLargerThan(obj2) < 0)
return object1;
else
return object2;
}
public boolean isEqual(Object object1, Object object2) {
MyInterface obj1 = (MyInterface) object1;
MyInterface obj2 = (MyInterface) object2;
if ((obj1).isLargerThan(obj2) == 0)
return true;
else
return false;
}
인터페이스 상속
클래스와 인터페이스의 중요한 차이점은 클래스는 필드를 가질 수 있지만 인터페이스는 가질 수 없다. 추가로 클래스의 객체 생성이 가능하지만 인터페이스는 불가능 하다.
객체는 클래스에 정의된 필드의 상태를 저장한다. 자바 언어가 둘 이상의 클래스를 확장할 수 없는 이유는 여러 클래스에서 필드를 상속하는 기능인 다중 상속 문제를 방지하기 위한 것.
인터페이스에는 필드가 포함되지 않기 때문에 다중 상속으로 인해 발생하는 문제에 대해 걱정할 필요가 없다.
구현(implementation)의 다중상속은 여러 클래스에서 메소드의 정의를 상속하는 기능
다중상속에서 이름 충돌 및 모호성과 같은 문제가 발생하는데 컴파일러가 슈퍼 클래스의 같은 이름의 메소드를 만나면 어떤 멤버나 메소드를 실행하거나 접근해야 하는지를 결정할 수 없는 경우가 있다. 또한 슈퍼 클래스에 새 메소드를 추가하여 무의식적으로 이름 충돌을 일으킬 수 있다. 기본 메소드(Default methods)는 다중 상속의 한 형태를 소개한다. 클래스는 동일한 이름을 가진 기본 메소드를 포함한 인터페이스를 2개 이상 구현할 수 있다. 컴파일러는 특정 클래스가 사용하는 기본 메소드를 결정하는 규칙을 제공한다.
출처: https://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html
인터페이스의 기본 메소드 (Default Method), 자바 8
산업 표준 인터페이스를 발표하는 컴퓨터 제어 자동차 제조업체의 예를 들어 설명해 봅시다. 컴퓨터로 제어되는 자동차 제조업체가 비행과 같은 새로운 기능을 자동차에 추가하면 어떻게 될까요? 제조업체는 다른 회사(예: 전자 유도 기기 제조업체)가 소프트웨어를 적용하도록 특별히 새로운 메소드가 필요할 겁니다. 이러한 새로운 비행 관련 메소드를 어디에 선언해야 할까요? 만약 오리지널 인터페이스에 추가하면 해당 인터페이스를 구현한 프로그래머는 구현을 다시 작성해야 합니다. 만약 static 메소드로 추가하면 프로그래머는 필수 핵심 메소드가 아닌 유틸리티 메소드로 간주할 것입니다.
기본 메소드(default methods)를 사용하면 라이브러리의 인터페이스에 새 기능을 추가하고 이전 버전용으로 작성된 코드와 바이너리 호환성을 보장할 수 있습니다.
출처: https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
public interface MyInterface {
default int getData(int i) {
return i;
}
}
인터페이스의 static 메소드, 자바 8
public interface MyInterface {
static public int getData(String myString) {
try {
return 1;
} catch (Exception e) {
System.err.println("error");
return -1;
}
}
}
클래스의 모든 인스턴스는 static 메소드를 공유
라이브러리에서 helper 메소드를 쉽게 구성할 수 있다.
인터페이스의 private 메소드, 자바 9
Java 9부터 인터페이스에 private 메소드와 private static 메소드 추가 가능
인터페이스 내부의 코드 재사용성을 향상
private 메소드는 인터페이스 내에서만 사용 가능
private static 메소드는 다른 static or non-static 인터페이스 메소드 안에서 사용 가능
private non-static 메소드는 private static 메소드 내부에서 사용 불가능
public interface MyInterface {
private int add(int nums) {
return nums + 1;
}
}
출처: https://howtodoinjava.com/java9/java9-private-interface-methods/
링크1: 인터페이스의 장점에 대해 모르겠습니다. 납득좀 시켜주세요
링크2: 객체지향 개발 5대 원리: SOLID
댓글 없음:
댓글 쓰기