Java 109

[이펙티브 자바(Effective Java)][모든 객체의 공통 메서드] - 12. toString을 항상 재정의하자

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다. [toString] toString의 역할 그 객체를 설명해주는 문자열을 리턴한다. Object의 기본 toString은 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우가 거의 없다. '클래스_이름@16진수로_표시한_해시코드'를 반환할 뿐이다. toString 규약에 따라 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 한다. '모든 하위 클래스에서 이 메서드를 재정의해라'라는 toString 규약은 새겨들어야 할 조언이다. [내가 쓰지 않아도 어디선가 사용될 toString] 내가 사용하지 않더라도 toString은 어디서든 사용될 수 있기 때문에 재정의 해주어야 한다. 컴포넌트 오류 메시지의 로..

[이펙티브 자바(Effective Java)][모든 객체의 공통 메서드] - 11. equals를 재정의하려거든 hashCode도 재정의하라

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다. [equals를 재정의하면 hashCode도 재정의 해야 한다.] equals 비교에 사용되는 정보가 변경되지 않았다면, hashCode 도 변하면 안 된다. (애플리케이션을 다시 실행한다면 이 값이 달라져도 상관 없음) equals가 두 객체가 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환한다. → 논리적으로 같은 객체는 같은 해시코드를 반환해야 한다. equals가 두 객체를 다르다고 판단했더라도, hashCode는 꼭 다를 필요는 없다. 하지만, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다. 이를 지키지 않을 때 2번 규약에서 큰 문제가 일어나게 된다. 그렇기에 꼭 e..

[이펙티브 자바(Effective Java)][모든 객체의 공통 메서드] - 10. equals는 일반 규약을 지켜 재정의하라

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다. [equals를 재정의하지 않아야 하는 상황] 값을 표현하는 것이 아닌 동작하는 개체를 표현하는 클래스의 경우 각 인스턴스는 본질적으로 고유하다. Thread가 좋은 예시로 Object의 equals 메서드는 이러한 클래스에 딱 맞게 구현되어 있다. 논리적 동치성(logical equals)을 검사할 일이 없다. 논리적 동치성이란? 객체가 같은지를 확인하는 것이 아니라 객체가 가지고 있는 각 값이 같은지를 확인하는 것을 의미한다. 상위 클래스에서 재정의(Overriding)한 equals가 하위 클래스에 딱 들어 맞는 경우를 의미한다. 클래스가 private이거나 package-private이고 equals 메서드를 ..

[이펙티브 자바(Effective Java)] - 3장 모든 객체의 공통 메서드

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다. [Object] 이미 구현된 클래스지만 상속해서 사용하도록 설계되어 있다. Object에서 final이 아닌 메서드는 모두 재정의(Overriding)를 염두해 두고 설계된 것이다. 재정의 시 지켜야 하는 일반 규약이 명확히 정의되어 있다. [모든 객체의 공통 메서드] equals hashcode toString clone comparable

[이펙티브 자바(Effective Java)][객체 생성과 파괴] - 9. try-finally보다는 try-with-resources를 사용하라

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다. [자원이 닫히는 것을 보장하는 수단 - try-finally] close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 그러나 이는 놓치기 쉬운 문제고 결과적으로 예측할 수 없는 성능 문제로 이어지기도 한다. 이런 자원 중 상당수가 안전망으로 finalizer를 사용하곤 있지만 이는 믿음직스럽지 못하다.(이전 포스팅을 참고해주세요) 자원이 닫히는 것을 보장하는 다른 방법으로 try-finally를 사용했는데 이는 예외 발생, 메서드에서 반환되는 경우를 포함해서 보장했다. [이제는 자원 회수의 최선의 방책이 아닌 try-finally] static String firstLineOfFile(String path) th..

