본문 바로가기

개발 공부/Java58

이펙티브 자바 아이템 13 - clone 재정의는 주의해서 진행하라 - 핵심 정리 아이템 13 - clone 재정의는 주의해서 진행하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. clone 규약 clone 메서드는 Object 에 정의되어있는 메서드이다. public interface Cloneable { } 아무것도 정의되어 있지 않은 Cloneable 인터페이스가 존재한다. clone 메서드를 구현하려면 Cloneable 인터페이스를 implements 해야한다. Cloneable 인터페이스를 implements 하지 않으면 clone 메서드 는 동작하지 않는다. 오브젝트에 정의되어있는 clone 메서드 기능을 제공하기 위해서는 Cloneable 인터페이스를 implements 한다. clone 메서드 를 오버라.. 2022. 10. 27.
이펙티브 자바 아이템 12 - toString 을 항상 재정의하라 - 핵심 정리 아이템 12 - toString 을 항상 재정의하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 오브젝트에서 기본적으로 제공하는 toString 은 클래스이름@16진수로 표시한 해시 코드 의 형태이다. 이런 기본적인 형식은 딱히 유용하지가 않다. 인스턴스에 문자열을 연산하면 인스턴스에 있는 toString 이 자동으로 호출된다. toString 은 우리가 원하는 형태로 표현을 해주면 좋다. 특히 값 클래스의 경우에는 어떤 형태로 toString 의 형식이 되는 문서화 를 하면 좋다. public final class PhoneNumber { private final short areaCode, prefix, lineNum; public .. 2022. 10. 26.
이펙티브 자바 아이템 11 - equals 를 재정의하려거든 hashCode 도 재정의하라 - 완벽 공략 아이템 11 - equals 를 재정의하려거든 hashCode 도 재정의하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 해시맵 내부의 연결 리스트 자바8 이전 까지는 해시 충돌 발생시 링크드 리스트 를 사용했다. 이때 링크드 리스트 는 해시맵 내부 에 구현되어 있는 링크드 리스트를 사용했다. 링크드 리스트에서 데이터를 추가 할때 성능은 O(1) 이다. 링크드 리스트에서 데이터를 조회 할때 성능은 O(n) 이다. 해시 충돌 이 자주 발생할수록 해당 버킷 에 들어있는 링크드 리스트 에서 값을 꺼낼때 성능이 저하된다. 자바8 버전부터는 성능 최적화를 위해 링크드 리스트 대신에 이진 트리 를 사용하도록 바뀌었다. 이진 트리 에서 값을 꺼낼 때.. 2022. 10. 26.
이펙티브 자바 아이템 11 - equals 를 재정의하려거든 hashCode 도 재정의하라 - 핵심 정리 아이템 11 - equals 를 재정의하려거든 hashCode 도 재정의하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. equals 메서드를 구현할 때는 반드시 hashCode 도 구현해야한다. equals 메서드와 hashCode 는 같이 정의되어 있지 않다면 잘못된 코드이다. hashCode 를 구현할 때는 몇가지 규약 이 존재한다. equals 메서드에서 사용하는 값이 변경되지 않았다면 hashCode 는 몇번이 실행 되더라도 동일한 값 을 리턴해야한다. 두 객체를 equals 메서드로 비교했을 때 같은 객체 로 나온다면 두 객체의 hashCode 값도 같아야 한다. 성능을 고려해 다른 객체라면 다른 hashCode 를 리턴하는 .. 2022. 10. 25.
이펙티브 자바 아이템 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.
이펙티브 자바 아이템 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.