프로그래밍/Python

파이썬 기초 복습: 변수, 데이터 타입, 자료구조, 그리고 제어문

shimdh 2025. 2. 21. 09:22
728x90

파이썬 프로그래밍을 시작할 때 가장 먼저 배우는 개념은 변수, 데이터 타입, 자료구조, 그리고 제어문입니다. 이번 포스트에서는 이 핵심 개념들을 깊이 있게 다루고, 각각의 특징과 활용 방법을 예제와 함께 설명하겠습니다. 이를 통해 파이썬 프로그래밍의 기초를 탄탄히 다질 수 있을 것입니다.


1. 변수와 데이터 타입

1.1 변수란 무엇인가?

변수는 데이터를 저장하기 위한 이름 있는 공간입니다. 파이썬에서는 변수를 선언할 때 별도의 자료형을 명시하지 않아도 됩니다. 변수를 사용하면 프로그램 내에서 값을 쉽게 참조하고 변경할 수 있습니다.

x = 10  # 정수형 변수
name = "Alice"  # 문자열 변수
is_active = True  # 불리언 변수

위 코드에서 x, name, is_active는 각각 정수, 문자열, 불리언 값을 저장하는 변수입니다. 변수는 프로그램의 다양한 부분에서 재사용될 수 있으며, 이를 통해 코드의 가독성과 유지보수성이 향상됩니다.

1.2 데이터 타입의 종류

