파이썬 기초 강좌 – 8강: 문자열 자료형

파이썬 기초 강좌 – 8강: 문자열 자료형

문자 데이터를 다룰 때 필수적인 문자열 자료형!
문자열을 다루는 다양한 방법과 활용법을 익혀보세요.

안녕하세요! 이번 강의에서는 파이썬의 문자열(String) 자료형을 깊이 있게 다뤄보겠습니다.
문자열은 프로그래밍에서 텍스트 데이터를 처리하는 기본 단위이며, 다양한 조작 방법이 존재합니다.

파이썬에서는 문자열을 쉽게 선언하고 다룰 수 있으며, 슬라이싱, 포맷팅, 내장 함수 등을 활용하면 더욱 강력한 기능을 구현할 수 있습니다.
이번 강의에서는 문자열의 기본 개념부터 고급 활용법까지 차근차근 알아보겠습니다.

암호, 코딩, 컴퓨터, 데이터, 개발, 이더넷, html, 프로그램 제작자, 프로그램 작성, 화면, 소프트웨어, 기술, 일하다, 코딩, 코딩, 코딩, 코딩, 컴퓨터, 컴퓨터, 컴퓨터, 컴퓨터, 컴퓨터, 데이터

목차

  1. 문자열의 기본 개념과 선언
  2. 문자열 슬라이싱과 인덱싱
  3. 문자열 메서드와 함수
  4. 문자열 포맷팅
  5. 문자열 활용 및 실전 예제

<a id=”section1″></a>

1. 문자열의 기본 개념과 선언

■ 문자열이란?

문자열(String)은 문자(character)들의 연속적인 모음으로, 파이썬에서는 따옴표(” 또는 “”)를 사용하여 문자열을 표현합니다. 예를 들어, "Hello, World!"와 같은 텍스트 데이터는 문자열 자료형으로 저장됩니다.

파이썬에서 문자열의 특징:

  • 순서가 있는(ordered) 자료형
  • 변경 불가능(immutable)한 자료형
  • 인덱싱과 슬라이싱이 가능한 자료형

■ 문자열 선언 방법

파이썬에서는 여러 가지 방법으로 문자열을 선언할 수 있습니다:

# 작은따옴표 사용
text1 = 'Hello'

# 큰따옴표 사용
text2 = "Python"

# 삼중 따옴표 사용 (여러 줄 문자열)
text3 = """이 문자열은
여러 줄로 작성할 수 있습니다."""

# 삼중 작은따옴표도 가능
text4 = '''여러 줄
문자열입니다.'''

print(text1, text2)  # Hello Python
print(text3)
print(text4)

■ 이스케이프 문자

문자열 내에서 특수한 기능을 수행하는 이스케이프 문자를 사용할 수 있습니다:

# 줄바꿈
print("안녕하세요.\n반갑습니다.")

# 탭
print("이름:\t홍길동")

# 따옴표 출력
print("그가 말했다. \"안녕하세요!\"")
print('She said, \'Hello!\'')

# 백슬래시 출력
print("경로: C:\\Users\\Desktop")
이스케이프 문자설명
\n줄바꿈
\t
\\백슬래시
\'작은따옴표
\"큰따옴표
\r캐리지 리턴
\b백스페이스

■ 문자열 기본 연산

문자열은 다양한 연산을 지원합니다:

# 문자열 연결 (concatenation)
first_name = "길동"
last_name = "홍"
full_name = last_name + first_name
print(full_name)  # 홍길동

# 문자열 반복
echo = "에코" * 3
print(echo)  # 에코에코에코

# 문자열 길이 확인
text = "Python Programming"
print(len(text))  # 18

# 멤버십 테스트
print("P" in text)  # True
print("Java" in text)  # False

<a id=”section2″></a>

2. 문자열 슬라이싱과 인덱싱

■ 문자열 인덱싱

파이썬에서 문자열의 각 문자는 인덱스(index)를 통해 접근할 수 있습니다. 인덱스는 0부터 시작합니다.

