기술블로그-Django편

📌 Python 오버라이딩(Overriding) 완전 정복 - 개념, 예시, Django 실전 활용까지

Chansman 2025. 5. 8. 13:24

📌 Python 오버라이딩(Overriding) 완전 정복 - 개념, 예시, Django 실전 활용까지


✅ 1. 오버라이딩(Overriding)이란?

오버라이딩은 부모 클래스에서 정의된 메서드를 자식 클래스에서 "다시 정의"하는 것입니다.

  • 같은 이름의 메서드를 자식 클래스에서 새롭게 작성함으로써,
  • 기존 동작을 재정의하거나 확장할 수 있습니다.

🔁 즉, 기존 기능을 내가 원하는 방식으로 덮어쓴다고 이해하면 됩니다.


✅ 2. 오버라이딩 기본 예시 (동물 클래스)

class Animal:
    def sound(self):
        return "동물이 소리를 냅니다"

class Dog(Animal):
    def sound(self):  # 오버라이딩
        return "멍멍"
dog = Dog()
print(dog.sound())  # 출력: "멍멍"

➡️ 부모 클래스 Animal의 sound()를 자식 클래스 Dog가 다시 정의(오버라이딩) 했습니다.


✅ 3. 오버라이딩과 super()

자식 클래스에서 오버라이딩하면서도 부모 클래스의 기능을 그대로 유지하고 싶을 때는 super()를 사용합니다.

class Cat(Animal):
    def sound(self):
        original = super().sound()
        return original + " + 야옹"
cat = Cat()
print(cat.sound())  # 출력: "동물이 소리를 냅니다 + 야옹"

✅ 4. Django에서 오버라이딩이 필요한 이유

Django의 CBV(Class-Based View)는 부모 클래스에 다양한 메서드가 이미 정의되어 있습니다.

우리는 그중 일부만 오버라이딩해서 커스터마이징합니다.

예: 글 작성자만 상세 보기 허용

class BlogDetailView(DetailView):
    model = Blog
    template_name = 'blog_detail.html'

    def get_object(self, queryset=None):  # 오버라이딩
        obj = super().get_object()
        if obj.author != self.request.user:
            raise Http404  # 권한 없으면 404
        return obj

✅ 5. 오버라이딩의 주요 활용 예

메서드 사용 목적

get() GET 요청에 대한 응답 수정
post() POST 요청 처리 커스터마이징
get_queryset() DB 조회 범위 제한 (ex. 본인 글만 보기)
get_object() 특정 객체 조회 방식 수정 (ex. 권한 체크)
form_valid() 폼 저장 전 추가 로직 수행 (ex. 작성자 자동 할당)

✅ 6. 오버라이딩 vs 오버로딩

항목 오버라이딩 오버로딩 (Python은 직접 지원 X)

정의 부모의 메서드를 다시 정의 하나의 이름으로 매개변수 다르게 여러 함수 정의
목적 기존 기능 재정의 다양한 인자를 처리하는 유연한 함수 제공
예시 def get(self): def add(a, b) / def add(a, b, c)

✅ 7. 결론 정리

오버라이딩은 기존 동작을 바꾸거나 확장하고 싶을 때 사용하는 필수 기술입니다.

  • Django의 CBV에서는 거의 모든 실무 로직이 오버라이딩을 통해 구현됩니다.
  • super()를 함께 사용하면 부모 동작을 유지하면서 커스터마이징 가능!

💬 다음에는 get_queryset()이나 form_valid() 같은 실전 오버라이딩 예제도 정리해드릴게요!