interface (9) 썸네일형 리스트형 인터페이스(13) - 디폴트 메서드가 있는 인터페이스의 상속 우리는 인터페이스 사이에도 상속관계가 있음을 배웠죠? 그럼 인터페이스의 상속이 이루어진 상태에서, 디폴트 메서드는 어떻게 동작하게 될지에 대해서도 살펴보도록 하겠습니다. 기본적으로는 추상 메서드와 마찬가지로, 디폴트 메서드 역시 상속이 이루어질 것입니다. 하지만, 이런 단순 상속을 통한 디폴트 메서드의 사용 이외에도 몇 가지 사용 방식이 존재합니다. 이 부분에 대해서 다음과 같이 살펴보도록 하겠습니다. 1. 디폴트 메서드를 그냥 상속해서 사용합니다. 2. 디폴트 메서드를 상속한 다음, 오버라이드 합니다. 3. 디폴트 메서드를 추상 메서드로 재선언 합니다. 우선, 예제에서 사용할 인터페이스 ParentInterface가 다음과 같습니다. public interface ParentInterface { pub.. 인터페이스(12) - 디폴트 메서드와 인터페이스의 확장 디폴트 메서드를 배웠던 것을 기억하실 것입니다. 디폴트 메서드는, 기본적으로 인터페이스에서 선언되는 추상 메서드와 달리 메서드의 실행 코드까지 모두 선언되는 메서드였습니다. 선언은 인터페이스에서 되어 있지만, 실제로 실행은 구현 객체를 통해서 이루어지는 독특한 성질을 갖고 있다는 것도 설명했습니다. 인터페이스로서는 상당히 예외적이고 특이한 케이스입니다. 다만 별다른 조작 없이 구현 클래스 인스턴스를 통해서 인터페이스 객체에서 실행 가능하다는 기본 메서드로서의 장점은 있지만 - 정확히 이 디폴트 메서드가 왜 필요한지에 대해서 상세히 살펴보도록 하겠습니다. 인터페이스에 선언된 디폴트 메서드의 가장 기본적인 특징은, 구현 클래스에서 오버라이드를 의무적으로 하지 않아도 된다는 점입니다. 이 특성은, 인터페이스의.. 인터페이스(11) - 인터페이스의 상속 인터페이스 역시, 클래스와 마찬가지로 다른 인터페이스를 상속할 수 있습니다. 주의할 것은 구현 클래스가 아니라 인터페이스 자체가 다른 인터페이스를 상속한다는 점입니다. 인터페이스 역시 extends 키워드를 통해 다른 인터페이스를 상속할 수 있고, 중요한 점은 인터페이스는 클래스와 달리 다중 상속이 가능하다는 것입니다. 기존에는 부모 / 자식 클래스로 통칭했는데, 인터페이스는 상위 / 하위 인터페이스로 각각의 호칭을 지정하겠습니다. public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2... { //... } 상속이 발생하므로, 당연하겠지만 다형성의 특질을 갖게 됩니다. 예를 들어서 위에서 예시로 든 '하위인터페이스'를 구현하는 '구현클래스'가 있다고 가정하겠습니다... 인터페이스(10) - 객체 타입체크(instanceof) 상속 챕터에서와 마찬가지로, 인터페이스 타입 객체와 구현 클래스 간에 강제 타입 변환(casting)을 시도할 때 자동 변환된 타입의 원본 타입에 오류가 있다면 ClassCastException이 발생하게 됩니다. 이를테면 구현 클래스 Taxi가 Vehicle 인터페이스 타입으로 변환되어 인터페이스 변수에 대입되었는데, Bus 타입으로 캐스팅을 시도한다면 오류가 발생하겠지요. 그래서 캐스팅이 필요한 경우에는 역시 instanceof 키워드를 사용하여 true일 경우에만 실행하는 조건을 주는 것이 안전합니다. if(vehicle instanceof Bus) { Bus bus = (Bus) vehicle; } 기존 인터페이스 Vehicle과 Driver 클래스를 활용한 예제를 수정해 instanceof를 사.. 인터페이스(8) - 인터페이스의 타입 변환과 다형성 3(배열 객체) 이번에는 인스턴스 객체의 배열형 타입 관리의 케이스와 마찬가지로, 인터페이스 역시 구현 객체를 배열 타입으로 관리해 보는 예제를 확인해 보도록 하겠습니다. 우선, 기존 예제에서 작성되었던 Car 클래스를 살펴보겠습니다. public class Car { Tire frontLeftTire = new HankookTire(); Tire frontRightTire = new HankookTire(); Tire backLeftTire = new HankookTire(); Tire backRightTire = new HankookTire(); void run() { frontLeftTire.roll(); frontRightTire.roll(); backLeftTire.roll(); backRightTire.rol.. 인터페이스(8) - 인터페이스의 타입 변환과 다형성 2 ○ 자동 타입 변환(promotion) 상속 체계 하에서의 타입 변환과 마찬가지로, 구현 객체가 자식 클래스의 포지션에서 인터페이스 타입으로 변환되는 것이 자동 타입 변환에 해당하게 됩니다. 여기는 기존의 클래스 상속 관련 내용을 잘 이해하고 있다면 특별할 것이 없습니다. 인터페이스타입 변수 = 구현객체; Remotecontrol rc = new Audio(); 한 가지 더 생각할 점이 있습니다. 만일, 어떤 클래스 A가 특정 인터페이스를 구현한 클래스인데 - 이 클래스 A를 상속하는 자식 클래스 B가 있다면 타입 변환은 이루어질까요? 정답은 '타입 변환이 이뤄진다'입니다. 자식 클래스 타입 B를 인터페이스 변수에 대입한다면, 자동 타입 변환이 동일하게 이루어집니다. 기존에 클래스의 부모 자식관계 상속 .. 인터페이스(8) - 인터페이스의 타입 변환과 다형성 1 상속 파트에서 우리는 다형성에 대해서 다루었습니다. 하나의 타입에 대입되는 인스턴스의 종류에 따라서, 그 실행 결과가 달라지는 성질을 확인했죠(부모 타입에 어떤 자식 객체를 대입하느냐에 따라 달라지는 결과). 인터페이스 타입에 구현 클래스 인스턴스가 어떤 것이 적용되느냐에 따라서도 그 실행 결과가 달라지는 것을 확인했습니다. 물론 부모-자식과 인터페이스-구현 간의 관계는 계층적 차이가 있어서 엄격하게는 다른 개념이지만, 동일한 형질을 통해서 다양한 결과를 구현할 수 있다는 점은 동일합니다. 실제 사례를 예로 들어서, 인터페이스 다형성에 기반한 구조 설계를 살펴보겠습니다. 우선 XXX라는 클래스를 사용하여 프로그램 개발을 진행했다고 가정해 보겠습니다. 그런데, XXX클래스가 전반적으로 결함이 있어서 메서드.. 인터페이스(7) - 인터페이스의 구현과 사용 1 : 추상 메서드 사용 지금까지 인터페이스와 관련해 여러 가지 원리와 기본 규칙들에 대해서 알아보았습니다. 본격적으로 인터페이스에서 선언한 내용을 구현하고, 실제 실행 코드에서 사용하는 방식에 대해서 살펴보도록 하겠습니다. 우선, 기본적인 내용을 다시 한번 되짚어 보도록 하겠습니다. 인터페이스를 사용하기 위해서는, 우선 인터페이스 타입의 변수를 선언하고 여기에 구현 클래스의 인스턴스를 대입합니다(만일 익명 객체 형태로 구현한다면 인터페이스 타입). 당연하지만 인터페이스 타입의 변수도 참조 타입이므로 구현 클래스 인스턴스의 메모리 주소를 참조하게 됩니다. RemoteControl rc = new Television(); RemoteControl rc2; rc2 = new Audio(); 참고로 인터페이스는 사용 범위에 있어서 클.. 이전 1 2 다음