본문 바로가기

java

(45)
제네릭(3) - 제네릭 메서드 3 제네릭 메서드에 대한 예제를 계속해서 살펴보고 있습니다. 이번에는 멀티 파라미터 타입을 사용하는 경우의 제네릭 메서드 사용에 대해서 살펴보겠습니다. 우선, 멀티타입 파라미터를 사용하는 제네릭 타입(클래스) Pair를 선언합니다. public class Pair { private K key; private V value; // 생성자 public Pair(K key, V value) { this.key = key; this.value = value; } // Setter public void setKey(K key) { this.key = key; } public void setValue(V value) { this.value = value; } // Getter public K getKey() { ret..
제네릭(1) - 제네릭 타입 2 앞서 제네릭 타입에 대한 예제를 살펴보기 위해서, 비제네릭 방식으로 구현한 예제를 살펴보았습니다. 비교를 위해서 예제를 다시 한번 보도록 하겠습니다. 제네릭(1) - 제네릭 타입 1 우선은 기본적으로 '제네릭(Generic)' 타입이 무엇인지를 알고 넘어가야 합니다. 제네릭은 컬렉션부터 람다식, 스트림, NIO 등 자바의 intermediate 이상의 레벨에서 학습하는 내용에 빠지지 않고 등장 nozeroslope.tistory.com public class Box { private Object object; public void set(Object object) { this.object = object; } public Object get() { return object; } } public class..
제네릭(1) - 제네릭 타입 1 우선은 기본적으로 '제네릭(Generic)' 타입이 무엇인지를 알고 넘어가야 합니다. 제네릭은 컬렉션부터 람다식, 스트림, NIO 등 자바의 intermediate 이상의 레벨에서 학습하는 내용에 빠지지 않고 등장하기 때문이죠. API 문서에서도 자주 사용하기 때문에 알아두지 못하면 JAVA를 공부하거나 개발 과정에서 꽤나 곤란한 상황을 겪게 됩니다. 기본적으로 제네릭(Generic)은, "타입"을 컨트롤하는 개념입니다. 그래서 제네릭을 사용하게 되면 다음 두 가지 장점을 갖게 됩니다. 첫 번째로 컴파일 과정에서 타입 체크를 강력하게 할 수 있다는 점입니다. 실행되고 에러가 발생하느니, 컴파일 레벨에서 미리 문제를 해결하는 게 낫다는 것이죠. 두 번째로는 불필요한 타입 변환(casting)을 제거할 수 ..
중첩 클래스&인터페이스(5) - 익명 객체 7 우리는 앞서 로컬 클래스에서의 사용 제한과 관련해, 로컬 클래스에서 메서드의 파라미터나 로컬 변수를 사용하는 경우의 제약 사항에 대해서 학습했습니다. 잘 기억이 나지 않는다면, 'final' 키워드가 힌트가 되겠습니다. 중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 4 : 로컬 클래스 우선 앞의 아티클과 바로 이어지는 내용이니, 가능한 앞의 내용과 연속해서 확인해 보겠습니다. 우리는 특정 메서드 내부의 로컬 클래스가 선언되었을 때, 이 로컬 클래스가 바깥 메서드의 필드 nozeroslope.tistory.com 익명 객체에서도 마찬가지 입니다. 익명 객체 내부에서는 바깥 클래스의 필드 / 메서드를 제약 없이 사용이 가능합니다. 하지만, 익명 객체 내부에서 "메서드의 파라미터나 로컬 변수를" ..
중첩 클래스&인터페이스(5) - 익명 객체 6 다음 예제를 통해서는 UI 프로그래밍에서 흔히 사용하는 방식을 알아보겠습니다. 여기서도 역시 익명 객체를 활용하는 형태로 구현을 진행하게 됩니다. 예제에서는 버튼의 클릭 이벤트를 Setter를 통해 설정하고, 실행하는 과정을 다루어 보겠습니다. public class Button { OnClickListener listener; void setOnClickListener(OnClickListener listener) { this.listener = listener; } void touch() { listener.onClick(); } interface OnClickListener { void onClick(); } } Button 클래스입니다. 기본적으로 OnClickListener라는 중첩 인터페이스가..
중첩 클래스&인터페이스(5) - 익명 객체 4 지금까지 익명 객체의 사용 형태와 관련해서 부모-자식 클래스를 사용하는 경우를 중심으로 살펴보았습니다. 그럼, 이제부터는 인터페이스를 익명 객체를 통해서 사용하는 케이스를 살펴보도록 하겠습니다. 사실 익명 객체를 활용한 인터페이스 구현 객체의 생성을 진행하는 케이스는 이미 인터페이스 아티클에서 배운 적이 있지만, 다시 한번 살펴보도록 하겠습니다. 일단 자식 클래스의 구현과 원리 자체는 거의 유사합니다. 인터페이스의 구현 객체 역시 다형성을 기반으로 하여 생성하고 있기 때문이죠. 기본적으로 인터페이스는, 인터페이스 타입의 변수를 만들고 거기에 구현 클래스의 인스턴스를 대입해 객체를 생성했습니다. 그리고 그 구현 클래스에는 필수로 인터페이스의 추상 메서드에 대해서 재정의를 진행해야 했습니다. 그런데 자식 클..
중첩 클래스&인터페이스(5) - 익명 객체 3 앞선 아티클에서 익명 인스턴스 형태로 자식 클래스를 정의해 사용하는 것을 배웠습니다. 실제 코드 작성 예제를 통해서 한번 살펴보도록 하겠습니다. 아래의 경우 일단 상위 부모 클래스인 Person에서 wake( )라는 메서드를 선언하고, Anonymous라는 클래스에 필드, 메서드의 로컬 변수, 메서드의 파라미터로 Person 클래스를 상속받는 익명의 자식 객체 인스턴스를 생성하게 됩니다. 각각의 익명 객체로 선언된 자식 객체들은 wake( )라는 공통의 메서드를 오버라이드하여 사용하게 되고, 각각 work, walk, study라는 고유의 자식 메서드를 사용하게 됩니다. 여기서 주의할 점, 이 익명 자식 객체에 새롭게 정의된 - wake( ) 이외의 필드나 메서드 - 의 경우에는 재정의된 wake( ) ..
중첩 클래스&인터페이스(5) - 익명 객체 1 익명(anonymous) 객체는, 말 그대로 이름을 갖지 않는 객체를 의미합니다. 그런데 JAVA에서의 익명 객체에서 갖는 큰 특징은, 단독으로 익명 객체를 생성할 수가 없다는 점입니다. 단독으로 생성할 수 없다는 것은 결국 무엇을 의미할까요? 이는 어떤 부모 클래스를 상속받거나, 인터페이스를 구현해야만 생성할 수 있다는 의미입니다. 결국 JAVA에서의 익명 객체는 자식 레벨에서만 구현이 가능하다고 생각하면 되겠습니다. ○ 익명의 자식 객체 기본적으로 우리가 자식 객체를 사용하는 방법에 대해서 되짚어 보겠습니다. 부모 클래스인 Parent가 있고, 이를 상속받는 Child 클래스가 있다고 가정하겠습니다. 다형성을 발현하게 되는 경우는 언제일까요? 자식은 부모 행세를 할 수 있기 때문에 Parent 클래스..