반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

웹풀스택 공부 중

15 - 8. Java - 익명 클래스 & 익명 구현 객체 본문

웹개발/Java

15 - 8. Java - 익명 클래스 & 익명 구현 객체

lukeit 2024. 11. 14. 09:07

익명 클래스와 익명 구현 객체

  • 익명이란? = 일회용

    • “익명”은 여러번 사용하기 위해 이름을 붙인 “가명”과 달리, 일회용의 개념이다

    • 익명 함수의 경우, 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 (참조 투명성)
                • 반복 호출해도 언제나 같은 결과 (상태)인 함수이다

익명 구현 객체

인터페이스를 구현한 (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());
            }
          })
  • 익명 구현 객체는 우리가 어떤 형태의 익명 함수를 쓸지에 대해 종류들을 인터페이스로 나눠두었다!

    1. Parameter가 없고, 결과 값이 있는 경우:
      1. ( ) => (R) = Suppiler라는 Interface를 만들어둔다
    2. Paramter가 있고, 결과 값이 없는 경우:
      1. (T) => ( ) = Consumer라는 Interface를 만들어둔다
반응형

'웹개발 > 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