brunch

You can make anything
by writing

C.S.Lewis

by 내가 사는 세상 Dec 02. 2023

기초개념 - 함수

목차

1. 함수란?

    1.1. javascript 예제

    1.2. python 예제

        1.2.1. 기본함수

        1.2.2. 이름없는 함수 : 람다

        1.2.3. 파이썬의 함수가 개체라서 가능한 것들

    1.3. C언어 예제


2. 함수 포인터

    2.1. C언어 예제

    2.2. Javascript 예제

    2.3. Python 예제

    2.4. Java 예제


3. 제네레이터 함수




1. 함수란?


함수는 입력을 받아 출력을 해준다.


입력과 관련해선

함수는 매개변수(parameter)를 통해 외부로부터 값을 받는다. 

이때 함수를 호출할 때 전달하는 값을 인자(argument)라고 부른다.


출력과 관련해서 

함수는 반환값(return값)을 내뱉는다.




함수 스코프 (function Scope)

변수가 함수 내에서 정의되었을 때 해당 변수가 유효한 범위

함수 내에서 선언된 변수는 해당 함수 내부에서만 접근이 가능

함수 외부에서는 그 변수에 접근 불가능


스택 (stack)

함수 호출 시 해당 '함수의 지역 변수 및 매개변수'가 스택 프레임에 저장되는 곳

함수가 호출되면 해당 함수의 스택 프레임이 생성

함수의 실행이 종료되면 스택 프레임이 제거

이런 과정을 통해 함수의 실행 순서가 보장


힙 (Heap)

힙은 동적으로 할당된 메모리를 관리하는 영역

개체나 배열과 같은 데이터 구조가 저장

함수 내에서 객체를 생성하거나 동적으로 할당된 변수는 힙에 저장


cf) 스택, 힙은 RAM에 위치




언어별로(javascript, python, c)예시를 살펴보자


1.1. javascript 예제


function myFunction(parameter1, parameter2) {

    const result = parameter1 + parameter2;

    return result;

}


/* 

화살표 함수로도 표현 가능

const myFunction = (parameter1, parameter2) => {

    const result = parameter1 + parameter2;

    return result;

};


{ 중괄호 }와 return은 서로 상쇄 가능

const myFunction = (parameter1, parameter2) => result = parameter1 + parameter2;

*/


const result_js = myFunction(10, 20);

console.log(result_js);  // 출력 결과: 30




1.2. python 예제


1.2.1. 기본함수


def my_function(parameter1, parameter2):

    # 함수 내용

    result = parameter1 + parameter2

    return result


result_python = my_function(10, 20)

print(result_python)  # 출력 결과: 30




1.2.2. 이름없는 함수 : 람다


add = lambda x, y: x + y

result = add(3, 5)

print(result)  # 출력: 8




1.2.3. 파이썬의 함수가 '개체'라서 가능한 것들


 파이썬의 함수는 개체이다. 그래서 다음의 것들이 가능하다. 

1. 매개변수에 함수를 인자로 전달 가능

2. 함수가 함수를 반환 가능


1. 함수를 인자로 전달 가능


def greet():

    return "안녕하세요!"


def process_greeting(func):

    return func()


# 함수를 매개변수로 전달

greeting_result = process_greeting(greet)


# 결과 출력

print(greeting_result)  #'안녕하세요'




2. 함수가 함수를 반환 가능


# 함수를 만들어내는 함수

def outer_function(x): 

    def inner_function(y):

        return x + y

    return inner_function


# 함수를 반환받음

returned_function1 = outer_function(10)

returned_function2 = outer_function(20)


# 반환된 함수를 호출

result1 = returned_function1(5)

result2 = returned_function2(5)


print(result1)  #15

print(result2)  #25




1.3. C언어 예제


#include <stdio.h>

int myFunction(int parameter1, int parameter2) {

    // 함수 내용

    int result = parameter1 + parameter2;

    return result;

}


int main() {

    // 함수 호출 및 결과 출력

    int result_c = myFunction(10, 20);

    printf("%d\n", result_c);  // 출력 결과: 30

    return 0;

}




2. 함수 포인터


함수의 시작지점을 가르키는 포인터이다. 함수가 호출될 땐, 함수가 시작하는 주소로 점프한다. 그래서 함수호출할 때, 함수 시작하는 딱! 그부분을 가리키면 함수를 변수처럼 전달이 가능하다.


2.1. C언어 예제


#include <stdio.h>


int add(int a, int b) {

    return a + b;

}


int subtract(int a, int b) {

    return a - b;

}


int operate(int a, int b, int (*operation)(int, int)) {

    return operation(a, b);

}


int main() {

    printf("덧셈 결과: %d\n", operate(2, 1, add));

    printf("뺄셈 결과: %d\n", operate(2, 1, subtract));

    return 0;

}


operation이라는 변수는

* 포인터형이다. 즉, 해당 변수에는 메모리 주소값(4byte)가 들어있다.

해당 함수는 2개의 인자(int형, int형)를 받고

1개의 결과값(int형)을 반환한다.




2.2. Javascript 예제


function add(a, b) {

    return a + b;

}


const subtract = (a, b) => a - b;


function operate(a, b, operation) {

    return operation(a, b);

}


console.log("덧셈 결과:", operate(2, 1, add));

console.log("뺄셈 결과:", operate(2, 1, subtract));




2.3. Python 예제


def add(a, b):

    return a + b


subtract = lambda a, b: a - b


def operate(a, b, operation):

    return operation(a, b)


print("덧셈 결과:", operate(2, 1, add))

print("뺄셈 결과:", operate(2, 1, subtract))




2.4. Java 예제


interface Operation {

    int apply(int a, int b);

}


static class Add implements Operation {

    public int apply(int a, int b) {

        return a + b;

    }

}


static class Subtract implements Operation {

    public int apply(int a, int b) {

        return a - b;

    }

}


public class Main {

    static int operate(int a, int b, Operation operation) {

        return operation.apply(a, b);

    }

    public static void main(String[] args) {


        Operation add = new Add();

        System.out.println("덧셈 결과: " + operate(2, 1, add));


        Operation subtract = new Subtract();

        System.out.println("뺄셈 결과: " + operate(2, 1, subtract));

    }

}




브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari