[TIL] 구현 전에 반환값 정하기 — 개수·존재 여부·위치의 차이

차곡코딩·2026년 9월 24일

TIL · 학습 복습

목록 보기
2/6

같은 입력이라도 질문이 다르면 반환값이 달라진다

[3, 1, 3]에서 3을 찾는다고 해도 요구사항은 여러 가지다. 있는지만 확인할 수도 있고, 개수나 첫 위치가 필요할 수도 있다. 반복문부터 작성하면 이 차이를 놓치기 쉽다.

이번 정리의 기준은 “무엇을 반환해야 다음 코드가 올바르게 사용할 수 있는가”다.

질문반환값찾지 못한 경우
3이 있는가TrueFalse
3이 몇 개인가20
첫 3은 어디에 있는가0None
각 값은 몇 개인가{3: 2, 1: 1}빈 입력이면 {}

첫 위치의 실패 값은 이 글에서 None으로 정했다. 문제에서 -1 등 다른 형식을 지정했다면 그 계약을 따라야 한다.

존재 여부와 개수는 같은 일이 아니다

def contains_value(values, target):
    for value in values:
        if value == target:
            return True
    return False

def count_value(values, target):
    count = 0
    for value in values:
        if value == target:
            count += 1
    return count

print(contains_value([3, 1, 3], 3))
print(count_value([3, 1, 3], 3))
True
2

존재 여부는 한 번 발견하면 답이 확정된다. 개수는 뒤에 같은 값이 더 있을 수 있으므로 끝까지 확인해야 한다. 두 함수의 반환 시점이 다른 이유는 문법이 아니라 질문의 차이다.

위치 0을 실패로 오해하지 않기

def first_index(values, target):
    for index, value in enumerate(values):
        if value == target:
            return index
    return None

index = first_index([3, 1, 3], 3)
print(index)
print(index is not None)
print(bool(index))
0
True
False

인덱스 0은 정상 결과지만 불리언으로 바꾸면 거짓이다. if index:는 발견 여부와 같은 조건이 아니다. 실패 값을 None으로 정했다면 호출하는 쪽에서도 is not None으로 그 계약을 지킨다.

구현 전에 남길 짧은 메모

  1. 입력의 자료형과 허용 범위를 적는다.
  2. 반환값의 자료형과 의미를 한 문장으로 정한다.
  3. 빈 입력, 미발견, 여러 번 발견한 경우의 값을 정한다.
  4. 원본을 변경해도 되는지 결정한다.

예를 들어 first_index의 계약은 “리스트를 변경하지 않고 첫 일치 위치를 반환하며, 일치가 없으면 None을 반환한다”로 적을 수 있다. 이 한 문장이 있어야 테스트의 기대값도 흔들리지 않는다.

SQL과 연결해서 생각하기

주문 여부, 주문 건수, 주문 상세는 서로 다른 질문이다. 각각 EXISTS, 집계, JOIN을 검토하는 것처럼 Python에서도 질문에 맞게 반환 형식을 선택한다. 다만 EXISTS의 실제 실행 방식은 DB 옵티마이저가 결정하므로 Python 반복문과 물리적으로 똑같이 동작한다고 설명하지는 않는다.

다음 문제에 적용할 기준

다음 풀이에서는 구현 전에 정상 입력과 빈 입력의 기대 반환값부터 적는다. 결과가 0인지, False인지, None인지 구분하는 작은 절차가 조기 반환과 실패 처리의 위치를 결정하는 기준이 된다.

함께 보기

profile
비전공자의 개발 성장 기록. 바이브코딩 프리랜서 경험부터 Python·SQL·AI 서비스 개발까지

0개의 댓글