TreeSet에서 객체를 구별할 때 equals와 hashCode만으로는 충분하지 않다

Intro컬렉션을 사용할 때, 특히 중복을 허용하지 않는 Set을 사용할 경우, 우리는 보통 사용하는 클래스의 equals와 hashCode만 올바르게 오버라이드하면 된다고 생각한다. HashMap에서는 그랬을지 몰라도 TreeSet을 사용할 때는 상황이 조금 달라진다.TreeSet은 내부적으로 요소를 정렬하는 과정에서 compareTo 메서드를 사용하는데, 이를 간과하면 문제가 발생할 수 있다. compareTo 메서드는 단순히 정렬만을 위한 것이 아니라, 중복을 체크하는 데도 사용되기 때문이다.이 글에서는 TreeSet에 집어넣는 클래스의 equals, hashCode 뿐만아니라 compareTo에 대해서도 신경 써야 하는 이유에 대해 살펴본다.문제 상황TreeSet은 삽입된 데이터를 자동으로 정렬하..

Programming/Java 2024.09.29
[Java] Carriage return 그리고 Line feed

Intro HWPX 이야기 이 사건은 사용자가 요청하는 정보에 해당하는 HWPX 파일을 서버에서 실시간으로 만들어서 사용자가 다운로드 받을 수 있도록 제공하는 기능을 구현하던 중 발생했다. hwpx파일은 엑셀처럼 기본적으로 zip 파일로 되어 있어, 파일 확장자를 .zip으로 변경한 뒤에 압축을 풀면 내부 파일 구조를 확인 할 수 있다. Contents 폴더, META-INF 폴더, Preview 폴더가 있는데 그 중 Contents 폴더의 section0.xml 이 내용물을 담고있는 핵심 파일이다. 그런데 문제는 마음대로 바꾸고 싶은대로 바꾸면 한컴오피스에서 파일이 열리지 않았다. 줄바꿈, 탭문자등이 들어가면 어김없이 프로세스가 죽어버린다. 그들이 정의해놓은 포맷에 맞게 기입해야만 한다. 예) 줄바꿈 ..

Programming/Java 2024.01.05
[Java] Serializable 인터페이스 이해하기

Intro 데이터를 한 시스템에서 다른 시스템이나 네트워크로 전송하거나 데이터를 파일에 저장할 때, 그 데이터를 전송가능한 형태로 변환해야 한다. 객체는 입체 형태지만, 데이터가 이동하는 통로는 0과 1로만 이루어진 일차원의 세상이기 때문이다. 이 과정을 직렬화(serialization)라고 하며, 데이터의 직렬화의 방법은 XML이나 JSON등 우리가 흔히 아는 것 외에도 정말 많은 방법들이 있다. 자바에서는 Serializable 인터페이스를 구현하여 이를 수행할 수 있게 된다. 자바 내에서의 직렬화는 객체의 상태를 바이트 스트림으로 변환하여 파일에 저장하거나 네트워크를 통해 전송할 수 있도록 하는 과정이다. 자바 플랫폼 내에서만 데이터를 주고받는다면 아래의 강점을 지니고 있기 때문에 여전히 많이 사용..

Programming/Java 2023.11.08
[Maven/Gradle] 의존중인 모든 라이브러리의 라이센스 정보 불러오기

Intro 소프트웨어 개발을 하는 과정에서는 다양한 서드파티 라이브러리를 사용하게 된다. 이들 라이브러리는 우리가 직접 작성해야 할 코드의 양을 획기적으로 줄여주며 이미 검증된 라이브러리를 사용하면 코드의 안정성 향상에도 많은 도움을 준다. 하지만 각 라이브러리는 자체 라이센스 정책을 가지고 있으며, 개발자로서 이를 이해하고 준수하는 것은 법적이나 윤리적인 측면에서 매우 중요하다. 이번에 사용중인 모든 서드파티 라이센스 정보를 프로젝트에 기입해야 하는 일이 필요했다. 수동으로 관리하고 문서화 하는 것은 실수하기도 쉽고 시간도 많이 소요되기 때문에 자동화 할 수 있는 도구를 찾아보았고, 다행히도 제법 잘 만들어진 몇 도구들이 있어 어렵지 않게 라이센스 정보를 한번에 생성할 수 있었다. 지금부터 이 글을 통..

Programming/Java 2023.07.21
[Java] JaCoCo로 코드 커버리지 측정하기

Intro Code Coverage 코드 커버리지는 작성한 소스코드중 얼마나 많은 부분이 자동화된 테스트에서 실질적으로 실행되었는지를 측정할 수 있는 지표 입니다. 높은 코드 커버리지는 테스트가 실행되는 동안 소스코드의 더 많은 부분이 실제적으로 실행된것을 의미하기 때문에 보다 낮은 커버리지의 프로그램에 비해 버그가 발생할 확률이 더 낮다고 기대할 수 있습니다. 물론 높은 커버리지가 더 좋은 테스트임을 보장하는 것은 아닙니다. 특히 최근의 트랜드처럼 급한 템포의 개발이 이루어지는 상황에서도 빠르게 만들어낼 뿐만 아니라 신뢰수준이 높고 좋은 퀄리티의 코드를 작성하기 위해서는 정말 중요한 지표라고 생각됩니다. 진행중인 사이드 프로젝트에서 코드 커버리지를 측정하고 해당 지표를 조금씩 개선해보는 실습을 진행 해..

Programming/Java 2023.02.25