Skip to content

[3주차] 이예림_Item 11,23#15

Merged
023-dev merged 9 commits intoeffective-java-3e-study:mainfrom
yerim123456:main
Jan 20, 2025
Merged

[3주차] 이예림_Item 11,23#15
023-dev merged 9 commits intoeffective-java-3e-study:mainfrom
yerim123456:main

Conversation

@yerim123456
Copy link
Copy Markdown
Contributor

No description provided.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

서브타이핑이라는 개념은 상속과 밀접한 연관이 있어보이는데, 인터페이스를 사용했을 때도 서브타이핑이라 부를 수 있나요?

Copy link
Copy Markdown
Contributor Author

@yerim123456 yerim123456 Jan 18, 2025

Choose a reason for hiding this comment

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

서브 타이핑이라는 개념이 하위 타입이 상위 타입을 대체할 수 있다는 개념이라서, 인터페이스에서도 성립한다고 합니다. 인터페이스를 구현한 클래스를 인터페이스 타입으로 다루기도 하는 상황을 생각해 주시면 좋을 것 같습니다!

정확하게 몰랐던 부분을 질문해 주셔서 감사합니다! 덕분에 정리할 수 있었습니다:) 혹시 제가 잘못 생각하고 있는 부분이 있다면 편하게 알려주시면 감사하겠습니다!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

이 경우 Collections.unmodifiableList()로 반환하는 것도 방법이라고 봐도 무방한가요?

Copy link
Copy Markdown
Contributor Author

@yerim123456 yerim123456 Jan 18, 2025

Choose a reason for hiding this comment

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

조건적으로 괜찮은 방법이지만, 방어적 복사와는 조금 결이 다르다고 합니다..!

말씀해주신 Collections.unmodifiableList()는 원본 리스트와 연결되어 있는 상황이기 때문에 원본이 변경된다면 읽기 전용 뷰도 변경되게 됩니다. 즉, 외부에서의 변경은 막아주지만 내부의 변경에 대한 영향을 막아주지 못한다는 단점이 생깁니다.

정리하자면 외부에서는 수정을 못하는가?에서는 비슷한 역할을 하지만, 내부의 변경(진정한 불변성 X)이 확실히 복사본에 영향이 없는가?에서 다르게 된다고 합니다.

방어적 복사의 핵심을 원본과 완전히 독립된 객체를 만든다 라는 부분을 만족하기 위해 새로운 메모리 할당이라고 생각해주시는 것도 좋을 것 같습니다!

질문해 주신 덕분에 그 경우에는 어떻게 동작하는지 생각해볼 수 있었습니다! 좋은 질문 주셔서 감사합니다:) 혹시 제가 잘못 생각하고 있는 부분이 있다면 편하게 알려주시면 감사하겠습니다!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

저는 사실 “불변 객체를 많이 만들면, 중간 객체들이 전부 버려지고 GC가 자주 일어나 성능이 떨어지지 않을까?”라는 질문이 과연 옳을까 하는 생각이 들었습니다!
자바 GC 구조상 새로 생성된 객체들은 Young영역에 위치하게 됩니다. 불변 객체를 생성했는데 그 객체가 금방 필요 없어지면, Young 영역 안에서 Minor GC를 통해 빠르게 수거될 수 있겠죠? 또한 HTTP는 stateless하게 동작하기 때문에 , 요청마다 생성되는 많은 객체(불변 객체 포함)도 금방 수거될 수 있으므로 실제로는 성능 문제가 없을 때가 많다고 알고있습니다!
이러한 이유로 불변 클래스 == 성능 문제 라고 동일시하는 건 아니지 않나.. 라는 생각을 했는데 예림님의 의견이 궁금합니다😀

(물론 책에서는 성능문제가 생길 수 있다고 언급하기는 합니다.😇)

Copy link
Copy Markdown
Contributor Author

@yerim123456 yerim123456 Jan 18, 2025

Choose a reason for hiding this comment

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

우와 그렇군요!! 말씀 듣고 찾아보니 되레 불변 객체는 GC의 성능 개선에 도움이 되는 장점이다라는 글이 있었습니다. 말씀하신 이유처럼 빠르게 수거되거나, 계속 참조되는 상황에선 Old 영역으로 이동하도록 되며 GC가 불변 객체들은 스킵하며 성능 개선에 도움이 된다는 것이었습니다. (참고 링크)

되레 장점이 되기도 하니 동일시 하는 것은 아니지 않나 라고 생각하신 부분이 맞다고 생각되었습니다. 사실 책에서도 큰 단점으로 언급했기 보단 이런 단점이 있을 수 있다라고 간단히 짚고 넘어갔던 것 같습니다..!

다만 GC 이외의 문제 때문에 성능에 대한 부분이 언급되었을 가능성도 있을 것이라는 생각이 들어서 찾아보니 다음과 같다고 나왔습니다.

1) 메모리&CPU 사용량 고려
불변 객체가 크고 복잡한 경우에도 매우 빈번히 중간 객체가 생성된다면, 메모리 사용량과 CPU 사용량이 증가하기에 부정적 영향이 있을 수 있을 수 있다고 합니다.

2) 객체 생성 비용 고려
객체가 매번 새로 생성되면 객체 생성 비용이라는 게 발생한다고 합니다. 이는 메모리 할당과 초기화가 발생하는 것으로, 객체가 생성되는 순간에만 발생한다고 합니다. 1번과 마찬가지로 매우 빈번히 중간 객체가 생성된다면, 객체 생성 자체에서 비용이 계속 발생해서 성능에 영향을 미칠 수 있다고 합니다.

저는 책을 받아들이기 바빴는데, 늘 질문 던지시고 생각할 거리를 만드신다는 점이 너무 멋지십니다..!! 매번 많이 배워요!! 생각해볼 수 있는 기회 주셔서 감사합니다!☺

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

너무 정성스러운 답변 감사합니다!!!!!!!!!!!!! 최고!!!

@023-dev 023-dev merged commit 1eaf49e into effective-java-3e-study:main Jan 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants