컴퓨터공학과에 진학한 후 파이썬을 사용하면서 문법이나 라이브러리 사용법은 익혀왔지만, 언어 자체를 깊게 공부해본 적은 없다는 생각이 들었다.
그래서 기초부터 하나씩 정리하면서 파이썬을 더 제대로 이해해보려고 한다. 첫 글에서는 파이썬이 어떤 특징을 가지고 있고, 어떻게 활용되는지 살펴본다.
파이썬은 고수준 범용 프로그래밍 언어다.

처음 보면 어려운 표현이지만, 두 단어를 나누어 보면 의미가 단순해진다.
예를 들어 숫자 여러 개를 저장하고 합계를 구하려면 다음과 같이 작성할 수 있다.
numbers = [10, 20, 30]
print(sum(numbers)) # 60
숫자를 저장할 메모리를 직접 확보하거나 관리하는 코드를 작성하지 않아도 된다. 리스트와 sum()이라는 기능을 이용해 원하는 작업을 표현하면 된다.
이처럼 파이썬은 비교적 적은 코드로 여러 작업을 구현할 수 있으며, 다음과 같은 분야에서 활용된다.
| 분야 | 활용 예시 |
|---|---|
| 자동화 | 파일 이름 변경, 반복 작업 처리 |
| 웹 개발 | 웹 서버와 API 개발 |
| 데이터 처리 | 데이터 수집, 정제, 분석 |
| AI·머신러닝 | 모델 학습과 예측 |
데이터 분석이나 AI에서 많이 접하지만, 그 용도로만 사용하는 언어는 아니다.
파이썬은 들여쓰기로 조건문이나 반복문에 속하는 문장 묶음을 구분한다. 다만 들여쓴 부분마다 별도의 변수 스코프가 생기는 것은 아니다.
score = 80
if score >= 60:
print("합격")
print("채점 완료")
if score >= 60:은 점수가 60점 이상인지 확인한다.
그 아래에서 들여쓰기한 print("합격")은 조건을 만족할 때만 실행된다. 반면 들여쓰기하지 않은 print("채점 완료")는 조건문 밖에 있으므로 조건과 관계없이 실행된다.
합격
채점 완료
점수를 50으로 바꾸면 "채점 완료"만 출력된다.
즉, 들여쓰기는 보기 좋게 정렬하는 용도가 아니라 코드의 구조를 결정하는 문법이다.
파이썬의 문법이 간결하다고 해서 무조건 짧게 작성할 필요는 없다. 나중에 다시 읽었을 때 의도를 이해할 수 있도록 작성하는 것이 더 중요하다고 생각한다.
타입은 정수, 문자열처럼 데이터의 종류를 말한다.
파이썬에서는 변수의 타입을 미리 선언하지 않고 값을 대입할 수 있다. 같은 변수 이름에 다른 타입의 값을 대입하는 것도 가능하다.
value = 10
value = "hello"
이 동작을 이해하려면 객체와 변수 이름을 구분할 필요가 있다.
여기서 객체는 우선 ‘프로그램에서 다루는 실제 데이터’라고 생각하면 된다. 10은 정수 객체이고, "hello"는 문자열 객체다. 변수는 이러한 객체를 가리키는 이름이다.
| 코드 | 의미 |
|---|---|
value = 10 | value라는 이름이 정수 객체 10을 가리킨다. |
value = "hello" | 이제 value가 문자열 객체 "hello"를 가리킨다. |
정수 10이 문자열로 바뀌는 것이 아니라, 같은 이름이 다른 객체를 가리키게 되는 것이다.
파이썬은 동적 타이핑을 지원한다. 이름에 타입을 고정하지 않으며, 실행 중 실제 객체의 타입에 따라 가능한 연산을 판단한다.
그렇다고 타입을 신경 쓰지 않아도 되는 것은 아니다.
print(10 + 20) # 30
print("10" + "20") # 1020
정수끼리의 +는 덧셈을 하지만, 문자열끼리의 +는 문자열을 이어 붙인다.
print(10 + "20") # TypeError
이 예시에서는 int와 str 사이의 덧셈이 지원되지 않아 오류가 발생한다. 숫자로 더하려면 문자열을 정수로 변환하면 된다.
print(10 + int("20")) # 30
타입을 선언하는 부담은 적지만, 지금 어떤 데이터를 다루는지는 알고 있어야 한다.
파이썬에서는 숫자, 문자열, 리스트뿐 아니라 함수와 클래스도 객체로 다룬다.
처음에는 이 말이 낯설 수 있다. 함수를 다른 변수 이름에 대입할 수 있다는 예시를 보면 조금 이해하기 쉽다.
def greet():
return "안녕하세요"
hello = greet
print(hello()) # 안녕하세요
greet는 "안녕하세요"를 반환하는 함수다.
여기서 괄호의 유무를 구분해야 한다.
greet는 함수 객체를 가리킨다.greet()는 그 함수를 실행한다.따라서 hello = greet는 함수를 실행해서 결과를 저장하는 코드가 아니다. hello라는 이름으로도 같은 함수를 가리키게 하는 코드다.
이후 hello()를 호출하면 그 함수가 실행된다. 함수도 데이터처럼 다른 이름에 대입하거나, 다른 함수에 전달할 수 있는 것이다.
다만 모든 데이터가 객체라고 해서 모든 코드를 클래스로 작성해야 하는 것은 아니다. 파이썬은 함수 중심으로 작성하는 방식과 클래스를 활용하는 방식 등을 함께 지원한다.
우리가 작성한 파이썬 코드를 컴퓨터가 그대로 이해하는 것은 아니다. 코드를 읽고, 파이썬의 규칙에 맞게 실행해주는 프로그램이 필요하다.
그 대표적인 프로그램이 CPython이다.
| 용어 | 의미 |
|---|---|
| Python | 코드의 문법과 동작 규칙을 가진 프로그래밍 언어 |
| CPython | 그 규칙에 따라 파이썬 코드를 실행하는 프로그램으로, 주로 C로 작성됨 |
이렇게 언어의 규칙을 실제로 작동하도록 만든 프로그램을 구현체라고 부른다.
보통 파이썬을 설치하고 다음 명령어를 입력하면 CPython이 파일을 읽고 실행한다.
python main.py
파이썬은 흔히 인터프리터 언어라고 부른다. 개발자는 보통 별도의 컴파일 명령을 직접 실행하지 않고, 인터프리터라는 실행 프로그램에 코드를 전달한다.
다만 내부에 컴파일 과정이 없는 것은 아니다.
CPython은 파이썬 소스 코드를 바이트코드라는 중간 명령어로 변환한 뒤 실행한다. 이 변환 과정이 컴파일이다. 바이트코드는 CPU가 직접 실행하는 기계어와는 구분된다.
여기서 헷갈렸던 점은 두 가지다.
파이썬은 다양한 라이브러리를 제공한다. 라이브러리는 여러 프로그램에서 활용할 수 있도록 미리 만들어둔 기능의 모음이라고 생각하면 된다.
파이썬과 함께 제공되는 표준 라이브러리와, 필요에 따라 별도로 설치하는 외부 라이브러리가 있다.
예를 들어 제곱근을 구할 때는 표준 라이브러리의 math 모듈을 사용할 수 있다.
import math
print(math.sqrt(16)) # 4.0
import math는 수학 관련 기능이 들어 있는 모듈을 불러오는 코드다. math.sqrt(16)은 그중 제곱근을 구하는 기능을 사용한다.
직접 제곱근 계산 방법을 구현하지 않아도 이미 만들어진 기능을 활용할 수 있다.
이런 점은 개발 시간을 줄여준다. 다만 라이브러리를 사용할 때도 어떤 값을 전달해야 하고, 어떤 결과가 돌아오는지는 이해하고 있어야 한다.
파이썬은 문법이 간결하고 활용할 수 있는 라이브러리가 많아, 기능을 빠르게 구현하고 확인하기 좋다.
하지만 개발자가 코드를 빠르게 작성하는 것과 컴퓨터가 코드를 빠르게 실행하는 것은 별개의 문제다.
다만 파이썬 코드로 연산을 하나씩 반복하는 작업에서는 실행 시간이 문제가 될 수 있다. 이런 경우에는 성능이 중요한 부분을 C 등으로 구현한 확장 모듈에 맡기는 방법도 있다.
따라서 성능은 작업의 특성, 자료구조와 알고리즘, 실제 연산을 처리하는 구현을 함께 살펴봐야 한다.
처음에는 파이썬을 ‘문법이 간단해서 사용하기 편한 언어’ 정도로 생각했다. 하지만 익숙하게 작성하던 코드에도 변수와 객체의 관계, 타입, 실행 방식처럼 짚어볼 내용이 있었다.
다음 글에서는 python main.py를 실행하면 내부에서 어떤 일이 일어나는지 정리해보려고 한다.