Programming/JAVA (139) 썸네일형 리스트형 인터페이스(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를 사.. 인터페이스(9) - 인터페이스 파라미터의 다형성 & Casting 파라미터의 다형성 역시, 상속 챕터에서 공부해 본 사항입니다. 만약, 파라미터의 타입이 부모 클래스로 선언되어 있을 경우 해당 파라미터 영역에 자식 클래스를 인자로 전달하게 되면 자동 타입 변환이 발생한다는 점을 활용하였죠. 인터페이스의 경우도 마찬가지입니다. 파라미터 타입이 인터페이스로 선언되었을 경우, 해당 인터페이스를 구현한 구현 클래스가 해당 파라미터에 인자로 전달될 수 있습니다. 그리고, 이 파라미터의 메서드를 호출하게 되면 각 구현 클래스가 오버라이드 한 메서드가 실행되기 때문에 다양한 결과를 호출할 수 있게 됩니다. 만일 Vehicle이라는 인터페이스를 파라미터로 받는 메서드가 있을 경우, 이를 구현하는 Bus 클래스의 인스턴스가 인자로 전달될 수 있습니다. 인스턴스 변수 혹은 new 형태로.. 인터페이스(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) - 인터페이스의 구현과 사용 2 : 디폴트, 정적 메서드 ○ 인터페이스의 디폴트 메서드 사용 디폴트 메서드는 인터페이스의 모든 인스턴스가 자동으로 보유하게 되는 말 그대로 '기본' 메서드입니다. 별다른 오버라이드 없이도, 기본적인 추상 메서드 구현만 잘 이루어졌다면 특별한 구현 클래스에서의 작업 없이 사용이 가능하죠. 실행 코드는 이미 인터페이스 상에 선언이 되어 있습니다. 물론, 엄격하게 구조를 따지면 인터페이스 상에 실행 코드가 정의되어 있긴 하지만 - 실제로는 구현 클래스 인스턴스가 보유하고 있는 구조라고 생각해야 합니다. 그리고 위의 문장에서 구현 클래스의 인스턴스가 보유하는 메서드라고 말했습니다. 이 부분을 강조하는 이유는 무엇일까요? 그건 인터페이스에 실행 코드가 선언되어 있긴 하지만, 반드시 구현 클래스 인스턴스를 통해서만 실행이 가능한 메서드이기.. 인터페이스(7) - 인터페이스의 구현과 사용 1 : 추상 메서드 사용 지금까지 인터페이스와 관련해 여러 가지 원리와 기본 규칙들에 대해서 알아보았습니다. 본격적으로 인터페이스에서 선언한 내용을 구현하고, 실제 실행 코드에서 사용하는 방식에 대해서 살펴보도록 하겠습니다. 우선, 기본적인 내용을 다시 한번 되짚어 보도록 하겠습니다. 인터페이스를 사용하기 위해서는, 우선 인터페이스 타입의 변수를 선언하고 여기에 구현 클래스의 인스턴스를 대입합니다(만일 익명 객체 형태로 구현한다면 인터페이스 타입). 당연하지만 인터페이스 타입의 변수도 참조 타입이므로 구현 클래스 인스턴스의 메모리 주소를 참조하게 됩니다. RemoteControl rc = new Television(); RemoteControl rc2; rc2 = new Audio(); 참고로 인터페이스는 사용 범위에 있어서 클.. 이전 1 ··· 11 12 13 14 15 16 17 18 다음