Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

타입으로 견고하게 다형성으로 유연하게 5주차 - 권태형 #488

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

TaeHyoungKwon
Copy link
Collaborator

챕터5장 읽고 작성하였습니다 Close #485

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello @TaeHyoungKwon, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

Summary of Changes

This pull request summarizes Chapter 5 of a book, focusing on the concepts of overloading, overriding, typeclasses, and kinds. The author reflects on their understanding of these concepts before and after reading the chapter, and discusses the practical application of overloading versus using union types. The author also shares their thoughts on the book's explanations and structure.

Highlights

  • Overloading vs. Union Types: The author discusses the criteria for choosing between overloading and union types, noting that overloading is generally preferred except when dealing with heterogeneous lists like List("a", 2, "c").
  • Method Overriding: The author reflects on the use of method overriding in Java and questions the practicality of the book's examples, suggesting that simpler solutions might exist in real-world scenarios.
  • Understanding Type Concepts: The author highlights how the book helped them understand the logical underpinnings of type checking and runtime type determination for overloading and overriding.
  • Kind (Type of Type): The author explains their understanding of 'kind' as a way to abstract and categorize types, with the diagram on page 363 being particularly helpful.
  • Challenges with Functional Language Concepts: The author notes that concepts specific to functional languages were more difficult to grasp due to their unfamiliarity with those languages.
  • Impact on Static Typing Perspective: The author expresses that reading the book has inspired deeper consideration of static typing principles and the nuances of types and polymorphism, which they hope to apply to their Java work.
  • Overall Book Experience: The author found the book challenging to follow and somewhat verbose, but still valuable for its insights into types and polymorphism.

Changelog

  • 2025/RobustWithTypeFlexibleWithPolymorphism/taehyoung/Chapter5.md
    • Added a summary of Chapter 5, including discussion points, keywords, and personal reflections.
    • Discusses the use cases for overloading and union types.
    • Explores the concepts of method overloading and overriding.
    • Introduces typeclasses and kinds.
    • Shares personal insights on understanding type systems and polymorphism.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.


In realms of code, where types reside,
Overloading's choice, where rules preside.
With union's grace, or method's might,
We shape the code, both day and night.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

github-actions bot commented Mar 5, 2025

우측에 있는 Projects, Milestone, Development를 확인 후 할당 해주세요~! 🙇

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

The pull request includes a summary and personal reflections on Chapter 5 of the book '타입으로 견고하게 다형성으로 유연하게'. The author discusses overloading, type usage, and shares their understanding of concepts like 'kind'. Overall, the reflections are insightful, but there are a few areas where clarity could be improved.

Merge Readiness

The pull request provides a good summary of the chapter and the author's thoughts. Since the changes are limited to a markdown file and there are no critical or high severity issues, the pull request is reasonably ready for merging. However, I am unable to directly approve the pull request, and other reviewers should also review and approve this code before merging.

@TaeHyoungKwon TaeHyoungKwon changed the title 타입으로 견고하게 다형성으로 유연하게 5주 권태형 타입으로 견고하게 다형성으로 유연하게 5주차 - 권태형 Mar 5, 2025
@TaeHyoungKwon
Copy link
Collaborator Author

@gemini

본문에 작성한 논의 내용을 보기 좋게 요약해서 코멘트로 작성해줘

Copy link

안녕하세요 @TaeHyoungKwon님, 요청하신대로 본문에 작성된 논의 내용을 요약해 드리겠습니다.

요약:

이 Pull Request는 챕터 5장을 읽고 작성되었으며, 주요 논의 내용은 다음과 같습니다.

  1. 오버로딩 vs. 이거나 타입: 기존에는 쉽고 빠른 구현을 위해 이거나 타입을 무의식적으로 사용하고 오버로딩으로 리팩토링하는 방식을 사용했지만, 책에서 제시하는 기준에 따라 코드를 작성하는 것에 대한 논의가 필요합니다.
  2. 메서드 선택의 한계: 책 330p의 _add 메서드 예제에 대한 이해와, 올바른 add 구현에 대한 고민을 공유합니다.
  3. 설명 방식: 책에서 주요 개념 설명 전에 나오는 처르지와 큐리 박사의 대화 형식이 효과적인지에 대한 의견을 묻습니다.

