Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

3 표현식과 자료형

Updated: 10 mrt 2026

프로그램으로 컴퓨터가 값을 계산하도록 하려면 컴퓨터가 평가evaluation할 수 있는 계산 과정으로 구성된 식을 작성해야 하며, 이를 표현식expression이라 부른다. 표현식은 자신이 묘사하는 값과 동일시되며, 따라서 해당 값의 자료형을 갖는다. 표현식과 표현식의 자료형, 그리고 파이썬이 제공하는 기초 자료형에 대해 살펴본다.

3.1표현식

표현식은 숫자, 문자열, 리스트 등과 같은 상수, 변수, 그리고 이들을 연산자나 함수 호출로 결합해서 생성한다. 파이썬 실행기(인터프리터)는 표현식을 평가하여 표현식이 나타내는 값을 계산하며, 그렇게 계산된 값은 컴퓨터에 저장하거나 다른 연산 등에 활용된다.

3.1.1상수 표현식

17, 3.14, '안녕하세요!', [1, 2, 3] 등의 숫자, 문자열, 리스트 등 모든 상수는 표현식이다. 여기서 상수의 의미는 고정된 값을 의미한다. 상수 표현식은 자신을 값으로 나타낸다.

3.1.2변수 표현식

모든 값은 변수에 할당할 수 있다. 아래 코드에서 선언된 변수들은 각각 정수, 부동소수점, 문자열, 리스트를 가리키며, 각 변수가 가리키는 값 대신 어디서나 활용될 수 있다. 즉, 변수 또한 하나의 값을 나타내는 표현식이다.

num1 = 17
num2 = 3.14
word = '안녕하세요'
one2three = [1, 2, 3]
print('num이 묘사하는 값:', num1)
print('num2가 묘사하는 값:', num2)
print('word가 묘사하는 값:', word)
print('one2three이 묘사하는 값:', one2three)
num이 묘사하는 값: 17
num2가 묘사하는 값: 3.14
word가 묘사하는 값: 안녕하세요
one2three이 묘사하는 값: [1, 2, 3]

3.1.3연산 표현식

아래 코드는 표현식을 적절한 연산자와 함께 조합하여 새로운 값을 나타내는 표현식을 생성할 수 있음을 다양한 예제를 통해 보여준다.

print(17 / 3.14)
print(num1 - 3)
print(num2 / 5)
print(num1 * num2 + 10)
print(word + ' 반갑습니다!')
print(one2three * 2)
print(one2three + [word])
5.414012738853503
14
0.628
63.38
안녕하세요 반갑습니다!
[1, 2, 3, 1, 2, 3]
[1, 2, 3, '안녕하세요']

비교 연산은 True 또는 False, 즉 부울값을 가리키는 표현식이다.

print(num1 > num2)
print(word <= '안녕')
True
False

사칙연산과 비교연산뿐만 아니라 문자열과 리스트에 대한 in 연산과 인덱싱 연산 등 파이썬에서 허용되는 모든 연산은 특정 값을 나타내는 표현식이다. 예를 들어, in 연산 표현식은 TrueFalse 중에 하나의 부울값을 나타낸다.

languages = ['파이썬', 'C', "자바", "Rust"]
print('파이썬' in languages)
True

반면에 languages 변수가 가리키는 리스트의 0번 인덱스의 값은 '파이썬'이며, 아래 코드에서 python 변수가 이 값을 가리킨다.

python = languages[0]
print("인기 프로그래밍 언어:", python)
인기 프로그래밍 언어: 파이썬

3.1.4함수 호출 표현식

함수와 반환값

수학에서 함수는 입력값을 받아 정해진 규칙에 따라 결과값을 내놓는 관계를 의미한다. 예를 들어 f(x)=x2+1f(x) = x^2 + 1이라는 함수는 xx가 2일 때 f(2)f(2)는 2의 제곱에 1을 더한 5가 된다. 이를 프로그래밍에서는 함수 f()f()인자argument로 2를 주어지고 호출되면 2의 제곱에 1을 더해서 계산된 5를 반환한다return라고 말한다. 즉, 인자 2에 대한 함수 f()f()의 반환값이 5다라고 한다.

파이썬의 수학적 함수

파이썬은 많은 수학적 함수를 동일하게 기본으로 제공하고, 또 사용자가 임의로 수학적 함수를 정의해서 활용할 수 있다. 예를 들어, round() 함수는 부동소수점과 음의 아닌 정수 두 개의 인자를 받으면 정수로 지정된 소수점 이하 몇 자리까지만 갖는 부동소수점을 반환한다. 예를 들어, 아래 코드는 3.141592를 소수점 이하 둘째까지만 갖는 부동소수점을 반환한다.

