추상화 in Python

타키탸키·2021년 1월 5일
0

Python 입문하기

목록 보기
4/14

지난 시간에는 Python의 핵심 자료형에 대해 알아보았습니다. 자료형을 배우며 데이터를 어떤 형태로 저장하고 활용하는지 이해하는 시간을 가졌었는데요. 이번 시간에는 코드를 더 간결하고 깔끔하게 작성할 수 있도록 도와주는 추상화에 대해 알아보겠습니다.

💖 변수 제대로 이해하기

x = x + 1

수학에서 이 식은 성립하지 않습니다. x가 x+1과 같을 수 없으니까요. 하지만 Python에서는 이러한 식이 성립되는데요. 그 이유는 '=' 기호가 두 항이 같음을 의미하는 것이 아니라 우측에 있는 값을 좌측 변수에 넣으라는 의미를 가지기 때문입니다. Python에서 '=' 기호는 지정 연산자(assignment operator)라고 부릅니다.

이 코드 위에 'x=5'라는 변수를 선언했다면 코드의 오른쪽 부분만 봤을 때 변수 x에 5라는 숫자가 들어가 6이 되고 결과적으로 6이라는 수가 왼쪽의 x에 저장이 됩니다.

다시 한 번, Python에서 등호의 의미는 '같다'가 아닌 '우측 값을 좌측 변수에 지정해주는 것'이라는 점을 잊지 마세요.

💖 함수의 실행 순서

def hello():
    print("Hello!")
    print("It's a nice day!")

print("함수 호출 전")
hello()
print("함수 호출 후")

위 코드는 어떤 순서로 실행될까요? 코드의 윗 부분은 함수를 정의하는 부분이기 때문에 함수가 실행되진 않습니다. 따라서, 코드의 아랫 부분부터 실행이 되는데요. 참고로 함수 호출함수 실행과 같은 의미입니다. 코드가 실행되는 순서는 다음과 같습니다.

  1. 문자열 '함수 호출 전' 출력
  2. hello 함수 호출
    2-1. 문자열 'Hello!' 출력
    2-2. 문자열 'It's a nice day!' 출력
  3. 문자열 '함수 호출 후' 출력

이번엔 이 코드의 순서를 한 번 봅시다.

def square(x):
    return x * x
    
print("함수 호출 전")
print(square(2) + square(5))
print("함수 호출 후")

처음 코드와 다른 점은 return이라는 명령어가 있다는 점인데요. 실행 순서를 한 번 볼까요?

  1. 문자열 '함수 호출 전' 출력
  2. 괄호 안 연산 계산
    2-1. 왼쪽 square 함수 호출 및 파라미터에 2 넘어감
    2-2. 2 곱하기 2 연산 후 결괏값 4 반환
    2-3. 오른쪽 square 함수 호출 및 파라미터에 5 넘어감
    2-4. 5 곱하기 5 연산 후 결괏값 25 반환
    2-5. 4 + 25 = 29 출력
  3. 문자열 '함수 호출 후' 출력

변수가 함수의 파라미터로 들어가 연산된 값을 반환합니다. 이 과정에 유의해주세요.

참고로 Python은 함수 정의 시 따로 괄호를 쓰지 않습니다. 들여쓰기의 깊이에 따라 함수 정의 범위를 구분하는데요. 따라서, Python에서 들여쓰기는 매우 중요합니다.

💖 return문 제대로 이해하기

앞서 return의 실행 순서를 봤습니다. return문의 역할함수를 통해 어떤 값을 돌려준다는 것입니다.

위 사례에서 square 함수를 호출하여 변수 2를 정의된 함수의 파라미터에 넣어 2 * 2를 연산한 값인 4를 돌려줌으로써 square 함수가 4로 대체되어 최종적으로 4를 출력하는 것을 함께 봤었죠?

사실 return문은 값을 돌려주는 것 외에도 다른 역할을 합니다. 바로 함수를 즉시 종료시키는 것입니다. 이 말이 무슨 뜻인지 예시로 알아봅시다.

def square(x)
    print("함수 시작")
    return x * x
    print("함수 끝")
    
print(square(2))
print("Hello!")

위 코드의 실행 순서는 다음과 같습니다.

  1. 위 square 함수 정의
  2. 아래 square 함수 호출
  3. 위 square의 파라미터에 2 넘어감
  4. 문자열 '함수 시작' 출력
  5. 2 * 2 연산 후 결괏값 4를 반환 및 함수 호출 종료
  6. 아래 square 함수 호출 부분 4로 대체 및 4 출력
  7. 문자열 'Hello!' 출력

위 순서에서 이상한 점을 찾으셨나요? return문 다음에 있는 문자열 '함수 끝'을 출력해주는 함수의 실행이 포함되지 않았습니다. 그 이유는 return문에 의해 함수 호출이 종료가 되었기 때문인데요. 따라서 return문 아래의 함수는 절대로 실행되지 않습니다. 이러한 코드를 Dead Code(의미 없는 코드)라고 합니다.

💖 return과 print의 차이

