전체 글 146

아이템8. finalizer와 cleaner 사용을 피하라

아이템8. finalizer와 cleaner 사용을 피하라 자바는 두 가지 객체 소멸자 제공을 제공한다 : finalizer / cleaner finalizer 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다. 기본적으로 '쓰지 말아야'하며, 자바9에서는 finalizer을 사용자제 API로 지정했다. cleaner finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고 일반적으로 불필요하다. 사용을 피해야 하는 이유 1. finalizer 와 cleaner은 즉시 수행된다는 보장이 없다. 둘다 제때 실행되어야 하는 작업은 절대 할 수 없다. 2. 수행 시점뿐 아니라 수행 여부조차 보장하지 않는다. 상태를 영구적으로 수정하는 작업에서는 절대 finalizer나 clea..

JAVA/Effective Java 2022.05.21

아이템7. 다 쓴 객체 참조를 해제하라.

아이템7. 다 쓴 객체 참조를 해제하라 자바의 가비지 컬렉터를 통해 메모리 관리에 신경쓰지 않아도 된다고 오해할 수 있지만, 절대 아니다. 가비지 컬렉션 언어에서는 메모리 누수를 찾기가 아주 까다롭다. 객체 참조 하나를 살려두면 가비지 컬렉터는 그 객체뿐 아니라 그 객체가 참조하는 모든객체(그리고 또 그 객체들이 참조하는 모든객체..)를 회수해가지 못한다. 해법은 해당 참조를 다 썼을때 null 처리(참조해제)하면 된다. null를 하면 null처리한 참조를 실수로 사용하려하면 NullPointerException을 던져 오류를 알 수 있다. 참조해제하는 가장 좋은 방법은 그 참조를 담은 변수를 유효범위(scope) 밖으로 밀어내는 것이다. 모든 객체를 다 쓰지마자 null처리로 모두 바꾸는 일은 프로그..

JAVA/Effective Java 2022.05.21

아이템6. 불필요한 객체 생성을 피하라.

아이템6. 불필요한 객체 생성을 피하라. 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 재사용은 빠르고 세련되다, 특히 불변객체는 언제든 재사용할 수 있다. // 하지 말아야 할 코드! // 실행될 때마다 String 인스턴스를 새로 만든다. 완전 쓸데없는 행위! String s= new String("biki"); //개선된 버전 // 같은 가상머신 안에서 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. String s= "biki" 생성자 대신 정적 팩터리 메서드(아이템 1)를 제공하는 불변 클래스에서는 정적 팩터리 메서드를 사용해 불필요한 객체 생성을 피할 수 있다. Boolean(String) 생성자 보다는 Boolean.va..

JAVA/Effective Java 2022.05.21

아이템5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라.

아이템5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스 나 싱글턴 방식 이 적합하지 않다. 그 이유는 우연하지 않고 테스트하기가 어렵기 때문. (= 많은 클래스가 하나 이상의 자원에 의존하는 클래스) 대신 클래스가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해야 한다. 인스턴스를 생성할 때 생성자에게 필요한 자원을 넘겨주는 방식을 사용하면 된다 => "의존객체주입" //맞춤법 검사기 클래스 public class SpellChecker{ private final Lexicon dictionary; // 맞춤법 검사기의 경우, 언어별로 따로 있고 특수어휘용 사전 등 별도의 버전이 있기 때문에 // 아래..

JAVA/Effective Java 2022.05.21

[프로그래머스] 약수의 개수와 덧셈

https://programmers.co.kr/learn/courses/30/lessons/77884 코딩테스트 연습 - 약수의 개수와 덧셈 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주 programmers.co.kr 따로 특별하게 제어할 것도없이, 생각하는대로 구현하면 되는 문제이다.

Algorithm Study 2022.05.21

아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라

아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. 컴파일러가 기본 생성자를 만드는 경우는 오직 명시된 생성자가 없을 뿐이니 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. //인스턴스를 만들 수 없는 유틸리티 클래스 public class UtilityClass{ //기본 생성자가 만들어지는 것을 막는다 (인스턴스화 방지용) private UtilityClass(){ throw new AssertionError(); } } 명시적 생성자가 private..

JAVA/Effective Java 2022.05.20

아이템3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

아이템3. private생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴(Singleton) : 인스턴스를 오직 하나만 생성할 수 있는 클래스 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 싱글턴을 만드는 방식은 세가지가 있다. 1. public static final 필드 방식의 싱글턴 public class Elvis{ public static final Elvis INSTACNE = new Elvis(); private Elvis(){...} public void leaveTheBuilding(){...} } private 생성자는 pulic static final 필드인 Elvis.INSTANCE를 초기화할 때 딱 한번만 호출된다. public 이나 prot..

JAVA/Effective Java 2022.05.20

아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라

아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리와 생성자에 선택적 매개변수가 많을 때 1. 점층적 생성자 패턴 (telescoping constructor pattern) // 점층적 생성자 패턴 - 확장하기 어려움 public class NutritionFacts{ private final int servingSize; // (ml, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1회 제공량당) 선택 private final int fat; // (g/1회 제공량) 선택 private fianl int sodium; // (mg/1회 제공량) 선택 private fina..

JAVA/Effective Java 2022.05.20

아이템1. 생성자 대신 정적팩터리 메서드를 고려하라.

아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라. 클래스는 클라이언트에 public 생성자 대신 (혹은 생성자와 함께) 정적 팩터리 메서드를 제공할 수 있다. 정적 팩터리 메서드 (static factory method) : 클래스의 인스턴스를 반환하는 단순한 정적 메서드 (리턴값이 그 클래스의 인스턴스값인 메서드) // 정적 팩터리 메서드의 예시: 기본타입인 boolean 값을 받아 Boolean 객체 참조로 변환해준다 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 팩터리 메서드가 생성자보다 좋은 점 (= 장점) 이름을 가질 수 있다. 생성자에 넘기는 매개변수와 생성자 자체만으로는 반환될 객..

JAVA/Effective Java 2022.05.20

[프로그래머스] 정수 제곱근 판별 / java

https://programmers.co.kr/learn/courses/30/lessons/12934 코딩테스트 연습 - 정수 제곱근 판별 임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함 programmers.co.kr Math.sqrt(i) : i의 제곱근을 구하는 함수 Math.sqrt(i,n) : i의 n 제곱인 수를 구하는 함수 아래는 내가 제출한 코드. floor 대신 (int) 로 형 변환 해도 된다!!! 아래는 floor함수 쓴 거랑, int로 형 변환했을 때의 차이!

Algorithm Study 2022.05.19