모래블로그

[JavaScript] 일급객체 본문

Language/JavaScript

[JavaScript] 일급객체

별모래 2024. 2. 7. 17:36
728x90

 

일급 객체(First Class Object)

다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.
보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.  (위키백과)

 

여기서 일급 은 사용할 때 다른 요소들과 아무런 차별이 없다는 것을 뜻한다.

 

 

일급 객체 조건

1. 변수나 데이터에 담을 수 있어야 한다.
2. 함수의 파라미터로 전달할 수 있어야 한다.
3. 함수의 리턴값으로 사용할 수 있어야 한다.

 

 

일급 객체는 어떤 특정 언어에만 국한되는 문법 단어가 아니고, 프로그래밍 언어론의 개념으로서 자바나 자바스크립트 외 다양한 언어가 일급 객체 개념을 가지고 있다.

Javascript, Python이 일급객체 언어이고, c, pascal, c++은 아니라고 보면 된다.(Java는 람다로 지원)

 

 


 

일급 객체의 조건 예시

 

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

자바의 메소드를 변수에 할당할 수는 없다.

그러나 자바스크립트는 함수 표현식으로 자유롭게 대입이 가능하다.

// javascript
const case1 = function() {
	console.log("case1");
}
// java
public class Main() {
	public static void case1_java() {
    	System.out.println("case1 in java");
   }
   public static void main(String[] args) {
       Object a = case1_java; // 메소드를 변수에 할당 불가능
   }
}

 

 

2. 함수의 파라미터로 전달할 수 있어야 한다. => (다른 함수를 인자로 받을 수 있다는 것)

자바의 메소드를 메소드 입력 값으로 보내는 행위는 불가능하다.

반면, 자바스크립트는 콜백 함수 형태로 자유롭게 전달이 가능하다.

// javascript
const case2 = function() {
	console.log("case2");
}

function print(func) {
	func();
}

print(case2);
// java
public class Main {

    public static void case2_java() {
        System.out.println("case2 in java");
    }
    
    public static void print(Object func) {
    	func();
    }

    public static void main(String[] args) {
		print((Object) case2_java) // static 메서드를 함수 매개변수로 전달 불가능
    }
}

 

 

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

자바의 메소드의 리턴값으로 메소드 자체를 반환하는 것은 불가능하다.

반면 자바스크립트는 클로저(closure) 기법을 통해 구성할 수 있다.

// javascript
const case3 = function() {
	console.log("case3");
    return function() {
    	console.log("case3 in javascript");
    }
}

const result = case3();
result();

 


자바 람다 함수의 일급 객체

위의 조건에서 일반 자바 메소드는 일급 객체 조건에 해당하지 않았지만, 자바의 람다식 혹은 익명 클래스는 변수나 매개변수에 할당 할 수 있으며, 리턴값으로도 사용할 수 있기 때문에 일급 객체 요건을 충족한다.

 

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

import java.util.function.Consumer;

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

 

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

import java.util.function.Consumer;

public class Main {
    // 메소드 매개변수로 람다 함수를 전달
    public static void case2(Consumer<String> c2, String str) {
        c2.accept(str);
    }

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

 

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

import java.util.function.Consumer;

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

    public static void main(String[] args) {
        Consumer<String> c3 = hello();
        c3.accept("case3");
    }
}

 

 

 

 

참조🙇‍♀️

https://inpa.tistory.com/entry/CS-%F0%9F%91%A8%E2%80%8D%F0%9F%92%BB-%EC%9D%BC%EA%B8%89-%EA%B0%9D%EC%B2%B4first-class-object

https://velog.io/@reveloper-1311/%EC%9D%BC%EA%B8%89-%EA%B0%9D%EC%B2%B4First-Class-Object%EB%9E%80

728x90