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

타입으로 견고하게 다형성으로 유연하게 2주차 - 김우현 #455

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

Conversation

wooyaggo86
Copy link
Contributor

아주 재미있게 읽었습니다. 챕터3도 기대가 되네요.

Copy link

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

Copy link

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

@wooyaggo86 wooyaggo86 requested a review from a team January 15, 2025 16:34
@wooyaggo86 wooyaggo86 added 2025 타입으로 견고하게 다형성으로 유연하게 탄탄한 개발을 위한 씨줄과 날줄 labels Jan 15, 2025
@wooyaggo86
Copy link
Contributor Author

@TaeHyoungKwon auto reviewer가 안되는데 제가 혹시 설정중 놓친게 있을까요?ㅜ

Base automatically changed from wooyaggo86-2025-1-chapter1 to main January 17, 2025 14:09
@wooyaggo86
Copy link
Contributor Author

@TaeHyoungKwon auto reviewer가 안되는데 제가 혹시 설정중 놓친게 있을까요?ㅜ

#441 에서 확인했습니다ㅜ

@TaeHyoungKwon
Copy link
Collaborator

@TaeHyoungKwon auto reviewer가 안되는데 제가 혹시 설정중 놓친게 있을까요?ㅜ

#441 에서 확인했습니다ㅜ

우현님 기존 기능을 대체할 gh api를 활용한 create_pr.sh 을 만들게 되면서, 기존에 있었던 github actions 는 제거하려고 합니다!


**Q. 논의내용**

Quiz. Java에는 bottom type이 있을까요?
Copy link
Collaborator

Choose a reason for hiding this comment

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

검색해서는 해당 내용을 찾을 수 없어서, 지피티 문의결과는 없다라고 말해주네요 지피티 답변 상으론, 애초에 자바 언어 설계 철학에 매칭되지 않는 부분으로 보이네요

greet(employee) # Works because Employee is a subtype of Person
```

2. "집합론적 타입"은 무슨 의미일까요? 이해는 하지 못했지만, 그냥 넘어가도 핵심을 이해하는데는 문제가 없어서 지나쳤습니다.
Copy link
Collaborator

Choose a reason for hiding this comment

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

저도 대략적으로만 이해했는데, 책에 나온대로, 책에서 설명하고자 하는 키워드들(최대, 최소, 이거나, 이면서 등등)이 집합론과 관련 있는 것이다보니 쓴 제목 같은데, 책 전체 맥락을 이해하는데 중요한 정보는 아니였던거 같습니다


Quiz. Java에는 bottom type이 있을까요?

1. Class뿐만 아니라 Record(e.g. struct)에도 subtyping 이 있습니다. width subtyping, depth subtyping이 있습니다. 이를 활용한 경험이 있으시면 공유해주세요. 아쉽게도 제가 주로 사용하는 언어에서는 활용해볼 수 없었네요.
Copy link
Collaborator

Choose a reason for hiding this comment

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

width subtyping이 필요한 속성(또는 메서드)이 존재하면, 추가적인 속성이 있어도 허용된다는 개념이고,

Depth Subtyping (깊이 서브타이핑) 가 객체의 구성 요소(속성 혹은 메서드)의 타입이 보다 구체적인 서브타입인 경우에도 전체 타입 관계가 성립하는 것 이라고 가정 했을 때,

python2를 기준으로, duck typing의 관점에서 위 두가지는 모두 많이 사용 했던 것 같습니다

다만, python3.8 부터는 Protocol 이란 것이 생겨서, 런타임 전에 mypy라는 타입체커로 타입이 올바른지 검사할 수 있도록 duck typing의 유연성과 정적 검사의 안전성을 동시에 누릴 수 있게 되었습니다

but, 제 개인적으로 python3으로 넘어오고나선, duck typing이나 Protocol 보단, python3.X 초반 에 생긴 추상 클래스, 추상메소드를 훨씬 많이 활용 합니다

Comment on lines +36 to +53
#### **Example in Python**:
```python
class Person:
def __init__(self, name: str, age: int):
self.name = name
self.age = age

class Employee(Person):
def __init__(self, name: str, age: int, department: str):
super().__init__(name, age)
self.department = department

def greet(person: Person):
print(f"Hello, {person.name}, age {person.age}")

employee = Employee("Alice", 30, "HR")
greet(employee) # Works because Employee is a subtype of Person
```
Copy link
Collaborator

@TaeHyoungKwon TaeHyoungKwon Jan 17, 2025

Choose a reason for hiding this comment

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

[참고]

파이썬 3.8 이후 나온 typing.Protocol을 활용하여서, Employee와 Person 간 상속 관계를 끊고, 구조에 의한 서브타입으로 아래와 같이 리팩토링 할 수 있고, mypy를 통해서 타입체크를 할 수 있습니다

from typing import Protocol


# Person과 Employee의 상속 관계를 끊고, 대신에 구조에 의한 서브타입을 위해서 프로토콜을 정의
class PersonProtocol(Protocol):
    name: str
    age: int


class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age


class Employee:
    def __init__(self, name: str, age: int, department: str):
        self.name = name
        self.age = age
        self.department = department


# Employee가 PersonProtocol을 따르는지 확인
def greet(person: PersonProtocol):
    print(f"Hello, {person.name}, age {person.age}")


employee = Employee("Alice", 30, "HR")
greet(employee)
# 실행 시 문제 없음

╰─➤  python sample.py
Hello, Alice, age 30
# mypy 실행 시 문제 없음

Success: no issues found in 2 source files

from typing import Protocol


class PersonProtocol(Protocol):
    name: str
    age: int


class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age


class Employee:
    def __init__(self, name: str, height: int, department: str):
        self.name = name
        self.height = height  # PersonProtocol에 없는 속성으로 변경
        self.department = department


def greet(person: PersonProtocol):
    print(f"Hello, {person.name}, height {person.height}")


employee = Employee("Alice", 170, "HR")
greet(employee) # mypy 실행 시, 구조에 의한 서브타입이 충족되지 않기 떄문에, 에러 발생
# 실행 시, 문제 없음

╰─➤  python sample.py
Hello, Alice, height 170
# but, mypy 실행 시는 에러 발생
# 이를 통해서, 타입에 의한 문제를 미리 발견 가능

╰─➤  mypy .
sample.py:23: error: "PersonProtocol" has no attribute "height"  [attr-defined]
sample.py:27: error: Argument 1 to "greet" has incompatible type "Employee"; expected "PersonProtocol"  [arg-type]
sample.py:27: note: "Employee" is missing following "PersonProtocol" protocol member:
sample.py:27: note:     age
Found 2 errors in 1 file (checked 2 source files)

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

Successfully merging this pull request may close these issues.

<타입으로 견고하게 다형성으로 유연하게> 2장, 총 79페이지, 2025-01-24
2 participants