round(3.141592, 2)
3.14

round() 함수가 값을 반환할 때 필요에 따라 반올림이 작동한다. 예를 들어 3.141592를 소수점 이하 셋째 자리까지만 갖도록 하면 소수점 이하 넷째 자리가 5이기에 소수점 이하 넷째 자리에서 반올림된 3.142가 반환된다.

round(3.141592, 3)
3.142

파이썬의 비수학적 함수

프로그래밍에서 사용되는 함수는 경우에 따라 수학에서의 함수와 다른 기능을 수행하기도 한다. 예를 들어 이전 장에서 활용한 함수인 print(), type(), ord() 등 세 함수는 아래 표에 정리된 것처럼 인자가 수가 아니거나, 반환값이 수가 아니다.

함수반환값예시
print()없음. 대신 괄호 안의 값을 화면에 출력print("Hello") → Hello 출력
type()괄호 안의 값의 자료형 확인해서 반환type(3)<class 'int'> 반환
ord()문자의 유니코드 코드 포인트를 확인해서 반환ord('A') → 65 반환

print() 함수는 어떤 값도 계산하거나 반환하지 않는 대신 주어진 값을 화면에 출력하고, type() 함수는 주어진 값의 자료형을 계산하는 것이 아니라 확인해서 반환한다. 그리고 ord() 함수는 인자로 주어진 문자에 대응하는 정수를 확인해서 반환한다.

프로그래밍에서 함수는 매우 중요하지만 여기서는 함수의 인자와 반환값 개념과 수학에서의 함수와 다른 종류의 함수도 활용된다는 점만 활용한다.

반환값과 표현식

함수가 반환하는 값이 수이건 아니건, 계산된 값이건, 아니면 단순히 확인된 값이건, 파이썬에서는 모두 값으로 인정된다. 따라서 type(3)ord('A') 또한 어떤 값을 나타낸다. 이처럼 어떤 함수의 특정 인자에 대한 반환값을 나타내는 것또한 표현식이다.

파이썬에서 값은 변수에 할당될 수 있는 대상이기에 3의 자료형과 영어 알파벳 A에 대한 유니코드 코드 포인트를 변수에 할당할 수 있음을 아래 코드가 잘 보여준다.

pi = round(3.141592, 2)
type_of_3 = type(3)
ord_of_A = ord('A')

print('원주율', pi)
print('3의 자료형:', type_of_3)
print('A의 유니코드 코드 포인트:', ord_of_A)
원주율 3.14
3의 자료형: <class 'int'>
A의 유니코드 코드 포인트: 65

3.1.5표현식 합성

지금까지 언급한 모든 종류의 표현식을 합성해서 새로운 표현식을 생성할 수 있다. 예를 들어, 아래 코드는 변수를 활용하는 연산 표현식을 인자로 지정된 값들 중에서 최댓값을 반환하는 max()의 인자로 사용하는 함수 표현식의 반환값을 계산한다. max() 함수는 2개 이상의 인자를 받아 인자들이 가리키는 최댓값을 계산하여 반환한다.

