Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions 2025/RobustWithTypeFlexibleWithPolymorphism/taehyoung/Chapter1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
1장 타입 검사 훑어 보기

# 논의 내용

1. 동적 타입 언어와 정적 타입 언어를 사용해본 경험이 있다면, 어떤 장단점이 있었는지 얘기해보아요
Copy link
Member

Choose a reason for hiding this comment

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

동적 언어

장점: 자바스크립트 위주로 썼고 파이썬도 조금 사용 했었습니다. 언어 특징으로 우선 빠르게 작성하고 결과를 런타임 상에서 확인해 볼 수 있었다는 점이고, 익숙해지면 나름 일반적인 비즈니스 로직 처리 정도는 어렵지 않다는 걸 느낄 수도 있었습니다.

단점: 작고 빠른 프로젝트의 반대인 크고 느려지는 프로젝트의 경우 폴더 구조에 따른 스크립트 계층과 export를 잘 해줘야 한다는 것 부터 시작해 느린걸 느리지 않게 하려면 작은 컴포넌트 구조를 잘 생각해야 하는 게 그 다음 넘어야 할 단점인 것 같습니다. 정적 타임 언어는 여기 얘기한 단점이 모두 컴파일 타임에 해결 되므로 동적 언어에서는 단점이라고 보여집니다.

정적 언어

단점: 실행 하기 전 컴파일이라는 단계를 거쳐야 하고 실행 할 때는 또 런타임이라는 시간을 버텨야 하는 게 동적 언어에서는 있을 수 없는 시간 낭비라고 생각할 수 있을 것 같습니다.

장점: 문법 오류는 사전에 컴파일 타임에서 체크가 가능해지는게 장점인데 익숙해지면 장점인지 잘 모르는 것도 있는 것 같습니다. 또 다른 장점으로 무거운 프로그램도 런타임 시에는 어느 정도의 성능을 기대해 볼 수 있는 것도 장점입니다.

Copy link
Member

Choose a reason for hiding this comment

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

동적 언어의 장점
약 1년 전까지는 Python으로 코딩 테스트를 준비했었고, 최근에는 Javascript, Node.js로 작은 과제 프로젝트를 진행해 보았던 경험이 있습니다. 이때 로직을 짜면서 일일이 타입을 맞춰줄 필요가 없기 때문에 비즈니스 로직에 집중하여 빠르게 작성할 수 있었던 기억이 있습니다.

동적 언어의 단점
런타임으로 가는 것은 빠르지만, 런타임 도중에 에러가 생각보다 많이 잡히는 단점이 있었습니다. 또한 제가 정적 언어를 주로 써서 그런지 모르겠지만, 특히 처음 보는 코드를 보면 각 변수들이 정확히 어떤 타입인지 직접 기억해야 한다는 것이 불편했습니다. 요즘 IDE는 옆에 글씨로 추론해서 보여줄 때도 있지만 코드가 아닌 무언가가 옆에 있는 것 자체도 저에게는 불편한 편입니다.

정적 언어의 장점
타입 오류에 대한 버그가 온전히 사라진다는 보장이 정말 크다고 생각합니다. 이것으로 로직에 더 집중할 수 있어 초반부터 더욱 견고한 서비스를 만들수 있는 기회가 생기는 것 같습니다.

정적 언어의 단점
가끔 타입 추론에서 나오는 warning들이 생각보다 귀찮고 시간을 잡아먹는 상황이 생기는 것 같습니다(Java).

Copy link
Contributor

Choose a reason for hiding this comment

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

동적 언어
이직을 준비하면서 코딩테스트 준비를 한 적이 있었습니다. 이 때 주 사용 언어인 C#으로 할까 하다가
Python으로 준비해보자 하여 해당 언어를 사용하였습니다.
장점: 동적언어로 코딩테스트 문제들을 해결해 나갈때 느꼈던 점은 빠르게 문제해결에 집중할 수 있다는 점이 좋았습니다. 타입을 꼼꼼히 맞춰 줄 필요가 없다는 점이 큰 장점으로 느껴졌습니다.
단점: 런타임 시 타입을 정해준 다는 것은 그만큼 작성자가 해당 타입에 대한 꼼꼼한 책임을 져야 한다고 생각이 들었습니다.
정적언어
장점: 컴파일 시점의 타입검사가 되기 때문에 런타임에 발생할 에러를 줄여줍니다.
단점: 확실히 동적언어인 Python과 비교했을때 코드 작성 시간이 더 걸립니다. 타입 작성을 명시적으로 해 주어야 하기 때문에 반복적인 코드 작성도 많아질 수 있습니다. 원래는 타입추론을 사용하지 않았는데 정적언어를 지속적으로 사용하다 보니 반복된 타입 작성을 줄일 수 있는 var를 사용하는 경우가 최근에 늘었습니다.

