아이템 53. 가변인수는 신중히 사용하라 가변인수란? 명시한 타입의 인수를 0개 이상 받을 수 있도록 하는 것이다. static int sum(int... numbers) { int sum = 0; for (int number : numers) { sum += number; } return sum; } sum(1, 2); sum(1); sum(); 가변인수 메소드를 호출하면 먼저 인수의 갯수와 같은 배열을 만들고 인수들을 배열에 저장해 가변인수 메서드에 전달한다. 최소한 인수가 한개라도 필요하게 하려면 아래와 같이 validation 로직을 작성해주면 된다. static int sum(int... numbers) { if (numbers.lenght == 0) { throw new IllegalArgum..
분류 전체보기
아이템45. 스트림을 주의해서 사용하라 스트림(stream)이란? 데이터 처리 작업(순차 또는 병렬)을 지원하고자 Java8부터 추가되었다. 핵심은 두가지 이다. 데이터 원소의 유한 혹은 무한 시퀀스를 뜻하는 스트림 원소들로 수행하는 연산 단계를 표현하는 스트림 파이프 라임 스트림의 원소는 컬렉션, 배열, 파일, 정규표현식 패턴 매처, 난수 생성기 등 어디로부터든 원소들이 올 수 있다. 기본 타입으로는 int, long, double을 지원하며, 객체 참조도 원소가 될 수 있다. 스트림은 한번만 소비할 수 있다. 즉, 스트림의 연산 후 또 다른 연산을 하려고 하면 에러를 발생시킨다. IntStream stream = IntStream.of(1, 2); stream.forEach(x -> System.ou..
아이템35. ordinal 메서드 대신 인스턴스 필드를 사용하라 서론 대부분의 열거 타입 상수는 자연스럽게 인덱스(하나의 정수값)을 갖게 된다. 따라서 Java enum은 ordinal 이라는 메서드를 제공해 인덱스를 반환해준다. 그러나 ordinal은 사용하면 안된다. 그 이유를 살펴보도록 하겠습니다. 잘못 사용한 예 pbulic enum Number { ONE, TWO, THREE, FOUR pbulic int convertInt() { return ordinal() + 1; } } 지금과 같이 Number라는 enum이 있고, enum의 Int형을 ordinal로 정의한다고 생각해봅시다. 이떄, 갑자기 Zero(0)이 필요하다고 생각해봅시다. 그렇다면 아래와 같은 코드가 될것 입니다. pbulic ..
아이템31. 한정적 와일드카드를 사용해 API 유연성을 높이라. 공변(covariant), 불공변(invariant) 공변과 불공변은 변함에 차이가 있다. 즉, 공변은 함께 변하는 것이고 불공변은 함께 변하지 못한다는 의미이다. class List {...} 이떄 List가 공변이면 List은 List의 하위 타입 불공변은 위의 하위 타입이 성립하지 않음 그러나 이제 배울 매개변수화 타입(제네릭)은 List이 List의 역할을 제대로 수행하지 못하기 때문에 리소코프 치환 원칙에 어긋나 불공변이라고 한다. 즉 아래와 같이 사용하지 못한다는 것이다. ArrayList strings = new ArrayList(); ArrayList objects = new ArrayList(); 그럼 공변은 뭐가 잇을까? ..
아이템30. 이왕이면 제네릭 메서드로 만들어라 서론 클래스뿐만 아니라 메서드도 제네릭화를 할 수 있습니다. 대표적인 예로 매개변수를 받는 정적 유틸리티 메서드(Collections의 알고리즘 메서드 binarySearch, sort ...)이 보통 제네릭 메서드입니다. public static
아이템23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라. 태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있으며, 그중 현재 표현하는 의미를 태그 값으로 알려주는 클래스를 태그 달린 클래스라고 한다. public class Figure { enum Shape {RECTANGLE, CIRCLE} // 태그 private final Shape shape; // 사각형일때만 사용 private final double length; private final double width; // 원형일때만 사용 private final double radius; public Figure(Shape shape, double radius) { this.shape = shape; this.length = 0; th..
아이템14. Comparable을 구현할지 고려하라 package java.lang; import java.util.*; public interface Comparable { public int compareTo(T o); } 단순 동치성 비교 + 순서까지 비교 + 제네릭 이 3가지의 특징을 가지고 있는 메서드가 바로 compareTo이다. 따라서 Comparable을 구현한 객체의 배열은 손쉽게 정렬이 가능하다. 아울러 자바 플랫폼 라이브러리의 모든 값 클래스, 열거 타입은 모두 Compareable을 구현하고 있다. 규약 객체가 매개변수로 들어온 객체보다 작으면 음의 정수(-1), 같으면(0), 크다면 양의 정수(+1)을 반환한다. 객체와 매개변수로 들어온 객체의 타입이 다르다면 ClassCastEx..
아이템10. equals는 일반 규약을 지켜 재정의하라 equals 메서드 재정의는 곳곳에 함정이 도사리고 있어 끔찍한 결과를 초래한다. 따라서 아예 재정의를 하지 않는 것이 더 좋을 때도 있다. 사전 지식 동치 수학과 논리학에서 동치(同値)란 두 문장이 논리적으로 같다는 것을 의미한다. 이것은 한 문장이 참이면 다른 한 문장도 참이고, 한 문장이 거짓이면 다른 문장도 거짓이 된다는 것을 뜻한다. - 위키백과 동치 관계 집합을 서로 같은 원소들로 이루어진 부분집합으로 나누는 연산 equals 재정의 하지 않는 경우 각 인스턴스가 본질적으로 고유할 경우 값을 표현하는 것이 아니라 동작하는 개체를 표현하는 클래스일 경우를 말한다. 예를들어 Thread, 인스턴스의 '논리적 동치성'을 검사할 일..
아이템 7. 다 쓴 객체 참조를 해제하라. JVM은 GC가 메모리를 관리해줍니다. GC가 있다고 해서 메모리 관리를 개발자가 신경을 쓰지 않아도 된다고 오해할 수 있지만, 절대 사실이 아닙니다. 아래와 같이 스택 코드가 있다고 생각해봅시다. public class Stack { private static final int DEFAULT_INITAL_CAPACITY = 16; private Obejct[] elements; private int size = 0; public Stack() { elements = new Object[DEFAULT_INITAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++]; } publ..
[RubyOnRails Guides] Active Record Query Interface - 2편 💼 서론 RubyOnRails Guides Active Record Basics 를 참고해 작성한 글입니다. Ruby version은 2.6.3을 사용합니다. Ruby On Rails version은 5.2.1을 사용합니다. 1편에서는 단건 및 복수 조회, 조건, 정렬, 그룹 등을 정리했습니다 (참고링크) Locking Records for Update DB 트랜잭션이 2개 이상 진행될 경우 프로세스 내에서 작업하는 쓰레드 자원이 꼬여 race codnition(경쟁 상태) 문제가 발생해 우리가 기대한 처리결과가 나오지 않을 경우가 있다. 따라서 우리는 이런 경우 Thread Safe 하게 해줘야 하는데,..