ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • golang: 1급 시민(First-class citizen)이란?
    Back-End/Golang 2024. 4. 28. 22:20
    반응형

    1급시민

     프로그래밍 언어에서 "1급 시민" 또는 "1급 객체"라는 용어는 해당 언어의 요소가 다음과 같은 특성을 갖추었을 때 사용됩니다:

    1. 변수나 데이터 구조 안에 담길 수 있음: 1급 객체는 변수에 할당될 수 있습니다. 예를 들어, 함수가 1급 객체인 언어에서는 함수를 변수에 할당할 수 있습니다.
    2. 함수의 인자로 전달될 수 있음: 함수를 다른 함수의 인자로 전달할 수 있습니다. 이는 고차 함수(higher-order function)를 가능하게 합니다.
    3. 함수의 결과로 반환될 수 있음: 함수에서 다른 함수를 결과로 반환할 수 있습니다. 이는 함수를 동적으로 생성하고 조작할 수 있음을 의미합니다.
    4. 할당에 사용된 표현식 내에서 리터럴로 표현될 수 있음: 객체를 코드 내에서 직접적으로 리터럴 형태로 표현할 수 있어야 합니다.

     예를 들어, JavaScript에서 함수는 1급 객체입니다. 함수를 변수에 할당할 수 있고, 다른 함수의 인자로 전달하거나 결과로 반환할 수 있으며, 함수 리터럴을 사용하여 직접적으로 정의할 수 있습니다. 이러한 특성은 프로그래밍에서 매우 유연한 구조를 가능하게 하며, 함수형 프로그래밍 패러다임에서 특히 중요한 역할을 합니다.

     

    Golang에서 1급 시민

    Go 언어(Golang)에서 1급 시민으로서의 함수를 통해 위에 나열된 네 가지 특성을 설명해 보겠습니다. Go는 정적 타입, 컴파일 언어이지만 함수를 1급 시민으로 취급합니다. 이것은 함수가 변수에 할당되거나 다른 함수에 인자로 전달되며, 함수의 반환값으로 사용될 수 있음을 의미합니다.

    1. 변수나 데이터 구조 안에 담길 수 있음

    Go에서 함수는 변수에 할당될 수 있습니다. 이는 함수를 값처럼 다룰 수 있게 하며, 다양한 상황에서 유용하게 사용할 수 있습니다.

    package main
    
    import "fmt"
    
    func main() {
        add := func(a, b int) int {
            return a + b
        }
    
        result := add(3, 4)
        fmt.Println(result) // 출력: 7
    }

    이 예시에서 add 변수는 두 개의 정수를 받아 더하는 익명 함수를 참조합니다. 이 변수를 사용하여 함수를 호출하고 결과를 출력할 수 있습니다.

    2. 함수의 인자로 전달될 수 있음

    Go에서 함수는 다른 함수의 인자로 전달될 수 있습니다. 이를 통해 고차 함수를 구현할 수 있으며, 함수의 조작과 재사용이 용이해집니다.

    package main
    
    import "fmt"
    
    func applyOperation(a, b int, operation func(int, int) int) int {
        return operation(a, b)
    }
    
    func main() {
        sum := func(a, b int) int {
            return a + b
        }
        
        result := applyOperation(5, 6, sum)
        fmt.Println(result) // 출력: 11
    }

    여기서 applyOperation 함수는 세 번째 인자로 함수를 받아, 그 함수를 이용해 연산을 수행합니다.

    3. 함수의 결과로 반환될 수 있음

    Go에서 함수는 다른 함수의 결과로도 반환될 수 있습니다. 이는 함수가 동적으로 생성되어 반환될 수 있음을 의미하며, 매우 유연한 프로그래밍 스타일을 가능하게 합니다.

    package main
    
    import "fmt"
    
    func makeAdder(x int) func(int) int {
        return func(y int) int {
            return x + y
        }
    }
    
    func main() {
        addFive := makeAdder(5)
        fmt.Println(addFive(3)) // 출력: 8
    }

    makeAdder 함수는 내부에서 다른 함수를 생성하여 반환합니다. 반환된 함수는 x에 대한 클로저를 형성합니다.

    4. 할당에 사용된 표현식 내에서 리터럴로 표현될 수 있음

    Go에서 함수는 직접적으로 정의되어 사용될 수 있습니다. 함수 리터럴은 익명 함수를 즉석에서 생성하여 할당하는 데 사용됩니다.

    package main
    
    import "fmt"
    
    func main() {
        square := func(x int) int {
            return x * x
        }
    
        fmt.Println(square(5)) // 출력: 25
    }

    위 예시에서 square는 정사각형의 넓이를 계산하는 함수를 참조합니다. 이 함수는 변수에 할당되어 사용될 수 있습니다.

    이와 같이 Go에서 함수를 1급 객체로 사용하는 것은 프로그램을 유연하고 모듈화하기 쉽게 만듭니다.

     

    1급 시민 왜 생겼을까?

    1급 강아지

     1급 시민(1급 객체)으로서의 함수는 프로그래밍 언어가 제공하는 표현력과 유연성을 크게 향상시킬 수 있는 기능입니다. 이 개념은 특히 함수형 프로그래밍에서 중요한 역할을 합니다. Java와 같은 전통적인 객체지향 프로그래밍 언어와 비교할 때, 함수를 1급 시민으로 취급하는 언어들이 제공하는 장점과 단점을 살펴보겠습니다.

    장점

    1. 유연성과 표현력 증가: 함수를 변수에 저장하거나 다른 함수에 인자로 전달할 수 있기 때문에, 프로그래머는 보다 동적이고 유연한 코드를 작성할 수 있습니다. 이는 코드의 재사용성을 높이고, 고차 함수를 통한 강력한 추상화를 가능하게 합니다.
    2. 함수형 프로그래밍의 지원: 함수를 1급 시민으로 다루는 언어들은 일반적으로 함수형 프로그래밍 패러다임을 더 잘 지원합니다. 이는 불변성, 순수 함수 등 함수형 프로그래밍의 중요 개념들을 활용하여 더 안정적이고 예측 가능한 코드를 작성하게 도와줍니다.
    3. 간결성: 함수를 직접적으로 다룰 수 있게 되면, 종종 코드를 더 간결하게 작성할 수 있습니다. 예를 들어, 콜백 함수나 람다 표현식을 이용하여 짧고 명확한 코드를 작성할 수 있습니다.

    단점

    1. 학습 곡선: 함수를 1급 시민으로 취급하는 언어들은 배우기가 더 어려울 수 있습니다. 특히, 함수형 프로그래밍의 개념들이 익숙하지 않은 프로그래머에게는 더욱 그렇습니다.
    2. 성능 문제: 때로는 함수를 객체로 다루는 것이 성능에 부정적인 영향을 미칠 수 있습니다. 예를 들어, 함수 호출이 더 느려질 수 있고, 메모리 사용이 증가할 수 있습니다. 이는 함수 객체가 추가적인 메모리를 사용하고, 호출 시간이 늘어날 수 있기 때문입니다.

    Java와의 비교

     Java는 전통적으로 객체지향 프로그래밍 언어로, 함수를 1급 시민으로 취급하지 않습니다. 그러나 Java 8부터는 람다 표현식을 도입하여 함수형 프로그래밍 스타일을 어느 정도 지원하기 시작했습니다. 이 람다 표현식은 함수를 일종의 1급 시민처럼 다룰 수 있게 해 주지만, 여전히 Java에서의 함수는 Go나 JavaScript 같은 언어에서처럼 완전한 1급 시민은 아닙니다.

    Java에서는 메서드나 함수를 직접 변수에 저장하거나 다른 함수에 직접적으로 인자로 전달할 수 없습니다. 대신, 함수형 인터페이스를 사용하는 람다 표현식이나 익명 클래스를 통해 비슷한 결과를 얻을 수 있습니다. 이는 코드를 더 유연하게 작성할 수 있게 해 주지만, 순수한 1급 시민으로서의 함수가 제공하는 모든 이점을 제공하지는 못합니다.

    결론적으로, 함수를 1급 시민으로 취급하는 언어는 프로그래밍의 유연성과 표현력을 크게 향상시킬 수 있지만, 이로 인한 성능 문제나 학습 곡선 등의 단점도 고려해야 합니다.

     
     
     
    반응형

    'Back-End > Golang' 카테고리의 다른 글

    golang: 배열(Array)과 슬라이스(Slice)  (0) 2024.05.11
    고루틴 누수(Goroutine Leak)란?  (0) 2024.05.10
    golang: Go 언어의 장점  (1) 2024.04.21
    golang: 문자열 함수  (0) 2024.04.21
    golang: for-select 패턴  (0) 2024.04.19
Designed by Tistory.