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: 17 mrt 2026

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

2.1값의 종류

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

정수

-13798, -7, 0, 1, 2, 17, 41, 87356112 등 일상적으로 사용되는 정수를 가리킨다.

부동소수점

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

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

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

문자열

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

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

부울값

참과 거짓을 의미하는 TrueFalse부울값Boolean value 또는 진릿값이라 한다.

리스트

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

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

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

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

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

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

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.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.4사전식 비교

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

2.4.1유니코드 코드 포인트

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

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

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

먼저 유니코드Unicode란 전 세계 모든 문자를 하나의 표준 체계로 정의해 각 문자에 고유한 번호를 부여하는 국제 문자 인코딩 표준이다. 그리고 각 문자에 부여된 고유 번호를 유니코드 코드 포인트Unicode code point 또는 단순히 코드 포인트다. 예를 들어, 한글 자음 'ㄱ', 'ㄲ', 'ㅎ', 'ㅏ'의 코드 포인트는 각각 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.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

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

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

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

'파썬' in greetings
False

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

'파이썬 안녕' in greetings
False

리스트 in 연산자

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

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

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

'파이' in first_languages
False

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.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