text = "Python"
print(text[0])  # P (첫 번째 문자)
print(text[1])  # y (두 번째 문자)
print(text[-1])  # n (마지막 문자)
print(text[-2])  # o (뒤에서 두 번째 문자)

![문자열 인덱싱 예시]

인덱스:   0   1   2   3   4   5
문자:     P   y   t   h   o   n
음수 인덱스: -6  -5  -4  -3  -2  -1

■ 문자열 슬라이싱

슬라이싱(Slicing)은 문자열의 일부분을 추출하는 기능입니다. 구문은 [시작:끝:단계] 형태로 사용합니다.

text = "Python Programming"

# 기본 슬라이싱
print(text[0:6])    # Python (0부터 5까지)
print(text[:6])     # Python (처음부터 5까지)
print(text[7:])     # Programming (7부터 끝까지)
print(text[:])      # Python Programming (전체 문자열)

# 단계(step) 사용
print(text[::2])    # Pto rgamn (2칸씩 건너뛰기)
print(text[::3])    # Ph rrmg (3칸씩 건너뛰기)

# 음수 인덱스와 단계 활용
print(text[7:-1])   # Programmin (7부터 마지막 전까지)
print(text[::-1])   # gnimmargorP nohtyP (문자열 뒤집기)
print(text[-1::-2]) # gimg rPnhy (뒤에서부터 2칸씩)

■ 슬라이싱 응용 예제

# 문자열에서 단어 추출하기
sentence = "Python is easy to learn"
words = sentence.split()
print(words)  # ['Python', 'is', 'easy', 'to', 'learn']

# 파일 확장자 추출하기
filename = "document.pdf"
extension = filename[filename.find(".")+1:]
print(extension)  # pdf

# 이메일에서 사용자 이름과 도메인 분리하기
email = "user@example.com"
username = email[:email.find("@")]
domain = email[email.find("@")+1:]
print(username)  # user
print(domain)    # example.com

<a id=”section3″></a>

3. 문자열 메서드와 함수

■ 대소문자 변환 메서드

text = "Python Programming"

print(text.upper())      # PYTHON PROGRAMMING
print(text.lower())      # python programming
print(text.capitalize()) # Python programming
print(text.title())      # Python Programming
print(text.swapcase())   # pYTHON pROGRAMMING

■ 문자열 검색 메서드

text = "Python Programming is fun and Python is easy"

# 특정 문자열 찾기
print(text.find("Python"))      # 0 (첫 번째 발견 위치)
print(text.find("Python", 1))   # 27 (인덱스 1 이후에서 발견된 위치)
print(text.find("Java"))        # -1 (없을 경우)

# index 메서드 (없을 경우 예외 발생)
print(text.index("Python"))     # 0
# print(text.index("Java"))     # ValueError 발생

# 발생 횟수 카운트
print(text.count("Python"))     # 2
print(text.count("is"))         # 2

# 시작/끝 문자열 확인
print(text.startswith("Python")) # True
print(text.endswith("easy"))     # True

■ 문자열 변형 메서드

# 공백 제거
text = "   Python   "
print(text.strip())      # "Python"
print(text.lstrip())     # "Python   "
print(text.rstrip())     # "   Python"

# 문자 바꾸기
text = "Hello, World!"
print(text.replace("Hello", "Hi"))  # "Hi, World!"
print(text.replace("o", "x", 1))    # "Hellx, World!" (첫 번째만 바꾸기)

# 문자열 분할
text = "Python,Java,C++,JavaScript"
print(text.split(","))   # ['Python', 'Java', 'C++', 'JavaScript']

# 구분자로 문자열 합치기
languages = ['Python', 'Java', 'C++', 'JavaScript']
print(", ".join(languages))  # "Python, Java, C++, JavaScript"

■ 문자열 판별 메서드

# 문자열이 특정 조건을 만족하는지 확인
print("abc123".isalnum())  # True (알파벳 또는 숫자)
print("abc".isalpha())     # True (알파벳만)
print("123".isdigit())     # True (숫자만)
print("ABC".isupper())     # True (대문자만)
print("abc".islower())     # True (소문자만)
print("  \t\n".isspace())  # True (공백 문자만)
print("Title Case".istitle()) # True (각 단어가 대문자로 시작)

