※ 이 포스팅은 주관적 해석을 포함하고 있습니다. compareTo() 구현 명세 자바 API 문서 Comparable compareTo() 구현 명세에 다음과 같은 지침이 있다. It is strongly recommended, but not strictly required that(x.compareTo(y)==0) == (x.equals(y)). compareTo()는 객체 간의 자연적 순서(natural order)를 정하기 위해서 주로 사용되고, equals()는 객체 간의 동치성을 비교하기 위해서 사용된다. 사용목적이 달라 보이는 두 메서드 간에 왜 위와 같은 구현 지침이 있는 걸까? 결론부터 말하자면 (일부) Set이나 Map 메서드의 동치성 확인은 equals()가 아닌 compreTo() ..
IntelliJ IDE에서 JUnit4를 JUnit5 테스트로 변환하는 방법을 알아보겠습니다. 이 포스팅은 https://www.youtube.com/watch?v=F8UTTTDtbH0&t=468s 영상을 참고하였습니다. 1. JUnit5 의존성 주입하기 org.junit.jupiter junit-jupiter 5.6.2 (아직 JUni4 의존성 삭제는 하지 않습니다.) 2. 리팩토링 설정 추가하기 (Inspection) IntelliJ - Preferences - Editor - Inspections JUnit으로 검색하여 JUnit 4 test can be JUnit 5 항목 체크[v] 후 OK 3. JUnit4 테스트를 JUnit5로 변환하기 이제 JUnit4 테스트 클래스는 IntelliJ가 경고..
JDK 1.5 버전 이후부터, String의 + 연산은 컴파일시에 StringBuilder를 사용하도록 자동변환되어 성능 최적화가 이뤄진다고 알려져 있습니다. 그러나 String은 항상 StringBuilder로 변환되지 않습니다. String 연산을 수행하는 몇가지의 예제를 준비했습니다. String을 연산하는 소스코드를 컴파일하고, 다시 디컴파일하여 성능최적화가 이뤄졌는지 확인해보겠습니다. (디컴파일러는 JAD를 사용하였으며, 예제코드들은 "012"라는 문자열을 이어붙여서 만드는 작업을 수행합니다.) 예제1) 한줄로 모두 선언한 경우 //컴파일 전 소스파일 String str1 = "0" + "1" + "2"; //컴파일 이 후, 디컴파일 한 소스파일 String str1 = "012"; 한줄로 모두..
EnumSet을 사용하는 방법 EnumSet은 다른 컬렉션들과 다르게 new 연산자 사용이 불가능합니다. EnumSet은 아래와 같은 방법으로 사용합니다. //DayOfWeek라는 Enum을 다루는 Set으로 비어있는 Set을 반환 EnumSet enumSet1 = EnumSet.noneOf(DayOfWeek.class); //모든 DayOfWeek Enum의 값을 담고있는 Set을 반환 EnumSet enumSet2 = EnumSet.allOf(DayOfWeek.class); 정적 팩토리 메소드(static factory method)만으로 EnumSet의 구현 객체를 반환받을 수 있습니다. 왜 이렇게 만든 걸까요? EnumSet 내부를 살펴보자 (아래 코드는 설명을 위해서 간소화한 코드입니다.) pu..
개요 Collection의 List나 Map은 모두 get()메소드로 저장되어진 인스턴스를 가져올 수 있지만 Set만 get메소드가 존재하지 않습니다. 왤까요..? 1. Set의 본래 사용 목적과 맞지 않는다. Set은 순서와 상관없이 중복되지 않는 데이터를 저장하는 것을 목적으로 만들어진 자료구조입니다. 순서를 보장하지 않기 때문에 List 처럼 인덱스 값을 가질 수 없습니다. 대신 중복을 허용하지 않기 때문에 해당 데이터가 저장되어 있는지 아닌지를 빠르게 확인하는 contains() 메소드를 가질 수 있습니다. (List도 contains() 메소드를 가지고 있기는 하지만 모든 데이터를 순회하면서 탐색하여 성능이 좋지 않습니다.) 2. 구조적으로 구현이 불가능하다. Set의 구현체들을 살펴보면 흥미로..
개요 Map에 많은 구현체들이 있지만 주로 HashMap을 사용하고 상황에 따라 TreeMap이나 LinkedHashMap정도를 고려해보는 것이 현실입니다. Hash를 사용하는 HashMap이면 성능적으로 충분히 훌륭하지 않은가 생각했는데, EnumMap이 HashMap보다 성능적으로 훨씬 좋다는 사실을 알게 되었습니다. EnumMap 이 뭘까 EnumMap도 Map의 구현체입니다. 대신 한가지 조건이 있는데 key값으로 enum이 들어가야 합니다. enum DayOfWeek { MON, TUE, WED, THU, FRI, SAT, SUN } public static void main(String[] args) { Map enumMap = new EnumMap(DayOfWeek.class);//키에 들어..
개요 class MyClass { class InnerClass{} static class InnerStaticClass{} //내부 클래스에 static이 붙는다면? } 클래스 내부에 선언된 두개의 내부 클래스에 대한 차이점에 대해서 얘기해보겠습니다. 만약에 'static'키워드가 붙은 내부 클래스를 보면서 '아 static이니까 메모리에 하나만 올라가는 인스턴스 인가보다' 라고 생각하신다면.. 큰 오해를 하고 계신다는 점을 미리 알려드립니다. :) 원래 'inner 혹은 내부'라는 키워드는 static class에 사용하지 않습니다. 이 포스팅에서는 차이점을 비교하기 위해서 편의상 사용하겠습니다. 정확한 명칭은 static member class (혹은 정적 멤버 클래스) 라고 해야합니다. 1. 내부..
[개요] 자바에서 숫자를 다루기 위한 타입들은 크게 두 가지로 분류할 수 있습니다. 하나는 '원시 타입(primitive type)'이고, 또 다른 하나는 참조 타입(reference type)'입니다. 원시 타입은 (int, double, boolean... )을 말하며, 참조 타입은 (Integer, Double, Boolean...)을 말합니다. 요즘 자바는 오토박싱, 언박싱이 잘 되어서, 원시 타입과 참조 타입을 코드 구현상에서 같이 사용해도 개발자 입장에서는 크게 불편함이 없습니다. int i = Integer.valueOf(1); Integer integer = i; //오토박싱 언박싱이 되기 때문에, 이런식으로 사용해도 컴파일 오류를 발생하지 않습니다. (+ 참고로 오토박싱은 메모리 누수의 ..