본문 바로가기

분류 전체보기152

이펙티브 자바 아이템 10 - equals 는 일반 규약을 지켜 재정의하라 - 완벽 공략 아이템 10 - equals 는 일반 규약을 지켜 재정의하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. Value 기반 클래스 value object, 혹은 값 클래스라고도 한다. DDD 에서 나오는 value object 나 값처럼 사용이되는 클래스나 객체를 의미한다. 값 클래스란 int 와 String 처럼 값을 표현하는 클래스를 말한다. 값 클래스는 객체의 유일성을 판단하기 위한 식별자가 없다. 그 클래스의 인스턴스가 가지고 있는 필드의 값들이 그 오브젝트를 대변하게 된다. public class Point { private final int x; private final int y; public Point(int x, int y.. 2022. 10. 24.
이펙티브 자바 아이템 10 - equals 는 일반 규약을 지켜 재정의하라 - 핵심 정리 아이템 10 - equals 는 일반 규약을 지켜 재정의하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 모든 클래스는 전부 Object 클래스를 상속 받는다 Object 클래스에 있는 메서드를 오버라이딩 할 수 있다. 이번 아이템에서는 equals 메서드 에 대해서 다룬다. equals 메서드는 직접 구현할 때도 있고 아닐 때도 있지만 보통은 IDE 나 Tool 을 사용해 equals 메서드를 정의하게 된다. equals 메서드 를 만들지 않아도 된다면 만들지 않는게 최선이다. equals 메서드 를 만들지 않아도 되는 상황은 다음과 같다. 각 인스턴스가 본질적으로 고유할 때. 싱글톤 패턴을 구현했다고 가정해보자. 그 Object는 그.. 2022. 10. 19.
이펙티브 자바 아이템 9 - try-finally 보다 try-with-resouces 를 사용하라 - 완벽 공략 아이템 9 - try-finally 보다 try-with-resouces 를 사용하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. finally 블럭에서 try - catch 로 다시 감싸져있다면 어떻게 될까? public class Copy { private static final int BUFFER_SIZE = 8 * 1024; // 코드 9-2 자원이 둘 이상이면 try-finally 방식은 너무 지저분하다! (47쪽) static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); OutputStream ou.. 2022. 10. 14.
이펙티브 자바 아이템 9 - try-finally 보다 try-with-resouces 를사용하라 - 핵심 정리 아이템 9 - try-finally 보다 try-with-resouces 를사용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. try-finally 는 자바7 버전 부터 더이상 최선의 방법이 아니다. try-with-resouces 를 사용해야 한다. public class TopLine { // 코드 9-1 try-finally - 더 이상 자원을 회수하는 최선의 방책이 아니다! (47쪽) static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return.. 2022. 10. 14.
이펙티브 자바 아이템 8 - finalizer 와 cleaner 사용을 피하라 - 완벽 공략 아이템 8 - finalizer 와 cleaner 사용을 피하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 정적이 아닌 중첩 클래스는 자동으로 바깥 객체의 참조를 갖는다. static 이 아닌 중첩 클래스는 자동으로 바깥 객체의 참조를 갖는다. public class OuterClass { class InnerClass { } public static void main(String[] args) { OuterClass outerClass = new OuterClass(); InnerClass innerClass = outerClass.new InnerClass(); System.out.println(innerClass); outerCl.. 2022. 10. 14.
이펙티브 자바 아이템 8 - finalizer와 cleaner 사용을 피하라 - 핵심 정리 아이템 8 - finalizer와 cleaner 사용을 피하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. finalizer 와 cleaner 사용을 피해야한다. cleaner 는 자바9 버전부터 새로 들어온 기능이다. finalizer 와 cleaner 는 같인 일을 하는 기능, 자원을 반납하는 기능이다. 하지만 finalizer 와 cleaner 는 즉시 수행한다는 보장이 없다. 만약 객체가 가지고있던 일부 리소스를 제대로 정리하지 않고 객체를 소멸시키면 어떻게될까? 운영체제에서는 파일 핸들러와 운영체제마다 오픈할 수 있는 파일 갯수가 제한되어있다. 소켓 갯수 또한 제한이 있다. 소켓이나 파일을 만들때마다 파일 핸들러가 만들어진다. .. 2022. 10. 12.
이펙티브 자바 아이템 7 - 다 쓴 객체 참조를 해제하라 - 완벽 공략 아이템 7 - 다 쓴 객체 참조를 해제하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. NullPointerException 우리가 코딩을 하다보면 NullPointerException 을 만나는 경우가 종종 발생한다. public class MemberShip { public String hello() { return "hello"; } } MemberShip 클래스를 작성한다. public class Channel { private int numOfSubscribers; public Optional defaultMemberShip() { if (this.numOfSubscribers < 2000) { return null; } els.. 2022. 10. 7.
이펙티브 자바 아이템 7 - 다 쓴 객체 참조를 해제하라 - 핵심 정리 아이템 7 - 다 쓴 객체 참조를 해제하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 모든 경우에 다 쓴 객체 참조를 해제하는 것은 아니다. Book spring = new Book(); 위에서 spring 이라는 변수는 Book을 참조하고 있는 것이다. 어떤 객체에 대한 레퍼런스가 남아있다면 해당 객체는 가비지 컬렉션의 대상이 되지 않는다는 걸 의미한다. 만약 Book 을 다 사용했다면 spring = null; 이렇게 null 을 할당함으로써 참조를 해제한다. 참조를 해제하는 건 예외적인 경우이지만 의외로 흔하다. 가비지 컬렉터가 있더라도 메모리 누수가 발생할 수 있기 때문이다. 책에서는 총 3가지의 경우에 대해 설명하고 있다. S.. 2022. 10. 4.
이펙티브 자바 아이템 6 - 불필요한 객체 생성을 피하라 - 완벽 공략 아이템 6 - 불필요한 객체 생성을 피하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. Deprecation 개발을 하다보면 해당 api 가 바뀌어야하는 경우가 생긴다. 클라이언트가 사용할 수도 있고, 클라리언트가 사용을 하고 있는 api 지만 사용 자제를 권장하는 경우가 있다. public class Deprecation { // TODO 애노테이션 프로세서 @Deprecated public Deprecation() { } } 사용을 자제하고 싶은 api 에 @Deprecated 를 붙이면 컴파일러에서 표시가 된다. public class Client { public static void main(String[] args) { Depr.. 2022. 9. 23.
이펙티브 자바 아이템 6 - 불필요한 객체 생성을 피하라 - 핵심 정리 아이템 6 - 불필요한 객체 생성을 피하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 주의할 점은 객체 생성은 비싸니 피하라 는 뜻이 아니다. 불필요하게 동일한 기능을 함에도 여러번 생성하는 경우가 있는 이런 상황을 피하도록 하자. 문자열 public class Strings { public static void main(String[] args) { String hello = "hello"; //TODO 이 방법은 권장하지 않습니다. String hello2 = new String("hello"); String hello3 = "hello"; System.out.println(hello == hello2); // false - 같은 .. 2022. 9. 22.
이펙티브 자바 아이템 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 - 완벽 공략 아이템 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. public class SpellChecker { private final Dictionary dictionary; public SpellChecker(Dictionary dictionary) { this.dictionary = dictionary; } public boolean isValid(String word) { // TODO 여기 SpellChecker 코드 return dictionary.contains(word); } public List suggestions(String typo) { // TODO 여기 Spel.. 2022. 9. 22.
이펙티브 자바 아이템 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 - 핵심 정리 아이템 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 모든 경우에 의존 객체 주입을 사용하는 것이 아니라 사용하는 자원에 따라 동작이 달라지는 클래스의 경우에는 의존 객체 주입을 사용해야한다. public class Dictionary { public boolean contains(String word) { return true; } public List closeWordsTo(String typo) { return Arrays.asList(typo); } } Dictionary 클래스가 있고 public class SpellChecker { private static final.. 2022. 9. 21.