■ 문자열 정렬 메서드

text = "Python"

# 좌측 정렬
print(text.ljust(10, '-'))  # "Python----"

# 우측 정렬
print(text.rjust(10, '-'))  # "----Python"

# 가운데 정렬
print(text.center(10, '-'))  # "--Python--"

# 숫자 자리수 맞추기
num = 42
print(str(num).zfill(5))    # "00042"

<a id=”section4″></a>

4. 문자열 포맷팅

■ % 연산자를 사용한 포맷팅 (구식)

name = "홍길동"
age = 30

# 문자열 포맷팅 (오래된 방식)
print("이름: %s, 나이: %d" % (name, age))  # 이름: 홍길동, 나이: 30

# 다양한 포맷 지정자
print("실수: %.2f" % 3.14159)  # 실수: 3.14 (소수점 2자리까지)
print("16진수: %x" % 255)      # 16진수: ff
print("8진수: %o" % 8)         # 8진수: 10

■ format() 메서드 사용

# 기본 사용법
print("이름: {}, 나이: {}".format(name, age))  # 이름: 홍길동, 나이: 30

# 인덱스 지정
print("이름: {0}, 나이: {1}, 직업: {0}의 직업".format(name, age))

# 키워드 인자 사용
print("이름: {name}, 나이: {age}".format(name="김철수", age=25))

# 포맷 지정
print("금액: {:.2f}원".format(10000.5))  # 금액: 10000.50원
print("비율: {:.1%}".format(0.25))      # 비율: 25.0%
print("왼쪽 정렬: {:<10}".format("Python"))  # 왼쪽 정렬: Python    
print("오른쪽 정렬: {:>10}".format("Python"))  # 오른쪽 정렬:     Python
print("가운데 정렬: {:^10}".format("Python"))  # 가운데 정렬:   Python  
print("채우기: {:*^10}".format("Python"))  # 채우기: **Python**

■ f-string (Python 3.6+)

# 기본 사용법 (가장 현대적인 방식)
name = "박지민"
age = 28
print(f"이름: {name}, 나이: {age}")  # 이름: 박지민, 나이: 28

# 표현식 사용
print(f"내년 나이: {age + 1}")  # 내년 나이: 29

# 형식 지정
price = 15000
print(f"가격: {price:,}원")  # 가격: 15,000원
print(f"원주율: {3.14159:.2f}")  # 원주율: 3.14

#

정렬과 채우기

print(f”{‘Python’:>10}”) # 오른쪽 정렬: Python print(f”{‘Python’:<10}”) # 왼쪽 정렬, 밑줄 채우기: Python___

날짜 형식 지정

import datetime today = datetime.datetime.now() print(f”오늘은 {today:%Y년 %m월 %d일} 입니다.”) # 오늘은 2025년 03월 16일 입니다.

중괄호 출력

print(f”중괄호 출력: {{name}}”) # 중괄호 출력: {name}


### ■ 문자열 템플릿 사용하기

