본문 바로가기

전체 글

item 61) 박싱된 기본 타입보다 기본 타입을 사용하라 자바 데이터 타입 : 1) 기본 타입 int, double, boolean ...) 2) 참조타입(String, List , 사용자 정의 클래스 ...) - 각각의 기본 타입마다 대응하는 참조 타입을 가지고 있으며 이를 박싱된 기본 타입이라고 한다. int -> Integer, double -> Double, boolean -> Boolean - 오토 박싱, 오토 언박싱으로 두 타입을 구분하지 않고 사용할수 있다. ex) Integer a = 42; (42가 오토박싱된다. 기본 타입 vs 박싱 타입 - 기본타입은 값만 가지고 있으나, 박싱된 기본타입은 식별성을 가지고 있다. 값이 같더라도 다르다고 판별할수 있다. (Object의 하위 클래스다.) - 박싱된 기본타입은 null 값을 가질수 있다. - 기본.. 더보기
item 58) 전통적인 for문보다는 For-each 문을 사용하라 우리의 주관심사는 배열, 컬렉션의 원소이지 반복자(Iterator)나 인덱스 변수가 아님(이를 접근하는 for문은 코드를 지저분하게 한다.) 잘못된 인덱싱을 할 가능성도 있음 컬렉션이나 배열이냐에 따라 코드 형태가 달라진다. 향상된 for문 : for-each (enhanced for statement) Iterator 인터페이스를 구현한 객체에서 사용가능함 (Collections, Array 등) 반복자와 인덱스 코드가 없음(오류 가능성 감소) 하나의 관용어구로 컬렉션, 배열을 모두 처리 가능 컬렉션을 중첩해서 사용할때 저지르는 실수 방지 enum Suit { CLUB, DIAMOND, HEART, SPADE} enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEV.. 더보기
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.. 더보기
by lazy vs lateinit 1. by lazy public actual fun lazy(initializer: () -> T): Lazy = SynchronizedLazyImpl(initializer) public actual fun lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy = when (mode) { LazyThreadSafetyMode.SYNCHRONIZED -> SynchronizedLazyImpl(initializer) LazyThreadSafetyMode.PUBLICATION -> SafePublicationLazyImpl(initializer) LazyThreadSafetyMode.NONE -> UnsafeLazyImpl(initializer) } pu.. 더보기
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.. 더보기