이펙티브 자바 아이템9,10 정리

이창호·2022년 5월 2일
0

이펙티브자바

목록 보기
11/12

try-finally 보다는 try-with-resources를 사용하라

자원이 둘 이상 일 때, try-fnally 방식은 지저분하다.

staitc void copy(String src, String dst) throws IOException {
	InputStream in = new FileInputStream(...);
    try {
    	OutputStream out = new FileOutputStream(...);
        try {
        	...
        } finally {
        	out.close();
        }
    } finally {
    	in.close();
    }
}

자원이 둘 이상 일 경우 finally를 두 번 사용해야한다.

try-with-resources를 함께 쓰자

static void copy(String src, String dst) throws IOException {
	try (InputStream in = new FileInputStream(src);
    	OutputStream out = new FileOutputStream(dst)) {
    	byte[] buffer = new byte[BUFFER_SIZE];
        int n;
        while ((n = in.read(buffer) >= 0) {
        	out.write(buffer, 0, n);
        }
    }
}

equals는 일반 규약을 지켜 재정의하라

equals란?

Object 객체에서 재정의(overriding)를 염두에 두고 설계된 메서드다.

equals를 재정의 하지 않아도 되는 경우

  • 각 인스턴스가 본질적으로 고유하다.
  • 인스턴스의 '논리적 동치성(logical equality)'을 검사 할 일이 없다.
  • 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다.
  • 클래스가 private이거나 package-private이고 equals 메서드를 호출 할 일이 없다.

equals를 사용해야 하는 경우

객체 식별성(object identity, 두 객체가 물리적(메모리주소)으로 같은가)이 아니라 논리적 동치성을 확인해야 하는데, 상위 클래스의 equals가 논리적 동치성을 확인하지 않는 경우

동치관계(equivalance relation)을 구현하려면 필요한 것

  • 반사성

    null이 아닌 모든 참조 값 x에 대해, x.equlas(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)를 반복해서 호출하면 항상 true를 반환하거나 항상 false를 반환한다.

  • null-아님

    null이 아닌 모든 참조 값 x에 대해, x.equals(null)은 false다.

양질의 equals 메서드 구현 방법

  • == 연산자를 사용해 입력이 자기 자신의 참조인지 확인한다.
  • instanceof 연산자로 입력이 올바른 타입인지 확인한다.
  • 입력을 올바른 타입으로 형변환한다.
  • 입력 객체와 자기 자신의 대응되는 '핵심' 필드들이 모두 일치하는지 하나씩 검사한다.
  • override 즉, 재정의다. Object 타입 외의 다른 타입을 매개변수로 받는 다면 재정의한게 아니다.
profile
이타적인 기회주의자

0개의 댓글