JAVA 썸네일형 리스트형 item 61) 박싱된 기본 타입보다 기본 타입을 사용하라 자바 데이터 타입 : 1) 기본 타입 int, double, boolean ...) 2) 참조타입(String, List , 사용자 정의 클래스 ...) - 각각의 기본 타입마다 대응하는 참조 타입을 가지고 있으며 이를 박싱된 기본 타입이라고 한다. int -> Integer, double -> Double, boolean -> Boolean - 오토 박싱, 오토 언박싱으로 두 타입을 구분하지 않고 사용할수 있다. ex) Integer a = 42; (42가 오토박싱된다. 기본 타입 vs 박싱 타입 - 기본타입은 값만 가지고 있으나, 박싱된 기본타입은 식별성을 가지고 있다. 값이 같더라도 다르다고 판별할수 있다. (Object의 하위 클래스다.) - 박싱된 기본타입은 null 값을 가질수 있다. - 기본.. 더보기 item 57) 지역변수의 범위를 최소화하라 지역변수의 유효범위를 최소로 줄이면 코드 가독성과 유지보수성 증가 , 오류 가능성 낮아짐(오류의 전파 범위가 작아짐) 모든 지역변수는 선언과 동시에 초기화 하라 가장 처음쓰일때 선언하기 생각없이 지역변수를 선언하다보면 변수가 실제 쓰이는 범위보다 앞서거나 다 쓴뒤에도 여전히 살아있기 쉬움 지역변수의 벙뮈는 선언지점부터 그 블록이 끝날떄까지 거의 모든 변수는 선언과 동시에 초기화해야한다.(초기화에 필요한 정보가 충분하지 않다면 선언을 미뤄야함, try-catch 는 예외) Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; //... try { // DB에 연결함 conn = DriverManager.getConnectio.. 더보기 interrupt vs notify 공통점 : 둘다 wait 셋에 있는 쓰레드를 깨우는 역할을 한다. 차이점 notify : Object 클래스의 함수 interrupt : Thread 클래스의 함수 notify : wait 셋에 있는 쓰레드 중 하나를 랜덤하게 깨움 (waiting 상태의 쓰레드가 Runnable 상태로 바뀐다.) interrupt : 특정 쓰레드를 wait 셋에서 깨운다. 이 때, InterruptedException이 발생한다. (참고로, 오라클 문서에서는 interrupt를 쓰레드 취소 용도로만 사용할 것을 권장한다.) + 추가 notifyAll : wait 셋에 있는 쓰레드 모두를 깨운다. stackoverflow.com/questions/30471285/what-is-the-difference-between-wa.. 더보기 item 54) null이 아닌 빈 컬렉션이나 배열을 반환하라 비어있다고해서 특별히 취급할 이유는 없음. => 클라이언트는 이 null 상황을 처리하는 방어 코드를 추가로 작성해야 한다. ( 코드복잡도 + 널 익셉션 발생 가능성) => 객체가 0개일 가능성이 거의 없는 경우 몇 년후에 발견할수도있음 빈 컨테이너를 할당하는 비용이 있으니 Null보다 낫다? => 성능 저하의 주범이라고 확인되지 않는한 이정도 성능 차이는 신경 쓸 수준이 아님(빠른 프로그램보다 견고한 프로그램을 작성하라) => 빈 컬렉션, 배열은 굳이 새로 할당하지 않고도 반환할수 있음(빈 불변 객체 반환) => Collections.emptyList , Collections.emptySet, Collections.emptyMap 사용 public List getCheeses(){ return new .. 더보기 item 53) 가변인수는 신중히 사용하라 가변인수는 메서드의 인수 개수가 정해지지 않았을 때 아주 유용하게 사용 할수 있음 가변인수 메서드를 호출하면 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네줌 단점 : 인수가 1개이상이여야할 경우 인수가 0개만 받을 수 있게 설계하는 것은 좋지 않음 - 런타임 에러 발생 가능, 이를 체크하기 위한 로직으로 코드가 지저분해짐 - for- each 문 사용하기 힘들어짐 - 성능에 민감한 경우 문제 발생(호출마다 배열 생성) 해결책 : 매개변수를 2개 받도록 함 첫번째로 평범한 매개변수를 받고, 가변인수를 두번쨰로 받음 public class Varargs { static int min(int... args) { if (args.length == 0) t.. 더보기 item 50) 적시에 방어적 복사본을 만들라 클라이언트가 악의적으로 불변식을 깨드리려 한다고 가정하고 방어적으로 프로그래밍 하라 - 악의를 가진 프로그래머 - 평범한 프로그래머의 실수로 인한 오작동 - 어떤 객체든 그 객체의 허락 없이 외부에서 내부를 수정하지 못하도록 하라. 기간을 나타내는 Period 객체를 만들어봤다. import java.util.Date; public final class Period { private final Date start; //Period의 멤버변수인 Date가 불변 객체가 아니므로 Period가 불변이 아니게 된다. private final Date end; public Period(Date start, Date end) { if (start.compareTo(end) > 0) throw new IllegalA.. 더보기 item 46) 스트림에서는 부작용 없는 함수를 사용하라 스트림 : 함수형 스타일 오퍼레이션을 지원하는 클래스 스트림의 특징 No storage : 저장을 위한 자료구조가 아니라 소스(자료구조, 배열, I/O 채널 등)로부터 자료를 받아서 계산을 위한 파이프라인 함수형 : 스트림의 연산(operation) 은 결과를 생산만 하지, 소스를 수정하지 않음 ex) 스트림을 필터링한다고 해서 기존 리스트의 원소를 제거 하지는 않음 Laziness-Seeking : 대부분의 스트림 연산(filter, map, 중복 제거 등) 은 lazy 하게 작동한다. (스트림 연산이 최종 연산이 호출되는 시점까지 지연됨) List strings = List.of(1,2,3,4,5); strings.stream() .map(x->{ System.out.println(x); return.. 더보기 item 42) 익명 클래스보다는 람다를 사용하라 public class LamdaIsBetter { public static void main(String[] args) { List words = new ArrayList(); Collections.sort(words, new Comparator() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); // 익명 클래스 Collections.sort(words, (s1,s2)-> -s1.compareTo(s2)); //람다 Collections.sort(words, comparingInt(String::length)); //메소드 참조 words.sort(comparingInt(String::length.. 더보기 이전 1 2 3 4 5 6 다음