본문 바로가기

분류 전체보기148

이펙티브 자바 아이템 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.
이펙티브 자바 아이템 4 - 인스턴스화를 막으려거든 private 생성자를 사용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 아이템 4 - 인스턴스화를 막으려거든 private 생성자를 사용하라 - 핵심 정리 인스턴스를 만들지 않는 걸 권장하는 경우가 있다. 특히 유틸리티성 클래스가 이에 해당한다. static 메서드만 가지고 있는 클래스들을 유틸리티성이라고 한다. 대표적으로는 StringUtils 클래스가 있다. public class UtilityClass { public static String hello() { return "hello"; } } static 메서드만 가지고 있는 클래스가 있다. public static void main(String[] args) { String hello = UtilityClass.hel.. 2022. 9. 20.
이펙티브 자바 아이템 3 - 생성자나 열거 타입으로 싱글턴임을 보증하라 - 완벽 공략 이펙티브 자바 아이템 3 - 생성자나 열거 타입으로 싱글턴임을 보증하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 메서드 참조 메소드 하나만 호출하는 람다 표현식을 줄여쓰는 방법이다. 스태틱 메소드 레퍼런스 public class Person { LocalDate birthday; public Person() { } public Person(LocalDate birthday) { this.birthday = birthday; } public int getAge() { return LocalDate.now().getYear() - birthday.getYear(); } public static int compareByAge(Person .. 2022. 9. 20.
이펙티브 자바 아이템 3 - 생성자나 열거 타입으로 싱글턴임을 보증하라 - 핵심 정리 아이템 3 - 생성자나 열거 타입으로 싱글턴임을 보증하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 애플리케이션을 만들다보면 어떤 인스턴스가 애플리케이션에서 하나만 있어야 하는 경우 혹은 하나만 꼭 유지해야하는 경우가 있다. 예를들어 어떤 설정값을 저장하는 인스턴스 등이 있다. 이러한 상황일 때 사용하는 것이 싱글턴이다. 싱글턴을 만드는 방법은 여러가지가 있다. 첫번째 : private 생성자 + public static final 필드 public class Elvis { /** * 싱글톤 오브젝트 */ public static final Elvis INSTANCE = new Elvis(); private Elvis() {} publ.. 2022. 9. 15.
이펙티브 자바 아이템 2 - 생성자에 매개변수가 많다면 빌더를 고려하라 - 완벽 공략 아이템 2 - 생성자에 매개변수가 많다면 빌더를 고려하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 자바 빈 (주로 GUI에서) 재사용 가능한 소프트웨어 컴포넌트이다. GUI에서 이루어지는 프로퍼티 값을 읽어오거나 값을 저장하거나 하는 등 모든 것들을 정의한게 자바 빈 스펙이다. 자바 빈이 지켜야할 규약에는 다음과 같다. 아규먼트 없는 기본 생성자 아규먼트 없는 기본 생성자를 사용하는 이유는 자바 빈을 사용하는 곳에서 객체를 만들기 쉽게 하기 위해서이다. 자바 빈은 리플렉션을 통해서 객체를 만들고 값을 주입하기 때문에 생성자에 아규먼트가 있으면 리플렉션으로 객체를 만들기가 까다로워진다. getter와 setter 메소드 이름 규약 자바.. 2022. 9. 7.