클린코드하는 방법 (클린코드 방법 설명 with Python)

728x90

클린 코드는 유지 보수와 가독성이 좋은 코드를 의미하며, 협업과 확장성을 고려해 작성된 코드이다. 클린 코드를 작성하기 위해서는 몇 가지 원칙을 따르는 것이 좋다. 이 글에서는 클린 코드를 작성하기 위한 주요 원칙들을 설명하고, 각 방법에 대해 잘못된 코드와 클린 코드 예시를 비교해보겠다. 클린 코드를 작성하는 것은 단순히 규칙을 따르는 것뿐만 아니라, 코드를 읽는 사람의 입장에서 생각하는 것이 매우 중요하다. 이러한 접근법은 코드의 유지 보수성을 높이고, 팀 내 다른 개발자들이 코드를 빠르게 이해하고 수정할 수 있도록 도와준다.

1. 의미 있는 변수명 사용하기

잘못된 변수명 사용은 코드의 가독성을 떨어뜨리기 쉽다. 변수명은 그 역할과 의미를 명확하게 표현해야 하며, 코드의 목적을 쉽게 이해할 수 있도록 해야 한다. 의미 없는 변수명은 코드 리뷰 과정에서 혼란을 초래할 수 있으며, 나중에 코드를 수정할 때에도 이해하는 데 많은 시간을 소모하게 만든다.

잘못된 코드

int a = 5;
int b = 10;
int c = a + b;
print(c);

위 코드에서는 변수명 a, b, c가 어떤 역할을 하는지 알기 어렵다. 이는 코드의 유지보수를 어렵게 만들며, 팀원들이 코드를 이해하는 데 많은 시간이 걸리게 한다.

클린 코드

int length = 5;
int width = 10;
int area = length + width;
print(area);

변수명 length, width, area는 코드의 의도를 명확하게 전달하며, 각 변수의 역할을 쉽게 이해할 수 있다. 의미 있는 변수명은 코드를 더욱 읽기 쉽게 만들고, 코드의 의도를 명확히 전달하여 유지보수를 수월하게 한다.

2. 함수는 하나의 작업만 수행하게 작성하기

함수가 여러 작업을 동시에 수행하면 코드의 재사용성과 테스트가 어려워진다. 함수는 한 가지 작업만 수행하도록 작성해야 하며, 이를 통해 함수가 독립적으로 테스트 가능하고, 재사용하기 쉽게 만든다. 또한, 단일 책임 원칙(SRP)을 준수함으로써 코드의 모듈성을 높일 수 있다.

잘못된 코드

def process_order(order):
    # 재고 확인
    if not check_inventory(order):
        return "재고 부족"

    # 결제 처리
    process_payment(order)

    # 배송 준비
    prepare_shipping(order)

    return "주문 처리 완료"

이 함수는 여러 작업(재고 확인, 결제 처리, 배송 준비)을 수행하고 있다. 이를 분리하면 코드가 훨씬 읽기 쉽고 유지보수하기 좋아진다.

클린 코드

def process_order(order):
    if not check_inventory(order):
        return "재고 부족"

    process_payment(order)
    prepare_shipping(order)

    return "주문 처리 완료"

def check_inventory(order):
    # 재고 확인 로직
    pass

def process_payment(order):
    # 결제 처리 로직
    pass

def prepare_shipping(order):
    # 배송 준비 로직
    pass

각 기능을 별도의 함수로 분리하여 유지 보수와 테스트가 쉬워졌다. 작은 단위로 나누어진 함수는 코드의 재사용성을 높이고, 각 함수의 목적이 명확하게 정의되어 있기 때문에 코드의 가독성이 크게 향상된다.

3. 매직 넘버 대신 의미 있는 상수 사용하기

코드에 매직 넘버(특정한 의미를 알 수 없는 숫자)가 있다면 가독성이 떨어지고, 나중에 이 숫자가 무엇을 의미하는지 파악하기 어렵다. 매직 넘버는 코드의 명확성을 떨어뜨리며, 이를 수정해야 할 때 그 의미를 다시 이해하는 데 많은 시간과 노력이 들 수 있다.

잘못된 코드

def calculate_discount(price):
    return price * 0.1

여기서 0.1은 무엇을 의미하는지 명확하지 않다.

클린 코드

DISCOUNT_RATE = 0.1

def calculate_discount(price):
    return price * DISCOUNT_RATE

상수를 사용하여 DISCOUNT_RATE의 의미를 명확히 했다. 코드를 읽는 사람은 이 숫자가 무엇을 나타내는지 쉽게 이해할 수 있다. 이러한 상수 사용은 코드의 유지보수성을 높이며, 숫자의 의미를 명확하게 함으로써 코드를 보다 직관적으로 만든다.

4. 중복 코드 제거하기 (DRY 원칙)