주요 키워드:

  • 오버로딩 (함수, 메서드, 연산자, 오버로딩에 의한 다형성)
  • 메서드 오버라이딩 (동적 선택)
  • 타입클래스 (타입클래스 인스턴스)
  • 카인드 (kind)

개인의 생각:

  • 이거나 타입과 오버로딩 사용에 대한 기준을 명확히 알게 됨.
  • 메서드 오버라이딩 예제가 현실적인 상황과 동떨어져 보이며, 상속의 폐해로 이어질 수 있다는 의견.
  • 오버로딩, 오버라이딩의 동작 방식에 대한 이해도 향상.
  • 카인드(kind) 개념을 새롭게 알게 되었으며, p363의 다이어그램이 이해에 큰 도움이 됨.
  • 함수형 언어 관련 내용의 이해가 다소 어려움.
  • 정적 타입의 철학과 타입/다형성에 대한 깊은 고민을 해볼 수 있게 됨.
  • 책 내용이 다소 난해하고 지루하게 느껴질 수 있다는 의견.
  • 내용 요약 정리의 필요성을 느낌.

이 요약본이 검토에 도움이 되기를 바랍니다.

@TaeHyoungKwon
Copy link
Collaborator Author

@gemini

아래 프롬프트를 실행시키고 결과를 알려줘

함수형 프로그래밍에서 타입클래스(typeclass)와 타입클래스 인스턴스(typeclass instance)에 대해 초보자도
이해할 수 있도록 단계적으로 설명해 주세요.

설명 시 다음 항목을 순차적으로 포함해 주세요:

  1. 해당 개념의 기본 정의를 가장 간단한 언어로 설명
  2. 일상에서 볼 수 있는 쉬운 비유나 예시 3가지
  3. 핵심 원리를 시각적으로 상상할 수 있는 묘사
  4. 단계적 심화 설명 (기초→중급→고급)
  5. 자주 오해하는 부분과 정확한 이해
  6. 이 개념을 실생활에 적용할 수 있는 방법 3가지

전문 용어는 반드시 쉬운 한국어로 풀어서 설명해 주세요.

Copy link

안녕하세요 @TaeHyoungKwon님,

요청하신 함수형 프로그래밍에서 타입클래스와 타입클래스 인스턴스에 대한 설명을 아래와 같이 제공합니다.

1. 기본 정의

  • 타입클래스 (Typeclass): 특정 타입이 지원해야 하는 기능(operation)들의 집합을 정의하는 인터페이스입니다. 즉, 어떤 타입이 특정 타입클래스의 '멤버'가 되기 위해서는 해당 타입클래스가 요구하는 모든 기능을 구현해야 합니다. 이는 Java의 인터페이스나 C++의 concept과 유사하지만, 타입클래스는 기존 타입에 새로운 기능을 추가할 수 있다는 점에서 차이가 있습니다.
  • 타입클래스 인스턴스 (Typeclass Instance): 특정 타입이 특정 타입클래스의 멤버임을 선언하고, 해당 타입클래스가 요구하는 기능을 실제로 구현하는 것입니다. 이는 Java에서 인터페이스를 구현하는 클래스, C++에서 concept을 만족하는 클래스와 유사합니다.

