JAVA 94

[아이템 65] 리플렉션보다는 인터페이스를 사용하라

리플렉션 기능을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있으며 Class 객체가 주어지면 클래스 정보를 통해 다음과 같은 인스턴스를 가져올 수 있습니다. 생성자 메서드 필드 1. 생성자 생성자 시그니처를 가져올 수 있음 생성자 인스턴스를 통해 객체를 생성할 수 있음 2. 메서드 메서드 시그니처를 가져올 수 있음 메서드 인스턴스를 통해 메서드를 실행시킬 수 있음 3. 필드 필드 타입, 멤버 필드명 등을 가져올 수 있음 MyClass.java ReflectionExample.java 리플렉션의 단점 앞서 코드에서 볼 수 있었다시피 리플렉션은 강력한 기능이지만 다음과 같은 단점들이 존재합니다. 컴파일 시점 타입 검사가 주는 이점을 누릴 수 없음 리플렉션을 이용하면 코드가 지저분해지고 장황해짐 성능 저..

JAVA/Effective Java 2024.03.19

[아이템 64] 객체는 인터페이스를 사용해 참조하라

아이템 51에서 소개된 `매개변수 타입으로 클래스가 아니라 인터페이스를 사용하라`는 내용을 `객체는 클래스가 아닌 인터페이스로 참조하라`로 보다 구체적으로 확장할 수 있습니다. 적합한 인터페이스만 존재한다면 매개변수 뿐 아니라 반환값, 변수, 그리고 필드를 전부 인터페이스 타입으로 선언하는 것을 권장합니다. 위 내용을 적용한다면 객체의 실제 클래스를 사용해야 할 상황은 `오직` 생성자로 생성할 때 뿐입니다. 코드 부연 설명 좋은 예는 Set 인터페이스 타입으로 변수를 선언 좋지 않은 예는 Set 인터페이스의 구현체 중 하나인 LinkedHashSet 타입으로 변수를 선언 1. 인터페이스 타입으로 사용하는 습관을 길러야 하는 이유 프로그램을 유연하게 작성하기 위해서는 인터페이스 타입으로 사용하는 습관을 길..

JAVA/Effective Java 2024.03.18

[아이템 63] 문자열 연결은 느리니 주의하라

문자열 연결 연산자(+)는 여러 문자열을 하나로 결합해주는 편리한 도구입니다. 주로 한 줄로 된 출력값이나 고정 크기의 객체의 문자열 표현을 만들 때 사용하기에 유용합니다. ex) `String fullName = this.firstName + this.lastName;` 하지만 문자열 연결 연산자로 문자열 N개를 잇는 시간 복잡도는 O(N^2)이기 때문에 본격적으로 많은 문자열을 합치기 시작하면 성능 저하를 피하기 어렵습니다. 문자열은 불변이기 때문에 두 문자열을 연결하는 경우 양쪽의 내용을 복사하여 연결한 다음 새로운 String 객체를 생성해야하기 때문 성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하는 것을 권장 자바 6번 이후 문자열 연결 성능을 다방면으로 개선했지..

JAVA/Effective Java 2024.03.17

[아이템 62] 다른 타입이 적절하다면 문자열 사용을 피하라

문자열은 널리 사용되며 자바에서 잘 지원되기 때문에, 일반적으로 텍스트 표현 이외의 다른 용도로도 자주 사용됩니다. 이번 아이템에서는 문자열을 쓰지 않아야 할 사례를 다루겠습니다. 문자열은 다른 값 타입을 대신하기에 적합하지 않음 문자열은 열거 타입을 대신하기에 적합하지 않음 문자열은 혼합 타입을 대신하기에 적합하지 않음 문자열은 권한을 표현하기에 적합하지 않음 1. 문자열은 다른 값 타입을 대신하기에 적합하지 않음 많은 개발자들이 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 이용 하지만 입력받을 데이터가 진짜 문자열인 경우 즉, 텍스트일 때만 문자열을 사용하는 것을 권장 데이터가 수치형이면 int, long, double 등 수치에 적합한 타입을 사용 `Yes/No`와 같은 질..

JAVA/Effective Java 2024.03.17

[아이템 61] 박싱된 기본 타입보다는 기본 타입을 사용하라

자바의 데이터 타입은 다음과 같이 두 가지로 나눌 수 있습니다. 기본 타입(Primitive Type) 참조 타입(Reference Type) 1. 기본 타입(Primitive Type) boolean char short int long double etc.. 2. 참조 타입(Reference Type) Boolean Character Short Integer Long Double etc.. 위처럼 기본 타입에 대응되는 참조 타입이 하나씩 있으며, 이를 박싱된 기본 타입 혹은 Wrapper 타입이라고 지칭합니다. 아이템 6에서 언급했다시피 자바 1.5버전부터 기본 타입과 래퍼 타입을 자동으로 변환해 주는 오토박싱 기능이 추가되어 두 타입을 혼용해서 사용해도 예외가 발생하지는 않습니다. 그럼에도 불구하고 ..

