전체 글

자바가 열거 타입을 지원하기 전 로또의 등수를 표현한다고 가정해보자. 열거 타입을 쓸 수 없다면 다음과 같이 표현할 수 있을 것이다. public static final int LOTTO_RANK_FIRST = 1; public static final int LOTTO_RANK_SECOND = 2; public static final int LOTTO_RANK_THRID = 3; public static final int LOTTO_RANK_FOURTH = 4; public static final int LOTTO_RANK_FIFTH = 5; public static final int LOTTO_RANK_NOTHING = 0; 1등은 정수 1로, 5등은 5로, 꽝은 0으로 정수를 열거하여 작성했다. 이렇..
로또 미션 로또 번호를 캐싱하여 불필요한 인스턴스 생성 방지 private static final Map lottoNumbers = new HashMap();; static { for (int number = MINIMUM_LOTTO_NUMBER; number LottoNumber.getInstance(source)) .isInstanceOf(IllegalArgumentException.class); } 테스트를 작성할 때 경곗값을 잘 정의하는 것이 중요하다. 로또 번호의 비즈니스 로직이 1부터 45 사이의 정수여야 하기 때문에 예외로 0과 46을 넣어서 테스트했더니 경곗값을 잘 활용했다며 리뷰어님이 칭찬해 주셨다. 객체 역할과 책임 설계 객체에게 역할과 책임을 알맞게 배분하는 일은 항상 어렵고 고민이 ..
· JAVA
우아한테크코스 로또 미션을 진행하던 중 두 리스트를 비교하여 테스트할 일이 있었다. @Test @DisplayName("수동 로또 번호 생성 검증") void createLottoTicketsByManual() { List lottoNumbers = List.of(List.of(1, 2, 3, 4, 5, 6), List.of(7, 8, 9, 10, 11, 12)); List lottoTickets = lottoMachine.purchaseLottoTicketsByManual(lottoNumbers); Iterator iterator = lottoNumbers.iterator(); for (LottoTicket lottoTicket : lottoTickets) { List ticketNumbers = lo..
스트림을 사용하면 내부 반복으로 네이티브 자바 라이브러리가 스트림 요소의 처리를 제어할 수 있다. 따라서 개발자는 컬렉션 데이터 처리 속도를 높이려고 따로 고민할 필요가 없다. 컴퓨터의 멀티코어를 활용해서 파이프라인 연산을 실행할 수 있다는 점이 중요한 특징이다. 7.1 병렬 스트림 컬렉션에 parallelStream을 호출하면 병렬 스트림이 생성된다. 병렬 스트림이란 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림이다. 따라서 모든 멀티코어 프로세서가 각각의 청크 처리를 할당할 수 있다. 병렬 실행이 무조건 빠른 것은 아니다. static long sum(int n) { long sum = 0; for (int i = 0; i < n; i++) { sum += 1; } re..
불변 클래스 클래스의 인스턴스 내부 값을 수정할 수 없는 클래스를 불변 클래스라고 한다. 인스턴스의 정보는 객체가 파괴되는 순간까지 절대 달라지지 않는다. 불변 객체의 특징 불변 객체는 단순하다. 인스턴스 내부가 달라지는 가변 객체와 달리 분변 객체는 생성된 뒤부터 값이 달라지지 않았음을 보장하여 믿고 쓸 수 있다. 불변 객체는 스레드 세이프하고 동기화할 필요가 없다. 여러 스레드가 동시에 사용해도 훼손되지 않는다. 불변 객체는 안심하고 공유할 수 있다. 스레드 세이프한 것과 이어지는 내용인데 값이 달라지지 않기 때문에 재활용할 수 있으면 재활용하면 좋다. 자주 쓰이는 인스턴스는 캐싱하여 같은 인스턴스를 중복 생성하지 않게 해 줄 수도 있다. 객체를 만들 때 다른 불변 객체들을 구성 요소로 사용하면 이점..
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로 생성하게 되면 새로운 인스턴스로 생성하기 ..
· JAVA
프로그래밍을 하다 보면 컬렉션, 그중에서도 List를 참 많이 다루게 된다. 특히 리스트 안의 데이터가 비즈니스 로직적으로 중요해서 일급 컬렉션으로 다루는 경우 신경 써서 리스트 안의 데이터를 관리해야 한다. 일급 컬렉션 안에 데이터를 조회해야할 일이 생기는 경우 원본 데이터를 아래와 같이 바로 리턴하면 데이터를 보호할 수가 없다. public class MemberRepository { private final List members = new ArrayList(); public List getMembers() { return members; } } getMembers()를 호출한 클라이언트 쪽에서 리스트에 데이터를 변경하면 잘못된 정보가 전달돼버리고 만다. 그래서 원본이 아닌 복사 데이터를 넘겨줄 필..
더즈
DOES-LOG