불변 클래스 클래스의 인스턴스 내부 값을 수정할 수 없는 클래스를 불변 클래스라고 한다. 인스턴스의 정보는 객체가 파괴되는 순간까지 절대 달라지지 않는다. 불변 객체의 특징 불변 객체는 단순하다. 인스턴스 내부가 달라지는 가변 객체와 달리 분변 객체는 생성된 뒤부터 값이 달라지지 않았음을 보장하여 믿고 쓸 수 있다. 불변 객체는 스레드 세이프하고 동기화할 필요가 없다. 여러 스레드가 동시에 사용해도 훼손되지 않는다. 불변 객체는 안심하고 공유할 수 있다. 스레드 세이프한 것과 이어지는 내용인데 값이 달라지지 않기 때문에 재활용할 수 있으면 재활용하면 좋다. 자주 쓰이는 인스턴스는 캐싱하여 같은 인스턴스를 중복 생성하지 않게 해 줄 수도 있다. 객체를 만들 때 다른 불변 객체들을 구성 요소로 사용하면 이점..
java
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로 생성하게 되면 새로운 인스턴스로 생성하기 ..
프로그래밍을 하다 보면 컬렉션, 그중에서도 List를 참 많이 다루게 된다. 특히 리스트 안의 데이터가 비즈니스 로직적으로 중요해서 일급 컬렉션으로 다루는 경우 신경 써서 리스트 안의 데이터를 관리해야 한다. 일급 컬렉션 안에 데이터를 조회해야할 일이 생기는 경우 원본 데이터를 아래와 같이 바로 리턴하면 데이터를 보호할 수가 없다. public class MemberRepository { private final List members = new ArrayList(); public List getMembers() { return members; } } getMembers()를 호출한 클라이언트 쪽에서 리스트에 데이터를 변경하면 잘못된 정보가 전달돼버리고 만다. 그래서 원본이 아닌 복사 데이터를 넘겨줄 필..
자동차 경주 미션 하나의 객체가 많은 책임을 맡지 않도록 하자 public class InputView { // ... private static final Scanner scanner = new Scanner(System.in); public static List getCarNames() { System.out.println(CAR_NAMES_MESSAGE); return Converter.toCarList(scanner.next()); } // ... } 사용자에게 입력을 받는 InputView 클래스이다. 자동차의 이름을 입력받아 Converter 클래스를 통해 Car 객체의 리스트를 반환하는 메서드를 가지고 있다. 그리고 Converter 클래스 안에는 자동차 이름에 대한 검증 로직이 Valida..
중첩 클래스 중첩 클래스(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. 이름을 가질 수 있다. 단순히 매개변수나 생성자 자체만으로 반환된다면 객체의 특성을 제대로 설명..

자바를 컴퓨터가 알아듣기까지 컴파일 인간이 이해하기 쉬운 언어를 기계어로 번역하는 과정 자바 코드를 바이트 코드(=바이너리 코드) 변환해서 컴퓨터가 이해할 수 있도록 변환 System.out.println(“HelloWorld”) -> 01010100110100-> 컴퓨터가 이해 컴파일러 컴파일 하는 프로그램 바이트 코드 0과 1로 이루어진 코드, 컴퓨터가 이해할 수 있다. 0과 1의 조합은 OS마다 다르다. (윈도우, 맥, 리눅스) 운영체제마다 “Hello World”가 실행 안될 수도 있다. 그래서 C언어 같은 경우 각각 다른 컴파일러가 필요하다. JVM 자바 컴파일러가 하나 있고 각 OS로 바로 가는 것이 아니라 JVM을 거쳐서 간다. (각 OS와 호환시켜 주는 아이) 자바 가상 머신의 약자 (Ja..