Dev. Diary
-
Comparable 인터페이스를 구현할 때 비교자(Comparator) 이용하기Dev. Diary/Memo 2023. 9. 27. 16:17
책 Effective Java에서 Comparable 인터페이스에 관한 내용을 다루는 부분을 읽다가, 유용할 것 같은 코드를 알게 되었다. 클래스에서 Comparable 인터페이스를 구현하고, compareTo() 메서드를 만들어서 객체들끼리 비교하도록 만드는 것을 우선순위 큐를 이용하여 알고리즘 문제를 해결할 때 많이 사용했었다. 그런데 클래스가 비교해야 할 필드가 여러 개 있을 경우에, 각각의 필드를 하나하나 다 비교해가며 compareTo() 메서드를 구현해야 했었다. 아래는 BOJ 문제 강의실 2(1379)에서 사용된 클래스이다. 기존의 코드에서 클래스의 멤버들이 너무 자유분방해보여서 약간 수정했다. class Lecture implements Comparable { private int id, ..
-
requireNonNull() 메서드 관련 메모Dev. Diary/Memo 2023. 9. 22. 13:14
책에서 Object 클래스의 requireNonNull() 메서드를 보게 되었다. 무엇을 하는 녀석인지 찾아보니 null을 체크하는 메서드라고 한다. 유용해보이는 메서드인데, 당장 자주 쓸 지 잘 모르겠는데 까먹기에는 뭔가 아쉬워서 적어놓으려고 한다. 기본적으로는 아래와 같이 짜여 있다. public static T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; } 매개변수가 null이면 NullPointerException을 던지고, 그렇지 않으면 주어진 매개변수를 그대로 반환한다. 내가 책에서 본 것은 아주 간단한 예시였지만, 잘만 쓰면 내가 만든 프로그램에서 어떤 부분에서 예외가 발생하는지 ..
-
객체의 일관성에 관한 메모Dev. Diary/Memo 2023. 9. 19. 00:53
Builder 패턴과 JavaBeans 패턴에 대해서 알아보다가, 한번에 이해가 되지 않는 문장이 있었다. JavaBeans 패턴은 객체가 완전히 생성되기 전까지는 일관성(consistency)이 무너진 상태에 놓이게 된다. 관용적으로 자주 쓰이는 표현인지는 잘 모르겠지만, 그래도 간단하게 정리해두려고 한다. 먼저 책에 있는 JavaBeans 패턴의 예시를 보자. // Effective Java 코드 2-2 public class NutritionFacts { private int servingSize = -1; // 필수 private int servings = -1; // 필수 private int calories = 0; private int fat = 0; private int sodium = 0..
-
정적 팩토리 메서드를 알아보다가 느낀 점Dev. Diary/Memo 2023. 9. 17. 10:28
책 Effective Java를 오랜만에 꺼내서 읽었다. 궁금한 것이 생겼을 때, 그 키워드가 책에 있으면 가끔 펼쳐서 보는 책이었는데, 특별한 계기 없이, 그냥 정독을 해보고 싶었다. 가장 먼저 나오는 아이템은 ‘생성자 대신 정적 팩토리 메서드 사용을 고려하라’인데, 전에도 읽어봤지만, 오랜만에 읽는 것이라 그런지 여러 가지 의미로 새롭게 받아들여졌다. 이 책 자체가 엄청 유명한 책이고, 이 책의 키워드만 검색해도 많은 사람들이 정리해놓은 글이 많아서, 이것의 내용을 정리할 생각은 없다. 어쨌든 내용을 이해하려고 글을 이것저것 읽어보는데, ‘객체 지향적 프로그래밍’에 대한 설명들이 역시나 조금씩 포함되어 있었다. 어떤 설명을 보거나 들어도 늘 뜬구름을 잡는 것 같았던 개념이었는데, 뭔가 느껴진(?) 것..
-
입력을 받았을 때, 직접 input stream에서 데이터를 읽어오기Dev. Diary/Memo 2023. 8. 28. 18:34
오랜만에 BOJ 알고리즘 문제(수 나누기 게임(27172))를 풀었다. 풀고 나서 Java로 푼 사람들의 시간을 확인해보았는데, 나의 풀이의 절반 정도 걸리는 풀이들이 보였다. 평소에는 크게 관심이 없기도 했고, 엄청 큰 차이인가 싶지만, 갑자기 궁금해져서 어떤 부분에서 차이가 생기는지 알아보았다. 문제를 푸는 아이디어는, 아래에 '에라토스테네스의 체'라는 힌트가 있었어서, 크게 다르지 않았다. 나의 코드와 가장 차이가 나는 부분은 입력을 받는 부분이었다. 나는 여태까지 BufferedReader 클래스를 사용해서 입력을 처리했었는데, 가장 빠른 풀이를 제출하신 분(roeyr)은 아래의 코드를 이용하여 입력을 받고 있었다. public static int readInt() throws IOExceptio..