Python을 처음 배울 때, return문과 print()문을 헷갈려 하시는 분들이 정말 많습니다. 몇 가지 사례를 통해 둘의 차이점을 명확히 구분해 봅시다.

def print_square(x):
    print(x * x)
    
def get_square(x):
    return(x * x)

위 코드는 파라미터 x의 제곱을 출력(print)해주는 함수이고 아래 코드는 파라미터 x의 제곱을 반환(return)해주는 함수입니다.

print_square(2)

이 코드를 실행하면 어떤 값이 출력될까요? print_square 함수에 2라는 파라미터를 넘겨주어 x에 2가 지정되고 함수 내에서 2 곱하기 2 연산을 하므로 콘솔에 4가 출력됩니다.

get_square(2)

이번에는 get_square 함수를 호출해봅시다. 이번에도 파라미터에 2가 넘어가서 x에 2가 지정되고 함수에서는 2 * 2의 값을 반환합니다. 그럼 함수 호출 부분을 9가 대체하게 되겠죠? 그런데 알아두어야 할 것은 함수 호출 부분이 9로 대체된 이후 어떤 명령어도 받지 않았기 때문에 대체된 그 상태에서 함수가 끝이 납니다. 따라서, 아무 것도 출력하지 않고 프로그램이 종료됩니다.

print(get_square(2))

이 코드를 실행해보면 어떤 결과가 나올까요? get_sqaure는 위와 동일한 과정으로 진행이 되고 마지막으로 4라는 반환값이 함수 호출 부분을 대체합니다. 중요한 것은 이번에는 print 함수가 있기 때문에 최종적으로 4라는 수가 콘솔창에 출력될 수 있다는 점입니다.

print(print_square(2))

마지막으로 위 코드를 실행해봅시다. 먼저 print_square 함수를 호출하여 파라미터로 2가 넘어가면 2 곱하기 2를 연산한 4를 콘솔창에 출력합니다. 그런데 이번에는 return문이 없어 값을 반환해줄 수 없게 되죠. 이때, None이라는 값을 대신 반환하게 됩니다. 따라서, None이 함수 호출 부분을 대체하게 되어 최종적으로 콘솔 창에는 앞서 연산한 4 그리고 그 아래 None이 출력됩니다. 아래처럼 말이죠.

4
None

💖 옵셔널 파라미터

파라미터에 '기본값(default value)'을 설정할 수 있습니다. 기본값을 설정해두면 함수를 호출할 때 파라미터에 값을 넘겨줄 필요가 없습니다. 이러한 파라미터를 '옵셔널 파라미터(optional parameter)'라고 합니다. 필수가 아닌 선택이 가능하다는 점에서 'optional'인거죠.

def myself(name, age, nationality="대한민국"):
    print("제 이름은 {}입니다.".format(name))
    print("나이는 {}살입니다.".format(age))
    print("출신은 {}입니다.".format(nationality))
    
myself("타키탸키", 27, "독일") # 기본값이 설정된 파라미터 바꾸었을 때
print()
myself("타키탸키", 27) # 기본값이 설정된 파라미터를 바꾸지 않았을 때

위 코드를 보면 myself 함수를 호출할 때 한 번은 파라미터 nationality에 들어갈 값을 제공했고, 한 번은 제공하지 않았습니다. 출력값을 한 번 비교해볼까요?

제 이름은 타키탸키입니다.
나이는 27살입니다.
출신은 독일입니다.

제 이름은 타키탸키입니다
나이는 27살입니다.
출신은 대한민국입니다.

파라미터를 제공하지 않은 경우 미리 설정해둔 "대한민국"이라는 값이 자동으로 들어가게 됩니다.

참고로 옵셔널 파라미터는 반드시 마지막에 있어야 합니다. 중간에 넣게되면 오류가 납니다. 😧😧😧

def myself(name, nationality="대한민국", age):
    print("제 이름은 {}입니다.".format(name))
    print("나이는 {}살입니다.".format(age))
    print("출신은 {}입니다.".format(nationality))

💖 Synatic Sugar

자주 쓰이는 표현을 더 간략하게 쓸 수 있게 해주는 문법을 'Synatic Sugar'라고 합니다. 앞으로 자주 보게 될 표현이니 잘 익혀 두시길 바랍니다!

x = x + 1
x += 1	  ## synatic sugar	
x = x * 2
x *= 2	  ## synatic sugar
x = x - 3
x -= 3	  ## synatic sugar
x = x / 4
x /= 4	  ## synatic sugar
x = x % 5
x %= 5	  ## synatic sugar

이번 시간에는 Python의 변수와 함수의 실행 순서, print()문과 return문 차이, 옵셔널 파라미터와 Synatic Sugar에 대해 배웠습니다. 주로 보이지 않는 곳에서 함수가 어떻게 실행되고 있는지를 알아보았는데요. 다음에는 Python의 추상화를 이어서 살펴보겠습니다.

* 이 자료는 CODEIT의 프로그래밍 기초 in Python 강의를 기반으로 작성되었습니다.
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글