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.

2 값과 연산

Updated: 10 mrt 2026

프로그래밍언어의 핵심 기능 중의 하나가 바로 컴퓨터에 값을 저장하고, 저장된 값을 활용해서 새로운 값을 계산하는 일이다. 이번 장에서는 가장 많이 활용되는 값의 종류를 소개하고, 새로운 값을 생성하는 다양한 연산자를 소개한다.

2.1파이썬 기초 자료형

변수에 할당해서 저장할 수 있는 대상이 values이며, 모든 값은 자료형을 갖는다. 파이썬의 대표적인 값은 정수, 부동소수점, 문자열, 부울값, 리스트 등이다. 이외에 튜플, 사전, 파일 등 다양한 값들이 존재하며, 앞으로 다양한 값들을 살펴볼 것이다.

정수

-13798, -7, 0, 1, 2, 17, 41, 87356112 등 일상적으로 사용되는 정수의 자료형은 int다.

print(type(-13798))
print(type(41))
<class 'int'>
<class 'int'>

부동소수점

1.0, -9.74, 3.141592, 0.0000072172765와 같은 유한 소수를 프로그래밍 분야에서는 부동소수점(floating point)이라 부르며, 자료형은 float다.

컴퓨터는 본질적으로 유한한 자원만을 다룰 수 있기 때문에, 유리수와 무리수를 포함한 모든 실수를 완전하게 표현할 수 없다. 따라서 파이썬을 비롯한 모든 프로그래밍 언어는 소수점 이하 일정 자리까지만 계산된 유한 소수만을 다룬다.

소수점 이하 몇 자리까지 계산되는지는 컴퓨터의 성능과 실행 환경에 따라 달라진다. 예를 들어, 1/3은 상황에 따라 0.333333, 0.333333333, 혹은 0.333333333333으로 표현될 수 있다. 이런 이유로 유한 소수를 부동소수점, 즉 고정되지 않은 소수라 부른다.

print(type(-9.74))
print(type(3.141592))
<class 'float'>
<class 'float'>

문자열