max_value = max(num1+2, num2//2, 100/7, 3.14*num1)
print(max_value)
53.38

위 결과는 다음 네 개 인자의 값들 중에서 최댓값이다.

print(num1+2, num2//2, 100/7, 3.14*num1)
19 1.0 14.285714285714286 53.38

반면에 아래 코드는 최솟값을 계산하는 min() 함수를 활용한다.

min_value = min(num1+2, num2//2, 100/7, 3.14*num1)
print(min_value)
1.0

None

파이썬에서 모든 함수는 반환값을 갖는다. 앞서 print() 함수는 반환값이 없다고 하였지만 엄밀히 말하면 print() 함수는 인자와 상관없이 항상 None이라는 값을 반환한다.

예를 들어, 아래 코드를 실행하면 none_value1none_value2 모두에 None이 할당된다. 코드를 실행하면 먼저 print() 함수가 인자와 함께 실행되어 각각의 인자가 화면에 출력되며, 그런 다음에 반환값인 None을 각각의 변수에 할당된다. 즉, 화면에 출력되는 값이 print() 함수의 반환값이 아님을 기억해야 한다.

none_value1 = print("Hello")
none_value2 = print(3.14)
Hello
3.14

아래 코드는 print() 함수의 반환값이 인자에 상관없이 항상 None임을 확인해준다.

print('첫째 반환값:', none_value1)
print('둘째 반환값:', none_value2)
첫째 반환값: None
둘째 반환값: None

None은 파이썬에서 '아무 의미도 없는 값’을 가리키는 값을 나타내는 기호 정도로 이해하면 된다. 특히 숫자 0과 다름에 주의한다. 예를 들어, None을 연산에 사용하면 오류가 발생한다.

None + 1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[36], line 1
----> 1 None + 1

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

3.1.6예제

(1) 먼저 아래와 같이 변수를 선언한다.

number = 17
two_semicolons = ';;'

다음에 오는 각각의 표현식들에 대해 해당 표현식이 나타내는 값을 예측하고 실생 결과와 비교하라.

가. number - 2.0

답:

17 에서 2를 뺀 15를 가리킨다. 단, 2가 아닌 2.0을 빼기에 17.0에서 2.0을 뺀 부동소수점 15.0으로 계산된다.

number - 2.0
15.0

나. number**3 / (2 + 3)

답:

17의 세제곱을 2 더하기 3인 5로 나눈 값인 부동소수점 982.6이 계산된다.

number**3 / (2 + 3)
982.6

다. two_semicolons * 3

답:

2개의 세미콜론으로 구성된 문자열이 3번 복제되어 이어붙여진 문자열이 계산된다.

two_semicolons * 3
';;;;;;'

(2) 변수가 다음과 같이 선언된다.

even_num = 666

가. even_num이 가리키는 값이 짝수인지를 판정하는 표현식을 변수 is_num_even이 가리키도록 한다.

답:

even_num 변수가 짝수를 가리키는지 여부는 아래 표현식으로 나타낸다.

even_num % 2 == 0
True

따라서 is_num_even 를 다음과 같이 선언한다.

is_num_even = even_num % 2 == 0

나. is_num_even이 가리키는 값의 자료형을 확인한다.

답:

변수가 가리키는 값의 자료형은 변수 자체의 자료형과 동일하며, TrueFalsebool 자료형을 갖는다.

type(is_num_even)
bool

3.1.7연습문제

(1) 두 변수가 다음과 같이 선언된다.

x = 2.4
y = 5.7

두 변수가 가리키는 값의 조화 평균을 계산하는 표현식을 정의한 다음에 변수 z에 할당한다. 또한 z가 가리키는 값과 자료형을 화면에 다음과 같이 출력한다.

2.4 와 5.7 의 조화평균: 3.38

단, xy의 조화평균은 다음과 같이 계산하며, 소수점 이하 셋째 자리에서 반올림한다.

2 / (1/x + 1/y)

(2) 대기실에 8개의 의자가 일렬로 놓여 있다. 대기실에 있는 사람들이 의자에 앉을 때 어느 두 사람도 이웃하여 못하도록 하면서 앉을 수 있는 최대 인원이 앉는 방식과 최소 인원이 앉는 방식을 문자열로 출력하는 코드를 작성하라.

단, 자리 앉기가 완료된 이후에는 더 이상 어느 누구도 자리에 앉을 수 없어야 한다. 예를 들어 아래 방식으로 앉는 것은 허용되지 않는다. 아래 표에서 O은 채워진 자리를, X는 빈자리를 가리킨다.

불가능 방식이유
XXOXOXOX왼쪽 끝에 한 명 더 앉을 수 있음
XOXXOXXX오른쪽 끝에 한 명 더 앉을 수 있음

3.2자료형

3.2.1표현식의 자료형

표현식의 자료형은 표현식이 나타내는 값의 자료형으로 지정된다.

num = 3
type(num + 2)
int
type(max(num+2, num//2))
int
type(min(num*2, num/2))
float
type("파이썬," + " 안녕!")
str
type(['파이썬', 'C', "자바", "Rust"])
list
type(['파이썬', 'C', "자바", "Rust"][3])
str
type("자바" in ['파이썬', 'C', "자바", "Rust"])
bool

3.2.2자료형의 역할

자료형은 주어진 값이 어떤 속성과 기능을 갖는지를 지정한다. 예를 들어, 정수와 부동소수점 등은 사칙연산을 모두 적용할 수 있지만 문자열과 리스트는 사칙연산자 중에서 덧셈 기호와 곲셈 기호와만 함께 사용할 수 있다. 또한 문자열과 문자열의 곱, 리스트와 리스트의 곱도 사용할 수 없다.

'abc' * 'def'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[13], line 1
----> 1 'abc' * 'def'

TypeError: can't multiply sequence by non-int of type 'str'
'abc' - 'def'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[14], line 1
----> 1 'abc' - 'def'

TypeError: unsupported operand type(s) for -: 'str' and 'str'
[1, 2, 3] * [4, 5, 6]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[15], line 1
----> 1 [1, 2, 3] * [4, 5, 6]

TypeError: can't multiply sequence by non-int of type 'list'
[1, 2, 3] / [4, 5, 6]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[16], line 1
----> 1 [1, 2, 3] / [4, 5, 6]

TypeError: unsupported operand type(s) for /: 'list' and 'list'

주어진 값의 자료형과 해당 자료형의 속성과 기능을 정확하게 파악해서 적절하게 활용할 줄 알아야 한다.

3.2.3동적 타이핑

파이썬은 변수가 가리키는 값을 다른 자료형의 값을 가리키도록 하는 것을 하용한다. 예를 들어, 아래 코드는 변수 b가 가리키는 값을 정수 6에서 Hello, world! 라는 문자열로 바꿔 지정하면 변수의 자료형 또한 변경된 값의 자료형으로 바뀜을 보여준다.

b = 6
print(type(b))
b = "Hello, world!"
print(type(b))
<class 'int'>
<class 'str'>

이처럼 변수가 가리키는 값의 자료형을 미리 정하지 않고 필요에 따라 임의로 값의 자료형을 변경하는 것을 허용하고, 또 파이썬이 알아서 변수의 자료형을 확인해주는 방식을 동적 타이핑dynamic typing이라 한다.

3.2.4형변환

앞서 보았듯이 연산을 실행할 때 사용되는 값들의 자료형이 매우 중요하며, 자료형에 따라 연산 결과의 값의 자료형도 달라진다. 예를 들어, 부동소수점 2.0과 정수 3을 더하면 5.0으로 계산되는 반면에 2와 3을 더하면 정수 5로 계산된다.

print(type(2.0 + 3))
print(type(2 + 3))
<class 'float'>
<class 'int'>

2.0 더하기 3이 5.0 부동소수점으로 계산되는 이유는 부동소수점과 정수 자료형을 하나로 통일시키기 위해 정수 2를 부동소수점 2.0으로 파이썬 실행기가 알아서 자료형 변환을 내부적으로 진행하기 때문이다. 이렇게 파이썬 실행기 내부적으로 값을 다른 자료형의 값으로 계산하는 기능을 형변환 또는 영어로 타입 캐스팅type casting이라 부른다. 형변환에 사용되는 함수로 int(), float, str(), bool() 등이 가장 많이 자주 사용되며, 필요에 따라 사용자가 직접 형변환 함수를 활용할 수 있다.

int() 함수

정수 모양의 문자열, 부동소수점, 부울값을 정수로 계산하여 반환한다.

경우 1: 정수 모양의 문자열을 실제 정수로 변환한다. 아래 코드에서 문자열 '5'와 정수 17을 더하는 게 가능하도록 하기 위해 문자열에 int() 함수를 먼저 적용하였다.

int('5') + 17
22

주어진 문자열이 정수의 모양을 갖추지 못하면 int() 함수는 오류를 발생시킨다.

  • 오류 종류: 값오류(ValuError)

  • 오류 내용: '5.1'은 정수 모양이 아님.

int('5.1')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[33], line 1
----> 1 int('5.1')

ValueError: invalid literal for int() with base 10: '5.1'

경우 2: 임의의 부동소수점을 정수로 형변환시킬 수 있다. 이때 소수점 이하는 무조건 버린다. 아래 코드의 결과는 4 곱하기 3, 즉 정수 12로 계산된다.

int(4.8952) * 3
12

경우 3: 부울값 TrueFalse를 각각 1과 0으로 변환한다.

int(True)
1
int(False)
0

float() 함수

정수 또는 유한소수 모양의 문자열을 부동소수점으로 계산한다.

경우 1: 정소 또는 부동소수점 모양의 문자열을 실제 부동소수점으로 변환한다. 아래 코드를 실행하면 7.9 더하기 3.0이 계산된다.

float('7.9') + float('3')
10.9

문자열이 부동소수점 또는 정수 모양을 갖추지 못하면 오류가 발생한다.

  • 오류 종류: 값오류(ValuError)

  • 오류 내용: '5.1a'은 부동소수점 모양이 아님.

int('5.1a')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[45], line 1
----> 1 int('5.1a')

ValueError: invalid literal for int() with base 10: '5.1a'

경우 2: 정수에 소수점을 추가하는 방식으로 부동소수점으로 형변환시킨다. 예를 들어, 2.0 더하기 3에서 3을 3.0으로 변환할 때 사용된다.

2.0 + float(3)
5.0

경우 3: 부울값 TrueFalse를 각각 1.0과 0.0으로 변환한다.

float(True)
1.0
float(False)
0.0

str() 함수

인자로 주어진 임의 자료형의 값을 주어진 모양 그대로의 문자로 구성된 문자열로 변환한다.

str(6) + ' apples'
'6 apples'
str(7.6) + "은 부동소수점"
'7.6은 부동소수점'
3 * str(False)
'FalseFalseFalse'
str([1, 2, 3]) + "는 리스트"
'[1, 2, 3]는 리스트'
str([1, 2, 3]) + ' + ' + str([4, 5, 6])
'[1, 2, 3] + [4, 5, 6]'

bool() 함수

인자로 주어진 임의 자료형의 값을 True 또는 False 로 변환한다. 0, 0.0, None, ''(비어 있는 문자열), [] (비어 있는 리스트) 등처럼 0, 비어 있는 것, 의미 없는 것등은 False 로, 그렇지 않으면 True 로 변환한다.

bool(0)
False
bool(1)
True
bool(-1)
True
bool(0.0)
False
bool(-0.01)
True
bool(None)
False
bool('')
False
bool('apple')
True
bool([])
False
bool([1, 2, 3])
True

3.2.5예제

(1) 아래 수식을 계산하려 하면 오류가 발생한다.

3 + '3.0'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[99], line 1
----> 1 3 + '3.0'

TypeError: unsupported operand type(s) for +: 'int' and 'str'

유한소수 모양의 문자열을 부동소수점 자료형으로 변환하여 3 + 3.0이 계산되도록 하라

답:

부동소수점 모양의 문자열을 실제 부동소수점으로 변환시키는 float() 함수를 활용하면 된다.

3 + float('3.0')
6.0

(2) 두 변수가 다음과 같이 선언된다.

x = 2.438730
y = 5.711729

가. 두 변수가 가리키는 값이 평균값을 계산하는 표현식을 정의한 다음에 변수 z에 할당하고, 변수 z가 가리키는 값과 자료형을 화면에 다음과 같이 출력하라.

x와 y의 평균값: 4.0752295

답:

두 변수 xy가 가리키는 값의 평균값을 나타내는 표현식은 (x + y) / 2이다. 따라서 변수 z를 다음과 같이 정의한다.

z = (x + y)/2

아래 코드는 print() 함수를 이용하여 지정된 방식으로 평균값을 출력한다.

print("x와 y의 평균값:", z)
x와 y의 평균값: 4.0752295

나. round() 함수를 활용하여 두 변수 xy가 가리키는 값이 평균값을 다음과 같이 출력되도록 하라.

x와 y의 평균값: 4.075

답:

변수 z가 두 변수의 평균값을 가리킨다. 따라서 함수 표현식 round(z, 3)을 활용하면 지정된 방식으로 평균값을 출력할 수 있다.

print("x와 y의 평균값:", round(z, 3))
x와 y의 평균값: 4.075

다. 형변환 함수 int()를 이용하여 두 변수가 가리키는 값이 평균값을 다음과 같이 출력하라.

x와 y의 평균값: 약 4

답:

부동소수점의 소수점 이하를 버리면 되기에 int(z)가 4를 반환한다.

print("x와 y의 평균값: 약", int(z))
x와 y의 평균값: 약 4

round(z, 0)의 반환값은 4가 아닌 부동소수점 4.0임에 주의한다.

round(z, 0)
4.0

3.2.6연습문제

(1) dogscats 두 변수를 다음과 같이 선언한다.

dogs = '12'
cats = '7'

강아지가 고양이보다 몇 마리 더 많은지를 아래 형식으로 출력하는 코드를 작성하라.

강아지가 고양이보다 5 마리 더 많다.

(2) 리스트가 다음과 같이 주어졌다.

data = [3, "py", 2.5, "7", True, "hi"]

변수 item 하나만 이용해서 아래 문자열을 가리키는 변수 dynamic_typing를 정의하라.

단, 문자열 연산, 리스트 인덱싱, 형변환 함수를 모두 활용해야 하며, item 변수를 한 번 정의한 다음에 5번 재할당 해야 한다. 또한 dynamic_typing는 빈 문자열을 가리키도록 한 다음에 5번 업데이트 해서 최종적으로 아래 문자열을 가리키도록 해야 한다.

'3, py, 2, 7.0, 1, True'