강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

jlim님의 프로필 이미지
jlim

작성한 질문수

30분안에 끝내는 객체지향의 본질

객체지향은 어떻게 동작하는가?

다형성 개념 문의

작성

·

15

·

수정됨

1

안녕하세요, 요즘 이직 준비하면서 CS 인사이드나 좀 얻고자 해당 강의를 무료로 수강 중인데요. 우선 영상 만드시는데 수고하신 것 같습니다만 이해가 안되는 부분들(다형성)이 있어서 문의드립니다.

 

2강 '객체지향은 어떻게 동작하는가?'

6:08 해당 주제명과 코드는 추상화 라고 해야 적합할 듯한데요. OCP는 추상화에 관련 있기도 하고요

 

6:26 다형성의 핵심은 부모타입으로 다루는 것(구현이 아닌 추상에 의존한다) 이 말씀이 무슨 말씀인지 이해가 잘 안되는데, 공부하셨던 자료 출처가 있을까요?

 

결론적으로 문의를 요약하면 다형성 개념을 오버로딩/오버라이딩 개념보단 추상화 개념으로 보는 것 같은 데 다형성과 추상화과 어떤 관련이 있는 지 궁금하며 공부하신 자료 출처를 남겨 놔주시면 다른 이들도 함께 공부하는 기회가 될 것 같습니다 :))

답변 2

1

kmmom591님의 프로필 이미지
kmmom591
지식공유자

좋은 질문 감사합니다!

다형성을 오버로딩/오버라이딩으로만 설명하는 것은 사실 다형성의 일부만 다루는 것입니다. Cardelli & Wegner(1985)의 분류에 따르면 오버로딩은 임시적 다형성(ad-hoc polymorphism) 의 한 종류이고, 객체지향 설계에서 핵심으로 다루는 것은 서브타입 다형성(inclusion polymorphism) 입니다.

"부모 타입으로 다룬다 = 구현이 아닌 추상에 의존한다"는 GoF의 "Program to an interface, not an implementation" 원칙과 동일한 맥락으로, 코드가 구체적인 클래스가 아니라 인터페이스/추상 타입에만 의존하면 새로운 구현체를 추가해도 기존 코드를 수정할 필요가 없습니다. 이것이 OCP가 다형성/추상화와 연결되는 이유입니다.

 

1. 다형성(Polymorphism)의 정의 — 오버로딩/오버라이딩을 넘어서

Luca Cardelli & Peter Wegner (1985), "On Understanding Types, Data Abstraction, and Polymorphism" (ACM Computing Surveys, Vol. 17, No. 4)

이 논문은 다형성을 다음 네 가지로 분류한 가장 권위 있는 원전입니다:

Parametric polymorphism (제네릭)

Inclusion polymorphism (서브타입 다형성 — 상속/인터페이스)

Overloading (임시 다형성)

Coercion (강제 변환)

오버로딩은 다형성의 한 종류일 뿐이며, 객체지향에서 핵심으로 다루는 다형성은 Inclusion polymorphism(서브타입 다형성) 입니다.

 

2. "부모 타입으로 다룬다" = "구현이 아닌 추상에 의존" — 이게 무슨 뜻인가?

Barbara Liskov (1987), "Data Abstraction and Hierarchy" (SIGPLAN Notices)

리스코프 치환 원칙(LSP)의 원전으로, 핵심 개념은 이것입니다:

"If S is a subtype of T, then objects of type T may be replaced with objects of type S without altering any of the desirable properties of that program."

즉, 코드가 구체적인 자식 클래스(구현)를 몰라도 부모 타입(추상)만 알면 동작해야 한다는 것이고, 이것이 "구현이 아닌 추상에 의존"의 의미.

 

3. OCP와 다형성/추상화의 관계

Robert C. Martin (1996), "The Open-Closed Principle" (C++ Report)

"A module should be open for extension but closed for modification."

Martin은 이 원칙을 달성하는 핵심 수단으로 추상화(abstraction) + 다형성(polymorphism) 을 명시합니다. 새로운 구현체를 추가할 때 기존 코드를 수정하지 않아도 되는 이유가 바로 부모 타입(인터페이스/추상클래스)에 의존하기 때문입니다.

GoF (Gang of Four), "Design Patterns" (1994) — Erich Gamma 외

"Program to an interface, not an implementation."

위 문장이 "추상에 의존"의 유명한 표현.

 

4. DIP(의존성 역전 원칙)와의 연결

Robert C. Martin, "Agile Software Development" (2002)

"High-level modules should not depend on low-level modules. Both should depend on abstractions."

"구현이 아닌 추상에 의존"과 정확히 같은 맥락.

 

참고 자료:

  • Cardelli & Wegner (1985) — "On Understanding Types, Data Abstraction, and Polymorphism"

  • Barbara Liskov (1987) — "Data Abstraction and Hierarchy"

  • Robert C. Martin (1996) — "The Open-Closed Principle"

  • GoF (1994) — "Design Patterns: Elements of Reusable Object-Oriented Software"

-1

안녕하세요, 인프런 AI 인턴입니다. jlim님.

다형성과 추상화는 객체지향 프로그래밍에서 중요한 개념입니다. 두 개념은 밀접하게 연관되어 있습니다. 다형성은 같은 메시지를 다르게 처리할 수 있는 능력을 의미하며, 추상화는 복잡한 시스템을 단순화하여 개념을 정의하는 과정입니다. 다형성에서 중요한 점은 “부모 타입으로 다룬다”는 것이며, 이는 코드의 유연성과 재사용성을 높여줍니다.

다형성과 추상화의 관계를 자세히 이해하기 위해 아래의 유사한 질문과 해답을 참고하시길 추천드립니다.

  1. UML과 객체지향 설계 입문 강의의 다형성 설명: 이 답변에서는 객체지향의 다양한 측면, 특히 다형성과 추상화 사이의 관계를 설명합니다. 두 개념이 어떻게 코드의 유연성을 높이는지 이해하는 데 도움이 될 것입니다.

이 질문과 대답에서 얻고자 하는 정보는 다형성을 향상시키기 위해 추상화가 왜 중요한지를 정확히 이해하는 것입니다. 부모 타입으로 다루는 것은 코드가 특정 구현이 아닌 구조 및 인터페이스에 더 초점을 두어 다양한 구현을 사용할 수 있게 만들어 줍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

jlim님의 프로필 이미지
jlim

작성한 질문수

질문하기