파이썬에는 여러 가지 기본 데이터 타입이 있습니다. 주요 데이터 타입은 다음과 같습니다:

  • 정수 (Integer): 정수를 나타내는 데이터 타입입니다. 음수와 양수 모두 포함됩니다.

    age = 25
    print(age)  # 출력: 25
  • 부동 소수점 (Float): 실수를 나타내며 소수점을 포함한 숫자입니다.

    height = 5.9
    print(height)  # 출력: 5.9
  • 문자열 (String): 문자들의 집합으로 따옴표로 감싸서 표현합니다. 작은따옴표(')나 큰따옴표(")를 사용할 수 있습니다.

    greeting = "안녕하세요!"
    print(greeting)  # 출력: 안녕하세요!
  • 불리언 (Boolean): 참(True) 또는 거짓(False)을 나타냅니다. 조건문에서 많이 사용됩니다.

    is_student = False
    print(is_student)  # 출력: False
  • 리스트 (List): 여러 개의 항목을 하나의 변수에 저장할 수 있는 가변(mutable) 데이터 구조입니다.

    fruits = ["apple", "banana", "cherry"]
    print(fruits)  # 출력: ['apple', 'banana', 'cherry']
  • 튜플 (Tuple): 여러 개의 항목을 하나의 변수에 저장할 수 있는 불변(immutable) 데이터 구조입니다.

    coordinates = (10, 20)
    print(coordinates)  # 출력: (10, 20)
  • 딕셔너리 (Dictionary): 키-값 쌍으로 데이터를 저장하는 가변적인 자료형입니다.

    student_info = {"name": "Bob", "age": 22}
    print(student_info)  # 출력: {'name': 'Bob', 'age': 22}
  • 집합 (Set): 중복되지 않는 요소들의 모임이며, 순서가 없는 가변적 자료형입니다.

    unique_numbers = {1, 2, 3}
    print(unique_numbers)  # 출력: {1, 2, 3}

2. 리스트와 튜플

2.1 리스트 (List)

리스트는 여러 개의 항목을 하나의 변수에 저장할 수 있는 가변(mutable) 데이터 구조입니다. 리스트는 순서가 있으며, 인덱스를 통해 접근할 수 있습니다. 리스트는 다양한 데이터 타입을 혼합하여 저장할 수 있습니다.

# 리스트 생성 예제
fruits = ["apple", "banana", "cherry"]
print(fruits)  # 출력: ['apple', 'banana', 'cherry']

# 리스트 조작 예제
fruits.append("orange")  # 리스트에 요소 추가
print(fruits)  # 출력: ['apple', 'banana', 'cherry', 'orange']

# 리스트의 특정 위치에 요소 삽입
fruits.insert(1, "grape")  # 인덱스 1에 "grape" 추가
print(fruits)  # 출력: ['apple', 'grape', 'banana', 'cherry', 'orange']

# 리스트의 요소 삭제
fruits.remove("banana")  # "banana" 삭제
print(fruits)  # 출력: ['apple', 'grape', 'cherry', 'orange']

리스트는 데이터를 동적으로 관리할 때 매우 유용합니다. 예를 들어, 사용자 입력을 받아 리스트에 저장하거나, 리스트의 요소를 반복적으로 처리할 때 사용할 수 있습니다.

2.2 튜플 (Tuple)

튜플은 여러 개의 항목을 하나의 변수에 저장할 수 있는 불변(immutable) 데이터 구조입니다. 튜플은 한 번 생성되면 수정할 수 없습니다. 튜플은 순서가 있으며, 인덱스를 통해 접근할 수 있습니다.

# 튜플 생성 예제
coordinates = (10, 20)
print(coordinates)  # 출력: (10, 20)

# 튜플은 수정할 수 없음
# coordinates[0] = 15  # 에러 발생

# 튜플의 요소 접근
print(coordinates[0])  # 출력: 10

튜플은 데이터가 변경되지 않아야 하는 상황에서 유용합니다. 예를 들어, 프로그램의 설정 값이나 상수를 저장할 때 튜플을 사용할 수 있습니다.

2.3 리스트 vs 튜플

특징 리스트 튜플
가변성 Yes No
성능 느림 빠름
사용 목적 일반적인 목록 관리 및 업데이트 필요 시 고정된 데이터 세트 또는 불변한 상태 유지 시

3. 딕셔너리와 집합

3.1 딕셔너리 (Dictionary)

딕셔너리는 키-값 쌍으로 데이터를 저장하는 가변적인 자료형입니다. 각 키는 고유해야 하며, 이를 통해 값에 빠르게 접근할 수 있습니다. 딕셔너리는 중괄호 {}를 사용하여 정의하며, 콜론 :을 이용해 키와 값을 구분합니다.

# 딕셔너리 생성 예제
student = {
    "name": "홍길동",
    "age": 20,
    "major": "컴퓨터공학"
}
print(student)  # 출력: {'name': '홍길동', 'age': 20, 'major': '컴퓨터공학'}

# 딕셔너리 조작 예제
student["age"] = 21  # 나이 업데이트
student["graduation_year"] = 2024  # 새로운 정보 추가
print(student)  # 출력: {'name': '홍길동', 'age': 21, 'major': '컴퓨터공학', 'graduation_year': 2024}

# 딕셔너리의 키와 값 순회
for key, value in student.items():
    print(f"{key}: {value}")

딕셔너리는 데이터를 구조화하여 저장할 때 매우 유용합니다. 예를 들어, 학생 정보, 제품 정보 등을 저장할 때 딕셔너리를 사용할 수 있습니다.

3.2 집합 (Set)

집합은 중복되지 않는 요소들의 모임이며, 순서가 없는 가변적 자료형입니다. 집합은 중복을 제거하거나 수학적 연산을 수행할 때 유용합니다.

# 집합 생성 예제
fruits = {"사과", "바나나", "오렌지"}
print(fruits)  # 출력: {'사과', '바나나', '오렌지'}

# 집합 조작 예제
fruits.add("망고")  # 새로운 과일 추가
print(fruits)  # 출력: {'망고', '바나나', '오렌지', '사과'}

# 중복된 과일 추가 시도 (무시됨)
fruits.add("사과")
print(fruits)  # 출력: {'망고', '바나나', '오렌지', '사과'}

# 다른 집합 생성 및 교집합 계산
citrus_fruits = {"레몬", "오렌지", "라임"}
common_fruits = fruits.intersection(citrus_fruits)
print(common_fruits)  # 출력: {'오렌지'}

집합은 데이터의 중복을 제거하거나, 두 데이터 세트 간의 공통 요소를 찾을 때 유용합니다.


4. 조건문과 반복문

4.1 조건문 (if statements)

조건문은 주어진 조건이 참인지 거짓인지에 따라 실행할 코드를 결정합니다. 파이썬에서는 if, elif, else 키워드를 사용합니다.

# 조건문 예제
score = int(input("점수를 입력하세요: "))

if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
elif score >= 60:
    print("D")
else:
    print("F")

조건문은 프로그램의 흐름을 제어하는 데 필수적입니다. 예를 들어, 사용자 입력에 따라 다른 동작을 수행하거나, 특정 조건이 충족될 때만 코드를 실행할 수 있습니다.

4.2 반복문 (loops)

반복문은 특정 블록의 코드를 여러 번 실행하도록 합니다. 파이썬에서는 for 루프와 while 루프를 사용합니다.

4.2.1 for 루프

for 루프는 iterable 객체(리스트, 튜플 등)의 각 요소를 순회하며 작업을 수행합니다.

# for 루프 예제
fruits = ["사과", "바나나", "체리"]

for fruit in fruits:
    print(fruit)

for 루프는 리스트, 튜플, 문자열 등과 함께 사용될 수 있으며, 데이터를 순차적으로 처리할 때 유용합니다.

4.2.2 while 루프

while 루프는 주어진 조건이 참인 동안 계속해서 코드를 실행합니다.

# while 루프 예제
total = 0

while True: 
    number = input("숫자를 입력하세요 (종료하려면 'exit' 입력): ")

    if number == 'exit':
        break

    total += int(number)

print(f"입력된 숫자의 총합은 {total}입니다.")

while 루프는 특정 조건이 충족될 때까지 반복적으로 코드를 실행할 때 사용됩니다. 예를 들어, 사용자 입력을 반복적으로 받거나, 특정 조건이 충족될 때까지 계산을 반복할 때 사용할 수 있습니다.


5. 고급 자료구조와 활용

5.1 리스트 컴프리헨션 (List Comprehension)

리스트 컴프리헨션은 리스트를 생성하는 간결하고 효율적인 방법입니다. 기존의 리스트를 기반으로 새로운 리스트를 생성할 때 유용합니다.

# 리스트 컴프리헨션 예제
numbers = [1, 2, 3, 4, 5]
squared_numbers = [x**2 for x in numbers]
print(squared_numbers)  # 출력: [1, 4, 9, 16, 25]

리스트 컴프리헨션은 코드를 간결하게 만들고, 가독성을 높이는 데 도움이 됩니다.

5.2 딕셔너리 컴프리헨션 (Dictionary Comprehension)

딕셔너리 컴프리헨션은 딕셔너리를 생성하는 간결한 방법입니다. 기존의 리스트나 다른 딕셔너리를 기반으로 새로운 딕셔너리를 생성할 때 유용합니다.

# 딕셔너리 컴프리헨션 예제
numbers = [1, 2, 3, 4, 5]
squared_dict = {x: x**2 for x in numbers}
print(squared_dict)  # 출력: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

5.3 집합 컴프리헨션 (Set Comprehension)

집합 컴프리헨션은 집합을 생성하는 간결한 방법입니다. 기존의 리스트나 다른 집합을 기반으로 새로운 집합을 생성할 때 유용합니다.

# 집합 컴프리헨션 예제
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_squares = {x**2 for x in numbers}
print(unique_squares)  # 출력: {1, 4, 9, 16, 25}

6. 파일 입출력

파이썬에서는 파일을 읽고 쓰는 작업을 쉽게 수행할 수 있습니다. 파일 입출력은 데이터를 저장하거나 불러올 때 매우 유용합니다.

6.1 파일 읽기

# 파일 읽기 예제
with open("example.txt", "r") as file:
    content = file.read()
    print(content)

6.2 파일 쓰기

# 파일 쓰기 예제
with open("example.txt", "w") as file:
    file.write("Hello, World!")

6.3 파일에 추가하기

# 파일에 추가하기 예제
with open("example.txt", "a") as file:
    file.write("\nThis is a new line.")

7. 예외 처리

예외 처리는 프로그램 실행 중 발생할 수 있는 오류를 관리하는 방법입니다. 예외 처리를 통해 프로그램이 비정상적으로 종료되는 것을 방지할 수 있습니다.

# 예외 처리 예제
try:
    number = int(input("숫자를 입력하세요: "))
    result = 10 / number
    print(f"결과: {result}")
except ValueError:
    print("숫자를 입력해주세요.")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

8. 함수와 모듈

8.1 함수 정의

함수는 특정 작업을 수행하는 코드 블록입니다. 함수를 사용하면 코드를 재사용하고, 가독성을 높일 수 있습니다.

# 함수 정의 예제
def greet(name):
    return f"Hello, {name}!"

print(greet("Alice"))  # 출력: Hello, Alice!

8.2 모듈 사용

모듈은 관련된 함수와 변수를 모아놓은 파일입니다. 모듈을 사용하면 코드를 체계적으로 관리할 수 있습니다.

# 모듈 사용 예제
import math

print(math.sqrt(16))  # 출력: 4.0

결론

파이썬의 기본 개념과 고급 기능을 잘 이해하고 활용하면 더 복잡한 문제를 해결하는 데 큰 도움이 됩니다. 다양한 예제와 연습 문제를 통해 직접 코드를 작성해보면서 익혀보세요. 파이썬 프로그래밍의 세계로 한 걸음 더 나아가 보시길 바랍니다!


추가 예제 및 연습 문제

예제 1: 리스트와 튜플 활용

# 리스트와 튜플을 사용하여 학생 정보 관리
students = [
    ("Alice", 20, "Computer Science"),
    ("Bob", 22, "Mathematics"),
    ("Charlie", 21, "Physics")
]

# 학생 정보 출력
for name, age, major in students:
    print(f"이름: {name}, 나이: {age}, 전공: {major}")

예제 2: 딕셔너리와 집합 활용

# 딕셔너리를 사용하여 제품 정보 관리
products = {
    "apple": 0.5,
    "banana": 0.3,
    "orange": 0.4
}

# 제품 가격 업데이트
products["apple"] = 0.6

# 집합을 사용하여 재고 관리
in_stock = {"apple", "banana"}

# 재고 확인
for product, price in products.items():
    if product in in_stock:
        print(f"{product}의 가격은 {price}입니다.")

예제 3: 조건문과 반복문 활용

# 사용자로부터 숫자를 입력받아 짝수와 홀수를 구분
numbers = []

while True:
    number = input("숫자를 입력하세요 (종료하려면 'exit' 입력): ")
    if number == 'exit':
        break
    numbers.append(int(number))

# 짝수와 홀수 구분
even_numbers = []
odd_numbers = []

for num in numbers:
    if num % 2 == 0:
        even_numbers.append(num)
    else:
        odd_numbers.append(num)

print(f"짝수: {even_numbers}")
print(f"홀수: {odd_numbers}")

이러한 예제들을 통해 파이썬의 기본 개념을 더 깊이 이해하고, 실제 문제를 해결하는 데 적용할 수 있습니다. 파이썬은 간결하고 강력한 언어로, 이러한 기본 개념들을 잘 익히면 더 복잡한 프로그래밍에도 쉽게 적응할 수 있습니다.

728x90