웹풀스택 공부 중
15 - 8. Java - 익명 클래스 & 익명 구현 객체 본문
익명 클래스와 익명 구현 객체
익명이란? = 일회용
“익명”은 여러번 사용하기 위해 이름을 붙인 “가명”과 달리, 일회용의 개념이다
익명 함수의 경우, Lambda로 표현한다
자바에서도 일회용의 개념이 존재하나 자바에는 함수라는 개념이 없다!
대신 Method가 있다
- Method: 클래스 안에 들어간 함수가 Method이다
익명 함수를 구현하기 위해 익명 구현 객체가 생긴다
익명 (상속) 클래스: 클래스를 상속 (Extends)한 익명 클래스이다
- 동시에 객체를 생성한다
익명 구현 객체: 인터페이스를 구현 (Implements)한 익명 클래스이다
동시에 객체를 생성한다
일급 함수 (First-Class function) 때문에 생겼다!
일급 함수: 함수가 다른 데이터 유형과 동일한 방식으로 취급 될 수있음을 의미한다
함수를 변수에 할당할 수 있다
//변수에 할당 가능 const greet = function() { console.log("Hello, world!"); };
다른 함수의 인자로 전달할 수 있다
function executeFunction(fn) { fn(); } executeFunction(greet); // "Hello, world!" 출력
다른 함수에서 반환할 수 있다
function createGreeter() { return function() { console.log("Hello from the greeter!"); }; } const greeter = createGreeter(); greeter(); // "Hello from the greeter!" 출력
데이터 구조에 저장할 수 있다
const functionsArray = [greet, createGreeter()]; functionsArray[0](); // "Hello, world!" 출력 functionsArray[1](); // "Hello from the greeter!" 출력
순수함수란?
- No Side-Effects (참조 투명성)
- 반복 호출해도 언제나 같은 결과 (상태)인 함수이다
- No Side-Effects (참조 투명성)
익명 구현 객체
인터페이스를 구현한 (Implements) 익명 Class이다
부모 Interface를 구현한 자식 Class를 만들어 사용하고 싶다면:
1.) 기명 Class 방법: 구현 클래스를 정의한 다음 → 인스턴스화
여러번 사용이 가능하다
// Interface 정의 interface IAnimal { public String cry(); } // 구현 Class 정의 class Dog **implements** IAnimal { public String cry() { return "멍멍"; } } // 사용 IAnimal schnauzer = new Dog(); IAnimal poodle = new Dog(); IAnimal maltese = new Dog();
2.) 익명 Class 방법: 구현 클래스를 정의하는 동시에 인스턴스화를 한다
한번 사용되고 더 이상 미사용
IAnimal chihuahua = new IAnimal() { public String cry() { return "왈왈"; } }
장점: 익명 구현 Class이기때문에 Class없이 바로 Interface를 통해서만 구현이 된다
람다 표현식을 사용한 익명 함수
->
를 사용한다예시
Arrays.sort(members, (Member u1, Member u2) -> { return Integer.compare(u1.getId(), u2.getId()); }); Arrays.sort(members, (Member u1, Member u2) -> Integer.compare(u1.getId(), u2.getId())); Arrays.sort(members, Comparator.comparingInt(each -> each.getId())); Arrays.sort(members, Comparator.comparingInt(Member::getId));
익명 구현 객체를 통한 익명 함수 정의하는 방법
예시) member라는 Array가 있고, 그 Array를 특정 값 기준으로 나열하고 싶다
Member[] members = { new Member(12, "Aaron"), new Member(11, "Baron"), new Member(13, "Caron"), new Member(10, "Daron"), };
나이값과, 오름차순으로 나열하고 싶다면
어떤걸 기준으로 나열해야하 할지에 대한 함수 정의 (익명 함수)를 Arrays.sort() 함수에 Parameter로 넘겨주면 된다
Parameter 1: 어떤 것을
Parameter 2: 어떻게 ← 익명 함수!
//Pseudo code Array.sort(members, 익명 함수 = 어떤걸 기준으로?) // Implementing it Arrays.sort(members, new Comparator<Member>() { @Override public int compare(Member m1, Member m2) { return Integer.compare(m1.getId(), m2.getId()); } })
익명 구현 객체는 우리가 어떤 형태의 익명 함수를 쓸지에 대해 종류들을 인터페이스로 나눠두었다!
- Parameter가 없고, 결과 값이 있는 경우:
( ) => (R)
= Suppiler라는 Interface를 만들어둔다
- Paramter가 있고, 결과 값이 없는 경우:
(T) => ( )
= Consumer라는 Interface를 만들어둔다
- Parameter가 없고, 결과 값이 있는 경우:
'웹개발 > Java' 카테고리의 다른 글
15 - 7. Java - Design Pattern & SOLID Principle (2) | 2024.11.04 |
---|---|
15 - 6. Java - ENUM (0) | 2024.11.04 |
15 - 5. Java - Abstract Class vs Interface (0) | 2024.11.04 |
15 - 4. Java - Generic & 자료 구조 (0) | 2024.11.04 |
15 - 3. Java - Static (0) | 2024.11.04 |