코딩에서 추상화란 복잡한 소프트웨어 동작 과정을 단순하고 간략하게 만들어 이용에 편리함을 증대시키는 기술을 의미한다. 이를테면 중복된 기능을 정리하고, 작성한 코드의 가독성을 높이며, 반복해서 사용되는 기능을 정의하여 간소화하는 것들을 예로들 수 있다.
이렇게 복잡하고 반복되는 프로그램 작동 방식을 간추릴 수 있는 방식을 고안하여 좋은 코딩을 할 수 있는 기법을 통틀어서 얘기하기 때문에 완벽한 정답은 없다. 하지만, 계속해서 어느 동작의 효율성을 높일 수 있을지에 대한 아이디어를 제시하고, 고쳐나가며 습관으로 만든다면 강력한 코드를 작성할 수 있는 능력을 기를 수 있다.
추상화를 하기 위해 사용되는 변수, 함수 등이 파이썬에서 어떤 점을 이해해야 하는지 알아보자.
a = 10
print(a == 10)
a = a+1
print(a == 10)
위 코드는 코딩에서 무조건 헷갈리면 안 되는 것을 설명하기 위한 것으로 딱히 큰 의미가 있는 코드는 아니다. 우리가 일상적으로 사용하는 등호 '='는 코딩에서 '할당 연산자'로 사용된다. 다시 말하자면, 좌변과 우변이 같다는 등호의 의미에서 사용되는 것이 아니라, 좌변에 우변의 값을 '할당'한다는 의미에서 사용되는 것이다. 따라서, 'a = a + 1' 같은 수학적으로는 말도 안 되는 내용이 위 코드에서 사용될 수 있는 것이다. 등호를 사용하고자 한다면 '=='를 사용한다.
코딩을 하며 여러 번 반복되는 의미의 특정한 값이 있을 텐데 이를 변수로 지정하고 사용하면 어느 줄에서 해당 변수를 사용해도 뜻을 이해하기 편할 것이다. 만약 값을 변경할 일이 있다면 값을 정의하는 부분을 변경하거나 변수를 재정의 하면 되기 때문에 엄청난 편리함을 제공한다.
a = 10
def scope_ex():
a = 3
print(a)
scope_ex()
print(a)
변수를 사용할 때 알고 있어야 할 또 하나의 개념은 스코프이다. 위 코드의 결과는 같은 변수명의 변수를 출력했지만 3과 10으로 다른 값을 얻을 수 있다. 이를 이해할 수 있게 하는 것이 스코프로, 이는 변수가 유효한 범위를 뜻하는 용어로써 글로벌 변수와 로컬 변수로 나뉜다.
위 코드를 살펴보면 변수 a가 두 번 정의되는 것을 볼 수 있다. 하지만, 첫 번째 줄에서 정의된 변수는 글로벌 변수로써 나중에 변수의 값이 변화되지 않는 이상 함수 내부를 포함한 어디에서든 사용될 수 있다. 하지만 네 번째 줄에서 정의된 변수는 로컬 변수로써 scope_ex() 함수 정의 중에 선언된 변수이다. 이는 해당 함수 안에서 사용되는 변수로써 함수 정의 외부에서는 의미를 잃는다.
여기서 주목할 점은 함수 내부에서 변수가 정의되지 않은 채로 일정 변수를 사용하려 해도 글로벌 변수로 똑같은 변수명이 정의되어 있다면 이를 사용할 수 있다. 이러한 코드의 작동 순서를 이해하는 것이 추상화의 기본이라고 할 수 있다.
def return_ex():
msg = "반환할게요~"
return msg
def print_ex():
msg = "출력할게요~"
print(msg)
return_ex()
print_ex()
print(return_ex())
print(print_ex())
그다음으로는 함수의 처리 순서를 return과 print의 차이점을 살펴보며 이해해 보자. 위 코드를 실행하면 인터프리터는 위에서부터 차례대로 읽어나갈 것이다. 그러다가 처음으로 받은 10번째 줄의 return_ex() 명령을 받아 1번째 줄로 돌아가 함수를 실행한다. 이런 식으로 함수를 호출하면 해당 함수를 정의한 곳으로 가서 정의된 내용을 실행하고 다시 읽던 줄로 돌아간다는 것이다.
여기서 헷갈리면 안 되는 기능이 return과 print이다. 지금까지는 별 설명 없이 둘을 사용했기 때문에 둘의 차이점이 헷갈렸을 수도 있지만, return문은 결괏값을 반환하는 것이고, print문은 값을 출력하는 것이다. 이러한 이유로 위 코드 10번째 줄에서 return_ex()을 호출해도 아무런 값이 결과창에 뜨지 않는 것이다. 그저 "반환할게요~"라는 문자열을 함수 호출 위치로 반환했을 뿐 해당 위치에서 어떠한 조치가 없었기 때문에 그렇게 넘어가는 것이다.
return은 함수 호출 위치에 값을 반환하는 것 이외에도 함수를 즉시 종료하는 역할을 한다. 예를 들어, return msg 다음 줄에 어떤 코드를 넣어도 실행되지 않고 함수는 종료된다. 따라서 그 뒤에 오는 코드는 의미가 없기 때문에 'Dead Code'라고 불린다. 하지만, return문을 기입하지 않는다면 함수는 마지막에 none값을 반환한다. 이러한 이유로 print(print_ex()) 부분에서 함수 실행값인 "출력할게요~"와 반환받은 "none"이 차례대로 출력되는 것이다.
def optional_para(age, name, gender = "남자"):
print("내 나이는 {}".format(age))
print("내 이름은 {}".format(name))
print("내 성별은 {}".format(gender))
optional_para(25, 홍길순, "여자") # 옵셔널 파라미터에 값을 제공하는 경우
optional_para(19, 강호동) # 옵셔널 파라미터에 값을 제공하지 않는 경우
파라미터는 이전에 설명했듯이 함수를 사용할 때마다 지정해서 사용할 수 있는 매개변수이다. 이런 파라미터는 여러 개 설정할 수 있는데 디폴트 값을 설정할 수 있다. 이를 '옵셔널 파라미터'라고 부르고 매개변수를 함수 호출 시에 기입하지 않더라도 특정 값을 할당해 자동으로 함수가 실행될 수 있도록 하는 것이다. 옵셔널 파라미터는 유의할 점이 항상 맨 마지막(오른쪽)에 변수 선언을 해줘야 오류가 나지 않는다.
파이썬에서는 간단하고 가독성이 좋은 코드를 작성하기 위해 규칙을 만들어서 지키는 것을 중요하게 생각한다. 이를 '코딩 스타일'이라고 부르며, 코딩의 의도를 이해하기 쉽도록 코딩 방식을 정의하고 규칙을 만든 것인데, 대표적인 예로 'PEP8'이 있다.
[PEP8 주요 규칙]
- 모든 변수와 함수의 이름은 소문자로 작성하고 단어 사이에 '_'를 사용해 구분 지어야 한다.
- 상수는 대문자로 기입하고 여러 단어일 경우 '_'를 사이에 넣어 구분 짓는다.
- 변수명은 의도에 맞게 이름을 기입한다 (주석을 사용해 설명하면 더 좋다.)
- 들여 쓰기는 화이트 스페이스(띄어쓰기) 4번을 사용한다. TAB키를 사용해서 들여 쓸 수도 있다.
- 함수 정의끼리 공백 줄을 2칸씩 띄어서 쓴다.
- 괄호 안에서 바로 칸을 띄우지 않는다. 하지만, 연산자와 숫자 식에서는 서로 띄어 쓴다.
- 함수명과 괄호 사이에 여백을 두지 않는다. 쉼표 앞에도 띄어쓰기를 하지 않는다.
- 연산자 앞뒤로 띄어 쓰는 것을 준수하지만, 계산식에서 우선순위를 강조하는 경우 띄어 쓰지 않는다.
이외에도 추상화는 무한한 방식으로 진행될 수 있다. 정해진 규칙 외에도 모두에게 이해하기 쉬운 코딩이고, 동작에 이상이 없는 효율성이 좋은 코딩이라면 추상화가 잘 이루어졌다고 볼 수 있다. 이를 잘하기 위해서는 앞에서도 말했다시피 좋은 코딩과 나쁜 코딩의 차이점을 인지하고, 좋은 습관을 차곡차곡 들인다면 자연스럽게 간결한 코딩을 짤 수 있다. 마지막으로 오늘 실습으로 만들어 본 거스름돈 계산기 코드를 올리고 포스팅을 마무리하겠다.
# 잔돈 반환 계산기 (실습)
def calculate_change(payment, cost): # payment는 지불액, cost는 금액 파라미터
change = payment - cost # 거스름돈 값
fifty_bill = change // 50000 # 50000원지폐 장수
ten_bill = (change % 50000) // 10000 # 10000원지폐 장수
five_bill = (change % 10000) // 5000 # 5000원지폐 장수
one_bill = (change % 5000) // 1000 # 1000원지폐 장수
print(f"50000원 지폐: {fifty_bill}장")
print(f"10000원 지폐: {ten_bill}장")
print(f"5000원 지폐: {five_bill}장")
print(f"1000원 지폐: {one_bill}장")
# 테스트 코드
calculate_change(100000, 27000)
print()
calculate_change(500000, 491000)'IT Self-study > Python' 카테고리의 다른 글
| 파이썬 기초: 리스트 (0) | 2025.04.04 |
|---|---|
| 파이썬 실습 (1): 기초 문제해결 능력 (0) | 2025.03.27 |
| 파이썬 기초: 제어문 (0) | 2025.03.26 |
| 파이썬 기초: 데이터 형 (0) | 2025.03.24 |
| 파이썬 시작 (0) | 2025.03.24 |