본문 바로가기
반응형

Java76

[이펙티브자바 3판] ITEM10. equals는 일반 규약을 지켜 재정의하라 이번장의 핵심은... 꼭 필요한 경우가 아니면 equals를 재정의하지 말자 많은 경우 Object의 equals가 여러분이 원하는 비교를 정확히 수행해준다 재정의해야 할 때는 그 클래스의 핵심 필드 모두 빠짐 없이, 아래에 설명되어 있는 5가지 규약을 확실히 지키고 있는지 비교하자 equals() vs hashCode() equals() : 두 객체의 내용이 같은지, 논리적 동등성을 비교하는 것이다 hashCode() : 두 객체가 같은 객체인지, 동일성을 비교할 수 있다 equals()는 이럴 땐 재정의하지 말자 1. 각 인스턴스가 본질적으로 고유할 때 즉, 값을 표현하는게 아니라 동작하는 개체를 표현하는 클래스 ex) Thread -> Object의 equals 메서드는 이러한 클래스에 딱 맞게 구.. 2020. 9. 11.
[이펙티브자바 3판] ITEM9. try-finally 보다는 try-with-resources를 사용하라 이번장의 핵심은... 꼭 회수해야 하는 자원을 다룰 때는 try-finally 말고, try-with-resources를 사용하자 코드는 더 짧고 분명해지고, 만들어지는 예외 정보도 훨씬 유용하다 자원회수를 finalizer로? No! 자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다 Ex) InputStream, OutputStream, java.sql.Connection 등 자원 닫기를 놓칠 경우, 예측할 수 없는 성능 문제로 이어지기도 한다 상당 수가 안전망으로 finalizer를 활용하고 있지만 finalizer는 좋지 않다 자세한 내용은 아래에 정리해두었다 https://jackjeong.tistory.com/17 [이펙티브자바 3판] ITEM8. finalizer와.. 2020. 9. 9.
[이펙티브자바 3판] ITEM8. finalizer와 cleaner 사용을 피하라 이번장의 핵심은... 자바의 객체 소멸자(finalizer, cleaner)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자 물론, 이런 경우라도 불확실성과 성능 저하에 주의해야한다 (가능하면 close()로 자원회수를 하는게 좋을거같다..) 자바의 2가지 객체 소멸자 1. finalizer 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 한다 자바 9에서는 이미 deprecated 되었고, cleaner를 그 대안으로 소개한다 2. cleaner finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다 C++의 파괴자(destructor) vs 자바의 객체 소멸자 자바의 객체 .. 2020. 9. 8.
[이펙티브자바 3판] ITEM7. 다 쓴 객체 참조를 해제하라 (메모리 누수) 이번장의 핵심은... 자바가 가비지 컬렉터를 갖춘 언어이지만, 메모리 관리에 신경쓰지 않으면, 메모리 누수가 일어날 수 있다 다른 언어를 쓰다가 자바처럼 가비지 컬렉터를 갖춘 언어로 넘어오면, 자칫 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 오해할 수 있다 아래 자료구조 Stack에서 데이터를 꺼낼 때 쓰는 pop() 메소드를 예로 들어보자 public class Stack { private Object[] elements; public Object pop() { if(size=0) throw new EmptyStackException(); Object result = elements[--size]; return result; } } 별로 문제가 없어보이지만, '메모리 누수' 라는 문제가 있다 결국.. 2020. 9. 7.
[Java] String 객체 생성 2가지 방식의 차이점 (new String vs "") 안녕하세요~ 잭코딩입니다! new String("") vs "" 이번 내용에서는 String 객체를 생성하는 2가지 방식과 그 차이점을 설명하겠습니다 String은 다른 일반 객체와 달리 Heap 영역 안에 String Pool 영역에서도 관리해주는데, 그와 관련된 내용을 정리해볼게요! 평소에 String으로 객체를 생성할 때, String name = "jackcoding" 단순히 이렇게 ""(큰 따옴표)로 생성했다. 그런데 이펙티브자바 ITEM6을 공부하면서, new String("jackcoding") 이렇게 생성하면 성능에 좋지 않다는 내용을 봤다. ""로 생성하면 한번만 객체가 생성되지만, new로 생성하면 객체가 계속 생성된다고 한다 https://jackjeong.tistory.com/12'.. 2020. 9. 6.
[이펙티브자바 3판] ITEM6. 불필요한 객체 생성을 피하라 이번장의 핵심은... 기존 객체를 재사용해야 한다면 새로운 객체를 만들지 말자 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다 특히, 불변 객체는 언제든 재사용할 수 있다 new String() 대신 문자열 리터럴을 사용하자 하지 말아야 할 극단적인 예 String s = new String("jackcoding"); 이 코드는 실행될 때마다 String 인스턴스를 새로 생성한다 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없이 String 인스턴스가 수백만 개 만들어질 수 있음 개선해보자 String s = "jackcoding"; 이제 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가.. 2020. 9. 6.
[이펙티브자바 3판] ITEM5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 이번장의 핵심은... 클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스를 사용하지 않는 것이 좋다! 클래스가 직접 생성해서도 안되고, 필요한 자원을 생성자에 넘겨주자 -> '의존 객체 주입' 이라 하는 이 기법은 유연성, 재사용성, 테스트 용이성을 기막히게 개선해준다 정적 유틸리티 클래스와 싱글턴을 잘못 사용한 예를 보자 이런 코드는 유연하지 않고 테스트하기 어렵다 // 정적 유틸리티를 잘못 사용 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 } // 싱글턴을 잘못 사용 public.. 2020. 9. 6.
반응형