Java
자바 레코드 (Record) 란 무엇일까?
자바의 Record 란? 자바 17 에서 Stable 이 된 데이터 클래스다. 클래스 정의 시에 보일러 플레이트 코드를 줄이기 위해 탄생했다. 기능 불변 (final 처리) 클래스와 모든 필드가 final 처리 된다. 한번 생성하면 record 의 상태는 바뀌지 않는다. 간결한 메서드 자동 생성 getter, equals(), hashCode(), toString() 메서드를 자동으로 생성한다. 생성자 자동 생성 모든 필드를 매개변수로 사용하는 생성자를 자동으로 생성해준다. 예제 아래 코드는 1줄이지만, 클래스와 모든 필드가 final 처리되어 있다. 매개변수에 있는 field1 과 field2 가 필드가 된다. getter, equals(), hashCode(), toString() 메서드도 생성된 상..
자바 Objects.requireNonNull() 을 사용하는 이유
Objects.requireNonNull(T obj) 오브젝트가 null 이라면 NullPointerException 을 던진다. public static T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; } 사용 이유 어차피 null 에서 메서드를 호출하면 NullPointerException 은 던져질텐데 왜 사용할까? 빠른 실패 아래는 /register 에서 name 이라는 파라미터를 받아서 포맷팅을 한 후 저장하는 코드의 예시이다. 만일 register() 메서드에 Objects.requireNonNull() 이 있었다면, register() 에서 에러가 터졌을 것이다. register()..
자바 예외의 종류와 특징
예외의 종류와 특징 예외 처리에서 가장 큰 이슈는 체크 예외(checked exception)라고 불리는 명시적인 처리가 필요한 예외를 사용하고 다루는 방법이다. Error java.lang.Error 클래스의 서브 클래스들이 있다. 시스템에 비정상적인 상황이 발생했을 경우 사용되며, 자바 VM에서 발생시키는 것이므로 애플리케이션 코드에서 잡으려고 하면 안된다. OutOfMemoryError나 ThreadDeath같은 에러는 catch 블록으로 잡아봤자 아무런 대응 방법이 없다. 시스템 레벨에서 이뤄지는 에러기 때문에 애플리케이션에서는 이런 에러에 대한 처리를 신경쓸 필요가 없다. Exception과 체크 예외 java.lang.Exception 클래스와 그 서브 클래스로 정의되는 예외들은 에러와 달리 ..
이펙티브 자바, 쉽게 정리하기 - item 72. 표준 예외를 사용하라
이펙티브 자바, 쉽게 정리하기 - item 72. 표준 예외를 사용하라 표준 예외를 사용해야 하는 이유 표준이기 때문에 다른 개발자가 내 코드에서 예외의 의미를 이해하기 쉬워진다. 클래스를 적게 만들어 성능상의 이득도 있다. 자바 라이브러리에서 충분한 수의 예외를 제공해줘서 일반적인 경우 표준 예외로 전부 처리가 가능하다. 직렬화에도 용이하다. 표준 예외 중 자주 쓰이는 것들 IllegalArgumentException 이름 그대로 잘못된 인수를 넘겼을 때 던져주는 예외이다. ex) 사람의 나이 설정에 음수를 넘겼을 때 관례적으로 null은 NullPointerException을 이용한다. IllegalStateException 객체의 상태가 메서드 수행에 적합하지 않을 때 객체 초기화 자체가 제대로 되..
이펙티브 자바, 쉽게 정리하기 - item 71. 필요 없는 검사 예외(checked error) 사용은 피하라
이펙티브 자바, 쉽게 정리하기 - item 71. 필요 없는 검사 예외(checked error) 사용은 피하라 검사 예외의 단점 try-catch 혹은 throws 를 강제한다. 이 과정에서 많은 개발자들이 귀찮다는 이유로 잘못된 예외 처리 로직을 작성하거나 예외처리 로직에서 아무 행위도 하지 않기도 한다. 검사 예외가 발생하는 메서드는 스트림 안에서 해당 메서드를 직접 사용할 수 없다. 단, 프로그래머가 이 검사 예외로 인해 의미있는 조치를 취할 수 있다면 괜찮은 조치일 수도 있다. 예외 상황에 대처하지 못하는 경우의 예 try { // ... } catch (TheCheckedException e) { throw new AssertionError(); // 일어날 수 없다! } try { // ....
이펙티브 자바, 쉽게 정리하기 - item 70. 복구할 수 있는 상황에는 검사 예외를 프로그래밍 오류에는 런타임(비검사) 예외를 사용하라
이펙티브 자바, 쉽게 정리하기 - item 70. 복구할 수 있는 상황에는 검사 예외를 프로그래밍 오류에는 런타임(비검사) 예외를 사용하라 예외의 4가지 종류 예외는 throwable 타입이라고 한다. 예외는 검사, 비검사 예외가 있으며 하위 예외로 런타임 예외와 에러가 있고 각각의 목적이 있다. 검사 예외 (Checked Exception) 비검사 예외 (Unchecked Exception) 런타임 예외 (Runtime Exception) 에러 (Error) 검사 예외와 비검사 예외는 예외 처리를 강제하냐 아니냐의 차이가 있다. 예외별 간단 사용 지침 검사 예외: 호출하는 쪽에서 복구하리라 여겨지는 상황에 사용한다. catch 로 복구하거나 밖으로 퍼트려(throws) 복구할 가능성이 있다. 복구할 가..
이펙티브 자바, 쉽게 정리하기 - item 69. 예외는 진짜 예외 상황에만 사용하라
이펙티브 자바, 쉽게 정리하기 - item 69. 예외는 진짜 예외 상황에만 사용하라 예외가 아닌 상황에 예외를 사용했을 때 try { int i = 0; while(true) { range[i++].climb(); } } catch (ArrayIndexOutOfBoundsException e) { } 위 코드의 의도는 일반적인 반복문에서 반복문도 매 반복마다 배열의 경계를 넘는지 검사하고, JVM도 배열에 접근할 때마다 경계를 넘는지 검사하는데, 그 중복을 없애서 성능 최적화를 하려던 의도이다. 결과적으로는 잘못된 추론을 근거로 성능을 높여보려 한 것이 된다. 위 추론이 잘못된 이유 JVM 구현자 입장에서는 위 같은 코드가 빠르게 돌아갈지에 대해서는 전혀 고려하지 않을 것이다. 예외는 예외를 처리하는데..
이펙티브 자바, 쉽게 정리하기 - item 68. 일반적으로 통용되는 명명 규칙을 따르라
이펙티브 자바, 쉽게 정리하기 - item 68. 일반적으로 통용되는 명명 규칙을 따르라 자바 언어의 명명 규칙 철자와 문법 2가지로 나뉜다. 철자 규칙 패키지, 클래스, 인터페이스, 메서드, 필드, 타입 변수의 이름을 다룬다. 특별한 이유가 없는 한 반드시 따라야 다른 개발자들의 오해로 인한 실수가 생기지 않는다. 패키지 명명법 .으로 구분하여 계층적으로 이름을 짓는다. 보통 인터넷 도메인 이름을 역순으로 사용한다. ex) com.google 표준 라이브러리 및 선택적 패키지는 java와 javax로 시작한다. 이름은 보통 8자 이하의 짧은 단어로 한다. utilities -> util 약어라면, abstract window toolkit -> awt와 같이 가능하다. 클래스와 인터페이스 명명법 열거타..
이펙티브 자바, 쉽게 정리하기 - item 67. 최적화는 신중히 하라
이펙티브 자바, 쉽게 정리하기 - item 67. 최적화는 신중히 하라 최적화에 대한 생각 최적화는 보통 해로운 결과로 이어진다. 특히나 견고한 구조를 해치는 최적화는 하지말자. 빠른 프로그램보다는 좋은 프로그램을 작성하자. 좋은 프로그램은 개별 구성요소의 내부를 독립적으로 설계 가능한 것이다. 시스템의 나머지에 변화를 주지 않고도 내가 원하는 부분에 변화를 줄 수 있는 것이다. 설계를 이용해 성능 올리는 방법 성능을 제한하는 설계를 피하라 설계적인 요소는 완성 후 변경하기가 가장 어렵다. API, 네트워크 프로토콜, 영구 저장용 데이터 포맷 등이 대표적이다. 완성 후 변경이 어렵거나 불가능할 수도 있고, 시스템 성능도 크게 제한할 수 있다. API를 설계할 때 성능에 주는 영향을 고려하라 public ..
이펙티브 자바, 쉽게 정리하기 - item 66. 네이티브 메서드는 신중히 사용하라
이펙티브 자바, 쉽게 정리하기 - item 66. 네이티브 메서드는 신중히 사용하라 네이티브 메서드란? C, C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드이다. 자바 네이티브 인터페이스(JNI)라는 기술에 의해 호출된다. 네이티브 메서드의 쓰임 레지스트리와 같이 플랫폼 특화 기능을 사용한다. 네이티브 코드로 작성된 기존의 라이브러리를 활용한다. 성능 개선 목적으로 성능에 중요한 부분만 네이티브 메서드를 쓴다. 다만 성능을 개선할 목적으로 네이티브 메서드를 사용하는 것조차 거의 권장하지 않는다. 네이티브 메서드를 쓴다면? 성능 개선 목적으로 쓰지말자. JVM은 빠른 속도로 발전해왔고, 현재는 특수한 경우가 아니면 네이티브 메서드가 필요 없을 정도로 많이 빨라졌다. 단, 다중 정밀 연산 라이브러리(G..
이펙티브 자바, 쉽게 정리하기 - item 65. 리플렉션보다는 인터페이스를 사용하라
이펙티브 자바, 쉽게 정리하기 - item 65. 리플렉션보다는 인터페이스를 사용하라 리플렉션이란? 자바 리플렉션 (Reflection) 이란? 포스팅 참고 리플렉션의 기능 특정 클래스의 생성자, 메서드, 필드 정보를 가져올 수 있다. 추가적으로 멤버 이름, 필드 타입, 메서드 시그니쳐 등을 가져올 수 있다. 실제 생성자, 메서드, 필드를 조작할 수도 있다. Method.invoke() 는 메서드를 호출할 수 있게 해준다. 리플렉션을 이용하여 컴파일 당시 존재하지 않던 클래스도 이용 가능하다. 리플렉션의 단점 컴파일 타입 검사의 이점을 누릴 수 없다. 런타임에야 오류를 알게될 것이다. 코드가 지저분해진다. 성능이 떨어진다. 리플렉션을 통한 메서드 호출은 상당히 느리다. 일반적인 코드에서는 리플렉션이 필요..
이펙티브 자바, 쉽게 정리하기 - item 64. 객체는 인터페이스를 사용해 참조하라
이펙티브 자바, 쉽게 정리하기 - item 64. 객체는 인터페이스를 사용해 참조하라 웬만하면 유연함을 위해 인터페이스로 연결하자 매개변수, 반환값, 변수, 필드가 대상이 될 수 있다. 인터페이스를 타입으로 사용하면 프로그램이 유연해진다. Map 인터페이스를 사용한다고 가정했을 때, HashMap 도 가능하고, 성능을 위해 EnumMap 혹은 순서를 위해 LinkedHashMap 등을 유연하게 사용할 수 있다. 왜냐하면 구현체들은 다 Map 인터페이스를 구현한 것이기 때문이다. Set sonSet = new LinkedHashSet(); // O LinkedHashSet sonSet = new LinkedHashSet(); // X 그러나 인터페이스가 항상 정답은 아니다. 클래스를 써야 하는 경우 적합한..