지역변수의 범위를 최소화하자 지역변수의 유효범위를 최소로 줄일 경우 장점 코드 가독성이 좋아진다. 유지보수성이 높아진다. 오류 가능성이 낮아진다. 지역변수의 범위를 줄이는 방법 가장 처음 쓰일 때 선언한다. 선언과 동시에 초기화 한다. 초기화를 하지 않는 상태라면 선언을 최대한 미뤄야 한다. 메서드를 작게 유지하고 한 가지 기능에 집중하게 한다. 전통적인 for문 대신 for-each 문 사용 전통적인 for문 단점 반복자와 인덱스 변수는 코드를 지저분하게 한다. 요소 종류가 늘어날 수록 오류가 생길 가능성이 높아진다. 컬렉션이냐 배열이냐에 따라 코드 형태가 달라진다. 향상된 for문인 for-each 문을 사용하면 코드도 깔끔해지고, 오류가 날 일도 없어진다. for-each문을 사용 못하는 경우 파괴..
매개변수가 유효한지 검사하자 오류는 가능한 빨리 잡아내는 것이 좋다. 초반에 오류를 잡아내지 못한 상태로 코드가 수행되면 오류의 발생 지점을 점점 찾기 어려워지기 때문이다. 매개변수를 검사하는 예시 public BigInteger mod(BigInteger m) { if (m.signum()
Enum: 열거 타입 Enum은 일정 개수의 상수 값을 정의한 다음 그 외의 값을 허용하지 않는 타입이다. 연관된 상수를 묶어 표현한다. Enum이 나오기 전까지는 아래 처럼 정수 상수를 한 묶음 선언해서 사용했다. 정수 열거 패턴: Enum나오기 전 쓰던 방법 public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD..
클래스와 멤버의 접근 권한을 최소화하자 잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 숨겨, 구현과 API를 깔끔히 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통한다. [정보은닉, 캡슐화]라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다. 정보은닉 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 나춘다. 컴포넌트가 모듈화되어 있어 더욱 쉽게 파악할 수 있고 교체하는 부담도 줄어든다. 소프트웨어 재사용성을 높인다. 큰 시스템을 제작하는 난이도를 낮춰준다. 성능 그 자체를 높여주지는 않지만, 성능 최적화에 도움 된다. → 컴포넌트들을 독립시켜 개발, 테스트, 최적화, 분석, 수정, 교체를 개별적으로 할..
equals 재정의 equals를 재정의할 때는 논리적 동치성을 비교할 때이며 Object 명세에 적힌 규약을 따라줘야한다. 반사성 null이 아닌 모든 참조 값 x에 대해, x.equals(x)는 true다. 객체는 자기 자신과 같아야한다. 대칭성 null이 아닌 모든 참조 값 x,y에 대해 x.equals(y)가 true면 y.equals(x)도 true이다. 두 객체는 서로에 대한 동치 여부에 똑같이 답해야 한다. 추이성 null이 아닌 모든 참조 값 x,y,z에 대해, x.equals(y)가 true이고 y.equals(z)도 true면 x.equals(z)도 true다. 삼단논법을 생각하면 이해하기 쉽다. 일관성 null이 아닌 모든 참조 값 x,y에 대해, x.equals(y)를 반복해서 호출..
꼭 회수해야 하는 자원은 try-with-resources를 사용하자 try-finally의 단점 우리는 자원의 닫힘을 보장하는 수단으로 try-finally를 써왔다. static void copy(String src, String dst) throws IOException{ InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dst); try { byte[] buf = new byte[BUFFER_SIZE]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } finally { out.close(); } }finally { in.clo..