2. 쉬운 비유 및 예시

  • 예시 1 (요리):
    • 타입클래스: "구울 수 있는 (Bakeable)"
    • 타입클래스 인스턴스: "빵 (Bread)", "쿠키 (Cookie)", "케이크 (Cake)"
    • 설명: 빵, 쿠키, 케이크는 모두 '굽기'라는 기능을 수행할 수 있으므로 '구울 수 있는' 타입클래스의 인스턴스가 될 수 있습니다.
  • 예시 2 (악기):
    • 타입클래스: "소리를 낼 수 있는 (Soundable)"
    • 타입클래스 인스턴스: "기타 (Guitar)", "피아노 (Piano)", "드럼 (Drum)"
    • 설명: 기타, 피아노, 드럼은 모두 '소리내기'라는 기능을 수행할 수 있으므로 '소리를 낼 수 있는' 타입클래스의 인스턴스가 될 수 있습니다.
  • 예시 3 (동물):
    • 타입클래스: "움직일 수 있는 (Movable)"
    • 타입클래스 인스턴스: "강아지 (Dog)", "고양이 (Cat)", "새 (Bird)"
    • 설명: 강아지, 고양이, 새는 모두 '움직이기'라는 기능을 수행할 수 있으므로 '움직일 수 있는' 타입클래스의 인스턴스가 될 수 있습니다.

3. 핵심 원리의 시각적 묘사

타입클래스는 일종의 '계약'과 같습니다. 타입클래스는 어떤 타입이 특정 기능을 제공할 것을 요구하고, 타입은 해당 계약을 이행함으로써 타입클래스의 인스턴스가 됩니다.

+-----------------------+
|      타입클래스       |
| (예: 더할 수 있는)   |
+----------+------------+
     |
     | "더하기" 기능 요구
     |
+-----v------+  +-----v------+  +-----v------+
|  정수 (Int)  |  | 실수 (Float) |  | 문자열 (String) |
+----------+  +----------+  +----------+
     |
     | "더하기" 기능 구현
     |
+-----------------------+
| 타입클래스 인스턴스  |
+-----------------------+

4. 단계적 심화 설명

  • 기초: 타입클래스는 인터페이스와 유사하며, 특정 타입이 제공해야 하는 기능을 정의합니다. 타입클래스 인스턴스는 해당 인터페이스를 구현하는 것과 같습니다.
  • 중급: 타입클래스는 기존 타입에 새로운 기능을 추가할 수 있는 강력한 메커니즘입니다. 이를 통해 코드 재사용성을 높이고, 타입 안전성을 확보할 수 있습니다.
  • 고급: 타입클래스는 higher-kinded 타입과 함께 사용되어 더욱 강력한 추상화를 가능하게 합니다. 이는 함수형 프로그래밍에서 매우 중요한 개념입니다.

5. 자주 오해하는 부분과 정확한 이해

  • 오해: 타입클래스는 객체 지향 프로그래밍의 상속과 동일하다.
  • 정확한 이해: 타입클래스는 상속과 달리, 기존 타입에 새로운 기능을 추가할 수 있습니다. 또한, 타입클래스는 타입에 대한 제약 조건을 정의하는 반면, 상속은 타입 간의 계층 구조를 정의합니다.

6. 실생활 적용 방법

  • 예시 1 (데이터 직렬화/역직렬화): 다양한 데이터 타입을 JSON, XML 등의 형식으로 직렬화하거나 역직렬화하는 기능을 타입클래스로 정의할 수 있습니다.
  • 예시 2 (데이터베이스 접근): 다양한 데이터베이스에 대한 접근 방식을 타입클래스로 정의하여, 데이터베이스 종류에 상관없이 일관된 방식으로 데이터에 접근할 수 있습니다.
  • 예시 3 (수학 연산): 다양한 숫자 타입에 대한 사칙연산을 타입클래스로 정의하여, 숫자 타입에 상관없이 동일한 연산자를 사용할 수 있습니다.

이 설명이 타입클래스와 타입클래스 인스턴스를 이해하는 데 도움이 되었기를 바랍니다.

@TaeHyoungKwon
Copy link
Collaborator Author

