본문 바로가기

Programming/JAVA

(139)
중첩 클래스&인터페이스(5) - 익명 객체 5 앞서 살펴본 익명 객체를 활용한 인터페이스 구현 객체 사용법에 대해서 다시 한번 상기해 보겠습니다. 이번 아티클에서는 예제 코드를 통해서 익명 구현 클래스 인스턴스 생성과 사용 방식을 연습해 보겠습니다. public interface RemoteControl { public void turnOn(); public void turnOff(); } public class Anonymous { // 필드 값으로 인터페이스 구현 클래스 익명 인스턴스 구현 RemoteControl field = new RemoteControl() { @Override public void turnOn() { System.out.println("TV전원 ON"); } @Override public void turnOff() { S..
중첩 클래스&인터페이스(5) - 익명 객체 4 지금까지 익명 객체의 사용 형태와 관련해서 부모-자식 클래스를 사용하는 경우를 중심으로 살펴보았습니다. 그럼, 이제부터는 인터페이스를 익명 객체를 통해서 사용하는 케이스를 살펴보도록 하겠습니다. 사실 익명 객체를 활용한 인터페이스 구현 객체의 생성을 진행하는 케이스는 이미 인터페이스 아티클에서 배운 적이 있지만, 다시 한번 살펴보도록 하겠습니다. 일단 자식 클래스의 구현과 원리 자체는 거의 유사합니다. 인터페이스의 구현 객체 역시 다형성을 기반으로 하여 생성하고 있기 때문이죠. 기본적으로 인터페이스는, 인터페이스 타입의 변수를 만들고 거기에 구현 클래스의 인스턴스를 대입해 객체를 생성했습니다. 그리고 그 구현 클래스에는 필수로 인터페이스의 추상 메서드에 대해서 재정의를 진행해야 했습니다. 그런데 자식 클..
중첩 클래스&인터페이스(5) - 익명 객체 3 앞선 아티클에서 익명 인스턴스 형태로 자식 클래스를 정의해 사용하는 것을 배웠습니다. 실제 코드 작성 예제를 통해서 한번 살펴보도록 하겠습니다. 아래의 경우 일단 상위 부모 클래스인 Person에서 wake( )라는 메서드를 선언하고, Anonymous라는 클래스에 필드, 메서드의 로컬 변수, 메서드의 파라미터로 Person 클래스를 상속받는 익명의 자식 객체 인스턴스를 생성하게 됩니다. 각각의 익명 객체로 선언된 자식 객체들은 wake( )라는 공통의 메서드를 오버라이드하여 사용하게 되고, 각각 work, walk, study라는 고유의 자식 메서드를 사용하게 됩니다. 여기서 주의할 점, 이 익명 자식 객체에 새롭게 정의된 - wake( ) 이외의 필드나 메서드 - 의 경우에는 재정의된 wake( ) ..
중첩 클래스&인터페이스(5) - 익명 객체 2 바로 앞의 아티클에서, 익명 객체의 기본적인 생성 방식과 개념에 대해서 함께 살펴보았습니다. 코드 예제를 통해서 익명 객체를 생성하는 몇 가지 패턴에 대해서 살펴보도록 하겠습니다. 중첩 클래스&인터페이스(5) - 익명 객체 1 익명(anonymous) 객체는, 말 그대로 이름을 갖지 않는 객체를 의미합니다. 그런데 JAVA에서의 익명 객체에서 갖는 큰 특징은, 단독으로 익명 객체를 생성할 수가 없다는 점입니다. 단독으로 생성할 nozeroslope.tistory.com 우선 임의의 부모 클래스 Parent가 있다고 가정해 보겠습니다. A라는 클래스에서 Parent를 상속받는 자식 클래스를 익명 개체로 구현한다면, 다음과 같이 구현하게 됩니다. 참고로 부모 클래스 Parent에 선언된 메서드 parentM..
중첩 클래스&인터페이스(5) - 익명 객체 1 익명(anonymous) 객체는, 말 그대로 이름을 갖지 않는 객체를 의미합니다. 그런데 JAVA에서의 익명 객체에서 갖는 큰 특징은, 단독으로 익명 객체를 생성할 수가 없다는 점입니다. 단독으로 생성할 수 없다는 것은 결국 무엇을 의미할까요? 이는 어떤 부모 클래스를 상속받거나, 인터페이스를 구현해야만 생성할 수 있다는 의미입니다. 결국 JAVA에서의 익명 객체는 자식 레벨에서만 구현이 가능하다고 생각하면 되겠습니다. ○ 익명의 자식 객체 기본적으로 우리가 자식 객체를 사용하는 방법에 대해서 되짚어 보겠습니다. 부모 클래스인 Parent가 있고, 이를 상속받는 Child 클래스가 있다고 가정하겠습니다. 다형성을 발현하게 되는 경우는 언제일까요? 자식은 부모 행세를 할 수 있기 때문에 Parent 클래스..
중첩 클래스&인터페이스(4) - 중첩 인터페이스 중첩 인터페이스는 클래스 내부에 멤버로서 선언된 인터페이스를 의미합니다. 일단 중첩 형태로 인터페이스를 선언하게 되는 경우는, 해당되는 바깥 클래스와 밀접하게 연결된 구현 클래스를 생성하기 위함입니다. 주로 UI 처리 관련 코드에서 사용하게 되는데 자세한 것은 차차 살펴보도록 하겠습니다. 기본적인 형태는 다음과 같습니다. class Outter { interface I { void method(); } } 안드로이드 스튜디오 등에서 UI 관련 이벤트를 구현할 때 자주 사용되는 패턴을 통해서, 중첩 인터페이스의 사용 방식을 알아보겠습니다. 일단 Button이라는 클래스가 있고, 이 클래스를 통해서 우리가 '클릭'이 발생했을 때의 여러가지 동작을 정의하는 상황이라고 가정해 보겠습니다. 예를 들어 Button..
중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 5 : 바깥 클래스 참조하기 클래스 내부에서 this라는 키워드를 사용하게 되면, this가 가리키는 것은 해당 클래스를 통해서 생성된 인스턴스 자신을 의미하게 되는 것을 잘 알고 계실 겁니다. 중첩 클래스 내부에서 this라는 키워드를 사용하게 되면, 당연히 중첩 클래스의 인스턴스를 가리키게 되겠죠. 하지만 중첩 클래스 내부에서 바깥 클래스의 인스턴스를 참조해야 하는 경우도 있을 것입니다. 중첩 클래스 내부에서 바깥 클래스의 인스턴스 참조를 진행하기 위해서는, this 앞에 해당 클래스의 이름을 붙여주는 방식으로 사용하게 됩니다. OutterClass.this.field; OutterClass.this.method(); 그럼 다음과 같이 바깥 클래스 Outter, 그리고 중첩 클래스 Nested가 있는 구조에서 바깥 클래스를 참조..
중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 4 : 로컬 클래스 우선 앞의 아티클과 바로 이어지는 내용이니, 가능한 앞의 내용과 연속해서 확인해 보겠습니다. 우리는 특정 메서드 내부의 로컬 클래스가 선언되었을 때, 이 로컬 클래스가 바깥 메서드의 필드 값이나 메서드를 사용하게 되는 경우 발생할 수 있는 문제점에 대해서 살펴보았습니다. 이를 해결하기 위해서 로컬 클래스가 바깥 메서드의 매개변수 혹은 로컬 변수의 값을 사용하게 되면, 컴파일할 때 해당 값을 로컬 클래스 내부에 복사해 두고 사용하게 된다는 기본 작동 원리를 알아보았죠. 대신 이로 인해서 생기는 제약은 값의 변경이 생기면 안 되기 때문에 JAVA 7까지는 바깥 메서드의 매개변수, 로컬변수 등은 반드시 final 속성을 가진 값들이어야 한다고 했습니다. 또한, JAVA 8 이후에는 반드시 final 속성을 갖..