✅ Flag 변수의 활용

Flag 변수란 프로그램의 흐름을 제어하거나 상태를 나타내기 위해 사용하는 boolean 변수입니다.
주로 특정 조건의 충족 여부나 이벤트 발생 여부를 나타내는 데 쓰입니다.

주요 활용 예시

  • 상태 표시: isLoggedIn, isLoading 등으로 현재 상태를 명확히 표현합니다.
  • 조건 제어: 반복문이나 조건문에서 특정 조건에 따라 로직을 분기하거나 제어합니다.
  • 오류 처리: 오류 발생 여부를 플래그로 표시하여 추가적인 처리를 가능하게 합니다.
  • 상태 변경: isFirstRun과 같이 특정 동작의 완료 여부를 나타내어 이후 동작에 영향을 줍니다.

사용 시 주의사항

  • 명확한 이름 부여: 플래그가 어떤 상태를 나타내는지 직관적으로 알 수 있도록 이름을 지정해야 합니다.
  • 남용 방지: 과도하게 사용하면 코드가 복잡해질 수 있으므로, 꼭 필요한 경우에만 사용해야 합니다.
  • 유효성 관리: 초기값과 사용 범위를 명확히 정의하여 예기치 않은 오류를 방지해야 합니다.

🧩 파이썬의 Case 문 (match-case)

파이썬 3.10부터 도입된 match-case 문법으로, 다른 언어의 switch-case와 유사한 기능을 수행합니다.

기본 구조

match 변수:
    case 값1:
        # 값1에 해당하는 실행문
    case 값2:
        # 값2에 해당하는 실행문
    case _:
        # 그 외의 경우 (와일드카드, default 역할)

특징

  • | 연산자를 사용하여 여러 값을 한 번에 매칭할 수 있습니다.
  • 리스트, 튜플 등 다양한 자료구조의 패턴 매칭을 지원합니다.
  • if를 추가하여 조건부 매칭(case ... if ...)이 가능합니다.

🏗️ 구조적 패턴 매칭 (Structural Pattern Matching)

단순 값 비교를 넘어, 데이터의 구조(튜플, 리스트, 객체 등)를 기반으로 패턴을 정의하고 분기 처리하는 문법입니다.

  • case 문에서 언패킹과 변수 바인딩을 직접 할 수 있습니다.
  • 복잡한 if-elif-else 구조를 대체하여 가독성을 향상시킵니다.

예시

shape = ("rectangle", 10, 20)

match shape:
    case ("rectangle", width, height):
        area = width * height
    case ("circle", radius):
        area = 3.14 * radius * radius
    case _:
        area = None

⚡️ 다른 언어의 switch-case와의 차이

구분 전통적 switch-case (C, Java 등) 파이썬 match-case (3.10 이상)
매칭 대상 정수, 문자, 문자열 등 단순 값 값, 리스트, 튜플, 객체 등 복합 자료구조
패턴 매칭 값의 동등성만 비교 구조, 값, 타입, 언패킹, 조건(가드) 등 다양한 패턴 지원
break 필요 여부 각 case마다 break 필요 break 불필요 (첫 번째 일치 case만 실행)
기본 케이스 default 키워드 사용 _ (언더바) 사용
OR 조건 일부 언어만 지원 | 연산자로 지원
복합 자료구조 지원 안 함 튜플, 리스트, 데이터클래스 등 직접 매칭 지원
조건부 분기 case 내부에서 if문 사용 case x if ... 형태로 case 자체에 조건 추가 가능

🦭 Walrus Operator (:=)

바다코끼리 연산자(Walrus operator):= 기호로, 변수에 값을 할당함과 동시에 그 값을 표현식 내에서 사용할 수 있게 해주는 대입 표현식입니다. 파이썬 3.8부터 도입되었습니다.

특징

  • 할당과 반환을 동시에 수행 (예: if (n := len(a)) > 10:)
  • 기존에 여러 줄로 작성해야 했던 코드를 한 줄로 줄여 코드를 더 간결하고 직관적으로 작성하게 합니다.
  • 반복문, 조건문, 리스트 컴프리헨션 등 다양한 곳에서 활용 가능합니다.
  • 문법적 모호성을 피하기 위해 괄호를 사용해 명확하게 구분하는 것을 권장합니다.

예시

# 할당과 동시에 조건 검사
if (n := len(a)) > 5:
    print(f"List is too long ({n} elements)")

# while 루프에서 읽기와 처리 동시 수행
while (chunk := file.read(256)) != '':
    process(chunk)

# 리스트 컴프리헨션 내에서 값 할당 및 필터링
[clean_name.title() for name in names \
if (clean_name := normalize(name)) in allowed_names]

장점

  • 중복 계산을 줄여 성능을 최적화합니다.
  • 코드의 가독성과 간결성을 향상시킵니다.
  • 변수의 스코프(유효 범위)를 좁혀 불필요한 변수 사용을 최소화합니다.