Copy link
Contributor

Choose a reason for hiding this comment

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

동적 언어

장점: 동적 언어를 사용해 본 경험으로는 학부생 때 파이썬을 사용해봤습니다. 확실히 타입 표시가 생략되어 있어 사용하기에도 유연했고 빠르게 구현에 집중할 수 있었습니다.

단점: 타입표시가 생략되어 있어 이것이 다시 불편하게 작용할 때가 있습니다. 어떤 타입으로 사용되는지 확인하고 싶은 경우 직접 확인해보거나 유추를 거쳐야 하는 것이 불편하게 느껴지기도 했습니다.

정적 언어

장점: 프로그램의 모든 타입오류를 찾을 수 있어 타입 안전성을 보장할 수 있다는 점이 가장 큰 장점이라고 생각합니다.

단점: 지속적인 타입 표시로 인하여 코드가 장황해질 수 있다는 점이 단점이라고 생각됩니다.

Copy link
Contributor

Choose a reason for hiding this comment

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

정적 타입 언어는 Java, C++를 사용해 봤는데, 컴파일 시 타입 체크를 통해 퍼포먼스와 가독성을 높이지만, 컴파일 과정이 복잡하고 개발 속도가 느릴 수 있습니다.

동적 타입 언어로는 Python을 주로 사용했습니다. 빠른 프로토타이핑에 유리하지만, 대규모 프로젝트나 협업 시 코드 유지보수가 어렵습니다.

Copy link
Member

Choose a reason for hiding this comment

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

  • 동적언어
    저는 대학생 때 과제로 파이썬을 배우고 영상처리 과제를 제출했었습니다. 당시 자바와 파이썬을 동시에 배웠던 시기라 확연하게 동적, 정적 언어의 차이를 경험했습니다. 저에게는 파이썬은 타입 선언 없이 값에 따라 변화되는 점이 이상하게도 불편했습니다. 반대로 이런 특징이 어떤 값을 넣는지에 따라 선언 없이 사용하는 것을 장점으로 생각하는 분들도 계실 것 같습니다.ㅎㅎ

  • 정적언어
    정적 언어는 실행 전에 타입에 대해 안정성을 확인 하고 실행할 수 있다는 점이 큰 장점인 것 같습니다.
    하지만 코드를 조금이라도 바꾸면 한번 더 타입 검사가 들어가기 때문에 프로젝트가 큰 단위로 되어있고 개발환경이 좋지 않다면 컴파일 시간이 정말 오래걸릴 수 있다는 점이 단점이라고 생각합니다.

Copy link
Contributor

Choose a reason for hiding this comment

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

저는 한 가지 언어만 계속 사용해와서 사실 장단점을 이야기하기 어려운 것 같습니다. 명확하게 장단점을 이야기하려면 비교가 되어야 하는데, 동적 언어를 그만큼 오래 사용해본 경험이 없어서 장단점을 말하기 어렵네요.. 장점이라 생각한 것이 단점일 수 있겠다는 생각은 듭니다

2. 정적 타입 언어를 현업에서 사용한다면, 타입 추론을 어떻게 활용하고 있는지, 어떻게 생각하는지 얘기해보아요
Copy link
Member

Choose a reason for hiding this comment

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

정적 타입 언어라고 해도 reflection 기능이 이미 있는 자바나 C# 같은 언어는 IDE에 reflectiion 기능이 탑재되서
개발할 때 거의 타입에 대해 헷갈리게 작성하거나 모르는 타입으로 캐스팅을 하는 일은 거의 없다고 보는게 맞을 것 같습니다.
오히려 IDE가 정확한 타입을 쓰라고 하기 보다는 var와 같은 타입 추론형을 쓰도록 추천해 주기도 합니다. (JetBrain Rider 툴의 경우가 그래서 그 추천 기능을 빼고 씁니다)
만약 IDE 없이 한다고 하면, 개발자의 타입에 대한 체크 및 캐스팅 시 컴파일 오류에 대해 확인하기 위해 매우 높은 집중력 혹은 귀찮음을 요구하게 될 것 같네요.

그리고 중요한 문제로 타입 추론 문법을 쓴다면 코드 작성할 때는 좋지만 결국 가독성, 유지 보수성으로 이어지는 미래를 예측해 봤을 때는 타입 추론형 보다는 본래의 타입으로 쓰는 것도 좋다는 생각입니다.

