개발 서적

불변 클래스 클래스의 인스턴스 내부 값을 수정할 수 없는 클래스를 불변 클래스라고 한다. 인스턴스의 정보는 객체가 파괴되는 순간까지 절대 달라지지 않는다. 불변 객체의 특징 불변 객체는 단순하다. 인스턴스 내부가 달라지는 가변 객체와 달리 분변 객체는 생성된 뒤부터 값이 달라지지 않았음을 보장하여 믿고 쓸 수 있다. 불변 객체는 스레드 세이프하고 동기화할 필요가 없다. 여러 스레드가 동시에 사용해도 훼손되지 않는다. 불변 객체는 안심하고 공유할 수 있다. 스레드 세이프한 것과 이어지는 내용인데 값이 달라지지 않기 때문에 재활용할 수 있으면 재활용하면 좋다. 자주 쓰이는 인스턴스는 캐싱하여 같은 인스턴스를 중복 생성하지 않게 해 줄 수도 있다. 객체를 만들 때 다른 불변 객체들을 구성 요소로 사용하면 이점..
4.1 스트림이란 무엇인가 자바 8 API에 새로 추가된 기능 선언형으로 컬렉션 데이터 처리(DB에 질의하듯이) 어떻게 동작을 구현할지 지정할 필요 없이 ‘저칼로리의 요리만 선택하라’ 같은 동작의 수행을 지정할 수 있다. 멀티스레드 코드를 구헌 하지 않아도 데이터를 투명하게 병렬로 처리 가능 parallelStream() 여러 빌딩 블록 연산을 파이프 라인으로 연결해 가독성과 명확성을 유지하며 작성이 가능하다. filter(sorted, map collect)와 같은 연산은 고수준 빌딩 블록으로 이루어져 있어서 특정 스레딩 모델에 제한되지 않는다. (내부적으로 단일 스레드 모델에 사용할 수 있지만 멀티코어 아키텍처를 최대한 투명하게 활용할 수 있게 구현되어 있다.) 결과적으로 데이터 처리를 병렬화하면서 ..
똑같은 객체를 매번 생성하기보다 하나를 재사용하는 편이 나을 때가 많다. 특히 불변 객체는 생성할 필요 없이 언제든 재사용할 수 있다. 예시1. String String newString = new String("string"); String string1 = "string"; String string2 = "string"; 첫 줄처럼 문자열을 생성하는 사람은 없을 것이나 예시를 들기 위해 가져왔다. 문자열(String)은 프로그램이 실행되는 동안 엄청 많이 생성되는 객체이다. String은 String pool에서 관리되기 때문에 단순히 2,3번째 줄처럼 생성하면 String pool에서 인스턴스를 가져오기 때문에 불필요한 생성은 하지 않는다. 하지만 new로 생성하게 되면 새로운 인스턴스로 생성하기 ..
중첩 클래스 중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다. 메서드 밖에서 사용해야 하거나 메서드 안에 정의하기에 너무 길 때 만든다. public class OuterClass { // ... class InnerClass { // ... } } 정적 멤버 클래스 static이 붙어 정적으로 선언된 중첩 클래스를 정적 멤버 클래스라고 한다. 바깥 클래스의 private 멤버 변수에도 접근할 수 있다는 점만 제외하고 일반 클래스와 똑같다. 멤버 클래스일 뿐 다른 정적 멤버 변수와 같은 규칙을 적용받는다. 바깥 클래스가 생성되는 것과 상관없이 독립적으로 생성할 수 있다. public class OuterClass { static class StaticInnerClass {..
일반적으로 객체를 생성할 때 생성자를 통해 생성한다. CustomClass customClass = new CustomClass(); 정적 팩터리 메서드는 객체를 생성할 때 클래스 내부에 구현된 클래스 메서드로 자기 자신 객체를 반환하는 메서드이다. LocalDateTime을 예시로 살펴보자. LocalDateTime localDateTime = LocalDateTime.of(2022, 2, 24, 10, 26); 이처럼 객체를 생성할 때 of와 같은 이름을 가진 메서드로 클래스 메서드로 객체를 생성하는 것을 정적 팩터리 메서드라고 한다. 정적 팩터리 메서드를 사용하면 얻을 수 있는 이점은 다음과 같다. 1. 이름을 가질 수 있다. 단순히 매개변수나 생성자 자체만으로 반환된다면 객체의 특성을 제대로 설명..
Junit은 자바에서 사용하는 유닛 테스트 프레임워크이다. 요즘 자바로 TDD(테스트 주도 개발)를 연습하고 있는데 공부할 겸 Junit5 어노테이션을 정리하고자 한다. Junit은 어노테이션으로 다양한 기능을 제공한다. @Test 테스트 메서드임을 나타낸다. @Test void 테스트() { //... } @ParameterizedTest 매개변수를 받아서 여러 입력에 대한 결과를 한 번에 테스트할 수 있다. @ParameterizedTest @ValueSource(strings = {"dog", "cat"}) void 매개변수_테스트(String input) { // ... } 여러 입력에 다른 결과를 테스트하고 싶을 때 사용하는 방법이다. @ParameterizedTest @CsvSource(val..