[이펙티브 자바(Effective Java)][객체 생성과 파괴] - 8. finalizer와 cleaner 사용을 피하라

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다. [객체 소멸자 - finalizer / cleaner ] [finalizer] 예측할 수 없고 상황에 따라 위험할 수 있어 일반적으로 불필요하다. 오동작, 낮은 성능, 이식성 문제의 원인이 된다. deprecated API로 지정되어 있기에 사용하지 않을 것을 권장한다. [cleaner] finalizer의 대안책으로 나왔지만 이 역시도 문제가 많다. finalizer보다는 덜 위험하지만, 여전히 예측 불가하고, 느리고, 일반적으로 불필요하다. [C++의 파괴자] C++의 파괴자는 비메모리를 회수하는 용도로 쓰인다. 특정 객체와 관련된 자원을 회수하는 보편적인 방법이 C++의 파괴자이다. 자바는 객체 회수의 역할은 가..

[이펙티브 자바(Effective Java)][객체 생성과 파괴] - 7. 다 쓴 객체 참조를 해제하라

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다. [자바의 가비지 컬렉터?] [가비지 컬렉터(가비지 컬렉션)] 쓰레기 수집(garbage collection 가비지 컬렉션, GC)은 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다. 영어를 그대로 읽어 가비지 컬렉션이라 부르기도 한다. 📌출처: https://ko.wikipedia.org/wiki/%EC%93%B0%EB%A0%88%EA%B8%B0_%EC%88%98%EC%A7%91_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99) c언어 c++언어의 경우엔 메모리를 직접 관리해야 하기 때문에 자바처럼 가비지 컬렉터..

[이펙티브 자바(Effective Java)][객체 생성과 파괴] - 6.불필요한 객체 생성을 피하라

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다. [객체 생성?] String s = new String("yaloo"); //사용할 때마다 새로운 객체를 생성하는 코드 절대 비추 String s = "yaloo"; //하나의 인스턴스를 사용하는 방법 [매번 새로운 객체를 생성하는 코드와 하나의 인스턴스를 사용하는 코드] [불변 클래스에서는 정적 팩터리 메서드를 사용해 불필요한 객체 생성을 막는다.] 불변 클래스에서는 정적 팩터리 메서드를 사용해서 불필요한 객체 생성을 피하고 생성자 대신 팩터리 메소드를 사용하는 것이 좋다. 생성자는 호출할 때마다 새로운 객체를 만든다. 그러나 팩터리 메서드는 그렇지 않다. 불변 객체만이 아니라 가변 객체라 해도 사용 중에 변경되지 ..

[이펙티브 자바(Effective Java)][객체 생성과 파괴] - 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다. [하나 이상의 자원에 의존한 클래스 - 잘못된 예시들] 많은 클래스가 하나 이상의 자원에 의존한다. 아래는 자원에 의존한 클래스들의 잘못된 예시들이다. [정적 유틸리티를 잘못 사용한 예 - 유연하지 않고 테스트하기가 어렵다.] public class SpellChecker{ private static final Lexicon dictionary = ...; //객체 생성 방지 -> 정적 유틸리티는 객체 생성을 원하지 않기에 이를 private 생성자로 방지해주어야 한다. private SpellChecker(){} public static boolean isValid(String word){ ... } public s..

[이펙티브 자바(Effective Java)][객체 생성과 파괴] - 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다. [인스턴스화란?] 객체를 만드는 것을 의미하고 이는 컴퓨터 내에서 실행시킬 수 있는 실행 파일을 만드는 것을 의미한다. 📌출처: https://mblogthumb-phinf.pstatic.net/MjAxODA3MThfMTE3/MDAxNTMxODQ4NzMyNjc1.nEfjbuFvtqAn9vSh0d7wNMyO-jdhH0GBUQfPhSC-coIg.QHy5B362cpbfAvXvYpInExa4PuUGBqVzINOZBoDJ4M4g.PNG.bibis0520/1.png?type=w800 [정적 메서드와 정적 필드만 담은 클래스] [정적 메서드와 정적 필드만 담은 클래스를 쓰는 곳] 객체 지향적으로 사고하지 않는 이들이 종종 남용하는..