Copy link
Member

Choose a reason for hiding this comment

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

저는 자바를 사용하면서 var 키워드는 쓰지 않는 편입니다.
아직은 제 기준에서 해당 키워드가 크게 도움이 되는지 와닿지는 않아서인 것 같습니다.

그래도 이외에도 제네릭 등에서 사용되는 것은 꽤나 편하기 때문에 모든 타입 추론이 나쁘다고 생각하지는 않습니다.

This comment was marked as duplicate.

Copy link
Contributor

Choose a reason for hiding this comment

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

정적 타입 언어에서 null safety 기능은 변수에 null 값이 할당되는 것을 방지하여 프로그램의 안정성을 크게 향상시킵니다. 컴파일러가 null 값에 대한 오류를 사전에 검출하여 개발자가 미처 파악하지 못한 문제를 해결해 주는데 저는 이게 가장 기본적이지만 유용한 기능이라 생각합니다.

3. 책 내용(57page) 중에, `널을 자유롭게 사용하고 싶다면 코틀린 대신 자바를 선택하는 게 나을 수 있다` 라는 말에 공감하면서 읽었는지 그렇지 않았는지 궁금하네요
Copy link
Member

Choose a reason for hiding this comment

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

저는 언어의 발전에 따라 문법적으로 지원해 주는 방향은 좋다고 보는 입장이라
하지만 널 문제 때문에 언어를 선택적으로 바꾸기 보다는
언어의 문법적 지원 범위와 특징에 맞게 회사의 팀에서 code style을 맞춰 나가는 게 더 좋다고 봅니다.
그래서 많이 공감하지는 못했는데, java 언어도 openjdk 스펙에 null 체크가 최근에 논의되었던 걸 봐서는
문법적으로 사용하고 싶은 사람이 있다는 추측을 해볼 수 있을 것 같습니다.

https://openjdk.org/jeps/8303099

Copy link
Member

Choose a reason for hiding this comment

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

코틀린을 사용해 본 적은 없어서 아직 비교해보기는 어려운 것 같습니다.
저에게는 아직은 null을 자유롭게, 잘 사용하는 것이 어떤 것인지 명확하게 느껴지지 않습니다.

Copy link
Contributor

Choose a reason for hiding this comment

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

저는 공감이 되지 않았습니다. 널을 자유롭게 사용하고 싶다면 Python 같은 동적 언어가 낫지 않을까 생각이 듭니다. 소수의 performance와 관련된 코드라던가 reflection 같이 low-level 기술을 이용해 코드를 간결하게 하거나, 추가로 해택을 주는 게 아니면, 오류로 프로그램에서 문제가 발생하거나, null을 따로 처리해야 하는 데에서 오는 overhead가 더 클 거라 예상합니다.


# 키워드

1. 타입 검사기(type checker)
- 프로그램이 타입 오류를 일으키는지 자동으로 판단해주는 프로그램
2. 타입 안전성(type safety)
- 타입 검사기를 통과 했다면, 프로그램을 타입 오류 없이 안전하게 실행할 수 있음
- 타입 안전성이 높은 언어에서는 타입과 관련된 버그를 조기에 발견할 수 있어서, 런타임 오류를 줄일 수 있다
3. 정적 타입 언어(statically typed language)
- 프로그램 실행 전에 타입이 올바르게 사용되었는지 확인하는 언어
4. 동적 타입 언어(dynamically typed language)
- 프로그램 실행 중에 타입이 올바르게 사용되었는지 확인하는 언어
5. 타입 추론
- 타입 표시가 있을 때도 검사를 통과할 프로그램에 한해서 타입 표시를 생략하게 해준다

# 내 생각

1. 저는 동적 타입 언어로는 파이썬 2버젼, 정적 타입 언어로는 자바, 정적 타입 언어는 아니지만, type hint를 사용할 수 있는 파이썬 3버전 with mypy(타입 체커)를 사용해보았습니다. 개인적으로 파이썬 2버전을 사용할 때는 동적 타입이 불편하다는 것에 대해서는 별로 느끼지 못했고, 타입 체크를 런타임에서밖에 못 한다는 단점보다도 빠르게 개발할 수 있고, 코드도 간결하게 작성할 수 있는 장점이 더 와닿았던 것 같습니다.

그런데, type hint를 사용할 수 있는 파이썬 3버전과 mypy라는 타입 체커를 같이 사용하면서, 180도 바뀌게 되었는데, 이전과 비교해서 런타임 이전에 미리 타입을 체크하고 버그가 날 수 있는 부분을 체크한다는 장점이 너무 좋았고(이로 인해서 확실히 버그가 줄었습니다), type hint로 필요한 곳에 타입을 optional하게 적을 수 있게 됨으로써 오히려 코드 가독성이 좋아지는 경험을 해보았습니다.

