Programming 29

[Effective Java] item8 - finalizer와 cleaner 사용을 피하라.

finalizer와 cleaner 사용을 피하라! 공부하면서 느낀거지만, 내용이 꽤나 어렵다. 같이 스터디 하는 현업자분들도 실제로 GC를 강제로 발생시키는 경우는 사실상 없다고 말했기에, 이론적인 내용이라고 생각하고 접근해보려고 한다. 본인은 자바를 처음 공부할 때 이상민씨의 "자바의 신"으로 공부를 했었는데, 거기서 finalize()를 소개하면서, 절대 사용하지 말라고 (엄밀히 말하면 java.lang에 있는 finalization()이 각각의 Object의 finalize()를 실행 시킨다는 말을 하면서) 강조했었다. 사실 초보자를 위한 책인 만큼 그냥 쓰지 말라면 쓰지 말라고 생각했는데, 이번 절에서 마침 해당 내용이 나와서 좀 좋긴 했다. 일반적인 GC는 우리가 모르는 사이에 발생하지만, fi..

Programming/Java 2021.02.05

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

다 쓴 객체 참조를 해제하라! 때는 2018년... 다른 학과였던 나는 자료구조 수업을 들었다. 사실 시험을 잘봐서 그렇지, 과제는 엉망이었다. 7번 중 0점이 2개... 눈물났다. 그땐 "아... 코딩에 재능이 없나?" 라고 생각하고 그랬었다. (지금은 재능의 문제가 아니라 노력으로 충분히 커버할 수 있는 부분이라고 생각한다!) TMI는 집어 치우고, 그때 작성했던 Stack 자료구조의 코드를 읽어보자. class Stack { private String [] data; private final int size; private int top; public Stack(int s) { data = new String[s]; size = s; top = -1; } public boolean isEmpty()..

Programming/Java 2021.02.01

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

불필요한 객체 생성을 피하라! 앞에서도 여러번 이야기 했지만, 객체를 새로 만들바엔 이미 있는 객체를 재활용 하는 것이 성능이 훨씬 좋다. (정적 팩토리 메소드에서 다뤘듯이, 굳이 Boolean 생성자를 일일히 만들 바엔 valueOf를 써서 있는걸 그대로 리턴하는 것이 좋다.) public long TestCaseOne() { long beforeTime; long afterTime; beforeTime = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String s = new String("I'm always learning..."); s.toUpperCase(); } afterTime = System.currentTimeMillis..

Programming/Java 2021.01.28

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

자원을 직접 명시하지 말고 의존 객체 주입을 사용하라! 전국 피자집의 목록을 받아, 특정 지역에 있는 가게만 출력하는 클래스를 설계한다고 하자. 딱히 객체가 필요하진 않을 것 같고, 메소드만 적절히 활용하는 유틸리티 클래스를 만들어보자. import java.util.List; public class RegionFoods { private static final Food pizza = new Food(); private RegionFoods() {} // 객체 생성 방지 public static boolean isRegion(String food) {} public static List regionList() {} } 만약에 치킨집도 받고, 중국집도 받고 그래야 한다면 어떡할까? 당장 지금 생성한 클래스..

Programming/Java 2021.01.28

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

인스턴스화를 막으려거든 private 생성자를 사용하라! 정적 메소드와 정적 필드'만' 담은 클래스를 만들어보자. 솔직히 객체지향에서 이러면 욕먹기 딱 좋지만, 그런데 쓸데는 있을 것이다. (ex. java.lang.Math) 그리고 final 클래스와 관련한 메소드를 모을때도 상속해서 사용하는 것은 불가능하니 별개의 클래스로 빼기도 한다. 당연히 이런 클래스는 인스턴스를 만들어서 쓰려고 설계한게 아닌데... 일반적으로 생성자를 명시하지 않으면 자연스럽게 기본 생성자가 만들어진다. 이러면 의도치 않은 작업이 발생할 수 있으니 매우 위험하다! 그래서 그 대안으로 추상 클래스를 만들었다! public abstrct class test { public int Iamfree() { return 1; } } 완벽..

Programming/Java 2021.01.25

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

private 생성자나 열거 타입으로 싱글턴임을 보증하라! 이 글을 읽는 사람이라면 싱글턴 클래스에 대해서 알거라고 믿...지 말고 그래도 한번 짚고 넘어가자. 싱글턴 (Singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴을 만드는 방식은 일반적으로 두가지이다. 각각의 예시를 보자. public class LeaveMeAlone { public static final LeaveMeAlone PLEASE = new LeaveMeAlone(); private LeaveMeAlone() {} public void dontBortherMe() { System.out.println("Hew..."); } } 일반적인 방법이다. private 생성자는 초기화 과정에 딱 한번 호출되..

Programming/Java 2021.01.21

[Effective Java] item2 - 생성자에 매개변수가 많다면 빌더를 고려하라.

생성자에 매개변수가 많다면 빌더를 고려하라! 지난 item을 통해 정적 팩토리 메소드에 대해서 배웠다. 물론 약간의 단점만 감수하면 매우 훌륭한 도구이다. 다만 매개변수가 많으면 어떨까? 치킨이 먹고 싶으니 치킨 객체를 만든다고 가정해보자. 치킨 객체엔 다양한 인자들이 있다고 하자. 이름, 브랜드, 가격, 열량, 순살여부, (매우 중요하다!) 평점을 저장한다고 하자. 그렇다면 클래스의 기본 형태는 public class Chicken { private final String chickenName; // 필수 private final String brand; // 필수 private final int price; // 선택 private final int calrories; // 선택 private fin..

Programming/Java 2021.01.21

[Effective Java] item1 - 생성자 대신 정적 팩토리 메서드를 고려하라.

생성자 대신 정적 팩토리 메서드를 고려하라! 일반적인 public 생성자를 통한 인스턴스 생성을 고려해보자. public class ContactBook { public static void main(String[] args) { Contact contact1 = new Contact(); Contact contact2 = new Contact("Kim"); Contact contact3 = new Contact("Lee", 01000001111); } } public class Contact { // 인자가 없을 경우에 default 값은 공백/0이라고 가정하자. public Contact() {} public Contact(String name) {} public Contact(String name,..

Programming/Java 2021.01.20

<백준 17071> 숨바꼭질 5

문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 500,000)에 있고, 동생은 점 K(0 ≤ K ≤ 500,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 동생은 항상 걷기만 한다. 동생은 항상 매 초마다 이동을 하며, 이동은 가속이 붙는다. 동생이 이동하는 거리는 이전에 이동한 거리보다 1을 더한 만큼 이동한다. 즉, 동생의 처음 위치는 K, 1초가 지난 후 위치는 K+1, 2초가 지난 후 위치는 K+1+2, 3초가 지난 후의 위치는 K+1+2+3이다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생..