본문 바로가기

Web/JavaScript

[first-class object]

728x90

 

 

일급객체란

3가지 조건을 충족한 객체

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

 

 

JAVA METHOD와 비교

 

 

자바 메소드 말고

자바의 람다식, 익명 클래스로 변수나 매개변수 할당이 가능하고, 리턴값으로도 사용할 수 있어 일급객체의 요건이 충족된다

같이 비교하자면

 

 

1. 변수할당

java method는 변수 할당이 불가능

public class Main {

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

    public static void main(String[] args) {
		Object a = hello; // !! 메서드를 변수에 할당 불가능
    }
}

java lamda 식은 가능

import java.util.function.Consumer;

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

 

javascript 는 가능하다

const hello = function() {
	console.log("Hello World");
}

 

2. 파라미터로 전달

java method는 메소드 입력값으로 보낼 수 없음

public class Main {

    public static void hello(){
        System.out.println("Hello World");
    }
    
    public static void print(Object func) {
    	func();
    }

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

java lamda식

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 World");
    }
}

 

javascript는 콜백함수 형태로 전달 가능함

const hello = function() {
	console.log("Hello World");
}

function print(func) {
	func();
}

print(hello);

 

 

3. 리턴값으로 메소드 자체 반환 가능 여부

java 메소드는 자체 반환 안됨.

java lamda식 가능

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 World");
    }
}

 

javascript 는 Closure 기법으로 가능

const hello = function() {
	console.log("Hello World");
    return function() {
    	console.log("Hello World 22");
    }
}

const hello2 = hello();
hello2();

 

 

 

728x90

'Web > JavaScript' 카테고리의 다른 글

[event handler]  (1) 2023.10.30
[mozilla javascript] MutationObserver  (1) 2023.10.29
[property attribute]  (0) 2023.10.28
[기본] block level scope (const, let)  (0) 2023.10.27
[기본] garbage collection  (0) 2023.10.26