본문 바로가기

전체 카테고리361

[Effective Java] 아이템4 인스턴스화를 막으려거든 private 생성자를 사용하라 1. 정적 메서드와 정적 필드만 담은 클래스 생성 정적 메서드와 정적 필드만 담을 클래스 또는 final 클래스와 관련한 메서드들을 모아놓을 경우가있다. 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한게 아니기 때문에 private 생성자를 사용하면 된다. 예를들면 java.util.Collections 처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓는 경우 private 생성자를 사용한다. private 생성자에 이런 주석을 담으면 의도를 좀 더 명확하게 할 수 있다. //기본 생성자가 만들어지는 것을 막는다.(인스턴스화 방지용) private Collections() { } 2.정리 클래스의 인스턴스화를 막으려면 private 생성자를 추가하면 된다. pri.. 2021. 1. 13.
[Effective Java] 아이템3 private 생성자나 열거 타입으로 싱글턴임을 보증하라 1. 싱글턴(Singleton) 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 전역 변수이기 때문에 프로그램 내부에서 이 객체를 공유하며 사용한다. 싱글턴 생성 방식1 - public static final 방식 //public static final 필드 방식의 싱글턴 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis(){...}; } private 생성자는 public static final 필드인 Elvis.INSTANCE를 초기화할 때 딱 한번 호출 public 이나 protected(같은 패키지 or 상속 받을 시 접근 가능) 생성자가 없으므로 Elivis 클래스가 초기화 .. 2021. 1. 13.
[알고리즘] 2020 카카오 인턴십 - 보석 쇼핑 (Two Pointers Algorithm) 1. 문제 이번 문제는 2020 카카오 인턴십에 출제된 보석 쇼핑이라는 문제이다. 2. 문제 풀이 처음에 어떤 알고리즘과 자료구조를 사용해야할지 감을 못잡아서 제대로 접근을 하지 못했었다. 이번 문제는 하나의 1차원 배열에서 left, right를 0으로 두고 left와 right를 조작해서 원하는 값을 찾는 투포인터스 알고리즘(Two Pointers Algorithm)문제이다. 1. 우선 현재 map에 들어있는 보석의 종류가 gems에 들어있는 보석의 종류보다 작을 경우 right를 1씩 증가시켜주면서map에다가 넣는다. 2. map에 들어있는 보석의 종류가 gems에 들어있는 보석의 종류와 같을 경우 left를 하나 증가 시켜주고 map에 들어있는 보석의 개수가 0개이면 map에서 해당 key를 삭제.. 2021. 1. 13.
[Effective Java] 아이템2 생성자에 매개변수가 많다면 빌더를 고려하라 1. 정적 팩터리와 생성자의 문제점 정적 팩터리와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵습니다. 대부분 점층적 생성자 패턴을 즐겨 사용하는데 이런 생성자는 사용자가 설정하고 싶지 않은 매개변수까지 포함하기 때문에 어쩔 수 없이 그런 매개변수도 값을 지정해줘야한다. 매개변수가 늘어날수록 걷잡을 수 없다. 2. 자바빈즈패턴 두번째 대안인 자바빈즈패턴을 사용하면 매개변수가 없는 생성자로 객체를 만든 후 세터 메서드들을 호출하여 원하는 매개변수의 값을 설정하는 방식이 있다. 자바빈즈패턴은 객체 하나를 만들려면 메서들르 여러번 호출해야하고 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다. 일관서이 깨진 객체가 만들어지면 버그를 심은 코드와 그 버그 때문에 런타임에 문제를 겪는.. 2021. 1. 12.
[알고리즘] 2020 카카오 인턴십 - 수식 최대화 1. 문제 2. 문제 풀이 주어진 expression을 값과 연산으로 나누어서 list에 담는다. 연산자의 개수가 총 3개이므로 나올 수 있는 연산 순서는 6가지이다. 해당 연산 순서로 list에 담겨진 숫자들을 연산하면서 갱신한다. 연산을 여러번 반복 해야하므로 addAll 메소드를 이용하여 리스트를 깊은 복사를한다. import java.util.*; class Solution { static long answer = -1; public Long solution(String expression) { List list = new ArrayList(); //1. list에 나눠서 담음 initList(expression, list); System.out.println("list : " + list); /.. 2021. 1. 11.
[알고리즘] 2020 카카오 인턴십 - 키패드 누르기 1. 문제 2. 문제 풀이 현재 왼손과 오른손가락의 위치가 어디에 있는지 저장하면서 가운데 버튼을 누를 경우 왼손과 오른손중 어느 위치가 더 가까운지를 계산한다. 이때 거리를 계산하기 위해서는 현재 손가락 위치와 가운데 버튼 위치까지의 행과 열의 차이를 이용해서 구한다. class Solution { class Location{ int arr[][] = {{1,2,3}, {4,5,6}, {7,8,9}, {-1, 0 ,-2}}; int l = -1; int r = -2; public int getRow(int num){ for(int i=0;i 2021. 1. 11.