십대를 위한 코딩/십대를 위한 파이썬

두 코드(mangling1.py vs mangling2.py)의 차이

forSilver 2025. 2. 20. 17:30
반응형

🔍 두 코드(mangling1.py vs mangling2.py)의 차이점

두 코드의 차이는 인스턴스 변수의 네이밍 방식에 있습니다.

파일명 속성 선언 방식 속성 접근 방식 실행 결과

mangling1.py self.price (공개 속성) x.price 정상 실행
mangling2.py self._price (보호된 속성) x._price 정상 실행

1. mangling1.py: 공개(public) 속성 사용

class Food:
    def __init__(self, name, price):
        self.name = name
        self.price = price  # ✅ 일반적인 속성 (공개 속성)

    def show(self):
        print(self.name, self.price)

x = Food('milk', 1500)
x.price //= 2  # ✅ 직접 접근 가능
x.show()

✔️ 특징

  • self.price는 **공개 속성(public attribute)**이므로, 객체에서 직접 접근 가능.
  • x.price //= 2를 통해 속성 값을 바로 수정 가능.
  • 일반적으로 속성을 외부에서 접근할 수 있도록 공개할 때 사용.

출력 결과

milk 750

2. mangling2.py: 보호(protected) 속성 사용

class Food:
    def __init__(self, name, price):
        self.name = name
        self._price = price  # ✅ 보호된 속성 (Protected attribute)

    def show(self):
        print(self.name, self._price)

x = Food('milk', 1500)
x._price //= 2  # ✅ 여전히 접근 가능하지만, 원칙적으로 권장되지 않음
x.show()

✔️ 특징

  • self._price는 보호(protected) 속성으로, 변수명 앞에 _(언더스코어)를 추가하여 나타냄.
  • 보호 속성은 외부에서 직접 접근하는 것을 권장하지 않지만, 접근 자체는 가능.
  • 즉, x._price //= 2는 동작하지만, "이 속성은 내부적으로만 사용해야 한다"는 의미.

출력 결과

milk 750

🔥 📌 두 코드의 차이점 정리

비교 항목 mangling1.py (price) mangling2.py (_price)

속성 타입 공개(Public) 속성 보호(Protected) 속성
네이밍 방식 self.price self._price
접근 가능 여부 외부에서 자유롭게 접근 가능 (x.price) 외부에서 접근 가능하지만 권장되지 않음 (x._price)
속성 수정 가능 여부 가능 (x.price //= 2) 가능하지만 내부적으로만 수정해야 함 (x._price //= 2)

🚀 언제 _price(보호 속성)를 사용할까?

  • 개발자가 "이 속성은 내부적으로만 사용해야 한다"는 의도를 명확히 표현할 때
  • 외부에서 직접 수정하지 않고, 특정 메서드를 통해 접근하도록 유도할 때
    class Food:
        def __init__(self, name, price):
            self.name = name
            self._price = price  # 내부적으로만 사용해야 하는 속성
    
        def get_price(self):
            return self._price
    
        def set_price(self, new_price):
            if new_price > 0:
                self._price = new_price
            else:
                print("가격은 0보다 커야 합니다!")
    
    x = Food('milk', 1500)
    print(x.get_price())  # ✅ 1500 (getter 사용)
    x.set_price(1000)     # ✅ setter 사용하여 가격 변경
    print(x.get_price())  # ✅ 1000
    

🏆 결론

  • mangling1.py: self.price(공개 속성) → 외부에서 자유롭게 접근 가능
  • mangling2.py: self._price(보호 속성) → 외부에서 접근 가능하지만, 직접 수정하는 것은 권장되지 않음
  • Python에서는 _price와 같이 변수명 앞에 _를 붙이면 보호 속성을 의미하며, 원칙적으로 내부에서만 사용해야 함.

즉, "외부에서 값을 직접 변경해도 되는가?"에 따라 price(공개)와 _price(보호)를 선택하면 됩니다! 😊🚀