JAVA/Effective Java 2024.03.17

[아이템 60] 정확한 답이 필요하다면 float와 double은 피하라

float과 double 자료형은 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 `근사치`를 계산하도록 설계되었습니다. 따라서 위 자료형은 정확한 결과가 필요할 때에는 절대 사용해서는 안됩니다. 이 때문에 float과 double 자료형은 금융 관련 계산과는 성격이 맞지 않으며 지양해야 함 1. double 자료형의 계산 결과가 정확하지 않은 예제 코드 코드 부연 설명 $0.1, $0.2, $0.3, $0.4 달러의 물건을 샀을 것이라고 예상했고 이에 따라 잔돈 또한 없을 것이라고 예상 하지만 부동소수점 연산 때문에 0.3 + 0.1의 결과가 0.41이 됨 이 때문에 예산인 $1을 넘어 잔돈으로 $0.39999999999999999가 반환 올바른 결과 출력을 위해서는 BigDecimal 사용..

JAVA/Effective Java 2024.03.17

[아이템 59] 라이브러리를 익히고 사용하라

무작위 정수를 생성할 때 많은 개발자들이 다음과 같이 개발합니다. 얼핏 보면 문제가 없어 보이지만 세 가지의 문제점을 내포하고 있는 코드입니다. n이 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복됨 n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환됨 rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문에 지정한 범위 바깥의 수가 종종 튀어나갈 수 있음 혹여나 결과로 Integer.MIN_VALUE가 나왔고 이를 절댓값 씌웠을 때 오버플로우 발생 가능 1. n이 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복됨 코드 부연 설명 n을 2^10, 즉 1024로 설정하고 1024번의 반복을 통해 랜덤값을 생성했음에도 불구..

JAVA/Effective Java 2024.03.17

[아이템 58] 전통적인 for 문보다는 for-each 문을 사용하라

아이템 45에서 다루었다시피 stream이 제격인 작업이 있고 반복이 제격인 작업이 있습니다. 앞서 아이템 57에서도 언급했듯이 for문과 같은 광용구들은 while문보다는 낫지만 다음 이유 때문에 최선의 방법은 아닙니다. 진짜 필요한 것은 원소들 뿐이지만 위 코드처럼 작성할 경우 반복자와 인덱스 변수 모두 선언해야 하기 때문에 코드가 지저분해짐 컬렉션이나 배열이여냐에 따라 코드 형태가 달라짐 for-each문 정식 이름은 `향상된 for문(enhanced for statement)` for-each 문은 컬렉션과 배열은 물론 Iterable 인터페이스를 구현한 객체라면 무엇이든 순회 가능 반복자와 인덱스 변수를 사용하지 않기 때문에 코드가 깔끔해지고 오류가 날 일이 없음 하나의 관용구로 되어있어 컬렉션..

JAVA/Effective Java 2024.03.16

[아이템 57] 지역변수의 범위를 최소화하라

이번 아이템은 아이템 15에서 다루었던 `클래스의 멤버와 접근권한을 최소화하라`와 취지가 비슷합니다. 지역 변수의 범위를 최소화하면 코드의 가독성이 높아지고 유지보수가 쉬워지며 오류 발생 가능성이 낮아집니다. 지역변수는 가장 처음 쓰일 때 선언하자 지역 변수가 초기화된 지점과 사용되는 지점이 멀어질수록 코드의 가독성이 떨어지고 혼란스러워짐. 막상 쓰일 시점에 돼서는 해당 지역변수가 무슨 타입이었는지, 무슨 값으로 초기화했는지 기억이 나지 않을 가능성이 높음 지역변수를 생각 없이 선언하다 보면 변수가 쓰이는 범위보다 너무 앞서 선언하거나, 다 쓴 후에도 메모리 회수가 되지 않고 여전히 살아있을 확률이 높음 지역변수의 범위는 선언된 지점부터 그 지점이 포함한 블록이 끝날 때까지 유효 실수로 의도한 범위 앞 ..

JAVA/Effective Java 2024.03.16

[Java] 동기화 도구

개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2411 [Java] Lock, ReentrantLock, ReadWriteLock, ReentrantReadWriteLock 개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2409 [Java] synchronized, wait() & notify(), volatile, Deadlock 개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tist jaimemin.tistory.com CAS(Compare and Swap) 멀티 쓰레드 환경에서 락을 사용하지 않고도 공유 변수의 값을 원자적으로 변경하는 방법 제공 CP..

JAVA/RxJava 2024.03.14