중복된 코드는 유지 보수 시 실수를 유발할 가능성이 크다. 동일한 기능을 여러 곳에 반복 작성하지 않고, 재사용 가능한 함수로 추출하여 코드 중복을 제거해야 한다. DRY(Don't Repeat Yourself) 원칙을 따름으로써 코드의 일관성을 유지하고, 중복되는 부분을 수정할 때 발생할 수 있는 오류를 방지할 수 있다.

잘못된 코드

order_total_1 = item_price_1 * quantity_1
order_total_2 = item_price_2 * quantity_2
order_total_3 = item_price_3 * quantity_3

각 주문 총액을 계산하는 코드가 반복되고 있다.

클린 코드

def calculate_order_total(item_price, quantity):
    return item_price * quantity

order_total_1 = calculate_order_total(item_price_1, quantity_1)
order_total_2 = calculate_order_total(item_price_2, quantity_2)
order_total_3 = calculate_order_total(item_price_3, quantity_3)

반복되는 로직을 함수로 추출하여 재사용성을 높였다. 중복 코드가 제거되면 코드가 더 간결해지고 유지보수가 쉬워진다. 또한, 오류 발생 가능성도 줄어들게 된다.

5. 주석은 왜 작성하는지를 설명하기

주석은 코드가 하는 일 자체를 설명하는 것이 아니라, 왜 그런 선택을 했는지를 설명해야 한다. 주석은 코드의 동작을 설명하기보다는 의도와 이유를 기록하여, 미래의 자신이나 다른 개발자가 코드를 이해하는 데 도움을 주어야 한다. 코드 자체로 설명이 가능한 부분은 주석 없이도 충분히 이해될 수 있도록 코드를 작성해야 한다.

잘못된 코드

x = x + 1  # x에 1을 더함

이 주석은 코드가 무엇을 하는지 설명하지만, 굳이 필요하지 않은 정보이다.

클린 코드

# 다음 반복문을 위해 인덱스를 1 증가시킴
x = x + 1

주석은 코드의 이유나 배경을 설명하는 데 사용되어야 한다. 이를 통해 코드의 의도와 목적을 더 쉽게 이해할 수 있다. 잘 작성된 주석은 코드의 변화가 필요할 때 그 배경을 이해하는 데 큰 도움이 된다.

6. 적절한 예외 처리 사용하기

예외 처리를 제대로 사용하지 않으면 오류 발생 시 코드의 흐름이 비정상적으로 중단될 수 있다. 예외 처리는 예상 가능한 오류에 대해 적절히 대처할 수 있도록 작성해야 한다. 사용자 입력 오류나 네트워크 오류 등 예측 가능한 문제에 대해 예외 처리를 추가하여 프로그램의 안정성을 높이는 것이 중요하다.

잘못된 코드

def divide(a, b):
    return a / b

result = divide(10, 0)  # ZeroDivisionError 발생

위 코드에서는 b가 0일 경우 오류가 발생한다.

클린 코드

def divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return "0으로 나눌 수 없습니다"

result = divide(10, 0)

예외 처리를 통해 오류 상황을 안전하게 처리할 수 있게 되었다. 예외 처리를 잘 작성하면 프로그램이 비정상적으로 종료되지 않고 예상치 못한 상황에 대처할 수 있다. 이는 사용자 경험을 개선하고, 시스템의 신뢰성을 높이는 데 중요한 역할을 한다.

7. 작은 함수 작성하기

함수가 너무 크면 읽기 어렵고 재사용성이 떨어진다. 하나의 함수는 작고 명확한 작업만 수행하도록 작성해야 하며, 이는 코드의 가독성을 높이고, 각 함수의 역할을 명확하게 하여 코드의 재사용성을 향상시킨다. 작은 함수로 나누는 것은 유지보수성과 확장성을 높이는 데 매우 중요하다.

잘못된 코드

def generate_report(data):
    # 데이터 유효성 검사
    if not validate_data(data):
        return "잘못된 데이터"

    # 데이터 분석
    analysis = analyze_data(data)

    # 보고서 생성
    report = create_report(analysis)

    return report

클린 코드

def generate_report(data):
    if not validate_data(data):
        return "잘못된 데이터"

    analysis = analyze_data(data)
    return create_report(analysis)

def validate_data(data):
    # 데이터 유효성 검사 로직
    pass

def analyze_data(data):
    # 데이터 분석 로직
    pass

def create_report(analysis):
    # 보고서 생성 로직
    pass

각 작업을 개별 함수로 나누어 가독성과 유지보수성을 개선했다. 작은 함수는 코드의 명확성을 높이고, 각각의 함수가 명확한 목적을 가지게 하여 코드의 수정 및 테스트를 보다 쉽게 할 수 있게 해준다.

결론

클린 코드는 코드의 가독성과 유지 보수성을 높여줄 뿐만 아니라 협업 시 다른 개발자들이 코드를 쉽게 이해하고 수정할 수 있도록 도와준다. 의미 있는 변수명, 작은 함수, 중복 제거, 적절한 주석, 그리고 예외 처리를 통해 코드를 클린하게 유지하는 것이 중요하다. 이러한 원칙들을 염두에 두고 코드를 작성하면, 보다 효과적이고 효율적인 프로그래밍이 가능하다. 클린 코드를 작성하는 것은 단순히 코드 스타일을 개선하는 것이 아니라, 프로그램의 구조를 더 잘 이해하고 문제를 더 명확하게 정의하는 과정이다. 이를 통해 코드의 품질을 높이고, 소프트웨어의 생명주기를 연장할 수 있다. 팀 내 협업이 원활해지고, 나아가서는 전체 프로젝트의 성공 확률을 높이는 데 기여하게 된다.

728x90