아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라 가끔 단순히 정적 메서드와 정적 필드만을 담은 클래스를 사용하면 유용할 때가 있다. 대표적으로 java.lang.Math, java.util.Arrays 와 같이 기본 타입 값이나 배열에 관련된 메서드들을 모아 놓는 유틸리티 클래스들을 사용할 수 있다. 또한 java.util.Collections 와 같이 특정 인터페이스를 구현하는 객체를 생성해 주는 정적 팩터리 메서드를 모아 놓을 수도 있다. 이러한 유틸리티 클래스들은 따로 인스턴스 변수나 메서드가 없어도 사용할 수 있으므로 생성자가 필요하지 않다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어 준다. 즉, 매개변수를 받지 않는 public 생성자가 만들어지며..
아이템3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글톤 이란? 싱글톤이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글톤의 전형적인 예로는 무상태 객체나 유일한 시스템 컴포넌트를 들 수 있다. 하지만 싱글톤 클래스는 타입을 인터페이스로 정의하고 그것의 구현체로 정의한 것이 아니라면 테스트하기 어렵다는 문제가 있다. 싱글톤을 만드는 방법 1. public static 멤버가 final 필드인 방식 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Evlis () { } public void sining () { System.out.println("lalala"); } } priva..
아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라 빌더 패턴이란? 빌더 패턴은 선택적 매개변수가 많은 상황에서 생성자 혹은 정적 팩토리 메서드보다 더 유용하게 사용할 수 있다. 필더 패턴을 이해하기 위해 예시로 가상의 가방(Bag) 객체를 만들 것이다. 가방을 주문하여 만들 때, 가방의 크기는 필수로 입력해야 하지만, 나머지 옵션들은 주문하는 사람이 마음대로 결정할 수 있다고 가정하자. 여기서 필수 매개변수는 가방의 사이즈가 될 것이고, 여러 옵션들은 매개변수가 될 것이다. 빌더 패턴 사용 전 빌더 패턴을 사용하기 전에는, 많은 선택적 매개변수를 처리하기 위해 아래 두 가지 패턴이 사용 된다. 1) 점층적 생성자 패턴 (Telescoping Constructor Pattern) 점층적 생성자 패턴은 ..
아이템1. 생성자 대신 정적 팩토리 메서드를 고려하라 정적 팩토리 메서드(Static Factory Method)란? 직접적으로 생성자를 통해 객체를 생성하는 것이 아닌 메서드를 통해서 객체를 생성하는 것을 정적 팩토리 메서드라고 한다. 객체 생성의 역할을 하는 클래스 메서드 라는 의미이다. 클래스는 클라이언트에게 public 생성자 대신 static 팩토리 메서드를 제공할 수 있다. 여기서 말하는 팩토리 메서드는 디자인 패턴에서 나오는 팩토리 메서드 패턴과 다른 의미이다. 생성자와의 차이는?! 실제로 정적 팩토리 메서드가 어떤 방면에서 생성자보다 좋은지 하나씩 알아보자. 1. 이름을 가질 수 있다. public class Board { pricate String title; //일반적인 생성자를 만들어..
121. Best Time to Buy and Sell Stock 문제를 이해한 바로는, 순차적으로 읽어가며 가장 작은 값이 나온 경우 최소값을 대체하고, 최소값과 현재 시장가의 차로 수익을 계산 한다. 그리고 가장 그 차이가 큰 경우의 값을 리턴해준다. class Solution { public int maxProfit(int[] prices) { int answer =0; int min = Integer.MAX_VALUE; for(int i=0; ianswer) answer는 그 차이값으로 대체된다 409. Longest Palindrome 해당 input의 값으로 앞으로 읽어도, 뒤로 읽어도 같은 문자를 만들 때 그 길이를 묻는 문제다. ex) 수박이박수 ? 같은 느낌이랄까 class Solutio..
876. Middle of the Linked List 해당 노드의 가운데 헤드를 찾는 문제이다. 만약 중간 값이 두가지라면 뒤의 값을 반환. 문제를 해결하기 위해 보통 두가지 방법이 있다. class Solution { public ListNode middleNode(ListNode head) { ListNode A = head; ListNode B = head; while(B!=null && B.next != null){ B = B.next.next; A = A.next; } return A } } 문제 풀이 (1) - Fast and Slow Pointer Fast and Slow Pointer 라는 방법이 있다. B의 노드가 두 칸을 갈때, A의 노드는 한 칸씩 가는 방법이다. B가 마지막에 도..
206. Reverse Linked List 주어진 노드를 역순으로 새로 연결하는 것이다. class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode current = head; while(current != null){ ListNode next = current.next; current.next = prev; prev = current; current = next; } return prev; } } 문제 풀이 먼저 세개의 포인터가 필요하다 (prev, current, next) 가장 먼저 prev 포인터를 null로 만들어준다. 현재의 포인터 current를 head로 만들어준다. head가 nu..
205. Isomorphic Strings 문자열 s,t가 주어지고 s와 t가 동형체(isomorphic)인지 확인하는 문제이다. 즉 두 문자열이 동형체일 경우 s의 문자열 -> t로 변경 가능 하다는 뜻 class Solution { public boolean isIsomorphic(String s, String t) { HashMap map = new HashMap(); int length = s.length(); for (int i = 0; i < length; i++) { char sc = s.charAt(i); char tc = t.charAt(i); if (i == 0) { map.put(sc, tc); } else { if (map.containsKey(sc)) { if (map.get(sc..