포스트

01.일급객체

일급 객체

일급객체란??

  • 보통 자바의 람다 표현식을 배우다 보면 ‘일급 객체’라는 단어를 접하게 된다.
  • 일급 객체는 사용할 때 다른 요소들과 아무런 차별없다는 것을 뜻한다
  • 일급 객체의 3가지 조건
    • 모든 일급 객체는 변수나 데이터에 담을 수 있어야 한다
    • 모든 일급 객체는 함수의 파라미터로 전달할 수 있어야 한다
    • 모든 일급 객체는 함수의 리턴값으로 사용할 수 있어야 한다
  • 일급 객체는 특정 언어에 국한되는 문법 단어가 아니다
  • 일급 객체 언어 : JS, Python + Java Lambda

자바의 메소드와 자바스크립트 함수의 일급 객체

1.. 변수나 데이터에 담을 수 있어야 한다

1
2
3
4
5
6
7
8
9
10
public class Main{

  public static void hello(){
    System.out.println("Hello");
  }

  public static void main(String[] args){
    Object a = hello; // 메서드를 변수에 할당 불가능
  }
}
1
2
3
const hello = function(){
  console.log("Hello");
}

2.. 함수의 파라미터로 전달할 수 있어야 한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main{

  public static void hello(){
    System.out.println("Hello");
  }

  public static print(Object func){
    func();
  }

  public static void main(String[] args){
    print((Object) hello); // static 메서드를 함수 매개변수로 전달 불가능하다
  }
}
1
2
3
4
5
6
7
8
9
const hello = function(){
  console.log("Hello");
}

function print(func){
  func();
}

print(hello);

3.. 함수의 리턴값으로 사용할 수 있어야 한다

1
2
3
4
5
6
7
8
9
const hello = function(){
  console.log("Hello");
  return function(){
    console.log("Hello 2");
  }
}

const hello2 = hello();
hello2();

자바의 람다 함수의 일급 객체

  • 이러한 관점에서 자바의 람다식 혹은 익명 클래스는 변수나 매개변수에 할당할 수 있고, 리턴값으로도 사용할 수 있기 때문에 일급 객체의 요건을 충족한다

1.. 변수나 데이터에 담을 수 있어야 한다

1
2
3
4
5
6
7
8
9
import java.util.function.Consumer;

public class Main{
  public static void main(String[] args){
    // 람다식을 인터페이스 타입 변수인 c 에 할당하였다.
    Consumer<String> c = (t) -> System.out.println(t);
    c.accept("Hello");
  }
}

2.. 함수의 파라미터로 전달할 수 있어야 한다

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.function.Consumer;

public class Main{

  // 메소드의 매개변수로 람다 함수를 받겠다.
  public static void print(Consumer<String> c, String str){
    c.accept(str);
  }

  public static void main(String[] args){
    print((t) -> System.out.println(t), "Hello");
  }
}

3.. 함수의 리턴값으로 사용할 수 있어야 한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.function.Consumer;

public class Main{

  public static Consumer<String> hello(){
    // 람다 함수 자체를 리턴함
    return (t) -> {
      System.out.println(t);
    }
  }

  public static void main(String[] args){
    Consumer<String> c = hello();
    c.accept("Hello");
  }
}
참고 사이트

인파-일급 객체(first-class object) 란?