Programming/JAVA (139) 썸네일형 리스트형 람다식(3) - 클래스 멤버, 로컬 변수의 사용 1 ○ 람다식에서 클래스의 멤버 사용하기 람다식의 실행 블록 내부에서 실행문을 작성할 때, 어떤 클래스의 멤버인 필드와 메서드를 사용하는 데는 크게 제약이 없습니다. 단, 주의해야 하는 개념은 [this]의 사용 방식입니다. - 만약 일반적인 익명 객체에서 this를 사용하게 되면, 이것이 의미하는 것은 익명 객체 그 자체를 참조한다는 의미입니다. - 하지만 람다식에서 this를 사용하면, 익명 객체를 참조하는 것이 아니라 그 람다식을 실행하는 객체를 참조한다는 의미가 됩니다. 아래에서 예제를 통해서 살펴보겠습니다. 우선 인터페이스를 선언합니다. 당연히 함수형 인터페이스입니다. @FunctionalInterface public interface MyFunctionalInterface { public int .. 람다식(2) - 람다식의 타겟 타입, 함수적 인터페이스 3 ○ 파라미터와 리턴 값이 있는 람다식 이번에는 파라미터와 리턴 값이 모두 존재하는 람다식에 대해서 작성 방법을 살펴보겠습니다. 당연히 파라미터와 리턴 식을 작성해 주면 되는 간단한 문제이지만, 이 경우에도 람다식에서 생략이 가능한 부분들이 있기 때문에 몇 가지 작성 방식에 차이가 발생합니다. 머리가 복잡하다면 일단 기본형을 먼저 익혀두고, 생략하는 방법을 적용해 나갑시다. 우선 인터페이스에서 다음과 같이 추상 메서드가 선언되었습니다. 리턴 타입은 int, 파라미터도 두 개가 존재합니다. @FunctionalInterface public interface MyFunctionalInterface { public int method(int x, int y); } 이 인터페이스를 람다식으로 표현하는 여러 가지 .. 람다식(2) - 람다식의 타겟 타입, 함수적 인터페이스 2 앞의 아티클에서 람다식에서 정의하는 '함수적 인터페이스'의 기본 정의에 대해서 살펴보았습니다. 이때 추상 메서드는 단 한 개만 정의가 가능하다는 점도 배웠습니다. 그런데, 이렇게 정의된 하나의 추상 메서드의 선언 형태(파라미터, 리턴 값...)에 따라서 람다식 작성 방법이 달라진다는 사실을 기억해야 합니다. 해당 메서드의 선언 형태에 따라 달라지는 람다식 사용 방식에 대해서 하나씩 살펴보겠습니다. ○ 파라미터 / 리턴 값이 모두 없는 람다식 파라미터와 리턴 값이 모두 없는 추상 메서드가 선언되었을 경우의 사용 예시를 살펴보겠습니다. 사실 파라미터와 리턴 값이 없으므로 특이 사항은 없습니다. () -> { ... } 형태로 인터페이스를 구현해 주면 됩니다. 실제 예제를 통해서 살펴보겠습니다. public .. 람다식(2) - 람다식의 타겟 타입, 함수적 인터페이스 1 람다식에 대해서 앞선 아티클에서 간단하게 살펴보았습니다. 복잡해 보이는 설명이기는 했지만, 결국 람다식은 '인터페이스의 구현 객체를 익명으로 선언하는' 것이라는 간단한 정의를 잘 기억하고 있어야 합니다. 지금부터 설명하는 모든 내용이 이 사실을 기반으로 이루어지기 때문이지요. 자, 우리는 앞의 아티클에서 람다식의 기본 형태는 파라미터가 있고, 이를 사용하는 실행 코드 블럭( { } )이 있는 형태라고 배웠습니다. 람다식(1) - 람다식의 정의와 기본 문법 람다식은 익명 함수(anonymous function)를 생성하기 위한 식입니다. 이는 객체 지향 언어라기보다는, 함수 지향 언어에 가까운 성격을 갖고 있습니다. 일단 기존의 코드 작성 레이아웃과 약간의 차이 nozeroslope.tistory.com .. 람다식(1) - 람다식의 정의와 기본 문법 람다식은 익명 함수(anonymous function)를 생성하기 위한 식입니다. 이는 객체 지향 언어라기보다는, 함수 지향 언어에 가까운 성격을 갖고 있습니다. 일단 기존의 코드 작성 레이아웃과 약간의 차이가 있는 형태이지만, 결과적으로는 코드 자체가 간결해지고, 컬렉션을 다룰 때 원하는 결과를 쉽게 필터링/매핑할 수 있다는 장점이 있습니다. 람다식 자체는 기본적으로 '파라미터를 가진 코드 블럭' 형태이지만 런타임 시에는 "익명 구현 객체"를 생성하게 됩니다. 익명 구현 객체를 생성한다는 부분에서 눈치채셨겠지만, 인터페이스를 구현한다는 의미입니다. 이와 관련해서는, 익명 객체 아티클에서 인터페이스의 또는 부모 객체에 대한 익명 구현 객체 생성을 배웠습니다. 익명 객체와 관련해서는 생각보다 복잡한 내용을.. 제네릭(6) - 제네릭 타입의 상속과 구현 제네릭 타입(클래스)도 당연히 같은 레벨의 다른 클래스와 동일하게 부모-자식 클래스의 구현이 가능합니다. 물론 타입 파라미터에 대한 통일성을 가져야 상속이 가능하겠죠? 잘 이해가 가지 않는다면 아래와 같이 Product와 ChildProduct사이의 상속 선언 형태를 보겠습니다. public class ChildProduct extends Product { //... } 부모 클래스를 상속하는 자식 클래스는 (당연하게도) 자신만의 고유 필드나 메서드를 갖게 됩니다. 타입 파라미터도 비슷하게 생각해 주시면 됩니다. 자식 제네릭 타입의 경우 자신만의 타입 파라미터를 가질 수 있습니다. public class ChildProduct extends Product { // ... } 그럼 간단한 예제를 통해서, .. 제네릭(5) - 와일드카드 타입 와일드카드 타입은 제네릭 사용에 있어서 다소 설명이 어렵게 느껴질 수 있는 부분입니다. 하지만 차근차근 설명을 읽어나가면 충분히 이해할 수 있는 내용이니, 이 아티클을 순서대로 인내심을 갖고 읽어 내려가시기를 바랍니다. 일단 일반적으로 코드에서 '?'를 와일드카드(wildcard)로 통칭합니다. 제네릭 타입 파라미터의 구체적인 값을 선언할 때, 이 와일드카드를 이용해서 세 가지 형태로 사용할 수 있게 됩니다. 일단 예제를 직접 보기 전까지는 쉽게 이해가 가지 않을 수 있으니 분류에 대해서만 먼저 확인해 봅시다. · Unbounded Wildcards(제한 없음) GenericName genericName 모든 클래스나 인터페이스를 사용할 수 있다. · Upper Bounded Wildcards(상위 클래.. 제네릭(4) - 제한된 타입 파라미터 선언 앞선 내용까지 학습하면서, 타입 파라미터 ( )에 타입을 선언하여 상황에 맞게 사용하는 케이스를 살펴보았습니다. 그런데 이런 타입 파라미터를 무작정 아무 타입이나 사용 가능하게 만들어두는 경우는 많지는 않을 것입니다. 구체적으로 어떤 카테고리의 타입을 사용해야 할지 여부를 정할 필요가 있는 것이죠. 예를 들어서, 여러 타입을 넣을 수는 있지만 - 숫자 - 즉 Number 타입이나 하위 클래스 타입(Byte, Short, Integer, Long, Double)만 사용해야 하는 숫자 연산용 제네릭 메서드를 선언하는 경우가 있겠지요. '제한된 타입 파라미터(Bounded type parameter)'를 통해 타입 파라미터를 선언하여, 상위 타입을 함께 선언하여 타입 파라미터의 선언 가능한 타입을 제한할 수 .. 이전 1 ··· 7 8 9 10 11 12 13 ··· 18 다음