전체 글 194

[Effective Java] Item 7. 다 쓴 객체 참조를 해제하라

[Effective Java] Item 7. 다 쓴 객체 참조를 해제하라 C, C++처럼 메모리를 직접 관리해야 하는 언어를 쓰다가 자바처럼 가비지 컬렉터를 갖춘 언어로 넘어오면 프로그래머스이 삶이 훨씬 평안해진다. 다 쓴 객체를 알아서 회수해가니 말이다. 처음 경험할 때는 마법을 보는 듯했다. 그래서 자칫 메모리 관리에 더 이상 신경쓰지 않아도 된다고 오해할 수 있는데, 절대 사실이 아니다. 스택을 간단히 구현한 다음 코드를 보자. 메모리 누수가 일어나는 위치는 어디인가? public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; publ..

[Effective Java] Item 6. 불필요한 객체 생성을 피하라

[Effective Java] Item 6. 불필요한 객체 생성을 피하라 예시 public class RomanNumerals { private static final Pattern ROMAN = Pattern.compile( "^(?=.)M*(C[MD]|D?C{0,3})" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); static boolean isRomanNumeral (String s) { return ROMAN.matcher(s).matches(); } ) } 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 재사용은 빠르고 세련되어 특히 불변 객체는 언제든 재사용할 수 있다. 다음 코드는 하지 말아야할 극단적인 예시이다. String..

[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 예시 public class AccountService implements UserDetailsService { private final AccountRepository accountRepository; private final EmailService emailService; private final PasswordEncoder passwordEncoder; private final AppProperties appProperties; public AccountService(AccountRepository accountRepository, EmailService emailService, PasswordEnco..

[Effective Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

[Effective Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 예시 public class UtilityClass { // 기본 생성자가 만들어지는 것을 막는다. (인스턴스화 방지용) private UtilityClass() { throw new AssertionError(); } ... (생략) }이따금 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있을 것이다. 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이기에 그리 곱게 보이지는 않지만, 분명 나름의 쓰임새가 있다. 1) java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있다. 2) java.Util.Collecti..

[Effective Java] Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증해라

[Effective Java] Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증해라 예시 public class Elvis { private static final Elvis INSTANCE = new Elvis(); private Elvis() { } public static Elvis getInstance() { return INSTANCE; } public void leaveTheBuilding() { System.out.println("Whoa baby, I'm outta here!"); } // This code would normally appear outside the class! public static void main(String[] args) { Elvis e..

[Effective Java] Item 2. 생성자에 매개변수가 많다면 빌더를 고려해라

[Effective Java] Item 2. 생성자에 매개변수가 많다면 빌더를 고려해라 예시 NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8) .calories(100).sodium(35).carbohydrate(27).build(); 정적 팩터리와 생성자에는 똑같은 제약이 하나 있다. 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 식품 포장의 영양 정보를 표현하는 클래스에서 영양 정보는 1회 내용량, 총 2회 제공량, 1회 제공량당 칼로리 같은 필수 항목 몇 개와 총 지방, 트랜스지방, 포화지방, 콜레스테롤, 나트륨 등 총 20개가 넘는 선택 항목으로 이뤄진다. 그런데 대부분 제품은 이 선택 항목중 대다수의 값이 그냥 0이다. 이..

[Effective Java] Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라

[Effective Java] Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라 예시 public static Boolean valueOf(boolean b){ return b ? Boolean.True : Boolean.False; }클래스는 클라이언트에 public 생성자 대신 (혹은 생성자와 함께) 정적 팩터리 메서드를 제공할 수 있다. 이 방식에는 장점과 단점이 모두 존재한다. 정적 팩터리 메서드의 5가지 장점 이름을 가질 수 있다. (생성자 호출 방식) BigInteger(int, int Random) (정적 팩토리 메서드 호출 방식) BigInteger.probablePrime 위 예시에서 값이 소수인 BigInteger를 반환한다는 의미를 더 잘 설명할 수 있는 것은 정적 팩터리 메서..

[프로그래머스][2019 KAKAO BLIND RECRUITMENT] 길찾기 게임 Level 3 (Java)

알고리즘 [프로그래머스][2019 KAKAO BLIND RECRUITMENT] 길찾기 게임 (Level3 Java) https://programmers.co.kr/learn/courses/30/lessons/42892 코딩테스트 연습 - 길 찾기 게임 [[5,3],[11,5],[13,3],[3,5],[6,1],[1,3],[8,6],[7,2],[2,2]] [[7,4,6,9,1,8,5,2,3],[9,6,5,8,1,4,3,2,7]] programmers.co.kr 문제 설명 입출력 예시 nodeinfo result [[5,3],[11,5],[13,3],[3,5],[6,1],[1,3],[8,6],[7,2],[2,2]] [[7,4,6,9,1,8,5,2,3],[9,6,5,8,1,4,3,2,7]] 이진트리의 노드를 ..

개발/알고리즘 2021.01.11

[프로그래머스][월간 코드 챌린지 시즌1] 스타수열 문제 해결 (Java) Level 3

알고리즘 [프로그래머스][월간 코드 챌린지 시즌1] 스타수열 문제 해결 (Java) Level 3 https://programmers.co.kr/learn/courses/30/lessons/70130 코딩테스트 연습 - 스타 수열 programmers.co.kr 문제 설명 스타 수열의 최대 길이 갯수를 구하는 문제입니다. 수열이 {x[0], x[1]}, {x[2], x[3]}, ..., {x[2n-2], x[2n-1]} 라고 가정하자. 이 때 아래 조건을 만족한 수열을 스타 수열이라고 부른다. 스타 수열의 조건1. x의 길이가 2이상의 짝수이다. 스타 수열의 조건2. {x[0], x[1]}, {x[2], x[3]}, ..., {x[2n-2], x[2n-1]}의 교집합의 원소 갯수가 1 이상이다. 스타 수..

개발/알고리즘 2021.01.10

[Spring] DispatcherServlet 코드 분석하기

Spring DispatcherServlet 코드 분석하기 이번 포스팅에서는 Spring Framework의 DispatcherServlet 코드를 분석한 내용에 대해 정리해보려 합니다. DispatcherServlet 이란? Spring Framework의 구조와 Dispatcher Servlet의 역할을 간단히 설명하자면 아래와 같은 순서대로 사용자의 요청을 처리합니다. 1. 사용자의 Request가 들어오면 DispatcherServlet은 받아온 Request를 확인합니다. 2. DispatcherServlet은 HandlerMapping에게 보내서 해당 요청을 처리할 수 있는 Controller가 있는지 확인합니다. 3. HandlerAdapter에서는 HandlerMapping에서 확인한 Co..

개발/Spring 2021.01.01