```python
from string import Template

# Template 사용
template = Template("$name님의 나이는 $age세 입니다.")
result = template.substitute(name="이지은", age=30)
print(result)  # 이지은님의 나이는 30세 입니다.

# 딕셔너리로 값 전달
data = {"name": "김유신", "age": 35}
result = template.substitute(data)
print(result)  # 김유신님의 나이는 35세 입니다.

<a id=”section5″></a>

5. 문자열 활용 및 실전 예제

■ 입력값 검증하기

def validate_username(username):
    """사용자 이름 유효성 검사 (영문, 숫자, 3-16자)"""
    if not 3 <= len(username) <= 16:
        return False
    
    # 영문자와 숫자만 포함되어 있는지 확인
    for char in username:
        if not (char.isalnum() or char == '_'):
            return False
    
    # 숫자로 시작하지 않아야 함
    return not username[0].isdigit()

# 테스트
usernames = ["user123", "2user", "user_name", "a", "user*name"]
for name in usernames:
    if validate_username(name):
        print(f"{name}: 유효한 사용자 이름")
    else:
        print(f"{name}: 유효하지 않은 사용자 이름")

■ 이메일 주소 분석하기

def analyze_email(email):
    """이메일 주소를 분석하여 사용자 이름, 도메인, 최상위 도메인 반환"""
    if "@" not in email:
        return "유효하지 않은 이메일 형식입니다."
    
    username, domain = email.split("@", 1)
    
    if "." not in domain:
        return "유효하지 않은 도메인 형식입니다."
    
    domain_parts = domain.split(".")
    top_level_domain = domain_parts[-1]
    
    return {
        "username": username,
        "domain": domain,
        "domain_name": domain_parts[0],
        "top_level_domain": top_level_domain
    }

# 테스트
email = "user.name@example.co.kr"
result = analyze_email(email)
print(f"사용자 이름: {result['username']}")
print(f"도메인: {result['domain']}")
print(f"도메인 이름: {result['domain_name']}")
print(f"최상위 도메인: {result['top_level_domain']}")

■ 텍스트 암호화 예제 (시저 암호)

def caesar_cipher(text, shift):
    """시저 암호를 사용하여 텍스트 암호화"""
    result = ""
    for char in text:
        if char.isalpha():
            ascii_offset = ord('a') if char.islower() else ord('A')
            # 알파벳을 시프트하고 26으로 나눈 나머지를 구함 (알파벳 순환)
            shifted = (ord(char) - ascii_offset + shift) % 26 + ascii_offset
            result += chr(shifted)
        else:
            result += char
    return result

# 테스트
message = "Hello, Python!"
encrypted = caesar_cipher(message, 3)
decrypted = caesar_cipher(encrypted, -3)

print(f"원본: {message}")
print(f"암호화: {encrypted}")
print(f"복호화: {decrypted}")

■ 문자열 통계 분석

def analyze_text(text):
    """텍스트의 문자 통계 분석"""
    char_count = len(text)
    letter_count = sum(1 for char in text if char.isalpha())
    digit_count = sum(1 for char in text if char.isdigit())
    space_count = sum(1 for char in text if char.isspace())
    word_count = len(text.split())
    
    # 대소문자 비율
    upper_count = sum(1 for char in text if char.isupper())
    lower_count = sum(1 for char in text if char.islower())
    
    # 가장 많이 사용된 문자
    char_freq = {}
    for char in text:
        if char.isalnum():  # 알파벳과 숫자만 고려
            char_freq[char] = char_freq.get(char, 0) + 1
    
    most_common = max(char_freq.items(), key=lambda x: x[1]) if char_freq else ('없음', 0)
    
    return {
        "총 문자수": char_count,
        "알파벳 수": letter_count,
        "숫자 수": digit_count,
        "공백 수": space_count,
        "단어 수": word_count,
        "대문자 수": upper_count,
        "소문자 수": lower_count,
        "가장 많은 문자": most_common[0],
        "가장 많은 문자 빈도": most_common[1]
    }

# 테스트
sample_text = "Python 3.8은 2019년 10월에 출시되었으며, 많은 새로운 기능을 포함합니다!"
stats = analyze_text(sample_text)

for key, value in stats.items():
    print(f"{key}: {value}")

■ 정규 표현식을 활용한 문자열 처리

import re

# 전화번호 형식 검증
def is_valid_phone(phone):
    """한국 전화번호 형식 검증 (010-1234-5678 또는 01012345678)"""
    pattern = r'^(01[016789])-?(\d{3,4})-?(\d{4})$'
    return bool(re.match(pattern, phone))

# 이메일 주소 추출
def extract_emails(text):
    """텍스트에서 모든 이메일 주소 추출"""
    pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
    return re.findall(pattern, text)

# 문자열 치환
def censor_sensitive_info(text):
    """주민등록번호와 카드번호 마스킹 처리"""
    # 주민등록번호 마스킹 (뒷자리를 *로 변환)
    ssn_pattern = r'(\d{6})-(\d{7})'
    text = re.sub(ssn_pattern, r'\1-*******', text)
    
    # 카드번호 마스킹 (마지막 4자리를 제외하고 *로 변환)
    card_pattern = r'(\d{4})-(\d{4})-(\d{4})-(\d{4})'
    text = re.sub(card_pattern, r'****-****-****-\4', text)
    
    return text

# 테스트
phone_numbers = ["010-1234-5678", "01012345678", "010-123-5678", "016-1234-5678", "02-123-4567"]
for phone in phone_numbers:
    print(f"{phone}: {'유효함' if is_valid_phone(phone) else '유효하지 않음'}")

text_with_emails = "연락처: user@example.com, admin@company.co.kr, info@site.net"
emails = extract_emails(text_with_emails)
print(f"추출된 이메일: {emails}")

sensitive_text = "주민등록번호: 123456-1234567, 카드번호: 1234-5678-9012-3456"
censored = censor_sensitive_info(sensitive_text)
print(f"마스킹 처리: {censored}")

자주 묻는 질문 (FAQ)

■ 문자열과 리스트의 차이는 무엇인가요?

문자열과 리스트는 여러 개의 요소를 저장할 수 있는 순서가 있는 자료형이지만, 문자열은 변경 불가능(immutable) 한 반면, 리스트는 변경 가능(mutable) 합니다. 따라서 문자열은 한 번 생성된 후에는 개별 문자를 변경할 수 없습니다.

■ 문자열을 리스트로 변환할 수 있나요?

네, list() 함수를 사용하면 문자열을 문자 단위로 리스트로 변환할 수 있습니다.

print(list("hello"))  # ['h', 'e', 'l', 'l', 'o']

또한 split() 메서드를 사용하면 특정 구분자를 기준으로 문자열을 분할하여 리스트로 변환할 수 있습니다.

print("apple,banana,orange".split(","))  # ['apple', 'banana', 'orange']

■ 어떤 경우에 문자열 메서드를 사용하는 것이 좋나요?

문자열 메서드는 문자열을 조작하거나 분석할 때 유용합니다. 대소문자 변환, 공백 제거, 특정 문자 찾기, 문자열 분할 등의 작업을 할 때 사용합니다. 문자열 메서드는 항상 새로운 문자열을 반환하며 원본 문자열은 변경하지 않습니다.

■ 한글 문자열도 슬라이싱이 가능한가요?

네, 한글을 포함한 모든 유니코드 문자열에 대해 슬라이싱이 가능합니다.

text = "안녕하세요"
print(text[0:2])  # 안녕

■ f-string과 format() 중 어떤 것을 사용해야 할까요?

Python 3.6 이상에서는 f-string이 더 간결하고 가독성이 좋아 권장됩니다. 하지만 문자열 템플릿을 변수에 저장해야 하는 경우에는 format() 메서드가 더 적합합니다.

마무리 및 추천

문자열은 프로그래밍에서 매우 중요한 데이터 유형이며, 문자열 조작 방법을 익히면 더욱 효율적인 코드를 작성할 수 있습니다. 이번 강의에서 배운 내용을 활용하여 다양한 문자열 처리 작업을 수행해 보세요.

■ 실전 연습 문제

  1. 사용자로부터 문장을 입력받아 단어 수를 세는 프로그램 작성하기
  2. 회문(palindrome) 검사 함수 만들기 (예: “level”, “radar”)
  3. 주어진 문자열에서 모음과 자음의 개수를 세는 함수 만들기
  4. URL에서 프로토콜, 도메인, 경로를 추출하는 함수 만들기

■ 다음 강의 예고

다음 강의에서는 조건문과 반복문을 활용하여 더욱 논리적인 프로그램을 만드는 방법을 배워보겠습니다. 조건에 따라 다른 동작을 수행하고, 반복적인 작업을 효율적으로 처리하는 방법을 알아볼 예정입니다.

■ 추천 학습 자료

파이썬, 문자열, 문자열 슬라이싱, 문자열 함수, 프로그래밍, 코딩 강좌, 파이썬 기초, 문자열 포맷팅, 텍스트 처리, 문자열 변환, 정규 표현식

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다