자바의 경우는 정적 타입 언어로 책에서 말한 정적 타입 언어의 장점에 대부분 동의하지만, 빌드 타임에 null pointer exception을 타입 체크로 판단하지 못한다는 것과 타입 네이밍이 길어질 경우 코드가 장황해지는 부분은 좀 아쉽다고 느껴졌습니다.

2. 파이썬3 with mypy의 경우, 기본적으로 타입 추론을 한다고 전제하고, 명시적으로 타입을 기입하는 게 가독성에 더 도움이 된다고 판단될 때, 타입을 추가합니다. 물론 함수의 input 인자 값과 output인 return 값 등에는 필수적으로 타입을 추가하는 게 사실상 관례입니다. 그러다 보니 타입 추론에 대해서 거부감이 없는 편인데, 제 주변 피셜 기존부터 정적 타이핑 언어를 사용한 개발자분들의 경우는 타입 추론에 대해서 좋은 기능이라고 생각하기보다는 굳이 쓸 필요 없는 기능으로 보시고, 타입을 명시적으로 표시해주길 원하시는 분들이 좀 더 많았던 것 같습니다.

3. 빌드타임에 null 안전성을 보장받기 위해서 자바 대신에 코틀린을 사용하는 것이고, 빌드 타임에 null 안전성을 보장하지 못하는 자바는 문제가 있다고 생각하는데, null을 자유롭게 사용하기 위해서 자바를 사용하라는 말은 뭔가 모순 처럼 느껴졌습니다

4. 실제로, 파이썬3 with mypy를 사용할 때, 문제 없는 코드인데, 타입체크 결과는 문제가 있다고 나오는 경우가 있었습니다. 책에서는 코틀린을 예로 `!!` 을 말하는데, mypy 에서는 주석으로 `# type: ignore` 를 추가하는 방법으로 해결 가능 합니다.
책에서 나온내용과 같이, 타입체크가 실패하는 사유가 실제문제가 있어서 실패하는 것인지 문제가 없는데도 실패하는 것인지를 잘 파악해서 무시하도록하는 처리를 적절히 잘 해주는것이 중요하다고 생각합니다

5. 책에서 말하는 정적 타이핑 언어의 장점을 봤을 때, 대규모 프로젝트에 분명히 사용하기 좋은 것이 맞다고 생각합니다. 한국에서 대부분의 웹 백엔드의 기술 스택으로 자바와 스프링이 사용되는 이유 중에 한가지도 자바라는 정적 타이핑 언어를 사용하고 있는 것일 겁니다

다만, 파이썬에 type hint가 추가되고, mypy, pyright 같은 python 진영과 테크 기업에서 거의 official 관리되고 있는 타입체커가 생기면서, 파이썬 또한 정적타이핑 언어의 장점을 그대로 가져와서 적용할 수 있고, 실제로 저희 회사에서는 잘 사용하고 있습니다.

제가 회사에서 자바 스프링을 개발하면서 느끼는 한가지는 타입과 관련해서는 이전에 파이썬 환경에서 개발했을 때와 비교해서 크게 다른 점을 못느끼겠다는 점 입니다. 정적타이핑 언어로써 가지고 있던 자바의 장점은 파이썬이 type hint와 mypy를 사용하는게 활성화되면서 사실상 상쇄화 되었다고 봅니다. 오히려 저는 파이썬이 유연하게 type을 도입하도록 한 것이 제 스타일에는 훨씬 더 맞았던거 같고, 앞서 언급되었던 동적,정적 타이핑의 단점들을 잘 피해갈 수 있도록 해준다고 생각합니다. 자바의 경우도 타입추론을 할 수 있도록, var 같은 키워드를 제공해주고 있는데, 자바 개발자분들(저희회사기준)은 사용을 지양하도록 하셔서 개인적으로는 좀 아쉬웠습니다

현대 개발언어들은 현재 단점을 줄여나가는 방향으로, 새롭게 언어(코틀린)가 만들어지거나, 새로운 개념(type hint 추가 및 동적 타이핑 언어에 타입체커 추가)들을 추가하고, 서로 다른 언어들의 장점인 부분들을 가져와서 적용하면서 발전해 나가고 있는 것으로 보입니다. 개발자들도 이에 맞춰서, 고정관념에서 벗어나, 좀 더 유연하게 받아들이면 어떨까라는 생각이 들었습니다
Loading