문자열(String)은 컴퓨터에서 '파이썬 좋아요;-)', "Hello, World!"처럼 키보드로 입력할 수 있는 문자, 숫자, 기호의 조합을 하나의 값으로 다룬 것으로, 반드시 작은따옴표(')나 큰따옴표(")로 감싸야 하며, 자료형은 str이다.

예를 들어, 정수 17과 문자열 '17'은 서로 다른 종류의 값이다. 정수 17은 더 이상 나눌 수 없는 하나의 값이지만 문자열 '17''1''7' 두 개의 문자로 이루어진 값이므로, 숫자와 문자열은 겉보기에는 같아 보여도 본질적으로 다른 데이터임을 이해하는 것이 중요하다.

print(type('17'))
print(type(17))
<class 'str'>
<class 'int'>

부울값

참과 거짓을 의미하는 TrueFalse부울값Boolean value 또는 진릿값이라 하며, 자료형은 bool이다. TrueFalsebool 자료형을 갖는 유일한 두 개의 값이다.

print(type(True))
print(type(False))
<class 'bool'>
<class 'bool'>

리스트

리스트는 여러 개의 값으로 구성된 목록을 가리키는 값이다. 리스트에 포함된 각각의 값은 항목item이라 부른다. 리스트는 대괄호([]) 로 항목들의 목록을 감싸고, 각각의 항목은 쉼표(,) 로 구분한다. 예를 들어, 1부터 5까지의 정수로 구성된 리스트를 가리키는 변수 one2five를 다음과 같이 정의한다.

one2five = [1, 2, 3, 4, 5]

반면 아래 name_list 변수는 6명의 이름 문자열로 구성된 리스트를 가리킨다.

name_list = ['김강현', '황현', '남세원', '최흥선', '김현선', '함중아']

리스트에 포함된 항목들이 반드시 동일한 종류의 값일 필요는 없다. 예를 들어, 아래 리스트는 김강현의 이름, 전화번호, 나이, 키, 출생지로 구성된 리스트를 가리키는 kgh 변수를 정의한다. 항목중에 이름, 전화번호, 출생지는 문자열, 나이는 정수, 키는 부동소수점이다.

kgh = ['김강현', '010-1234-5678', 20, 172.3, '제주']

리스트의 자료형은 포함된 항목과 무관하게 항상 list이다.

print(type(one2five))
print(type(name_list))
print(type(kgh))
<class 'list'>
<class 'list'>
<class 'list'>

2.1.1예제

(1) 아래 값들의 자료형(Type)을 type() 함수를 사용하여 확인하고 설명하라.

  • 100

  • 100.0

  • "100"

답:

print(type(100))
print(type(100.0))
print(type("100"))
<class 'int'>
<class 'float'>
<class 'str'>

설명:

  • 100은 정수(int)

  • 100.0은 소수점이 있으므로 부동소수점(float)

  • "100"은 따옴표로 감싸져 있으므로 문자열(str)

(2) True"True"의 차이를 type() 함수를 이용해 설명하라.

답:

print(type(True))
print(type("True"))
<class 'bool'>
<class 'str'>

설명:

  • True는 부울값(bool)

  • "True"는 따옴표로 감싸져 있으므로 문자열(str)

(3) 리스트 안에 또 다른 리스트를 포함할 수 있다. 아래 코드를 실행하고 결과를 설명하라.

nested_list = [1, 2, ['a', 'b', 'c']]
print(nested_list)
[1, 2, ['a', 'b', 'c']]

답:

리스트는 항목으로 어떠한 종류의 값도 가질 수 있으며, 리스트 자체도 값이므로 리스트의 항목이 될 수 있다. 이를 중첩 리스트(Nested List)라고 한다.

2.1.2연습문제

(1) 다음 값들의 자료형을 예측하고 코드로 확인하라.

  • -3.14

  • '3.14'

(2) 강현이가 좋아하는 정수 숫자와 즐겨 먹는 과일이 각각 7과 사과이고, 강현이의 체중은 58.3kg이다.

가. 강현이에 대한 세 가지 정보를 차례대로 항목으로 갖는 리스트를 kgh_info 변수에 할당하고 출력하라.

나. kgh_info 변수가 가리키는 리스트의 자료형이 포함된 항목의 자료형과 상관이 없음을 확인하라.

(3) 아래 코드에서 정의된 nested_list 변수가 가리키는 값의 자료형을 확인하라.

nested_list = [1, 2, ['a', 'b', 'c']]

2.2연산과 연산자

연산

연산operation은 일반적으로 정수, 유리수, 실수 등을 대상으로 하는 덧셈·뺄셈·곱셈·나눗셈 같은 사칙연산이나 크기를 비교하는 연산을 의미한다. 그러나 컴퓨터 프로그래밍에서는 이보다 더 넓은 범위의 연산이 가능하다. 정수와 부동소수점뿐만 아니라 문자열, 리스트와 같은 다양한 데이터 유형에 대해서도 각각의 특성에 맞는 고유한 연산이 지원되며, 이를 통해 프로그래밍 언어는 숫자 계산을 넘어 텍스트 처리나 자료 조작까지 폭넓게 다룰 수 있다.

연산자

연산자operator는 연산을 수행할 때 사용하는 기호를 말한다.

예를 들어, 2와 3을 더하는 연산은 2 + 3으로 표현하며 여기서 +는 덧셈 연산자이다. 또, 3.14에서 2.3을 빼는 연산은 3.14 - 2.3으로 나타내며 이때 -는 뺄셈 연산자이다. 즉, 연산자는 값들을 대상으로 특정한 계산을 수행하도록 지시하는 기호라고 이해할 수 있다.

프로그래밍에서 가장 많이 사용되는 연산자는 다음과 같다.

  • 사칙 연산자: +, -, *, /

  • 동치 여부 판단 연산자: ==, !=

  • 크기 비교 연산자: <, <=, >, >=

언급된 연산자들은 정수나 부동소수점에 사용될 때 우리가 익숙하게 알고 있는 덧셈, 뺄셈과 같은 일반적인 연산으로 동작한다. 그러나 프로그래밍에서는 이 연산자들이 숫자뿐만 아니라 문자열이나 리스트 같은 다른 종류의 값에도 적용될 수 있으며, 이때는 값의 성격에 따라 연산 방식이 달라진다.

예를 들어, 문자열과 리스트에서 + 연산자는 두 문자열 또는 두 리스트를 이어붙이는 역할을 한다. 즉, 같은 연산자라도 어떤 데이터와 함께 쓰이느냐에 따라 의미와 결과가 달라진다는 점이 프로그래밍의 중요한 특징이다.

연산 결과

정수와 부동소수점을 이용한 사칙연산의 결과가 새로운 정수나 부동소수점이 되는 것처럼, 모든 연산의 결과 역시 하나의 값이다. 따라서 연산을 통해 얻어진 결과도 변수에 저장하여 필요할 때 활용할 수 있다.

onePtwo = 1 + 2
result = onePtwo * 7
print(result)
21

이처럼 프로그래밍의 핵심은 주어진 값을 이용하여 원하는 새로운 값을 생성하는 다양한 방식과 절차를 묘사하는 과정이다. 이제부터 일반적으로 사용되는 숫자들의 사칙연산과는 다르게 작동하지만 기초적이며 매우 중요한 연산 몇 가지를 살펴 본다.

2.2.1예제

(1) 섭씨 온도(C)를 화씨 온도(F)로 변환하는 공식은 다음과 같다.

F = C * 1.8 + 32

가. 변수 celsius에 25도를 할당하고, 위 공식을 이용하여 화씨 온도를 계산해 fahrenheit 변수에 할당하라.

답:

섭씨 온도를 가리키는 celsius에 25를 할당하고, 화씨로 변환된 값을 가리키는 fahrenheit 변수를 다음과 같이 정의한다.

celsius = 25                    # 섭씨 온도
fahrenheit = celsius * 1.8 + 32 # 화씨 온도

나. print() 함수를 이용하여 다음과 같이 출력되도록 한다.

섭씨: 25 -> 화씨: 77.0

답:

print() 함수에 쉼표로 구분된 문자열과 변수를 인자로 적절히 활용한다.

print("섭씨:", celsius, "-> 화씨:", fahrenheit)
섭씨: 25 -> 화씨: 77.0

(2) 우유 한 팩 가격은 820원이고, 아이스크림 한 개 가격은 1500원이다. 아이스크림은 3 개 이상 구입하면 5% 할인해준다. 우유 2 팩과 아이스크림 3 개를 구입할 때 지불해야 하는 가격을 다양한 변수를 활용하여 계산하는 코드를 작성하려 한다.

가. 우유 가격과 구입 개수, 아이스크림 가격과 구입 개수, 할인율을 변수로 지정한다. 변수명은 아래 표를 참고한다.

변수설명
milk_price우유 한 팩 가격
icecream_price아이스크림 한 개 가격
discount_rate아이스크림 3 개 이상 구입시 할인율
milk우유 구입 개수
icecream아이스크림 구입 개수

답:

아래 코드는 각각 우유 한 팩 가격, 아이스크림 한 개 가격, 할인율, 우유 구입 개수, 아이스크림 구입 개수 등을 가리키는 다섯 개의 변수를 정의한다.

milk_price = 820       # 우유 한 팩 가격
icecream_price = 1500  # 아이스크림 한 개 가격
discount_rate = 0.05   # 아이스크림 3개 이상 구입시 할인율

milk = 2               # 우유 2팩 구입
icecream = 3           # 아이스크림 3개 구입

나. 우유 두 팩 가격과 아이스크림 세 개 구입가격을 각각 할당받는 두 개의 변수 milk_totalicecream_total을 정의하라.

답:

아이스크림을 세 개 구입하여 할인을 받을 수 있기에 할인을 적용한다. 할인율이 5%이기에 0.95를 곱한 값이 할인된 가격이다.

milk_total = milk_price * milk # 우유 총 가격
icecream_total = icecream_price * icecream * (1 - discount_rate) # 할인 적용 아이스크림 총 가격

다. 최종적으로 지불해야 하는 돈을 할당받는 변수 total_price를 정의하라.

답:

앞서 구한 두 값을 단순히 더하면 된다.

total_price = milk_total + icecream_total

라. print() 함수를 활용하여 아래 문장을 화면에 출력하는 코드를 작성하라.

우유 2 개,  아이스크림 3 개 가격: 5915.0 원

답:

print() 함수에 쉼표로 구분된 문자열과 변수를 인자로 적절히 활용한다.

print("우유", milk, "개, ", "아이스크림", icecream, "개", "가격:", total_price, "원")
우유 2 개,  아이스크림 3 개 가격: 5915.0 원

2.2.2연습문제

(1) 체질량지수(BMI, Body Mass Index)는 키와 체중을 이용해 비만도를 간단히 평가하는 지표로, 체중(kg)을 키(m)의 제곱으로 나눈 값이다. 즉, 다음 식으로 체질량지수를 계산한다.

BMI = 체중 ÷ (키²)

몸무게가 80kg이고 키가 1.8m인 사람의 BMI를 계산하여 다음과 같이 출력하는 코드를 작성하라.

키 1.8 m, 몸무게 80 kg인 사람의 BMI: 24.691358024691358

힌트: weight, height, bmi 세 개의 변수와 거듭제곱 연산자 **를 활용한다.

(2) 한 쌍의 변이 서로 평행한 사다리꼴의 넓이를 구하는 공식은 다음과 같다.

(윗변 + 아랫변) * 높이 / 2

윗변(top)이 5, 아랫변(bottom)이 9, 높이(height)가 4인 사다리꼴의 넓이(area)를 계산하여 출력하는 코드를 작성하라.

2.3비교 연산자

비교 연산은 두 값의 동치 여부를 판단하는 연산과 크기를 비교하는 연산으로 나뉜다. 먼저 동치 여부를 확인하는 연산자를 살펴본 뒤, 이어서 크기를 비교하는 연산자를 설명한다.

2.3.1동치 여부 판단 연산자

동치 여부 판단 연산은 두 개의 값이 주어졌을 때 두 값이 동일한지 아닌지 여부를 판단하며, 다음 두 가지 방식으로 표현된다. 아래 표에서 ab는 임의의 값을 가리킨다.

동치 여부 판단 연산의미
a == ba와 b가 동일한 값일 때 True로, 서로 다른 값일 때 False로 계산
a != ba와 b가 서로 다른 값일 때 True로, 동일한 값일 때 False로 계산

예를 들어 아래 코드는 4를 4.0으로 나눈 값이 1과 동일한 값인지를 판단한다. 이유는 4/4.0이 1.0으로 계산되고, 1과 1.0을 파이썬은 동일하다고 취급하기 때문이다. 따라서 아래 코드는 최종적으로 True로 계산된다.

1 == 4/4.0
True

반면에 다음 동치 여부 판단 코드는 False로 계산된다. 이유는 1.1과 4/4.0이 의미하는 1.0은 동일한 값이 아니기 때문이다.

1.1 == 4/4.0
False

연산자 !=는 주어진 두 값이 서로 다른 값인지 여부를 판단한다. 즉, 두 값이 다를 때 True, 다르지 않을 때 False로 계산된다. 예를 들어, 1과 2는 서로 다른 값이기에 아래 코드는 True로 계산된다.

1 != 2
True

반면에 1과 4/4.0이 의미하는 1.0은 동일한 값이기에 아래 코드는 False로 계산된다.

1 != 4/4.0
False

문자열과 리스트 동치 여부 판단

두 문자열의 동치 여부는 글자 하나하나, 리스트 동치 여부는 항목과 순서까지 모두 같아야 True가 된다. 아래 표는 이러한 동치 여부 판단 연산자가 문자열과 리스트에서 어떻게 적용되는지를 간단한 예제와 함께 보여준다.

값의 종류코드 예시결과설명
문자열"apple" == "apple"True두 문자열이 동일하므로 참
문자열"Python" == "python"False대소문자가 달라서 다른 값
문자열"hello" != "world"True두 문자열이 서로 다름
리스트[1, 2, 3] == [1, 2, 3]True항목과 순서가 모두 같음
리스트[1, 2, 3] == [3, 2, 1]False항목은 같지만 순서가 달라서 다른 값
리스트["a", "b"] != ["a", "c"]True두 번째 항목이 달라서 서로 다름

2.3.2크기 비교 연산자

크기 비교 연산은 두 개의 값이 주어졌을 때 어떤 값이 더 큰지, 작은지 등을 판단할 때 활용되며, 다음 네 가지 방식으로 표현된다. 아래 표에서 ab는 임의의 값을 가리킨다.

크기 비교 연산의미
a < ba가 b보다 작을 때 True로, 아니면 False로 계산
a <= ba가 b보다 작거나 같을 때 True로, 아니면 False로 계산
a > ba가 b보다 클 때 True로, 아니면 False로 계산
a >= ba가 b보다 크거나 같을 때 True로, 아니면 False로 계산

숫자와 함께 사용되는 크기 비교연산은 일반적으로 알려진 방식과 동일하게 작동한다. 예를 들어 3이 4보다 크기 않기 때문에 아래 코드는 False로 계산된다.

3 > 4
False

반면에 아래 두 코드 모두 True로 계산됨을 바로 알 수 있다.

3 >= 4 - 1
True
3 >= 4 - 2
True

연산자 < 와 연산자 <= 또한 두 개의 숫자를 비교할 때 상식적으로 작동한다. 예를 들어 아래 코드는 False로 계산된다. 이유는 3/2 + 1.2는 2.7로 계산되고 3/2는 1.5로 계산되는데 2.7은 1.5보다 작지 않기 때문이다.

3/2 + 1.2 < 3/2
False

반면에 아래 두 코드는 True로 계산된다.

2.3 < 1.8 + 3.2
True
2.3 <= 1.8 + 0.5
True

2.3.3논리식

동치 여부 판단 연산과 크기 비교 연산의 결과는 논리적 참 또는 거짓을 나타내는 값인 True 또는 False 두 가지 부울값 중 하나다.

이처럼 결과가 부울값으로 나타나는 표현식을 일반적으로 논리식Boolean expression이라 부른다. 논리식은 프로그램의 흐름을 제어하거나 조건을 판별하는 데 핵심적인 역할을 한다. 앞으로 if 조건문, for 반복문, while 반복문 등에서 특정 코드를 "실행할지 말지"를 가르는 기준으로 논리식이 활용되는 다양한 방식을 학습할 예정이다.

2.3.4예제

(1) 아래 내용의 논리식을 할당받는 변수 three_four_neq을 정의한 후에 three_four_neq에 할당된 진리값을 확인한다.

3과 4가 다른지 여부 판단

답:

아래 코드는 두 값이 다른지 여부는 != 연산자를 이용하여 표현한다.

three_four_neq = 3 != 4
print(three_four_neq)
True

(2) 15, 28이 각각 짝수인지 또는 홀수인지를 판별하는 논리식을 가리키는 두 변수 is_even_15is_even_28을 정의하라. 또한 코드를 실행하면 아래 형식으로 화면에 출력되도록 한다.

15는 짝수인가요? False  
28은 짝수인가요? True

힌트: 짝수는 2로 나눴을 때 나머지가 0이며, 나머지 연산자 %를 활용한다. 참고로 홀수와 짝수는 영어로 odd number와 even number라 한다.

답:

아래 코드는 15를 2로 나눴을 때의 나머지를 계산한다.

15 % 2
1

따라서 15가 짝수인지 여부는 15 % 2 == 0True로 계산되는가에 의해 판단된다.

is_even_15 = 15 % 2 == 0
print(is_even_15)
False

동일한 방식으로 28이 짝수인지 여부를 판단한다.

is_even_28 = 28 % 2 == 0
print(is_even_28)
True

아래 코드는 두 개의 변수를 활용하여 지정된 문장을 화면에 출력한다.

print("15는 짝수인가요?", is_even_15)
print("28는 짝수인가요?", is_even_28)
15는 짝수인가요? False
28는 짝수인가요? True

(3) 현재 지갑에 5000원이 있다. 개당 1200원인 과자를 4개 사려 할 때, 살 수 있는지 여부를 판단하는 코드를 작성하라.

답:

지갑(wallet), 과자 개당 가격(snack_price), 과자 개수(quantity)를 가리키는 세 개의 변수를 먼저 선언한다.

wallet = 5000
snack_price = 1200
quantity = 4

아래 코드의 is_affordable 변수는 지갑에 있는 돈으로 4 개의 과자를 살 수 있는지 여부를 판단한다.

is_affordable = wallet >= snack_price * quantity
print("과자 4 개를 살 수 있다?", is_affordable)
과자 4 개를 살 수 있다? True

2.3.5연습문제

(1) 아래 내용의 논리식을 할당받는 변수 five_seven_ge을 선언한 후에 five_seven_ge에 할당된 진리값을 확인하라.

5가 7보다 크거나 같은지 여부 판단

(2) 정수 1233의 배수인지 확인하는 논리식 is_multiple_of_3을 작성하여 실행하는 코드를 작성하라.

힌트: 어떤 수가 3의 배수라면 3으로 나눈 나머지가 0이어야 한다.

(3) 키(신장)가 120cm 이상이어야 탑승이 가능한 놀이기구가 있다. 현재 키가 112cm인 어린이가 매년 2.5cm씩 자란다고 가정할 때, 3년 뒤에는 이 놀이기구에 탑승할 수 있는지 여부를 가리키는 변수 can_ride를 활용하여 판단하는 코드를 작성하라.

2.4사전식 비교

두 값의 비교 연산은 정수, 부동소수점 뿐만 아니라 문자열과 리스트에에 대해서도 가능하다. 두 개의 문자열 비교와 두 개의 리스트 비교는 사전식 비교lexicographic comparison를 활용한다. 사전식 비교란 문자열이나 리스트의 요소를 앞에서부터 차례대로 비교하여 크기를 판단하는 방법이다.

2.4.1유니코드 코드 포인트

사전식으로 두 문자열 중에 누가 더 큰지를 판단하려면 먼저 한글 자모, 영어 알파벳 등의 순서가 지정되어 있어야 한다. 한글 자모와 영어 알파벳은 우리가 알고 있는 순서와 동일하다. 예를 들어, 'ㄱ''ㄴ'보다, '가''나'보다, 'ㅏ''ㅑ'보다, 'a''b'보다 작다.

'ㄱ' < 'ㄴ'
True
'가' < '나'
True
'ㅏ' < 'ㅑ'
True
'a' < 'b'
True

반면에 'ㄱ''ㄲ'을 비교하거나, 자음 'ㅎ'과 모음 'ㅏ'을 비교하는 간단하지 않은데, 이때 해당 문자들의 유니코드 코드 포인트를 비교한다.

먼저 유니코드Unicode는 전 세계 모든 문자를 하나의 표준 체계로 정의해 각 문자에 고유한 번호를 부여하는 국제 문자 인코딩 표준체계다. 각 문자에 부여된 고유 번호를 유니코드 코드 포인트Unicode code point 또는 단순히 코드 포인트라고 한다.

예를 들어, 한글 자음 'ㄱ', 'ㄲ', 'ㅎ', 'ㅏ'의 코드 포인트는 각각 U+3131, U+3132, U+314E, U+314F이다. U+에 이어서 사용된 수는 16진법으로 표현된 수이며 10진법으로 변환하면 각각 12593, 12594, 12622, 12623이 된다.

문자의 코드 포인트는 다음과 같이 ord() 함수를 이용하여 확인한다.

ord('ㄱ')
12593
ord('ㄲ')
12594
ord('ㅎ')
12622
ord('ㅏ')
12623

영어 알파벳의 코드 포인트는 다음과 같다. 소문자 알파벳의 코드 포인트가 대문자 알파벳의 그것보다 큼에 주목한다.

문자코드 포인트
a97
z122
A65
Z90

결론적으로 한글 자모와 영어 알파벳의 순서는 해당 문자의 코드 포인트 값에 의해 결정된다. 즉, 코드 포인트 값의 크기가 곧 문자의 순서를 결정한다. 이런 이유로 영어 소문자 알파벳은 임의의 대문자 알파벳보다 크다고 판단된다.

'a' > 'A'
True
'Z' < 'b'
True

2.4.2문자열 크기 비교

임의의 두 문자열의 크기 비교는 사전식으로 이뤄진다. 사전식 문자열 크기 비교의 판단 기준을 정리하면 다음과 같다.

  1. 두 문자열을 첫 번째 문자부터 차례대로 비교

  2. 다른 문자를 발견하면 즉시 두 문자열의 크기 비교 판단

    • 같은 위치에서 다른 문자가 나오면, 그 문자들의 크기에 따라 전체 문자열의 크기 비교 판단

    • 각 문자의 크기는 유니코드 포인트 값으로 크기 비교.

  3. 한 문자열이 다른 문자열의 앞부분과 일치하면 짧은 문자열이 더 작다고 판단

아래 표는 두 문자열의 사전식 크기 비교가 어떻게 적용되는지를 간단한 예제와 함께 보여준다.

비교 표현결과설명
'가나다' < '나다'True'가나다’는 '나다’보다 앞선다
'도장' < '서명'True'도장’은 '서명’보다 앞선다
'apple' < 'banana'True'apple’은 'banana’보다 앞선다
'baseball' < 'basic'True'baseball’은 'basic’보다 앞선다
'도장' < '고무도장'False'도장’은 '고무도장’보다 뒤에 있다
'nano banana' < 'banana'False'nano banana’는 'banana’보다 뒤에 있다
'apple' > 'Apple'True소문자 'a’는 대문자 'A’보다 크다
'a' > 'Hello'True소문자 'a’는 대문자 'H’보다 크다
'hello' > 'Hi'True소문자 'h’는 대문자 'H’보다 크다

2.4.3리스트 크기 비교

리스트 크기 비교 또한 사전식 비교 방식으로 이루어진다. 아래 표는 리스트에서 사전식 크기 비교가 어떻게 적용되는지를 간단한 예제와 함께 보여준다.

비교 코드결과설명
[1, 2, 3] < [1, 2, 4]True앞의 1, 2는 같고, 3 < 4 이므로 참
[1, 2] < [1, 2, 3]True앞부분은 같고, 짧은 리스트가 더 작은 값으로 취급됨
[2, 0] >= [1, 100]True첫 번째 항목 2 > 1 이므로 바로 참
["dog", 10, "pig"] < ["dog", 5]False첫 번째 항목 "dog"은 같고, 두 번째 항목 “cat” > “bird”
["A", "b", "가"] > ["A", "b", "나"]False앞의 “A”, "b"는 같고, “가” < “나” 비교에서 참

2.4.4예제

(1) 대문자 'Z'와 소문자 'a'의 크기를 비교하면 사람이 생각하는 알파벳 순서와 다르다. 'Z' < 'a'True인지 False인지 예측하고, ord() 함수를 이용해 컴퓨터가 그렇게 판단하는 이유를 설명하라.

답:

소문자 'a'의 유니코드 코드 포인트(97)가 대문자 'Z'의 코드 포인트(90)보다 크다. 따라서 사전식 순서로는 대문자 'Z'가 소문자 'a'보다 앞선다(작다).

print("'Z' < 'a':", 'Z' < 'a')
print("'Z'의 코드 포인트:", ord('Z'))
print("'a'의 코드 포인트:", ord('a'))
'Z' < 'a': True
'Z'의 코드 포인트: 90
'a'의 코드 포인트: 97

(2) 아래 내용의 논리식을 할당받는 변수 hello_hi_eq를 정의한 후에 hello_hi_eq에 할당된 진리값을 확인한다.

"hello"와 "hi"가 같은지 여부

답:

아래 코드는 두 값이 동일한지 여부는 == 연산자를 이용하여 표현한다.

hello_hi_eq = "hello" == "hi"
print(hello_hi_eq)
False

(3) 리스트 [2, 0][1, 100]을 비교할 때, 뒤의 항목(0100)은 무시되고 첫 번째 항목만으로 크기가 결정된다. 이를 코드로 확인하고 이유를 설명하라.

답:

사전식 비교는 앞에서부터 차례대로 비교한다. 첫 번째 항목 21보다 크기 때문에, 뒤에 오는 숫자의 크기와 상관없이 [2, 0]이 더 크다고 판단한다.

list_a = [2, 0]
list_b = [1, 100]
print("list_a > list_b:", list_a > list_b)
list_a > list_b: True

2.4.5연습문제

(1) 문자열로 된 숫자 '10''2'의 크기를 비교하면 10이 2보다 크다는 수학적 상식과 다른 결과가 나온다. 그 결과를 예측하고, 왜 그런 결과가 나오는지 ord() 함수를 활용해 첫 글자를 비교하며 설명하라.

(2) 아래 내용의 논리식을 할당받는 변수 Hello_hello_lt를 선언한 후에 Hello_hello_lt에 할당된 진리값을 확인하라.

"Hello"가 "hello" 보다 작은지 여부

참고: 두 문자열 사이의 크기비교가 가능하다. 알파벳 순서로 하며 대문자가 소문자보다 작다고 판단된다.

(3) 리스트 [1, 2, -100][1, 2]를 비교하면, 음수가 포함되어 있음에도 불구하고 앞의 리스트가 더 크다고 나온다. 이 현상을 리스트의 길이와 사전식 비교 원리를 들어 설명하라.

2.5문자열과 리스트 연산

사칙연산에 사용되는 기호 중에서 연산자 +*는 문자열과 리스트에 적용될 때 특별한 방식으로 동작한다. +는 두 값을 이어붙이는 연산으로, *는 특정 횟수만큼 복제한 뒤 이어붙이는 연산으로 해석된다. 이 두 연산자 이외에 리스트와 문자열 고유의 연산 두 종류를 함께 소개한다.

2.5.1이어붙이기

문자열 이어붙이기

문자열 두 개에 대해 + 연산자를 적용하면 단순히 두 문자열을 이어붙인 문자열이 계산된다. 아래 코드를 실행하면 '파이썬, ''안녕' 두 문자열을 이어붙이는 연산 결과가 확인된다.

'파이썬, ' + '안녕!'
'파이썬, 안녕!'

아래 코드는 변수를 활용한 동일한 연산을 보여준다.

first = '파이썬, '
second = '안녕!'
greetings = first + second
greetings
'파이썬, 안녕!'

리스트 이어붙이기

리스트에 대해서도 유사하게 작동한다. 아래 코드는 리스트 이어붙이기 연산의 작동법을 보여주기 위해 먼저 다음과 같이 리스트를 가리키는 변수 first_languagessecond_languages를 정의한다.

first_languages = ['파이썬', 'C', '자바']
second_languages = ['C++', 'C#', '자바스크립트', 'Node.js']

아래 코드는 first_languagessecond_languages가 가리키는 문자열에 대해 + 연산의 결과를 languages 변수에 할당한다.

languages = first_languages + second_languages
languages
['파이썬', 'C', '자바', 'C++', 'C#', '자바스크립트', 'Node.js']

변수를 이용하지 않고 두 리스트를 바로 이어붙여도 된다.

['파이썬', 'C', '자바'] + ['C++', 'C#', '자바스크립트', 'Node.js']
['파이썬', 'C', '자바', 'C++', 'C#', '자바스크립트', 'Node.js']

2.5.2복제

문자열 또는 리스트를 정수와의 곱셈 형식으로 연산을 실행하면 주어진 문자열 또는 리스트를 지정된 정수만큼 복제해서 이어붙인 문자열 또는 리스트로 계산된다. 예를 들어, 아래 코드는 greetings 변수가 가리키는 문자열 '파이썬, 안녕!을 세 번 복제해서 단순히 이어붙인 문자열을 계산한다. greetings * 3

greetings * 3
'파이썬, 안녕!파이썬, 안녕!파이썬, 안녕!'

정수와 문자열의 순서를 바꿔도 동일한 결과를 얻는다.

3 * greetings
'파이썬, 안녕!파이썬, 안녕!파이썬, 안녕!'

리스트에 대해서도 유사하게 작동한다. 예를 들어, 아래 코드는 3개의 항목을 갖는 리스트를 가리키는 first_languages 변수와 2에 대해 * 연산자를 적용한 결과를 보여준다. 연산 결과는 first_languges 변수가 가리키는 리스트 ['파이썬', 'C', '자바']를 두 번 복제해서 이어붙인, 6개의 항목을 갖는 리스트이다.

first_languages * 2
['파이썬', 'C', '자바', '파이썬', 'C', '자바']
2 * first_languages
['파이썬', 'C', '자바', '파이썬', 'C', '자바']

2.5.3멤버십(항목 여부)

문자열과 리스트는 여러 항목으로 이루어진 값이다. 특정 값이 문자열이나 리스트에 항목으로 사용되었는지 여부, 즉 멤버십을 확인할 때는 in 연산자를 사용한다.

문자열 in 연산자

문자열에 특정 문자나 기호가 항목으로 포함되어 있는지 여부는 in 연산자를 이용하여 확인한다. 연산 결과는 포함되어 있는지 여부에 따라 True 또는 False 부울값이다. 아래 코드는 다양한 예제를 통해 greetings 변수가 가리키는 문자열에 포함된 지정된 기호와 문장의 포함여부를 판정해 준다.

'!' in greetings
True
'?' in greetings
False
'파' in greetings
True

앞서 설명한 바대로 공백 문자 또한 포함되어 있다.

' ' in greetings
True

문자열 not in 연산자

not in 연산자는 항목이 아닌지 여부를 판단한다. 즉, 항목이 아니면 True, 항목이면 False로 계산된다.

'?' not in greetings
True
' ' not in greetings
False

부분 문자열 여부

문자열 in 연산자는 하나의 문자나 기호만이 아니라 부분 문자열 여부도 판단한다. 예를 들어, 아래 코드는 '파이썬''파이썬, 안녕!'에 부분 문자열로 포함되어 있음을 확인해준다.

'파이썬' in greetings
True
', ' in greetings
True

문자나 기호가 연속적으로 이어진 경우에만 부분 문자열로 인정된다. 예를 들어, '파''썬'이 모두 '파이썬, 안녕!'에 포함되어 있다 하더라도 '파썬'은 부분 문자열로 인정받지 못한다.

'파썬' in greetings
False

not in 연산자 또한 부분 문자열 여부를 반대로 판단한다.

'파썬' not in greetings
True

'파이썬 안녕'도 마찬가지로 부분 문자열이 아니다.

'파이썬 안녕' not in greetings
True

리스트 in 연산자

리스트에 항목으로 포함되어 있는지 여부는 in 연산자를 이용하며 결과는 부울값으로 계산된다. 예를 들어 파이썬은 first_languages가 가리키는 리스트에 포함되어 있고, 자바는 second_languages가 가리키는 리스트에 포함되어 있지 않다.

'파이썬' in first_languages
True
'자바' in second_languages
False

리스트 in 연산자는 항목이 온전히 찾는 값과 일치할 때에만 True로 계산한다. 따라서, 항목이 문자열인 경우 부분 문자열로의 포함 여부는 모두 False로 간주한다.

'파이' in first_languages
False

리스트 not in 연산자

not in 연산자는 리스트에 대해서도 항목이 아닌지 여부를 판단한다. 즉, 항목이 아니면 True, 항목이면 False로 계산된다.

'파이썬' not in first_languages
False
'자바' not in second_languages
True
'파이' not in first_languages
True

2.5.4인덱싱

인덱스와 인덱싱

문자열은 여러 문자나 기호가 순서대로 나열된 값이며, 리스트는 여러 값이 모여 있는 자료형이다. 문자열의 각 문자와 리스트의 각 항목은 위치를 나타내는 번호를 통해 접근할 수 있다. 이 번호를 인덱스index 라고 부르며, 맨 왼쪽에 있는 항목부터 차례대로 0, 1, 2 … 와 같은 정수 번호가 부여된다.

예를 들어, "Python" 문자열에 포함된 각 문자의 인덱스는 다음과 같다.

항목Python
인덱스012345

리스트 [10, 20, 30, 40, 50]에 포함된 각 항목의 인덱스는 다음과 같다.

항목1020304050
인덱스01234

음의 정수도 인덱스로 사용할 수 있다. 맨 오른쪽에 위치한 항목부터 왼쪽으로 이동하면서 차례대로 -1, -2, -3 등의 음의 인덱스를 갖는다.

문자열 "Python"에 포함된 각 문자에 대한 음수 인덱스는 다음과 같다.

항목Python
인덱스-6-5-4-3-2-1

반면에 리스트 [10, 20, 30, 40, 50]에 포함된 각 항목에 대한 음수 인덱스는 다음과 같다.

항목1020304050
인덱스-5-4-3-2-1

인덱스를 사용하면 문자열이나 리스트에서 원하는 위치의 항목을 확인하고 활용할 수 있다. 이러한 과정을 인덱싱indexing이라고 부른다. 인덱싱은 대괄호([]) 연산자를 이용하여 수행한다.

문자열 인덱싱

설명을 위해 문자열 김강현 을 변수 kgh에 할당해보자.

kgh = '김강현'
print(kgh)
김강현

문자열 김강현에서 은 0번 인덱스의 항목이다.

kgh[0]
'김'

반면에 은 문자열 김강현의 2번 인덱스의 항목이다.

kgh[2]
'현'

리스트 인덱싱

리스트 인덱싱 또한 유사하게 작동한다. 설명을 위해 name_list가 가리키는 리스트를 활용한다.

print(name_list)
['김강현', '황현', '남세원', '최흥선', '김현선', '함중아']

가장 왼쪽에 위치한 항목, 즉 0번 인덱스의 항목을 확인하는 방법은 다음과 같다.

print(name_list[0])
김강현

왼쪽에서 세번째 항목은 인덱스가 2이기에 다음과 같이 확인한다.

print(name_list[2])
남세원

음수 인덱스 활용

문자열이나 리스트에서 오른쪽 끝에 있는 항목을 양수 인덱스로 지정하려면 전체 항목의 개수를 알아야 한다. 그러나 음수 인덱스를 사용하면 항목의 개수를 알지 못해도 마지막 요소를 손쉽게 가져올 수 있다. 예를 들어 name_list가 가리키는 리스트의 가장 오른쪽에 위치한 항목은 음수 -1을 인덱스로 지정하여 확인한다.

print(name_list[-1])
함중아

오른쪽 끝에서 두 번째 항목의 인덱스는 -2이며, name_list에 적용하면 '김현선'으로 확인된다.

print(name_list[-2])
김현선

문자열에 대해서도 동일한 방식으로 음수 인덱스를 활용할 수 있다. 문자열 '김강현'의 마지막 문자는 음수 인덱스 -1로 확인된다.

print(kgh[-1])

아래 코드는 문자열 '파이썬, 안녕!'에 포함된 마지막 문자인 느낌표라는 사실을 확인해준다.

print('파이썬, 안녕!'[-1])
!

끝에서 3번째 문자는 '안'이다.

print('파이썬, 안녕!'[-3])

2.5.5예제

(1) 아래 표현식을 실행했을 때의 결과를 설명하라.

4 * '3.0'
'3.03.03.03.0'

답:

먼저 12.0이 아닌 따옴표로 감싸인 이상한 숫자 기호들의 나열이 계산됨에 주의한다. 실제로 세 개의 기호 '3', '.', '0'으로 구성된 문자열 '3.0'이 네 번 단순 반복된 문자열 '3.03.03.03.0'이 출력된다.

(2) 변수 greetings가 다음과 같이 정의된다.

greetings = '파이썬, 안녕!'

가. 문자열에 포함된 쉼표 기호 ,를 확인하는 인덱싱을 표현하는 수식을 정의하라.

답:

greetings[3]
','

나. 문자열에 포함된 느낌표 기호 !을 확인하는 인덱싱을 표현하는 수식을 정의하라.

답:

greetings[-1]
'!'

(3) 변수 scores는 세 개의 시험점수로 구성된 리스트를 할당받는다. 세 점수의 평균값을 계산하는 코드를 작성하라. 단, 인덱싱을 활용한다.

scores = [92, 87, 100]

답:

변수 scores가 시험점수로 구성된 리스트를 가리키기에 아래 코드에서처럼 시험점수의 평균값을 인덱싱을 이용하여 계산할 수 있다. 참고로 정수의 나눗셈 결과는 항상 부동소수점으로 처리됨에 주의한다.

mean = (scores[0] + scores[1] + scores[2]) / 3
print('평균값:', mean)
평균값: 93.0

(4) 리스트 [1, 2, 3]을 가리키는 변수 base_list를 이용하여 [1, 2, 3, 1, 2, 3, 4, 5] 형태의 리스트를 만드는 코드를 작성하라.

힌트: 복제와 이어붙이기 활용

답:

먼저 base_list 변수를 정의한다.

base_list = [1, 2, 3]

base_list를 두 번 복제한 후에 [4, 5] 리스트를 이어붙이면 원하는 리스트를 생성할 수 있다.

new_list = base_list * 2 + [4, 5]
print(new_list)
[1, 2, 3, 1, 2, 3, 4, 5]

(5) 변수 greetings가 가리키는 문자열 '파이썬, 안녕!'에 문자 '안'이 포함되어 있는지 확인하는 코드를 작성하라.

힌트: in 연산자 활용

답:

greetings = '파이썬, 안녕!'
'안' in greetings
True

(6) 변수 scores가 가리키는 리스트 [92, 87, 100]에 점수 100이 포함되어 있는지 확인하는 코드를 작성하라.

힌트: in 연산자 활용

답:

scores = [92, 87, 100]
100 in scores
True

(7) 문자열 '2026-3-27'을 가리키는 date 변수를 이용하여 연도, 월, 일을 각각 추출해서 다음과 같이 출력하는 코드를 작성하라.

연도: 2026
월: 3
일: 27

힌트: 인덱싱과 문자열 이어붙이기 연산 활용

답:

지정된 날짜를 가리키는 date 변수에 대한 인덱싱과, 인덱싱 결과를 이용한 문자열 이어붙이기 연산을 적용하면 된다.

date = '2026-3-27'
year = date[0] + date[1] + date[2] + date[3]
month = date[5]
day = date[7] + date[8]

print("연도:", year)
print("월:", month)
print("일:", day)
연도: 2026
월: 3
일: 27

문자열의 인덱스는 0부터 시작한다. 따라서 date 변수에 할당된 '2026-3-27' 문자열에서 연도는 인덱스 0부터 3, 월은 인덱스 5, 일은 인덱스 7과 8에 위치한다. 하이픈(-)이 위치한 인덱스 4와 6을 건너뛰고 필요한 문자만 인덱싱하여 + 연산자로 이어붙인다.

2.5.6연습문제

(1) 아래 표현식을 실행했을 때의 결과를 설명하라.

'3.14' + '2.71'
'3.142.71'

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

num_list = [3, 6, 9, 12, 15, 18, 21]

가. 리스트에 포함된 9를 확인하는 인덱싱을 표현하는 수식을 정의하라.

나. 리스트에 포함된 18을 확인하는 인덱싱을 표현하는 수식을 정의하라.

(3) 문자열 'Python'의 첫 글자와 마지막 글자를 서로 바꾼 새로운 문자열을 만드는 코드를 작성하라.

힌트: 인덱싱과 이어붙이기 활용

(4) 사용자 정보가 담긴 리스트 info가 다음과 같이 정의된다.

info = ['name', 'age', 'phone']

이 리스트가 3회 반복된 후 마지막에 'END' 항목이 추가된 리스트를 생성하는 코드를 작성하라.

(5) 변수 sentence가 가리키는 문자열 '파이썬 프로그래밍은 즐겁다'에 문자열 '어렵다'가 포함되어 있지 않은지 확인하는 코드를 작성하라.

단, not in 연산자를 활용한다.

(6) 변수 fruits가 가리키는 리스트 ['사과', '바나나', '포도']'오렌지'가 포함되어 있지 않은지 확인하는 코드를 작성하라.

단, not in 연산자를 활용한다.

(7) 변수 word'stressed' 문자열을 가리킬 때, 이 단어를 거꾸로 뒤집어 'desserts'로 출력하는 코드를 작성하라. 단, 문자열의 각 문자를 음수를 이용하여 인덱싱하여 이어붙여야 한다.

2.6연산자 우선순위

여러 종류의 연산자를 이용하여 값을 계산하는 식을 표현할 경우 연산자들 사이의 우선순위를 고려해야 의도한 대로 계산된다. 파이썬의 연산자 우선순위는 수학의 수치연산 규칙과 유사하며, 이는 문자열과 리스트 연산에도 적용된다.

2.6.1수치 연산 우선순위

사칙연산의 경우 수학에서와 마찬가지로 곱셈 *과 나눗셈 /이 덧셈 +과 뺄셈 -보다 우선순위가 높다. 아래 코드는 2와 3을 곱한 6에서 1을 뺀 값을 계산한다.

2 * 3 - 1
5

연산자의 우선순위에 반하는 연산 순서를 지정하려면 괄호 ()를 사용해야 한다. 예를 들어, 아래 코드는 3에서 1를 먼저 뺀 값에 2를 곱한 값을 계산한다. 이전 코드와 결과가 다름에 주의한다.

2 * (3 - 1)
4

몫과 나머지 연산은 곱셈, 나눗셈과 동일한 우선순위를 가지며, 따라서 덧셈과 뺄셈보다는 우선순위가 높다. 예를 들어, 아래 코드는 7을 2로 나눈 몫 3을 먼저 구하고 5를 더해 8을 계산한다.

5 + 7 // 2
8

아래 코드는 7을 2로 나눈 나머지 1을 먼저 구하고 5를 더해 6을 계산한다.

5 + 7 % 2
6

거듭제곱(**) 연산은 사칙연산보다 우선순위가 더 높다. 예를 들어, 아래 코드는 2의 3승인 8을 먼저 계산한 뒤에 3을 곱해 24를 계산한다.

3 * 2 ** 3
24

곱셈을 먼저 계산하려면 괄호를 이용해야 하며, 그러면 6의 3승인 216을 계산된다.

(3 * 2) ** 3
216

2.6.2문자열과 리스트 연산 우선순위

문자열과 리스트를 조작할 때 사용하는 + (이어붙이기)와 * (복제) 연산자 사이에도 우선순위가 적용된다. 수학에서 곱셈이 덧셈보다 먼저 계산되는 것처럼, 복제(*)가 이어붙이기(+)보다 먼저 계산된다.

다음은 문자열에 대한 예시다. '안녕!' 문자열이 먼저 3번 복제된 후, '파이썬, ' 문자열과 합쳐진다.

'파이썬, ' + '안녕!' * 3
'파이썬, 안녕!안녕!안녕!'

아래 코드를 실행하면 '파이썬, '은 3번, '안녕!'은 2번 각각 먼저 복제된 후에 합쳐진다.

'파이썬, ' * 3 + '안녕!' * 2
'파이썬, 파이썬, 파이썬, 안녕!안녕!'

리스트에 대해서도 동일한 규칙이 적용된다. 아래 코드를 실행하면 [30, 40, 50] 리스트가 먼저 2번 복제된 뒤, [10, 20] 리스트와 합쳐진다.

[10, 20] + [30, 40, 50] * 2
[10, 20, 30, 40, 50, 30, 40, 50]

아래 코드를 실행하면 두 리스트가 각각 2번 복제된 뒤에 합쳐진다.

[10, 20] * 2 + [30, 40, 50] * 2
[10, 20, 10, 20, 30, 40, 50, 30, 40, 50]

2.6.3비교 연산 우선순위

동치 여부나 크기를 비교하는 연산자는 산술 연산자보다 우선순위가 낮다. 따라서 수식이 포함된 비교문에서는 계산이 먼저 끝난 뒤에 동치 여부나 크기 비교가 이루어진다.

10 + 20 > 5 * 5
True

문자열 비교에서도 예를 들어 복제 연산이 동치 여부 판단 연산보다 먼저 수행된다.

'a' * 2 == 'aa'
True

2.6.4인덱싱 우선순위

인덱싱은 사칙 연산이나 이어붙이기, 복제보다 우선순위가 더 높다. 즉, 지정된 위치의 항목을 가져오는 인덱싱이 가장 먼저 수행된다. 아래 예제에서 문자열 'Python'의 0번 인덱스인 'P'를 먼저 가져온 후, 이를 3번 복제한다.

'Python'[0] * 3
'PPP'

만약 문자열 전체를 먼저 복제한 다음에 인덱싱을 적용하고 싶다면 괄호를 사용해야 한다.

('Python' * 2)[0]
'P'

리스트의 경우도 항목을 먼저 가져온 후 산술 연산을 수행한다. 아래 코드는 [1, 2, 3]에서 2번 인덱스인 3을 먼저 가져온 뒤, 10을 더해 13이 된다.

[1, 2, 3][2] + 10
13

2.6.5예제

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

number = 17

number의 세제곱을 2 + 3으로 나누면 982.6이 계산되어야 하는데 아래와 표현식을 이용하면 다른 값이 계산된다. 이유를 설명하라.

number**3 / 2 + 3
2459.5

답:

이유는 나눗셈 연산자 /의 우선순위가 덧셈 연산자 + 보다 높아서 위 수식은 아래 수식처럼 계산되기 때문이다.

(number**3 / 2) + 3
2459.5

아래 표현식처럼 2 + 3을 괄호로 감싸야 제대로 계산된다.

number**3 / (2 + 3)
982.6

(2) 아래 코드는 문자열 연산에서 곱셈(*)과 덧셈(+)의 우선순위를 보여준다. 실행 결과를 예측하고 설명하라.

'1' + '0' * 3

답:

곱셈(*)이 덧셈(+)보다 우선순위가 높기 때문에 '0' * 3이 먼저 실행되어 '000'이 되고, 그 후에 '1'과 이어붙여져 '1000'이 된다.

'1' + '0' * 3
'1000'

(3) 아래 논리식을 이용하여 비교 연산자와 산술 연산자가 섞여 있을 때의 우선순위를 확인하라.

5 + 5 == 2 * 5

답:

산술 연산자(+, *)가 비교 연산자(==)보다 우선순위가 높다. 좌변 5 + 5 (10)와 우변 2 * 5 (10)가 먼저 계산된 후, 두 값이 같은지 비교하므로 True가 나온다.

5 + 5 == 2 * 5
True

(4) 아래 코드를 이용하여 리스트 인덱싱과 산술 연산의 우선순위를 확인하라.

nums = [1, 2, 3]
print(nums[1] * 10 + nums[2])

답:

인덱싱([])은 가장 높은 우선순위를 가진다. 따라서 nums[1](2)과 nums[2](3)가 가장 먼저 추출된다. 그 후 추출된 값으로 2 * 10 + 3이 계산되어 23이 된다.

nums = [1, 2, 3]
print(nums[1] * 10 + nums[2])
23

(5) 철수는 한 벌에 20,000원인 티셔츠와 30,000원인 청바지를 세트로 묶어 총 3세트를 구매하려고 한다. 전체 가격을 계산하기 위해 아래와 같이 코드를 작성했더니, 예상했던 150,000원이 아니라 110,000원이 계산되어 당황했다. 철수가 실수한 원인을 연산자 우선순위를 들어 설명하고 올바르게 수정하라.

20000 + 30000 * 3
110000

답:

위 코드는 20,000원(티셔츠 1장)에 30,000원(청바지) 3벌 가격을 더한 셈이 된다. 그 이유는 곱셈(*)이 덧셈(+)보다 우선순위가 높아서 30000 * 3이 먼저 계산되기 때문이다. 티셔츠와 청바지 가격을 먼저 더한 후 3을 곱해야 하므로, 괄호 ()를 사용하여 우선순위를 바꿔야 한다.

(20000 + 30000) * 3
150000

2.6.6연습문제

(1) 다음 수식의 계산 결과를 예측하고, 연산 순서를 괄호 ()를 사용하여 그 이유를 설명하라

7 + 3 * 2 ** 2 == 7 + (3 * (2 ** 2))

(2) 문자열 'A''B'를 이용하여 'ABBB'가 아닌 'ABABAB'를 출력하려면 아래 코드에 어떻게 괄호를 추가해야 하는가?

'A' + 'B' * 3
'ABBB'

(3) 아래 코드의 실행 결과를 예측하고 이유를 설명하라.

x = 10
x < 5 * 3

(4) 리스트 data = [10, 20, 30]이 주어졌을 때, 첫 번째 항목과 두 번째 항목의 평균을 구하는 코드를 작성하라. 단, 괄호를 적절히 사용하여 우선순위를 제어해야 한다.

(5) 지수는 친구 3명(본인 포함 총 4명)과 함께 배달 음식을 시켜 먹었다. 피자 가격은 25,000원, 치킨 가격은 19,000원이었고 이를 4명이 똑같이 나눠 내기로 했다. 지수가 계산기로 아래와 같이 계산하여 1인당 29,750원을 달라고 하자 친구들이 너무 비싸다며 깜짝 놀랐다.

25000 + 19000 / 4
29750.0

가. 지수의 위 계산식이 실제로 어떤 의미로 계산되었는지 설명하라.

나. 1인당 내야 할 올바른 금액을 구하는 파이썬 코드를 작성하여 실행하라.