콜백 함수

 

 

 

 

프로그래밍 언어는 함수를

하나의 자료로 다루기 때문에

함수를 매개변수로 전달하여

사용하는 것이 가능하다.

 

 

 

이 전 시간에 다룬

재귀 함수(Recursive Method)

특징으로 자기 자신을 호출한다는

특성이 있었는데

 

 

 

함수 자신이 자신을 호출하는 재귀 함수 외

다른 함수가 자신을 호출하는 함수

콜백 함수라고 부른다.

 

 

 

예)

 

 

 

 

 

 

 

 

 

선언하는 쪽

call_10_time라는 함수의

매개변수에는 '함수'가 들어간다는

의미로 func 가 들어가 있고

 

 

 

호출하는 쪽 call_10_times의

인자 값에는 코드 중간에 있는

새로운 함수 print_hello가

인자로 들어가 있다.

 

 

 

이처럼 다른 함수가 자신을

부르는 것을 콜백 함수라 하며

이를 실행하면 인자로 전달받는

함수 내에 입력되어 있는 내용이

반복문의 설정대로 실행되게 된다.

 

 

 


 

 

 

 

하지만 함수 안에 또 다른 함수를

만드는 작업은 번거롭고 비효율적이다.

 

 

 

때문에 이를 보다 효과적으로 사용하기 위해

활용하는 것이 바로 람다이다.

 

 

 

람다 (lambda Expression)

 

 

 

람다는 함수를 간단한 식 형태로

작성하는 특징 때문에 표현식으로

분류되며 익명의 함수(anonymous

function)이라고 부르기도 한다.

 

 

 

lambda라는 익명에

매개변수, 연산자, 값 등을 조합한

식을 더해 반환값을 만드는 방식으로

사용한다.

 

 

 

기본적인 사용법을 알아보자.

 

 

 

먼저 일반적인 함수를 하나 만들고

동일한 결과를 내는 또 다른 함수를

람다 표현식으로 만들어 이를

비교한다.

 

 

 

1. 일반적인 기본 함수

 

 

 

 

 

 

 

 

 

 

2. 람다식 함수

 

 

 

람다를 만드는 식은

"lambda 매개변수 : 반환 식"

으로

 

 

 

예제의 간단한 식을

람다로 만들어보면

 

lambda x : x + 9

 

가 되겠다.

 

 

 

 

이렇게 람다로 만든 익명의 함수를

호출하기 위해선 람다 표현식을

변수에 할당해 주던가

 

 

 

람다 표현식을 괄호에 넣고

인자 값을 바로 다음 괄호에 넣어

사용하는 두 가지 방법이 있다.

 

 

 

plus = lambda x: x + 9

or

(lambda x: x+9)(1)

 

 

 

람다의 매개변수 다음으로 오는

반환 식은 별도로 return키워드를

붙여주지 않아도 동일한 의미가

자동적으로 포함되어 있으니 참조하자!

 

 

 

이제 일반적인 기본 함수와

람다식을 비교해 보자.

 

 

 

 

처음 함수는 일반 식 / 두 번째는 람다식

 

 

 

 

 

 

 

 

 


 

 

 

 

 

이번엔 이것을 콜백 함수

예제에 적용시켜 사용해 보자.

 

 

 

 

 

 

 

 

 

코드가 훨씬 간결해졌다.

 

 

 

이번에는 람다를 활용하는

두 종류의 함수를 살펴보자.

 

 

 

 

 


 

 

 

filter ( )

map ( )

 

 

 

 

두 함수 모두

첫 번째 매개변수에는

함수(function)를,

 

 

 

두 번째 매개변수에는

반복할 수 있는 요소(iterable)을

넣어 전달하게 된다.

 

 

 

* 두 함수 모두 함수 자체를

출력하게 되면 결과로

filter는 filter 객체,

map 은 map 객체 문구가

출력되니

 

 

 

눈에 보이는 값들을 보고 싶을 땐

list로 변환하여 출력을 해주자.

 

 

 

 

 

 

 

 


 

 

 

 

1. filter ( ) 함수

 

 

 

 

filter 함수는 리스트 등을 필터링

해주는 기능이 있고 filter 함수에

매개변수를 사용할 때에는

리턴 값으로불 타입이 와야 한다.

 

 

 

예제)

 

 

 

1. 두 가지 방식으로 사용하는

기본적인 코드 예

 

 

 

 

 

 

 

 

 

 

이번엔 반복문 사용

 

 

 

 

 

 

 

 

하지만 이처럼 함수를 따로

하나 만들어 주는 것은

귀찮고 번거로운 일이다.

 

 

 

이제 동일한 코드를

람다식으로 만들어 보자.

 

 

 

 

2. 람다 적용 코드

 

 

 

 

 

 

 

 

간결하고 간편하다.

 

 

 

 


 

 

 

 

2. map ( ) 함수

 

 

 

 

map 함수는 어떠한 리스트를 기반으로

새로운 리스트를 만들어 주는 함수이다.

 

 

 

맵의 첫 번째 매개변수에는 역시 함수가

올 수 있고 그 외 int, float, str의

자료형을 넣어 사용하기도 한다.

 

 

 

예제)

 

1. 기본 코드

 

 

 

 

 

 

 

 

 

2. 람다 적용

 

 

 

 

 

간결!

 

 

 

 

 


 

 

 

 

 

* 참고 사항 (중요)

 

 

 

위 람다 코드는

이전에 공부한 리스트 내포

사용 형태가 유사함을 알 수 있는데

 

 

 

동일한 코드를 리스트 내포로 작성해보면

 

 

 

 

 

 

 

 

이와 같고

 

 

 

여기에 만약 if 조건문을 더해

filter 함수에서 살펴본 짝수를

구하는 코드를 입력하면

 

 

 

한 줄의 코드에 map 함수와 filter 함수를

동시에 적용시켜 사용할 수 있다.

 

 

 

 

 

 

 

 

 

이렇게만 본다면 굳이

map이나 filter 함수를

사용하지 않고 리스트 내포를

사용하는 게 훨씬 더 효과적이고

효율적으로 보인다.

 

 

 

어느 것을 사용하던 상관없지만

결정적 차이점은 바로 차지하는

용량(memory)과 연관이 있는데

 

 

 

map / filter 함수는

제너레이터함수(출력 시 각각의

객체가 값으로 출력되는)이기

때문에

 

 

 

내부의 데이터가 실제로 메모리

위에 차지하는 용량이 크지 않다.

 

 

 

실질적으로 호출이 되기 전까지는

가상의 값만 가지고 있기 때문에

메모리 용량을 절약하고 싶다면

이를 활용하는 것이 좋고

 

 

 

반면 리스트 내포의 경우

출력 시 완전히 새로운 리스트가

메모리 위에 만들어지게 되어

용량을 차지하게 된다.

 

 

 

여기까지 비교해 봤을 때는

map / filter 함수를 사용하는 것이

훨씬 좋아 보인다라고 생각할 수

있지만

 

 

 

현대 컴퓨터의 사양 및 성능이

위 차이점들을 무시할 수 있을

정도로 발전했기 때문에 사실상

별문제가 없다.

 

 

 

따라서 리스트 내포를 더 많이

활용하는 추세이며

 

 

 

리스트 내포를 적극 사용하는 것이

좋다고.

 

 

 

그래도 람다의 개념 또한

확실히 이해하고 넘어가자.

 

 

 

 

 

 

 

728x90

+ Recent posts