오버라이딩 (Overriding) vs. 오버로딩 (Overloading)
1. 주제 분류의 적절성 분석
" 오버라이딩 (Overriding) vs. 오버로딩 (Overloading)" 은 객체지향 프로그래밍 (Object-Oriented Programming, OOP) 에서 다형성 (polymorphism) 을 실현하는 핵심 개념입니다. 이 두 기능은 메서드의 재정의와 다중 정의를 통해 소프트웨어 아키텍처의 유연성과 확장성을 높이며, 시스템 및 소프트웨어 아키텍처의 원칙과 밀접하게 연관되어 있습니다. 따라서 “Computer Science and Engineering > System and Software Architecture > Principles > Programming Paradigms > Object-Oriented Programming” 분류는 매우 적절합니다 [1][7][19].
2. 200 자 요약
오버라이딩 (Overriding) 은 상속받은 메서드를 하위 클래스에서 재정의하여 다형성과 확장성을 제공하고, 오버로딩 (Overloading) 은 같은 이름의 메서드를 매개변수의 타입이나 개수만 다르게 여러 개 정의해 코드의 유연성과 가독성을 높입니다. 두 개념 모두 객체지향의 핵심입니다 [1][7][19].
3. 전체 개요 (250 자 내외)
오버라이딩 (Overriding) 과 오버로딩 (Overloading) 은 객체지향 프로그래밍에서 메서드의 재정의와 다중 정의를 통해 다형성을 실현하는 대표적 기능입니다. 오버라이딩은 상속 관계에서 하위 클래스가 상위 클래스의 메서드를 재정의해 동작을 변경하거나 확장할 수 있게 하며, 오버로딩은 같은 이름의 메서드를 매개변수의 타입이나 개수에 따라 여러 개 정의해 다양한 입력에 유연하게 대응할 수 있습니다. 두 기능은 코드의 재사용성, 유지보수성, 확장성을 크게 향상시킵니다 [1][6][19].
I. 핵심 개념
- 오버라이딩 (Overriding): 상속받은 (부모) 클래스의 메서드를 하위 (자식) 클래스에서 이름, 매개변수, 반환형 모두 동일하게 재정의하여 동작을 변경하거나 확장하는 것 [1][2][4][7][19].
- 오버로딩 (Overloading): 한 클래스 내에서 같은 이름의 메서드를 매개변수의 타입, 개수, 순서를 다르게 하여 여러 번 정의하는 것. 반환형은 오버로딩 성립에 영향을 주지 않음 [1][3][7][14][20].
- 공통점: 모두 다형성 (polymorphism) 구현 방법이며, 코드의 유연성과 재사용성을 높임 [6][17][19].
- 차이점: 오버라이딩은 상속 관계에서 동작 재정의, 오버로딩은 같은 클래스 내에서 입력 다양화 [1][7][19].
II. 비교 분석
1. 비교 개요
오버라이딩과 오버로딩은 모두 메서드의 이름을 공유하지만, 적용되는 맥락과 목적, 성립 조건, 동작 방식이 다릅니다. 아래 표는 각 항목별로 두 개념을 비교한 내용입니다.
1) 주요 비교표
구분 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
---|---|---|
적용 대상 | 상속 관계의 자식 클래스 | 같은 클래스 내 |
메서드 이름 | 동일 | 동일 |
매개변수 | 동일 | 다름 (타입, 개수, 순서) |
반환 타입 | 동일 | 무관 |
목적 | 상위 클래스 동작 재정의, 다형성 구현 | 다양한 입력 처리, 코드 유연성 |
결정 시점 | 런타임 (Runtime) | 컴파일 타임 (Compile time) |
대표 사례 | 부모 메서드 재정의 | add(int, int), add(double, double) 등 |
키워드 | @Override(자바), super() 로 부모 메서드 호출 | 없음 |
2. 구조 및 아키텍처
오버라이딩 구조 다이어그램
classDiagram class Parent { +void greet() } class Child { +void greet() } Parent B{상속 관계?} B -- Yes --> C{부모 메서드 존재?} C -- Yes --> D[오버라이딩: 자식 메서드 실행] B -- No --> E{동일 이름, 파라미터 다름?} E -- Yes --> F[오버로딩: 파라미터에 맞는 메서드 실행]
4. 구현 기법
구현 기법 | 정의/구성 | 목적/예시 |
---|---|---|
오버라이딩 | 부모 메서드와 동일한 시그니처로 자식에서 재정의 | 다형성, 동작 변경/확장예: 자식에서 greet() 재정의 |
오버로딩 | 같은 이름, 다른 파라미터로 여러 메서드 정의 | 다양한 입력 처리예: add(int, int), add(double, double) |
Python 예시
|
|
5. 실무 적용 예시
적용 분야 | 적용 예시 | 설명 |
---|---|---|
API 설계 | 오버로딩으로 다양한 입력 지원 | 다양한 파라미터로 동작하는 메서드 제공 |
서비스 확장 | 오버라이딩으로 특화 동작 구현 | 상위 서비스의 표준 동작을 하위에서 재정의 |
UI 컴포넌트 | 오버라이딩으로 렌더링 방식 변경 | 부모 컴포넌트의 렌더링 방식 확장/변경 |
데이터 처리 | 오버로딩으로 다양한 데이터 타입 처리 | 동일 메서드명으로 여러 타입 지원 |
6. 활용 사례
시나리오: 결제 시스템에서 결제 방식별로 동작을 다르게 하면서, 다양한 결제 정보를 처리
- 시스템 구성: Payment(부모), CreditCardPayment/PaypalPayment(자식, 오버라이딩), processPayment 메서드 (오버로딩)
- 다이어그램
classDiagram class Payment { +void processPayment() } class CreditCardPayment { +void processPayment() } class PaypalPayment { +void processPayment() } Payment <|-- CreditCardPayment Payment <|-- PaypalPayment
- Workflow
- Payment 클래스를 상속받아 각 결제 방식별로 processPayment() 를 오버라이딩
- processPayment(amount), processPayment(amount, currency) 등 오버로딩으로 다양한 입력 지원
- 역할: 결제 방식별 동작 분리 (오버라이딩), 다양한 입력 처리 (오버로딩)
- 차이점: 오버라이딩은 동작 자체를 변경, 오버로딩은 입력 방식 다양화
7. 실무에서 효과적으로 적용하기 위한 고려사항 및 주의할 점
고려사항 | 설명 | 권장사항 |
---|---|---|
명확한 목적 | 오버로딩/오버라이딩의 목적 구분 | 불필요한 중복 정의 지양 |
시그니처 일관성 | 오버라이딩 시 부모와 동일 시그니처 유지 | @Override 등 어노테이션 활용 |
가독성 | 오버로딩 남용 시 혼란 주의 | 파라미터 명확히 구분 |
유지보수성 | 오버라이딩 시 super() 활용 고려 | 부모 기능 재활용 권장 |
8. 최적화하기 위한 고려사항 및 주의할 점
고려사항 | 설명 | 권장사항 |
---|---|---|
성능 | 오버로딩 메서드 수 과다 시 성능 저하 | 꼭 필요한 경우만 오버로딩 |
설계 일관성 | 오버라이딩/오버로딩 혼용 시 구조 명확화 | 설계 문서화, 코드 리뷰 |
테스트 용이성 | 다양한 케이스 테스트 필요 | 단위 테스트 강화 |
9. 강점과 약점
구분 | 항목 | 설명 |
---|---|---|
✅ 장점 | 다형성 | 다양한 상황에 맞는 동작/입력 처리 가능 |
코드 재사용 | 부모 코드 재활용 (오버라이딩), 메서드명 절약 (오버로딩) | |
유지보수성 | 확장, 변경에 유리 | |
⚠ 단점 | 혼동 위험 | 오버로딩/오버라이딩 혼용 시 가독성 저하 |
설계 복잡 | 오버로딩 남용 시 코드 복잡도 증가 | |
디버깅 | 런타임/컴파일 타임 결정 시점 차이로 버그 유발 가능 |
단점 해결 방법
- @Override 등 명확한 어노테이션 사용
- 오버로딩/오버라이딩 목적 명확화 및 문서화
- 코드 리뷰, 테스트 강화
10. 앞으로의 전망
주제 | 항목 | 설명 |
---|---|---|
다형성 | 자동화 | 컴파일러/런타임 다형성 지원 강화 |
설계 | 유지보수성 | 오버로딩/오버라이딩 혼용 설계 패턴 발전 |
언어 | 기능 확장 | 다양한 언어에서 오버로딩/오버라이딩 지원 강화 |
11. 주목할 내용
주제 | 항목 | 설명 |
---|---|---|
다형성 | 런타임/컴파일 | 오버라이딩은 런타임, 오버로딩은 컴파일 타임 결정 |
설계 원칙 | SRP | 단일 책임 원칙 준수 권장 |
언어별 | 지원 방식 | 언어별 오버로딩/오버라이딩 지원 차이 존재 |
유지보수 | super() 활용 | 오버라이딩 시 부모 기능 재활용 가능 |
12. 추가 학습/조사 필요 내용
카테고리 | 간략한 설명 | 주제 |
---|---|---|
언어별 차이 | 오버로딩/오버라이딩 지원 방식 차이 | 자바, 파이썬, 자바스크립트 등 |
어노테이션 | @Override 등 활용법 | 코드 안정성 강화 |
설계 패턴 | 템플릿 메서드, 전략 패턴 등 | 다형성 활용 고도화 |
테스트 | 단위 테스트 자동화 | 다양한 시나리오 검증 |
용어 정리
카테고리 | 용어 | 설명 |
---|---|---|
객체지향 | 오버라이딩 (Overriding) | 상속받은 메서드를 자식 클래스에서 재정의하는 것 |
객체지향 | 오버로딩 (Overloading) | 같은 이름의 메서드를 매개변수 다르게 여러 번 정의하는 것 |
객체지향 | 다형성 (Polymorphism) | 같은 이름의 메서드가 다양한 방식으로 동작하는 성질 |
객체지향 | 시그니처 (Signature) | 메서드의 이름, 매개변수 타입/개수/순서의 조합 |
객체지향 | @Override | 자바에서 오버라이딩 표시용 어노테이션 |
객체지향 | super() | 부모 클래스의 메서드 호출 시 사용 |
참고 및 출처
- 오버로딩(Overloading),오버라이딩(Overriding)이란? + 차이점 - YD
- JAVA 오버로딩과 오버라이딩의 차이점 - 개발하는 새우
- 오버라이딩 vs 오버로딩: 핵심 차이점 심층 분석 및 주의 사항
- Java 메서드 오버라이딩에 관하여 - middlefitting
- 오버로딩과 오버라이딩 차이와 예제 - 오토봇팩토리
- 오버로딩 & 오버라이딩(Overloading & Overriding) - velog
- Python 오버로딩 - 끄적끄적 코딩 공방
[1] https://woo0doo.tistory.com/15
[2] https://hyoje420.tistory.com/14
[3] https://limsungju.tistory.com/16
[4] https://middlefitting.tistory.com/91
[5] https://brunch.co.kr/@kimkm4726/2
[6] https://sungman.tistory.com/9
[7] https://developshrimp.com/entry/JAVA-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
[8] https://dojang.io/mod/page/view.php?id=2387
[9] https://coding-shop.tistory.com/399
[10] https://ji-u.tistory.com/33
[11] https://velog.io/@korjsh/javascript-%ED%95%A8%EC%88%98-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%93%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0
[12] https://velog.io/@ohsol/JAVA-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9-%EC%B0%A8%EC%9D%B4%EC%99%80-%EC%98%88%EC%A0%9C
[13] https://wecanit.tistory.com/40
[14] https://private.tistory.com/25
[15] https://gthoya.tistory.com/entry/%EC%9D%BC%EA%B4%80%EC%84%B1-%EC%9E%88%EB%8A%94-%ED%98%91%EB%A0%A5
[16] https://velog.io/@ilil1/%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9Overloading-Overriding
[17] https://steady-coding.tistory.com/540
[18] https://statuscode.tistory.com/133
[19] https://googleyness.tistory.com/entry/%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9-vs-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9-%ED%95%B5%EC%8B%AC-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%8B%AC%EC%B8%B5-%EB%B6%84%EC%84%9D-%EB%B0%8F-%EC%A3%BC%EC%9D%98-%EC%82%AC%ED%95%AD
[20] https://hwanu-developer.tistory.com/14
[21] https://blog.naver.com/yulian/10175897045
[22] https://deeppago.tistory.com/40
[23] https://blog.naver.com/bitcoding/221542124198
[24] https://wikidocs.net/22347
[25] https://okeybox.tistory.com/430
[26] https://junior-datalist.tistory.com/96
[27] https://haileyjpark.tistory.com/16
[28] https://f-lab.kr/insight/inheritance-overloading-overriding
[29] https://revolutionarylife.tistory.com/41
[30] https://nbcamp.spartacodingclub.kr/blog/%EA%B0%9C%EB%85%90-%EC%BD%95-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9%EC%9D%98-%EC%B0%A8%EC%9D%B4-21656
[31] https://blog.naver.com/bbbisskk2/222942681471
[32] https://golden-retriever.tistory.com/16
[33] https://nicodora.tistory.com/entry/%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9Overloading-vs-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9Overriding-%EC%B0%A8%EC%9D%B4%EC%A0%90
[34] https://everyday-code-study.tistory.com/74
[35] https://velog.io/@jhdai_ly/python4%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EC%83%81%EC%86%8D-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%83%81%EC%86%8D-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9
[36] https://daco2020.tistory.com/170
[37] https://unocoings.tistory.com/31
[38] https://velog.io/@totoromin0308/%EC%83%81%EC%86%8D-%EC%8B%A4%EB%AC%B4-%EC%98%88%EC%A0%9C
[39] https://velog.io/@tera_geniel/%EC%97%B0%EC%82%B0%EC%9E%90-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9overloading
[40] https://velog.io/@onenewarm/4%EC%9E%A5-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8
[41] https://velog.io/@rayoung/%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9
[42] https://coding-by-head.tistory.com/entry/inheritance-method-overriding
[43] https://hcn1519.github.io/articles/2020-08/autolayout_performance_optimization
[44] https://www.illumina.com/content/dam/illumina/gcs/assembled-assets/marketing-literature/miseq-i100-library-optimization-tech-note-m-gl-03322/miseq-i100-library-optimization-tech-note-m-gl-03322-kor.pdf
아래는 “오버라이딩 (Overriding) vs. 오버로딩 (Overloading)” 에 대한 전체 분석 자료입니다. 객체 지향 설계 및 실무 구현 관점에서의 심화된 내용을 포함합니다.
1. 주제 분류의 적절성 분석
적절함
“Overriding vs. Overloading” 은 객체 지향 프로그래밍 (OOP) 의 핵심 개념으로, 다형성 (Polymorphism) 을 구현하는 주요 수단입니다. 이는 소프트웨어 설계 원칙과 직접적으로 연관되어 있으며, 주제 분류인 "System and Software Architecture > Principles > Programming Paradigms > Object-Oriented Programming"
에 정확히 부합합니다.
2. 주제 요약 (200 자 내외)
오버라이딩은 상속받은 메서드를 재정의하는 방식으로 동적 다형성을 구현하며, 오버로딩은 동일한 이름의 메서드를 파라미터 시그니처만 다르게 하여 정적 다형성을 제공합니다. 각각 런타임/컴파일 타임에서 처리됩니다.
3. 전체 개요 (250 자 내외)
오버라이딩 (Overriding) 과 오버로딩 (Overloading) 은 객체 지향 프로그래밍에서 메서드의 다형성을 지원하는 주요 기법입니다. 오버라이딩은 상속 구조에서 부모 클래스의 메서드를 자식 클래스가 재정의하여 동작을 바꾸는 것으로, 런타임 시점에 결정되는 동적 바인딩을 활용합니다. 반면, 오버로딩은 하나의 클래스 내에서 메서드 이름은 같되 매개변수의 수나 타입을 달리하여 다양한 호출을 허용하는 정적 바인딩 기법입니다. 이 둘은 코드 재사용과 가독성, 확장성 향상에 중요한 역할을 합니다.
4. 핵심 개념
개념 | 설명 |
---|---|
오버라이딩 (Overriding) | 부모 클래스의 메서드를 자식 클래스에서 재정의하여 다른 동작을 하도록 하는 기법 (동적 다형성 구현) |
오버로딩 (Overloading) | 동일한 이름의 메서드를 매개변수 타입/개수에 따라 여러 개 정의하는 기법 (정적 다형성 구현) |
다형성 (Polymorphism) | 동일한 이름의 메서드가 문맥에 따라 다르게 동작하는 객체 지향의 원리 |
5. 비교 분석 개요 및 정리 표
분류 기준별 비교
기준 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
---|---|---|
정의 | 상속받은 메서드를 자식 클래스에서 재정의 | 동일 클래스 내에서 같은 이름의 메서드를 매개변수 시그니처만 달리 정의 |
메서드 이름 | 동일해야 함 | 동일해야 함 |
시그니처 | 반드시 동일해야 함 | 시그니처 (매개변수 수/타입) 가 달라야 함 |
바인딩 시점 | 런타임 (동적 바인딩) | 컴파일 타임 (정적 바인딩) |
적용 위치 | 상속 관계의 자식 클래스 | 같은 클래스 내 |
반환 타입 | 동일하거나 하위 타입 | 반환 타입은 무관 |
사용 목적 | 부모 클래스의 기능을 자식 클래스에서 변경 | 같은 기능의 다양한 입력 처리 허용 |
대표 언어 지원 | Java, C#, Python, JS | Java, C#, Python (부분적), JS (함수 오버로드 불가, 조건문 사용) |
5.2 주요 원리 & 작동 원리 (Mermaid 다이어그램)
오버라이딩 (동적 바인딩)
classDiagram class Animal { +makeSound() } class Dog { +makeSound() } Animal <|-- Dog class Main { +run() } Main --> Animal : base ref Dog --> makeSound : override
오버로딩 (정적 바인딩)
classDiagram class Calculator { +add(int, int) +add(float, float) +add(String, String) }
6. 구조 및 아키텍처
오버라이딩
필수 구성요소: 상속 관계, 동일한 메서드 시그니처
선택 요소:
@Override
어노테이션 (Java), super 호출 등
오버로딩
필수 구성요소: 동일 메서드명, 다른 파라미터 목록
선택 요소: 기본값 (Default Parameter), 가변 인자 (Varargs) 등
7. 구현 기법
오버라이딩 예시 (Python)
오버로딩 예시 (Python - singledispatch
활용)
|
|
8. 실무 적용 예시
분야 | 적용 예시 설명 |
---|---|
백엔드 API | 컨트롤러에서 오버로딩으로 다양한 타입 요청 처리, 오버라이딩으로 서비스 계층 기능 확장 |
라이브러리 개발 | 상위 추상 클래스 재정의 시 오버라이딩, 유틸리티 메서드는 오버로딩으로 다양한 인자 처리 |
게임 개발 | 캐릭터 클래스의 move() 오버라이딩, attack() 오버로딩 (타입/무기별 대응) |
9. 활용 사례
시나리오: PaymentService
인터페이스 구현 (Java 기반)
process()
메서드를 오버라이딩하여CardPayment
,BankPayment
별로 구현process()
는 오버로딩되어 금액, 통화 등 다양한 타입으로 확장 지원
시스템 구성 (Mermaid)
classDiagram class PaymentService { +process() +process(amount: int) +process(amount: int, currency: String) } class CardPayment { +process() } class BankPayment { +process() } PaymentService <|-- CardPayment PaymentService <|-- BankPayment
10. 실무 적용 고려사항
고려사항 | 설명 | 권장사항 |
---|---|---|
오버라이딩 시점 | 부모 메서드와 완전히 동일한 시그니처 사용 필요 | @Override 명시로 컴파일 타임 오류 방지 |
오버로딩 설계 | 혼란을 줄 수 있는 다중 정의는 피해야 함 | 명확한 파라미터 명명, 문서화 권장 |
언어별 제한 | JS, Python 등은 오버로딩 공식 지원이 부족 | 조건문/디스패치 기법 활용 |
11. 최적화 고려사항
고려사항 | 설명 | 권장사항 |
---|---|---|
성능 고려 | 오버로딩은 컴파일 시 결정되어 상대적으로 빠름 | 오버라이딩 남용보다는 필요한 경우만 사용 |
테스트 효율성 | 오버라이딩된 메서드는 예외 케이스 테스트 중요 | 테스트 케이스 분리 작성 |
유지보수성 | 시그니처 혼란 방지를 위해 명확한 메서드 설계 필요 | 명명 일관성, 문서화, 인터페이스 활용 |
12. 강점과 약점 비교
구분 | 항목 | 설명 |
---|---|---|
✅ 강점 | 오버라이딩 | 상속 구조 확장 및 커스터마이징 가능, 동적 다형성 구현 |
오버로딩 | 코드 재사용 및 가독성 향상, 다양한 입력 처리 가능 | |
⚠ 단점 | 오버라이딩 | 설계가 복잡해질 수 있고, 예측 불가능한 동작 발생 가능성 |
오버로딩 | 과도한 정의로 인한 혼란, 가독성 저하 |
해결책:
오버라이딩은 설계 문서와 UML 로 설계 관계 명확화
오버로딩은 파라미터 명확화, 문서화,
@Overload
명시 (타입힌트)
13. 앞으로의 전망
주제 | 항목 | 설명 |
---|---|---|
오버라이딩 | 인터페이스 기반 강화 | 추상화 중심의 설계가 확산되며 오버라이딩 중요성 증대 |
오버로딩 | 함수형 전환 혼재 | 함수형 프로그래밍의 부상으로 일부 언어에서 오버로딩 사용 제한 증가 |
14. 주목할 내용
주제 | 항목 | 설명 |
---|---|---|
언어별 지원 | Python, JS 제한적 지원 | 함수 오버로딩은 singledispatch , 조건문, 타입 검사로 대체됨 |
런타임 최적화 | Virtual Table | JVM, CLR 에서는 오버라이딩 메서드는 가상 테이블 (VTable) 로 관리됨 |
15. 추가 학습 주제
카테고리 | 간략한 설명 | 주제 |
---|---|---|
다형성 | 정적/동적 바인딩, LSP 등 다형성 원칙 이해 | Liskov Substitution |
디스패치 기법 | 함수/메서드 디스패치 방식 비교 | Single/Multiple Dispatch |
언어별 차이점 | 오버라이딩/오버로딩의 언어별 구현 방식과 제약 이해 | Java, C#, Python, JS |
용어 정리
카테고리 | 용어 | 설명 |
---|---|---|
OOP | 오버라이딩 | 부모 메서드를 자식 클래스에서 재정의하여 동작을 바꾸는 기법 |
OOP | 오버로딩 | 동일 이름의 메서드를 매개변수 시그니처 다르게 하여 여러 개 정의하는 기법 |
OOP | 다형성 | 같은 이름의 메서드가 다양한 방식으로 동작할 수 있는 객체지향 원칙 |
실행 모델 | 정적 바인딩 | 컴파일 시점에 호출 메서드가 결정되는 방식 |
실행 모델 | 동적 바인딩 | 런타임에 호출 메서드가 결정되는 방식 |
참고 및 출처
필요하시면 C#
, Kotlin
, TypeScript
등 언어별 오버라이딩/오버로딩의 차이와 적용 방법도 정리해드릴 수 있습니다.
주어진 주제에 대해 체계적으로 분석하겠습니다. 먼저 웹 검색을 통해 최신 정보를 수집한 후 정리하겠습니다.추가로 오버라이딩과 오버로딩의 실무 적용 사례를 찾기 위해 검색을 계속하겠습니다.이제 구현 예시와 활용 사례를 위한 검색을 더 진행하겠습니다.이제 주제의 분류와 분석부터 시작하겠습니다.
1. 주제 분류 분석# 오버라이딩 (Overriding) vs. 오버로딩 (Overloading) 종합 분석
1. 주제 분류 분석
현재 분류: “Computer Science and Engineering” > “System and Software Architecture” > “Principles” > “Programming Paradigms” > “Object-Oriented Programming”
적절성 평가:
- ✅ Computer Science and Engineering: 매우 적절 - 명백히 컴퓨터 과학 영역
- ⚠️ System and Software Architecture: 부분적 적절 - 더 구체적 분류 필요
- ✅ Principles: 적절 - OOP 의 핵심 원칙
- ✅ Programming Paradigms: 매우 적절 - 객체지향 패러다임 핵심
- ✅ Object-Oriented Programming: 완벽하게 적절 - 다형성 구현 메커니즘
개선된 분류 제안: Computer Science and Engineering
> Programming Languages and Software Engineering
> Object-Oriented Programming
> Polymorphism
> Method Polymorphism Mechanisms
근거: 오버라이딩과 오버로딩은 시스템 아키텍처보다는 프로그래밍 언어의 기능과 다형성 구현에 더 직접적으로 관련됨
2. 요약 설명 (200 자 내외)
오버라이딩 (Overriding) 은 상속 관계에서 자식 클래스가 부모 클래스의 메서드를 재정의하는 런타임 다형성 기법이며, 오버로딩 (Overloading) 은 같은 클래스 내에서 같은 이름의 메서드를 매개변수만 다르게 하여 여러 개 정의하는 컴파일타임 다형성 기법입니다. 둘 다 객체지향 프로그래밍의 핵심인 다형성을 구현하는 중요한 메커니즘입니다.
3. 개요 (250 자 내외)
오버라이딩과 오버로딩은 객체지향 프로그래밍에서 다형성 (Polymorphism) 을 구현하는 핵심 메커니즘입니다. 오버라이딩은 상속받은 메서드를 자식 클래스에서 새롭게 재정의하여 런타임에 동적으로 메서드가 결정되는 동적 다형성을 제공합니다. 오버로딩은 동일한 메서드 이름으로 매개변수의 타입이나 개수를 달리하여 컴파일타임에 메서드가 결정되는 정적 다형성을 제공합니다. 이 두 기법은 코드의 재사용성, 유연성, 가독성을 향상시키는 중요한 설계 원칙입니다.
4. 핵심 개념
오버라이딩 (Overriding)
- 정의: 상속 관계에서 자식 클래스가 부모 클래스의 메서드를 동일한 시그니처로 재정의하는 것
- 동적 바인딩 (Dynamic Binding): 런타임에 실제 객체 타입에 따라 메서드 호출 결정
- 가상 메서드 테이블 (Virtual Method Table): JVM 이 오버라이딩된 메서드를 관리하는 메커니즘
- 런타임 다형성: 동일한 메서드 호출로 다른 동작 수행
오버로딩 (Overloading)
- 정의: 같은 클래스 내에서 동일한 이름의 메서드를 매개변수 시그니처를 달리하여 여러 개 정의
- 정적 바인딩 (Static Binding): 컴파일타임에 메서드 호출 결정
- 메서드 시그니처: 메서드명 + 매개변수 타입 + 매개변수 개수 + 매개변수 순서
- 컴파일타임 다형성: 매개변수에 따라 적절한 메서드 선택
5. 비교 분석
5.1 기본 특성 비교
특성 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
---|---|---|
다형성 타입 | 런타임 다형성 (Dynamic Polymorphism) | 컴파일타임 다형성 (Static Polymorphism) |
바인딩 시점 | 런타임 (Runtime) | 컴파일타임 (Compile-time) |
상속 관계 | 필수 (부모 - 자식 클래스) | 불필요 (같은 클래스) |
메서드 시그니처 | 완전히 동일해야 함 | 매개변수가 달라야 함 |
리턴 타입 | 동일하거나 공변 타입 | 자유롭게 변경 가능 |
접근 제어자 | 같거나 더 넓은 범위 | 자유롭게 변경 가능 |
5.2 목적 및 사용 시나리오
구분 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
---|---|---|
주요 목적 | 부모 클래스 메서드의 동작 변경/확장 | 같은 기능의 다양한 매개변수 지원 |
코드 재사용 | 상속을 통한 수직적 재사용 | 매개변수 다양성을 통한 수평적 재사용 |
유연성 | 런타임 동작 변경 | 컴파일타임 선택지 제공 |
성능 | 약간의 런타임 오버헤드 | 성능 오버헤드 없음 |
5.3 주요 원리 및 작동 원리
오버라이딩 작동 원리
graph TD A[메서드 호출] --> B{실제 객체 타입 확인} B --> C[가상 메서드 테이블 조회] C --> D[자식 클래스 메서드 존재?] D -->|Yes| E[자식 클래스 메서드 실행] D -->|No| F[부모 클래스 메서드 실행]
오버로딩 작동 원리
graph TD A[메서드 호출] --> B[컴파일러가 매개변수 분석] B --> C[메서드 시그니처 매칭] C --> D[가장 적합한 메서드 선택] D --> E[바이트코드에 직접 바인딩]
5.4 구조 및 아키텍처
필수 구성요소
오버라이딩 필수 구성요소:
- 상속 관계 (부모 - 자식 클래스)
- 동일한 메서드 시그니처
- @Override 어노테이션 (권장)
- 가상 메서드 테이블 (JVM 레벨)
오버로딩 필수 구성요소:
- 동일한 메서드명
- 서로 다른 매개변수 시그니처
- 컴파일러의 메서드 해석 로직
선택 구성요소
오버라이딩 선택 구성요소:
- super 키워드를 통한 부모 메서드 호출
- 접근 제어자 변경
- 예외 처리 범위 축소
오버로딩 선택 구성요소:
- 가변 인자 (Varargs) 사용
- 기본값 매개변수 패턴
- 타입 자동 변환 활용
5.5 구현 기법
오버라이딩 구현 기법
기본 오버라이딩
- 정의: 부모 메서드를 완전히 새로운 구현으로 대체
- 목적: 자식 클래스에 특화된 동작 제공
- 예시: Animal.makeSound() → Dog.makeSound()
확장 오버라이딩
- 정의: super 키워드로 부모 기능을 포함하면서 확장
- 목적: 기존 기능 유지 + 추가 기능
- 예시: 로깅 기능 추가, 검증 로직 추가
템플릿 메서드 오버라이딩
- 정의: 추상 메서드나 훅 메서드의 구체적 구현
- 목적: 프레임워크에서 정의한 골격에 세부 로직 구현
- 예시: Spring Framework 의 콜백 메서드들
오버로딩 구현 기법
매개변수 개수 기반 오버로딩
- 정의: 같은 타입의 매개변수 개수를 다르게 함
- 목적: 선택적 매개변수 효과
- 예시: StringBuilder.append(String), append(String, int, int)
매개변수 타입 기반 오버로딩
- 정의: 매개변수 타입을 다르게 함
- 목적: 다양한 데이터 타입 지원
- 예시: Math.max(int, int), Math.max(double, double)
가변 인자 오버로딩
- 정의: 가변 인자와 고정 인자를 조합
- 목적: 유연한 매개변수 처리
- 예시: String.format(String, Object…)
6. 강점과 약점 비교
구분 | 오버라이딩 강점 | 오버라이딩 약점 |
---|---|---|
런타임 유연성 | 실행 시점에 동적 메서드 선택 | 런타임 오버헤드 발생 |
확장성 | 기존 코드 수정 없이 새 기능 추가 | 상속 관계 의존성 증가 |
다형성 | 강력한 다형성 지원 | 복잡한 상속 구조 시 추적 어려움 |
유지보수 | 개방 - 폐쇄 원칙 준수 | 잘못된 오버라이딩 시 버그 위험 |
구분 | 오버로딩 강점 | 오버로딩 약점 |
---|---|---|
성능 | 컴파일타임 결정으로 빠른 실행 | 런타임 유연성 부족 |
편의성 | 같은 이름으로 다양한 기능 제공 | 과도한 오버로딩 시 가독성 저하 |
타입 안전성 | 컴파일타임 타입 검사 | 모호한 메서드 호출 가능성 |
API 설계 | 직관적인 API 제공 | 매개변수 조합 복잡성 증가 |
7. 장점과 단점
오버라이딩 장점과 단점
장점 | 단점 |
---|---|
런타임 다형성으로 유연한 동작 변경 | 가상 메서드 테이블 조회로 성능 오버헤드 |
개방 - 폐쇄 원칙 준수 (확장에 열려있고 변경에 닫혀있음) | 깊은 상속 계층에서 메서드 추적 어려움 |
코드 재사용성 향상 | 잘못된 오버라이딩으로 인한 예상치 못한 동작 |
프레임워크와 라이브러리 확장성 제공 | 리스코프 치환 원칙 위반 위험 |
인터페이스와 추상 클래스 구현 | 상속 관계에 강하게 결합됨 |
오버로딩 장점과 단점
장점 | 단점 |
---|---|
컴파일타임 해석으로 빠른 실행 속도 | 런타임에 메서드 변경 불가 |
같은 기능의 다양한 사용법 제공 | 과도한 오버로딩으로 인한 혼란 |
API 사용자에게 직관적인 인터페이스 | 매개변수 타입 자동 변환으로 의도치 않은 메서드 호출 |
타입 안전성 보장 | 메서드 시그니처 관리 복잡성 |
메모리 사용량 최적화 | 비슷한 기능의 중복 코드 가능성 |
단점 해결 방법
오버라이딩 단점 해결 방법
- 성능 최적화: JIT 컴파일러 최적화 활용, final 메서드 사용
- 설계 명확화: 명확한 상속 구조 설계, 문서화 강화
- 테스트 강화: 리스코프 치환 원칙 준수 테스트, 계약 프로그래밍
- 코드 리뷰: 오버라이딩 동작 검증, @Override 어노테이션 필수 사용
오버로딩 단점 해결 방법
- 명명 규칙: 의미 있는 메서드명 사용, 매개변수 타입 힌트
- 문서화: 각 오버로딩 메서드의 용도 명확히 문서화
- 최소화 원칙: 필요한 경우에만 오버로딩 사용
- 타입 안전성: 제네릭 활용, 명시적 타입 캐스팅
8. 구현 예시
Python 구현 예시
|
|
9. 실무 적용 예시
분야 | 오버라이딩 활용 | 오버로딩 활용 |
---|---|---|
웹 프레임워크 | Spring Controller 의 핸들러 메서드 커스터마이징 | HTTP 메서드별 다른 매개변수 처리 |
데이터베이스 | ORM 엔티티의 생명주기 콜백 메서드 구현 | DAO 메서드의 다양한 검색 조건 지원 |
게임 개발 | 캐릭터별 스킬 시스템 구현 | 무기 시스템의 다양한 공격 패턴 |
결제 시스템 | 결제 수단별 처리 로직 구현 | 결제 금액, 통화, 할부 옵션별 처리 |
로깅 시스템 | 로그 레벨별 출력 형식 변경 | 로그 메시지의 다양한 형태 지원 |
UI 프레임워크 | 컴포넌트별 렌더링 로직 구현 | 이벤트 핸들러의 다양한 매개변수 |
10. 활용 사례: 전자상거래 주문 관리 시스템
시스템 구성
graph TB A[주문 관리 시스템] --> B[주문 처리 엔진] A --> C[결제 처리 모듈] A --> D[배송 관리 모듈] B --> E[일반 주문 처리기] B --> F[프리미엄 주문 처리기] B --> G[대량 주문 처리기] C --> H[신용카드 프로세서] C --> I[PayPal 프로세서] C --> J[암호화폐 프로세서] D --> K[일반 배송] D --> L[익일 배송] D --> M[당일 배송]
Workflow 다이어그램
sequenceDiagram participant U as 사용자 participant O as 주문 시스템 participant P as 결제 프로세서 participant S as 배송 시스템 U->>O: 주문 생성 (오버로딩: 다양한 주문 타입) O->>O: 주문 검증 (오버라이딩: 주문 타입별 검증) O->>P: 결제 요청 (오버라이딩: 결제 수단별 처리) P->>P: 결제 처리 (오버라이딩: 각 결제사 API) P->>O: 결제 결과 반환 O->>S: 배송 스케줄링 (오버라이딩: 배송 타입별 로직) S->>U: 배송 시작 알림
시스템에서의 역할
오버라이딩의 역할:
- 결제 수단별 API 연동 로직 구현
- 주문 타입별 검증 및 처리 로직
- 배송 방식별 스케줄링 알고리즘
- 알림 발송 채널별 메시지 포맷팅
오버로딩의 역할:
- 주문 생성 시 다양한 매개변수 조합 지원
- 검색 기능의 다양한 필터 옵션
- 리포트 생성의 다양한 출력 형식
- API 엔드포인트의 유연한 매개변수 처리
비교 분석: 전통적 방식 Vs 다형성 활용
측면 | 전통적 방식 (if-else 체인) | 다형성 활용 (오버라이딩/오버로딩) |
---|---|---|
코드 복잡성 | 하나의 메서드에 모든 로직 집중 | 책임별로 분산된 깔끔한 구조 |
확장성 | 새 기능 추가 시 기존 코드 수정 필요 | 새 클래스 추가만으로 확장 가능 |
테스트 | 모든 경우의 수 테스트 복잡 | 각 구현체별 독립적 테스트 |
유지보수 | 변경 시 전체 로직 검토 필요 | 해당 구현체만 수정 |
성능 | 조건문 평가 오버헤드 | 다형성 호출 오버헤드 (미미함) |
11. 실무에서 효과적으로 적용하기 위한 고려사항
고려사항 | 오버라이딩 | 오버로딩 | 권장사항 |
---|---|---|---|
설계 원칙 | 리스코프 치환 원칙 준수 | 메서드 시그니처 일관성 | 명확한 계약 정의 |
성능 고려 | JIT 컴파일러 최적화 활용 | 컴파일타임 해석 활용 | 프로파일링을 통한 성능 측정 |
코드 가독성 | @Override 어노테이션 필수 사용 | 메서드명과 매개변수 명확화 | 코드 리뷰 프로세스 강화 |
문서화 | 오버라이딩 의도와 변경사항 명시 | 각 오버로딩의 용도 설명 | Javadoc/Sphinx 등 도구 활용 |
테스트 전략 | 부모 - 자식 클래스 동작 검증 | 모든 매개변수 조합 테스트 | 단위 테스트와 통합 테스트 분리 |
버전 호환성 | 메서드 시그니처 변경 금지 | 기본값 매개변수로 하위 호환성 | 시맨틱 버저닝 적용 |
12. 최적화를 위한 고려사항
최적화 영역 | 오버라이딩 | 오버로딩 | 권장사항 |
---|---|---|---|
메모리 사용 | 가상 메서드 테이블 최적화 | 메서드 수 최소화 | 불필요한 메서드 제거 |
실행 속도 | final 메서드로 인라이닝 유도 | 타입 변환 최소화 | JVM 옵션 튜닝 |
컴파일 시간 | 상속 깊이 제한 | 오버로딩 수 제한 | 빌드 도구 최적화 |
개발 생산성 | IDE 지원 기능 활용 | 코드 자동 생성 도구 사용 | 개발 템플릿 구축 |
유지보수성 | 단일 책임 원칙 적용 | 메서드 그룹화 | 리팩토링 도구 활용 |
확장성 | 인터페이스 기반 설계 | 빌더 패턴 활용 | 아키텍처 리뷰 주기적 실시 |
13. 앞으로의 전망
주제 | 항목 | 설명 |
---|---|---|
언어 발전 | 함수형 프로그래밍 통합 | Java 의 람다식, 스트림 API 와 오버라이딩/오버로딩 결합 |
컴파일러 기술 | 정적 분석 강화 | 컴파일 시점에 더 정교한 오버로딩 해석 및 최적화 |
JVM 개선 | 동적 최적화 | Project Valhalla 를 통한 value types 지원으로 성능 향상 |
도구 지원 | IDE 지능화 | AI 기반 코드 완성으로 적절한 오버라이딩/오버로딩 제안 |
프레임워크 | 어노테이션 기반 | Spring Boot 의 조건부 빈 등록과 같은 선언적 다형성 |
마이크로서비스 | 인터페이스 설계 | gRPC, GraphQL 등에서 다형성 패턴 활용 증가 |
14. 주제와 관련하여 주목할 내용
주제 | 항목 | 설명 |
---|---|---|
함수형 프로그래밍 | 고차 함수 | 오버라이딩 대신 함수를 매개변수로 전달하는 패턴 |
제네릭 프로그래밍 | 타입 안전성 | 오버로딩과 제네릭을 결합한 타입 안전한 API 설계 |
리플렉션 API | 동적 메서드 호출 | 런타임에 오버라이딩된 메서드 탐지 및 호출 |
어노테이션 처리 | 컴파일타임 검증 | 오버라이딩 규칙 검증을 위한 커스텀 어노테이션 |
바이트코드 조작 | 프록시 패턴 | CGLIB, Javassist 를 통한 동적 오버라이딩 |
성능 모니터링 | 프로파일링 | 다형성 호출의 성능 영향 측정 도구 |
15. 추가 학습 내용
카테고리 | 간략한 설명 | 주제 |
---|---|---|
디자인 패턴 | 다형성을 활용한 구조적 패턴 | Strategy, Template Method, Factory Method |
SOLID 원칙 | 객체지향 설계 원칙과 다형성 | Open-Closed Principle, Liskov Substitution |
동시성 프로그래밍 | 스레드 안전한 다형성 구현 | Synchronized 메서드, 불변 객체 |
함수형 인터페이스 | 람다식과 메서드 참조 | Function, Consumer, Predicate |
메타프로그래밍 | 코드 생성과 동적 프록시 | Annotation Processing, Dynamic Proxy |
성능 최적화 | JVM 튜닝과 프로파일링 | JIT 컴파일, GC 튜닝, 메모리 분석 |
16. 기타 사항: 문제점과 해결 방안
오버라이딩 관련 문제
1. 리스코프 치환 원칙 위반
- 원인: 자식 클래스에서 부모 클래스의 기대 동작을 변경
- 영향: 다형성 사용 시 예상치 못한 동작, 버그 발생
- 탐지: 단위 테스트로 부모 - 자식 클래스 동작 일관성 검증
- 예방: 명확한 계약 (Contract) 정의, 사전/사후 조건 명시
- 해결: 인터페이스 분리, 조합 (Composition) 패턴 활용
2. 다이아몬드 문제 (Multiple Inheritance)
- 원인: 여러 부모 클래스에서 같은 메서드 상속
- 영향: 어떤 메서드를 호출할지 모호함
- 탐지: 컴파일러 경고, 정적 분석 도구
- 예방: 인터페이스 기본 메서드 신중 사용, 단일 상속 원칙
- 해결: 명시적 super 호출, 믹스인 패턴 활용
오버로딩 관련 문제
3. 타입 자동 변환으로 인한 모호성
- 원인: 매개변수 타입 자동 변환으로 여러 메서드 매칭
- 영향: 의도하지 않은 메서드 호출, 성능 저하
- 탐지: 컴파일 경고, 코드 리뷰
- 예방: 명시적 타입 캐스팅, 제네릭 활용
- 해결: 메서드 시그니처 재설계, 타입 힌트 추가
4. 과도한 오버로딩으로 인한 복잡성
- 원인: 너무 많은 오버로딩 메서드 정의
- 영향: 코드 가독성 저하, 유지보수 어려움
- 탐지: 정적 분석, 코드 복잡도 측정
- 예방: 빌더 패턴, 설정 객체 패턴 활용
- 해결: 메서드 그룹화, 기본값 매개변수 활용
용어 정리
카테고리 | 용어 | 설명 |
---|---|---|
다형성 | 런타임 다형성 (Runtime Polymorphism) | 실행 시점에 객체 타입에 따라 메서드가 결정되는 다형성 |
다형성 | 컴파일타임 다형성 (Compile-time Polymorphism) | 컴파일 시점에 매개변수에 따라 메서드가 결정되는 다형성 |
바인딩 | 동적 바인딩 (Dynamic Binding) | 런타임에 메서드 호출이 결정되는 방식 |
바인딩 | 정적 바인딩 (Static Binding) | 컴파일 시점에 메서드 호출이 결정되는 방식 |
메서드 | 메서드 시그니처 (Method Signature) | 메서드명과 매개변수 타입, 개수, 순서를 포함한 식별자 |
상속 | 가상 메서드 테이블 (Virtual Method Table) | JVM 이 오버라이딩된 메서드를 관리하는 자료구조 |
원칙 | 리스코프 치환 원칙 (Liskov Substitution Principle) | 자식 클래스는 부모 클래스를 대체할 수 있어야 한다는 원칙 |
원칙 | 개방 - 폐쇄 원칙 (Open-Closed Principle) | 확장에는 열려있고 변경에는 닫혀있어야 한다는 원칙 |
참고 및 출처
- GeeksforGeeks - Method Overloading and Overriding in Java
- Oracle Java Documentation - Overriding and Hiding Methods
- Oracle Java Documentation - Defining Methods
- DigitalOcean - Overriding vs Overloading in Java
- FreeCodeCamp - Method Overloading vs Method Overriding
기본 개념 비교
구분 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
---|---|---|
정의 | 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것 | 같은 클래스 내에서 동일한 이름의 메서드를 매개변수를 다르게 하여 여러 개 정의하는 것 |
목적 | 상속 관계에서 메서드의 구현을 변경하기 위해 사용 | 비슷한 기능을 하는 메서드를 하나의 이름으로 여러 가지 방식으로 사용하기 위해 사용 |
다형성 유형 | 런타임 다형성 (동적 바인딩) | 컴파일 타임 다형성 (정적 바인딩) |
핵심 특징 비교
구분 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
---|---|---|
메서드 이름 | 반드시 동일해야 함 | 반드시 동일해야 함 |
매개변수 | 부모 메서드와 동일해야 함 | 타입이나 개수가 달라야 함 |
반환 타입 | 부모 메서드와 동일하거나 공변 반환 타입이어야 함 | 다를 수 있음 |
접근 제어자 | 부모 메서드보다 더 제한적일 수 없음 | 자유롭게 지정 가능 |
예외 처리 | 부모 메서드보다 더 큰 범위의 예외를 던질 수 없음 | 자유롭게 지정 가능 |
코드 예시 비교
오버라이딩 예시
|
|
오버로딩 예시
|
|
실행 시점 비교
구분 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
---|---|---|
결정 시점 | 런타임에 결정 | 컴파일 타임에 결정 |
바인딩 | 동적 바인딩 | 정적 바인딩 |
성능 영향 | 약간의 오버헤드 발생 가능 | 오버헤드 없음 |
사용 목적 비교
구분 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
---|---|---|
주요 용도 | • 부모 클래스 메서드의 동작 변경 • 다형성 구현 • 특화된 기능 구현 | • 메서드 이름의 재사용 • 다양한 매개변수 처리 • 코드의 간결성 향상 |
활용 상황 | • 추상 메서드 구현 • 인터페이스 구현 • 상속받은 메서드 수정 | • 생성자 다중 정의 • 유틸리티 메서드 구현 • API 설계 |
제약사항 비교
구분 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
---|---|---|
메서드 제약 | • final 메서드는 오버라이드 불가 • private 메서드는 오버라이드 불가 • static 메서드는 오버라이드 불가 | • 매개변수만 다르면 됨 • 반환 타입만 다른 것은 불가 • 접근 제어자 제약 없음 |
상속 관계 | 반드시 상속 관계가 있어야 함 | 상속 관계 불필요 |
기타 제약 | • 부모의 메서드보다 접근성을 좁힐 수 없음 • 부모보다 더 큰 예외 선언 불가 | • 매개변수 순서만 다른 경우 주의 필요 • 모호한 호출 가능성 주의 |
장단점 비교
구분 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
---|---|---|
장점 | • 다형성 구현 가능 • 코드 재사용성 향상 • 유연한 설계 가능 | • 직관적인 메서드명 사용 • 코드 가독성 향상 • API 사용 편의성 증가 |
단점 | • 런타임 오버헤드 • 복잡한 상속 관계시 추적 어려움 • 잘못 사용시 부모 클래스 동작 훼손 | • 과도한 사용시 복잡도 증가 • 타입 변환 오류 가능성 • 모호한 메서드 호출 가능성 |
용어 정리
용어 | 설명 |
---|---|