glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-008] 해시와 oridinal 메서드 접근 비유에 대한 질문 #164

Closed yngbao97 closed 1 month ago

yngbao97 commented 2 months ago

Based on: #160 by @FickleBoBo


책을 읽으면서도 Enum 클래스의 ordinal() 메서드 접근제한에 대해서는 생각해보지 못했는데, 간단하지만 의미있는 관점에서 고민할 수 있는 탐구를 해주신 것 같아 흥미롭게 읽었습니다.

다만 어려웠던 점으로 작성해주신 내용 중

이전에 해시에 대해 조사를 하면서 자바에서는 메모리에 대한 프로그래머의 직접적인 접근을 방지하도록 설계된 것으로 보였는데, ordinal()에 대해서는 Java 설계 철학에 투명성이 있어서 그렇다는 답변을 받아서 납득하기는 어려웠다.

해당 내용에서 자바에서 메모리에 대한 프로그래머의 직접적인 접근을 방지하도록 설계한 것과 ordinal 메서드이 public으로 접근 가능하도록 구현되어있는 것이 어떤 연관성을 가지는 것인지 궁금합니다. 저 스스로 해시에 대한 공부가 부족하기도 하지만, ordinal 메서드가 메모리와 관련이 있는지에 대해서 이해가 잘 되지 않아서요. 비교하신 부분에 대해 부가설명을 추가해주시면 관련 내용을 공부하는데에 도움이 될 것 같습니다!

좋은 탐구 감사합니다!

FickleBoBo commented 2 months ago

글을 깔끔하게 작성되지 않아서 의미 전달이 잘 안되었던 것 같습니다. 좋은 질문 감사합니다.

해시와 oridinal() 대한 어려웠던 점의 내용은 ordinal() 메서드를 굳이 public으로 제공해서 개발자가 오용할 여지를 준 이유가 무엇일지 알아내지 못해서 ChatGPT에 질문을 했는데 납득할 만한 답변이라는 생각이 들지 않았습니다.

답변은 위의 내용처럼 Java 설계 철학에 투명성이 있어서 그렇다고 나왔는데 최근 Collection을 학습하며 내부에 private 메서드들이 있는 것을 보았습니다. (ex ArrayList의 grow() 메서드)

해시에 대한 내용도 비슷하게 자바에서 메모리에 대한 직접적인 접근을 기본적으로는 제공하지 않고 JNI 같은 일부 방법을 통해야 가능한 것으로 보이는데, 이처럼 자바에서 개발자에게 모든 것을 자유롭게 사용하도록 한다는 느낌을 받지는 않았습니다.

요약하자면 oridinal 메서드가 메모리와 어떠한 연관 관계가 있는 것이 아니라 ordinal 메서드를 사용하지 않을 것을 권장하면서 사용할 수 있게 만든 이유를 납득하기 어렵다가 어려웠던 점의 내용이었습니다. 지금은 ordinal 메서드를 사용하지 않고 다른 방법을 쓰는 것을 권장은 하지만 oridinal이 간단하기도 하고 생성자를 통해 인덱스와 같은 숫자를 부여하는 것이 초보 개발자가 떠올리기 어려운 방법이라 그냥 공개한게 아닌가도 싶습니다.

https://stackoverflow.com/questions/14964122/how-do-i-access-the-memory-used-by-a-java-program