TaeHyoungKwon commented Mar 5, 2025

@gemini

아래 프롬프트를 실행시키고 결과를 알려줘

함수형 프로그래밍에서 카인드(kind)에 대해 초보자도
이해할 수 있도록 단계적으로 설명해 주세요.

설명 시 다음 항목을 순차적으로 포함해 주세요:

해당 개념의 기본 정의를 가장 간단한 언어로 설명
일상에서 볼 수 있는 쉬운 비유나 예시 3가지
핵심 원리를 시각적으로 상상할 수 있는 묘사
단계적 심화 설명 (기초→중급→고급)
자주 오해하는 부분과 정확한 이해
이 개념을 실생활에 적용할 수 있는 방법 3가지
전문 용어는 반드시 쉬운 한국어로 풀어서 설명해 주세요.

Copy link

안녕하세요 @TaeHyoungKwon님,

함수형 프로그래밍에서 카인드(kind)에 대한 설명을 요청하신대로 제공해 드리겠습니다.

1. 기본 정의

  • 카인드 (Kind): 타입의 종류, 즉 '타입의 타입'을 나타냅니다. 일반적인 타입(예: Int, String)은 * 카인드를 가지며, 타입 생성자(예: List, Option)는 * -> *와 같이 하나 이상의 타입을 받아 새로운 타입을 생성하는 카인드를 가집니다. 카인드는 컴파일러가 타입을 올바르게 사용하는지 검사하는 데 사용됩니다.

2. 쉬운 비유 및 예시

  • 예시 1 (상자):
    • 타입: 내용물 (예: 사과, 책)
    • 카인드: 상자의 종류 (예: 사과 상자, 책 상자)
    • 설명: 사과와 책은 각각 다른 타입이지만, 둘 다 '상자'라는 공통된 종류(카인드)에 담길 수 있습니다.
  • 예시 2 (함수):
    • 타입: 함수의 입력 타입과 출력 타입 (예: Int -> String)
    • 카인드: 함수의 종류 (예: 정수를 받아 문자열을 반환하는 함수)
    • 설명: Int -> StringFloat -> String은 각각 다른 타입이지만, 둘 다 '어떤 타입을 받아 문자열을 반환하는 함수'라는 공통된 종류(카인드)에 속합니다.
  • 예시 3 (자료구조):
    • 타입: 자료구조에 저장되는 요소의 타입 (예: List<Int>, Set<String>)
    • 카인드: 자료구조의 종류 (예: 리스트, 집합)
    • 설명: List<Int>Set<String>은 각각 다른 타입이지만, 둘 다 '요소들을 저장하는 자료구조'라는 공통된 종류(카인드)에 속합니다.

3. 핵심 원리의 시각적 묘사

카인드는 타입 시스템의 '메타 정보'와 같습니다. 타입이 어떤 종류의 값인지(예: 정수, 문자열, 리스트) 알려주는 것처럼, 카인드는 타입이 어떤 종류의 타입인지(예: 일반 타입, 타입 생성자) 알려줍니다.

+-----------------------+
|        카인드         |
|  (예: * -> *)       |
+----------+------------+
     |
     | 타입 생성
     |
+-----v------+  +-----v------+
|  List      |  |  Option    |
+----------+  +----------+
     |
     | 타입 적용
     |
+-----------------------+
|         타입          |
| (예: List<Int>)       |
+-----------------------+

4. 단계적 심화 설명

  • 기초: 카인드는 타입의 종류를 나타내는 '타입의 타입'입니다. 일반적인 타입은 * 카인드를 가지며, 타입 생성자는 * -> *와 같은 카인드를 가집니다.
  • 중급: 카인드는 컴파일러가 타입을 올바르게 사용하는지 검사하는 데 사용됩니다. 예를 들어, List* -> * 카인드를 가지므로, 반드시 하나의 타입을 인자로 받아야 합니다.
  • 고급: higher-kinded 타입은 카인드를 인자로 받는 타입입니다. 이는 함수형 프로그래밍에서 매우 강력한 추상화를 가능하게 합니다.

5. 자주 오해하는 부분과 정확한 이해

  • 오해: 카인드는 런타임에 존재하는 개념이다.
  • 정확한 이해: 카인드는 컴파일 타임에만 존재하는 개념입니다. 런타임에는 카인드 정보가 필요하지 않습니다.

6. 실생활 적용 방법

  • 예시 1 (제네릭 타입): 제네릭 타입은 카인드를 사용하여 타입 안전성을 확보합니다. 예를 들어, List<T>에서 T는 반드시 * 카인드를 가지는 타입이어야 합니다.
  • 예시 2 (타입 클래스): 타입 클래스는 카인드를 사용하여 특정 타입이 지원해야 하는 기능을 정의합니다. 예를 들어, Show[T] 타입 클래스는 T* 카인드를 가지는 타입이어야 하며, show 메서드를 제공해야 합니다.
  • 예시 3 (함수형 프로그래밍 라이브러리): 함수형 프로그래밍 라이브러리는 higher-kinded 타입을 사용하여 더욱 강력한 추상화를 제공합니다. 예를 들어, Monad[F[_]]F* -> * 카인드를 가지는 타입 생성자여야 합니다.

이 설명이 카인드를 이해하는 데 도움이 되었기를 바랍니다.

Copy link
Member

@jongfeel jongfeel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gemini가 대신 정리도 잘 해주고 설명도 잘 해주니 좋네요.
👍

@@ -0,0 +1,44 @@
# 논의 내용
1. 저자는 오버로딩을 써야할 때 그리고, 이거나 타입을 써야할 때에 대해서 설명해주고 있습니다. 이 책을 읽기 전까지, 제 경우 사실 이 책에서 제시한 기준에 따라 사용하기 보다는, 일단 쉽고 빠르게 구현하기위해서 무의식적으로, 이거나 타입을 쓰고, 오버로딩으로 리팩토링 하는 방식으로 작업했던 것 같습니다 다른 분들의 경우에 이 책에서 제시한 오버로딩을 써야할 때, 이거나 타입을 써야할 때 기준에 맞춰서 코드를 작성해왔는지 말해보면 좋을 것 같습니다
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 생각해 보면 꼭 이거나 타입에 맞게 썼다기 보다는 코드를 작성하다 보니 오버로딩이 필요하지 않을까? 제네릭으로 만들면 좋지 않을까? 로 발전했던 것 같습니다.
엄밀히 따지면 제가 주로 사용하는 언어인 C#은 이거나 타입을 지원하지 않으므로 이거나 타입을 생각하고 코드를 짠건 아닌 것 같네요.


2. 책 330p 메서드 선택의 한계 부분에서, _add 메서드를 구현한 클래스 예제를 내면서, 이 코드가 어째서 올바르게 add를 구현한 것인지 독자 스스로 고민해보라는 내용이 나옵니다. 본인이 생각했던 것에 대해서 얘기해보면 좋을 것 같습니다

3. 책의 내용과 별개의 논의 내용인데, 주요 개념들이 나오기 전에 처르지와 큐리 박사가 대화를 나누면서 설명해주는 부분이 있는데요 이부분 설명이 적절하다고 보시나요? 저는 사실 별로 와닿는 설명이라는 느낌이 안들어서 중간부터는 자세히 읽지 않고 넘어갔는데, 다른 분들은 어떻게 느끼셨는지 궁금합니다
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 어려울 수 있는 설명에 대해 일반적인 수준의 이해를 돕기 위해 만든 대화형 맛보기 예제라는 생각이 들긴 했습니다.
그 대화 내용에 보면 볼드체로 되어 있는 단어들이 있는데 그 단어가 책의 소주제를 설명하기에 적합한 용어입니다를 표현한거라 책 내용을 읽고 다시 큐리 박사와 처르지의 대화 내용에 볼드체 단어를 보면 무슨 단어인지 알게 될겁니다.

