Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

study

lambda 본문

python

lambda

채승완 2020. 12. 9. 00:49

안녕하세요

 

이번 포스팅은 함수 선언을 간결하게 할 수 있는 lambda에 대해 소개하겠습니다

 

lambda 설명아 앞서 메모리 영역에 대해서 설명하겠습니다

 

프로그램을 실행시키면 운영체제는 우리가 실행시킨 프로그램을 위해 메모리 공간을 할당해준다. 

할당되는 메모리 공간은 크게 스택(Stack), 힙(Heap), 데이터(Data)영역으로 나뉜다. 

이러한 메모리 공간이 어떠한 용도로 언제, 어디서 할당되는지 알아보도록 하자.

 

메모리 공간은 코드영역, 데이터 영역, 힙 영역, 스택 영역으로 4가지로 구분할 수 있습니다

코드 영역의 경우는 우리가 작성한 소스코드 영역으로 텍스트 영역이라고도 부릅니다 그래서 설명은 생략하겠습니다

 

데이터(Data) 영역

 - 전역 변수와 static 변수가 할당되는 영역

 - 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 소멸됨

#include <stdio.h>

          int a = 10; // 데이터 영역에 할당

          int b = 20; // 데이터 영역에 할당

          int main() {

                             return 0;

                                            }

위와 같은 코드에서 int형 변수 a, b는 프로그램 실행시, main 함수가 호출되기 전에 데이터 영역에 할당된다.

그렇기 때문에 프로그램이 종료될 때까지 메모리상에 존재한다.

(전역 변수가 프로그램이 종료될 때까지 존재하는 이유)

 

함수 increaseNumber에 변수 num1을 선언한 뒤 0으로 초기화했습니다. 그리고 값을 출력한 뒤 ++ 연산자로 

num1의 값을 1 증가시켰습니다.

이제 increaseNumber를 여러 번 호출해보면 0이 계속 출력됩니다. 즉, num1은 지역 변수이므로 increaseNumber를 벗어나면 값이 사라지며 다시 increaseNumber를 호출했을 때 이전 결과와는 상관없이 새로운 변수가 생성되기 때문입니다.

 

여기서는 변수 num1을 선언할 때 static 키워드를 붙여서 정적 변수로 만들었습니다. 이제 increaseNumber를 여러 번 호출해보면 0 1 2 3과 같이 출력됩니다. 즉, 정적 변수는 함수를 벗어나더라도 변수가 사라지지 않고 계속 유지되므로 ++ 연산자가 적용되어 값이 계속 증가하게 됩니다.

static int num1 = 0;은 프로그램이 시작될 때 변수를 초기화하며 increaseNumber 함수가 호출될 때는 변수를 초기화하지 않고 무시합니다. 이를 코드로 풀어보면 다음과 같습니다.

 

스택(Stack) 영역

 - 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역

 - 함수 호출이 완료되면 사라짐

 


main함수 fct1, fct2라는 함수를 추가하였다. 

a, b를 데이터 영역에 할당한 뒤에 main함수를 호출하면서 int형 변수 i는 지역변수로서 스택 영역에 할당된다.

그 뒤에 fct1()이라는 함수를 호출하면서 fct1함수의 매개변수인 c d가 스택영역에 할당된다.

fct1()이라는 함수 호출이 끝나면 c d는 스택 영역에서 삭제되며, 

그 뒤 fct2()라는 함수를 호출하면서 매개변수 e와 지역변수 f가 스택영역에 할당된다.

스택 영역은 그 이름 그대로 스택의 성질을 띄고 있다.



 

힙(Heap) 영역

 - 필요에 의해 동적으로 메모리를 할당할 때 사용

 

지금까지 데이터 영역과 스택 영역을 알아보았는데, 저 두 가지 영역만 있으면 코드를 문제없이 짤 수 있을 것처럼 보인다.

그럼 힙 영역은 왜 필요한 것일까?



힙 영역은 왜 필요할까?

  제일 첫 번째 그림을 보면 힙 영역은 프로그래머가 할당한다고 되어있다. 

  그럼 언제 할당을 할까? 

  배열을 예를 들어서 설명을 하겠다.

 

  우리는 배열을 선언할 때 상수로 선언을 한다.

 

배열의 길이를 사용자가 입력한 숫자로 잡아주는 것은 비 정상적인 배열 선언이다. 왜 비 정상적일까?

메모리 구조에 대해서 잘 파악하고 있다면 당연한 이야기다.

 

제일 첫 번째 그림을 다시 보자, 스택 영역에 할당될 메모리의 크기는 컴파일 타임(컴파일하는(컴파일 하는 동안)에 결정된다고 되어있다.

정상적인 배열 선언의 경우 arr이라는 배열의 크기가 40바이트 라는것을 알 수 있다.

하지만 비 정상적인 배열 선언의 경우 i의 크기가 4바이트 라는 것을 알 수는 있으나, arr이라는 배열의 크기는 알 수 없다.

 

그렇다면 다음과 같이 배열을 선언할 때는 문제가 없을까?

 



i라는 변수가 10이기 때문에 arr이라는 배열의 크기가 10이라는 것을 알 수 있지 않을까?

결과는 아니다.

 

컴파일을 하는 동안 i 4바이트의 크기라는 것을 알 수는 있으나, 그 값이 10으로 초기화되었다는 사실은 무시하고 넘어간다. 값이 10으로 초기화 되었다는 사실은 실행되는 동안, 즉 런타임에 결정된다.

그렇기 때문에 컴파일러는 arr의 크기가 40바이트가 된다는 사실을 알 수 없다. 

 

사용자의 요구에 맞게 메모리를 할당해 주기 위해서는(런타임에 메모리 크기를 결정하고 싶을 때) 메모리 동적 할당을 통해 힙 영역에 메모리를 할당해야 한다.

사용자의 요구에 맞게 메모리를 할당해 주기 위해서는(런타임에 메모리 크기를 결정하고 싶을 때) 메모리 동적 할당을 통해 힙 영역에 메모리를 할당해야 한다.

 

힙 영역 : 할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정해야 하는 경우(런 타임 때) 유용하게 사용되는 공간

 

이제 lambda에 대해 설명하겠습니다

 

 

lambda

파이썬의 람다 표현식은 쓰고 버리는 일시적인 함수이며, 함수가 생성된 내부에서만 사용된다. 간단한 기능을 일반적인 함수와 같이 정의하여 쓰는 것이 아니며 필요한 곳에서만 사용하고 버릴 수 있는 함수이다. 람다 표현식은 익명의 함수이기 때문에 메모리를 절약하는 이점이 있는 함수이다

장점

       - 메모리 절약, 코드 간결, 가독성 향상

       - 람다는 즉시 실행(Heap 초기화) -> 메모리 초기화 (Heap 영역에 해당하여 함수 종료 시 메모리에서 삭제됨)

 

문법

참고자료
https://dsnight.tistory.com/50 [Development Assemble]
https://redcow77.tistory.com/227

'python' 카테고리의 다른 글

sort와 sorted의 차이  (0) 2020.12.10
Closure(중첩함수)  (0) 2020.12.08