자바 15

[아이템07] 다 쓴 객체 참조를 해제하라

Java는 C/C++ 언어와는 달리 가비지 컬렉터가 메모리를 관리하고 있다. 하지만 Java 역시 메모리 관리에 신경을 써야 한다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack(){ elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e){ ensureCapacity(); elements[size++] = e; } public Object pop() { if(size == 0) throw new EmptyStackExcep..

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

많은 클래스가 하나 이상의 자원에 의존한다. 맞춤법 검사기는 사전에 의존하는데, 이런 클래스를 정적 유틸리티 클래스로 구현하는 모습을 많이 볼 수 있다. //정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) {...} public static List suggestions(String typo) {...} } //싱글턴을 잘못 사용한 예 public class SpeelChecker { private final Lexicon dictionary = ...; p..

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

개발을 하다 보면 정적 메서드와 정적 필드만을 담은 클래스를 만들 때가 있다. java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아 놓을 수 있다. //Math 메서드 public final class Math { private Math() {} public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; public static double sin(double a) { return StrictMath.sin(a); // default impl. delegates to StrictMath } ... ... ... } ..

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

싱글톤(Singleton) 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글톤 생성 방식 보통 두 방식을 사용하며 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련한다. 1. public static final 필드 방식 public class Singleton { public static final Singleton INSTANCE = new Singleton(); private Singleton() {}; } 장점 해당 클래스가 싱글턴임이 API에 명확히 드러난다. 간결함 private 생성자는 Singleton.INSTANCE를 초기화할 때 딱 한 번만 호출된다. 또한 private 외 다른 생성자가..

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

정적 팩터리와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다. public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; public NutritionFacts(int servingSize, int servings){ this(servingSize,servings,0); } public NutritionFacts(int servingSize, int servings, int calories){ this(servingSize,servings,calories,0); } public NutritionFacts..

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

클래스의 인스턴스를 얻는 전통적 수단은 public 생성자이다. 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할 수 있다. public 생성자 대신 정적 팩터리 메서드가 좋은 이유 5가지 첫 번째. 이름을 가질 수 있다. public class Dante { public Dante(){ //생성자 System.out.println("HI"); } public static void DanteWithMoney(){ // 정적 팩토리 메서드 System.out.println("I have money"); } public static void main(String[] args) { DanteWithMoney(); } } -> 생성자 이름이 없음 반환될 객체의 특성을 알기 힘듦 -> 정적 팩토리 메서드 이름..

[Java] 멀티 쓰레드(Multi Thread)

1. Main Thread 모든 Java Application은 main thread 가 main 메소드를 실행하면서 시작된다. 이러한 메인 쓰레드안에서 싱글 스레드가 아닌 멀티 스레드 애플리케이션은 필요에 따라 작업 스레드를 만들어 병렬로 코드를 실행할 수 있다. Multi Thread는 메인 스레드가 종료되어도 실행 중인 Thread가 하나라도 있으면 프로세스는 종료되지 않는다. 2. Thread 생성 2.1 Thread 클래스로부터 직접 생성 java.lang.Thread 클래스로부터 작업 스레드 객체를 직접 생성하려면 Runnable을 매개 값으로 갖고 있는 생성자를 호출한다. Runnable에는 run() 메소드 하나가 정의되어 있으며, 구현 클래스에서 run()을 재정의하여 실행할 코드를 작성..

Study/Java 2021.09.14

[Java] 파일 입출력 정리

업무를 보던 중 특정 기간내에 몇 천 건의 DB 자료들을 뽑아야하는 일이 있었다. 하지만 내가쓰고 있는 DB Tool인 MySql workbench 로는 부하가 많이 가서 쿼리 실행중에 계속 오류가 발생하였다. 이를 해결하기 위해 임시로 로컬에서 DB를 접속하여 자바 코드를 통해 데이터를 뽑아 냈다. 파일 입출력은 자주 쓰지 않아서인지 사용할 때 마다 매번 까먹고 다시 찾고를 반복한다.. 그래서 다시 찾아보더라도 내가 정리한 걸 보기위해 이번 기회에 제대로 정리해본다.. File 클래스 OutputStream FileReader FileWriter BufferedWriter BufferedReader Scanner .. .. 스트림 Stream 파일에서 입력과 출력이라는 동작을 하려면 파일로 데이터를 전..

Study/Java 2021.09.08

프로그래머스 / 비밀지도(Java)

문제 설명 암호화된 비밀 지도를 해독하기 위해 지도 1과 지도 2를 합쳐야 한다. 입력 형식 입력으로 지도의 한 변 크기 n과 2개의 정수 배열 arr1, arr2가 들어온다. 1 ≦ n ≦ 16 arr1, arr2는 길이 n인 정수 배열로 주어진다. 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다. 매개변수 값 n 6 arr1 [46, 33, 33 ,22, 31, 50] arr2 [27 ,56, 19, 14, 14, 10] 출력 ["######", "### #", "## ##", " #### ", " #####", "### # "] 내가 생각한 해별 방법 1. arr1과 arr2의 값을 이진수로 바꾼다. 2. 이진수를 비트 연산(OR)하..

Study/Algorithm 2020.11.16

프로그래머스 / 캐시 (JAVA)

문제 설명 캐시 크기에 따른 실행시간 측정 프로그램을 작성하는 것이다. 조건 1 : 캐시 교체 알고리즘 LRU(Least Recently Used)를 사용한다. 조건 2 : cache hit일 경우 실행시간은 1이다. 조건 3 : cache miss일 경우 실행 시간은 5이다. 조건 4 : 영문자로만 구성되어 있으며, 대소문자 구분을 하지 않는다. LRU 알고리즘 : 가장 오랫동안 사용되지 않은 데이터를 삭제하고 새로 추가 LFU 알고리즘 : 가장 적은 참조 횟수를 가진 데이터를 삭제하고 새로 추가 내가 생각한 해결 방법 가장 오랫동안 사용하지 않은 데이터를 삭제하는 것이기 때문에 큐를 사용하면 될것이라 생각하였다. 큐는 FIFO방식으로 그전에 cache가 hit 된다면 앞에 있는 데이터를 삭제하고, m..

Study/Algorithm 2020.11.04