본문 바로가기

공부 기록/Java

(37)
[이펙티브 자바 3/E] 아이템4 - 인스턴스화를 막으려거든 private 생성자를 사용하라 public class UtilityClass { private UtilityClass() { throw new AssertionError(); } ... } - 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. ===> 컴파일러가 기본 생성자를 만드는 경우는 오직 명시된 생성자가 없을 때뿐이니 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. - 명시적 생성자가 private이니 클래스 바깥이서는 접근할 수 없다. - 꼭 AssertionError를 던질 필요는 없지만, 클래스 안에서 실수로라도 생성자를 호출하지 않도록 해준다. - 어떤 환경에서도 클래스가 인스턴스화되는 것을 막아준다. - 상속을 불가능하게 하는 효과도 있다. - 그러나 그다지 직관적이지 않으므로 적절히 주..
[이펙티브 자바 3/E] 아이템3 - private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴 - 인스턴스를 오직 하나만 생성할 수 있는 클래스 - 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. => 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이다. 싱글턴을 만드는 방식 - 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해둔다. 1. public static 멤버가 final 필드인 방식 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() {...} public void leaveTheBuilding() {...} } - public이나 pr..
[이펙티브 자바 3/E] 아이템2 - 생성자에 매개변수가 많다면 빌더를 고려하라 점층적 생성자 패턴(telescoping constructor pattern) - 필수 매개변수만 받는 생성자 ... 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식 => 쓸 수는 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. 자바빈즈 패턴(JavaBeans pattern) - 매개변수가 없는 생성자로 객체를 만든 후, 세터(setter)메서드를 호출해 원하는 매개변수의 값을 설정하는 방식 => 객체 하나를 만들려면 메서드를 여러 개 호출해야 하고, 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다. 빌더 패턴(Builder pattern) - 필수 매개변수만으로 생성자(혹은 정적 팩터리)를 호출해 빌더 객체를 얻는다. 그런 다음 빌더 객체가 제공하..
[이펙티브 자바 3/E] 아이템1 - 생성자 대신 정적 팩터리 메서드를 고려하라 클래스는 생성자와 별도로 정적 팩터리 메서드(static factory method)를 제공할 수 있다. 정적 팩터리 메서드의 장점 1. 이름을 가질 수 있다. - 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다.(ex. BigInteger.probablePrime) - 한 클래스에 시그니처가 같은 생성자가 여러 개 필요할 것 같으면, 생성자를 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주자. 2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다. - 이 덕분에 불변 클래스(immutable class; 아이템 17)는 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있다. - (특히 생성 비용이 큰) ..
[JPA] 3장 - 영속성 관리 엔티티 매니저 - 엔티티를 저장, 수정, 삭제, 조회하는 등 엔티티와 관련된 모든 일을 처리한다. - 개발자 입장에서는 엔티티를 저장하는 가상의 데이터베이스로 생각하면 된다. 엔티티 매니저 팩토리와 엔티티 매니저 엔티티 매니저 팩토리 생성하기 - 공장 만들기 => 비용이 아주 많이 든다. - 데이터베이스를 하나만 사용하는 애플리케이션은 일반적으로 하나만 생성한다. => 애플리케이션 전체에서 공유하도록 설계되어 있다. - 여러 스레드가 동시에 접근해도 안전하다. => 공유해도 문제 없다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook"); 엔티티 매니저 생성하기 - 비용이 거의 안 든다 - 여러 스레드가 동시에 접근하면..
[JPA] 2장 - JPA 애플리케이션 개발 엔티티 매니저 설정 public class JpaMain { public static void main(String[] args) { // 엔티티 매니저 팩토리 생성 EntityManagerFactory emf = Persistence.createEntityManagerFactory("unit"); // 엔티티 매니저 생성 EntityManager em = emf.createEntityManager(); ... // 엔티티 매니저 종료 em.close(); // 엔티티 매니저 팩토리 종료 emf.close(); } } 엔티티 매니저 팩토리 - 생성 시 JPA를 동작시키기 위한 기반 객체를 만들고 JPA 구현체에 따라서는 데이터베이스 커넥션 풀도 생성하므로 생성 비용이 매우 크다. => 엔티티 매니저 팩토..
[JPA] 1장 - 스프링부트 프로젝트와 H2 데이터베이스 연결하기 로컬에 H2 데이터베이스 설치 https://yurison.tistory.com/450 윈도우 환경에서 H2 데이터베이스 연결 시 경로 not found 오류 해결 H2 데이터베이스 설치 https://www.h2database.com/html/download.html Downloads Downloads Version 2.1.214 (2022-06-13) Windows Installer (SHA1 checksum: 5f7cd83d394df5882ed01553935463a848979f29) Platform-Independent Zip (SHA1 checksum: 5ff027217098bf6 yurison.tistory.com 위 내용 참고! build.gradle 설정 dependencies { ... i..
[Java] 큐(Queue) 큐(Queue) - 선입선출(FIFO) : 가장 먼저 삽입된 요소가 가장 먼저 삭제된다. - 선입선출은 양방향(front, rear)에서 이뤄진다. - 너비 우선 탐색(BFS)에서 자주 사용한다. Queue 사용하기 - Queue 선언 Queue queue = new LinkedList(); 보통 LinkedList를 이용한다. 삽입 : queue.offer(x), queue.add(x) queue.offer(1); // 삽입 실패 시 false 반환 queue.add(1); // 삽입 실패 시 IllegalStateException rear에 값을 삽입한다. 삭제 : queue.poll(), queue.remove() int a = queue.poll(); // 큐가 비어있다면 null 반환 int a..