아마 프로그래밍 언어 이해가 어려운 사람한테는 뭘 이해해야 하는지 큐리 박사와 처르지 대화 내용으로 파악할 수 있지 않나 생각도 드네요.

# 논의 내용
1. 저자는 오버로딩을 써야할 때 그리고, 이거나 타입을 써야할 때에 대해서 설명해주고 있습니다. 이 책을 읽기 전까지, 제 경우 사실 이 책에서 제시한 기준에 따라 사용하기 보다는, 일단 쉽고 빠르게 구현하기위해서 무의식적으로, 이거나 타입을 쓰고, 오버로딩으로 리팩토링 하는 방식으로 작업했던 것 같습니다 다른 분들의 경우에 이 책에서 제시한 오버로딩을 써야할 때, 이거나 타입을 써야할 때 기준에 맞춰서 코드를 작성해왔는지 말해보면 좋을 것 같습니다

2. 책 330p 메서드 선택의 한계 부분에서, _add 메서드를 구현한 클래스 예제를 내면서, 이 코드가 어째서 올바르게 add를 구현한 것인지 독자 스스로 고민해보라는 내용이 나옵니다. 본인이 생각했던 것에 대해서 얘기해보면 좋을 것 같습니다
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 _add() 메서드에서 Vector와 SpaseVector 타입에 맞게 동적 오버로딩 호출이 잘 되겠구나라고 이해하긴 했습니다.
앞선 설명에서 동적 타입에 맞게 add() 함수가 호출되지 않는다고 설명을 했었으니까요.

@@ -0,0 +1,44 @@
# 논의 내용
1. 저자는 오버로딩을 써야할 때 그리고, 이거나 타입을 써야할 때에 대해서 설명해주고 있습니다. 이 책을 읽기 전까지, 제 경우 사실 이 책에서 제시한 기준에 따라 사용하기 보다는, 일단 쉽고 빠르게 구현하기위해서 무의식적으로, 이거나 타입을 쓰고, 오버로딩으로 리팩토링 하는 방식으로 작업했던 것 같습니다 다른 분들의 경우에 이 책에서 제시한 오버로딩을 써야할 때, 이거나 타입을 써야할 때 기준에 맞춰서 코드를 작성해왔는지 말해보면 좋을 것 같습니다
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 수가 적고 사용자 정의가 직접적으로 들어간다면 오버로딩을 수가 많고 일반화가 필요하면 제네릭을 떠올릴 것 같습니다.


2. 책 330p 메서드 선택의 한계 부분에서, _add 메서드를 구현한 클래스 예제를 내면서, 이 코드가 어째서 올바르게 add를 구현한 것인지 독자 스스로 고민해보라는 내용이 나옵니다. 본인이 생각했던 것에 대해서 얘기해보면 좋을 것 같습니다

3. 책의 내용과 별개의 논의 내용인데, 주요 개념들이 나오기 전에 처르지와 큐리 박사가 대화를 나누면서 설명해주는 부분이 있는데요 이부분 설명이 적절하다고 보시나요? 저는 사실 별로 와닿는 설명이라는 느낌이 안들어서 중간부터는 자세히 읽지 않고 넘어갔는데, 다른 분들은 어떻게 느끼셨는지 궁금합니다
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 대부분 다형성을 일반화하여 생각했을 때 (컴퓨터적 사고?) 나오는 오류들에 대해서 말하는 느낌을 받았습니다. 실제로 책에서 주어지는 예제도 비슷한 흐름으로 오류가 발생하는 사례와 개선하는 흐름으로 보여줘서 좋았습니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
2025 타입으로 견고하게 다형성으로 유연하게 탄탄한 개발을 위한 씨줄과 날줄
Projects
Status: In review
4 participants