전체 글
-
템플릿 메서드 패턴: Segment TreeStudy/Java 2023. 10. 13. 01:41
책 Effective Java의 아이템 20에서 '템플릿 메서드 패턴'을 간단하게 소개하는 부분이 있다. 인터페이스로 타입을 정의하고, 추상 클래스에 다른 하위 클래스에서 공통적으로 정의될 메서드를 모아서 하위 클래스의 골격으로 사용하는 것이다. 글로만 봤을 때는 이 패턴이 왜 좋은지 크게 와닿지 않아서 최근에 알고리즘 문제(BOJ10868, BOJ2042)를 풀기 위해 공부했던 Segment Tree에 이 패턴을 적용해서 만들어 볼 수 있을 것 같아서 구현해보았다. 먼저 인터페이스에 들어갈 메서드가 어떤 것이 있을 지 생각해봤다. public interface SegmentTree { Object[] getTree(); void update(int idx, Object diff); Obj..
-
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, ..
-
equals() 메서드의 유효성 단위 테스트Study/Java 2023. 9. 23. 11:15
오늘(9월 22일) 책 Effective Java에서는 equals() 메서드에 관한 부분을 읽었다. 한 번 읽고는 잘 이해가 되지 않는 부분들이 있어서 같은 내용을 두 세번씩은 더 읽었던 것 같다. 아이템 제목은 '아이템 10. equals는 일반 규약을 지켜 재정의하라'였다. 내용에서는 equals() 메서드를 만들 때 지켜야하는 몇 가지 규칙들에 대해 자세히 설명한다. 그 규칙들은 equivalance class(동치류)의 정의로부터 오는 것들인데, 그것들의 단위 테스트를 작성해서 실행해보라는 굵은 글씨를 그냥 지나치기가 좀 그래서, 테스트 코드를 연습할 겸 간단하게 만들어보았다. 단위 테스트를 실행할 클래스는 오늘 풀었던 BOJ 알고리즘 문제 2887번: 행성 터널에서 만들었던 클래스를 사용했다...
-
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를 오랜만에 꺼내서 읽었다. 궁금한 것이 생겼을 때, 그 키워드가 책에 있으면 가끔 펼쳐서 보는 책이었는데, 특별한 계기 없이, 그냥 정독을 해보고 싶었다. 가장 먼저 나오는 아이템은 ‘생성자 대신 정적 팩토리 메서드 사용을 고려하라’인데, 전에도 읽어봤지만, 오랜만에 읽는 것이라 그런지 여러 가지 의미로 새롭게 받아들여졌다. 이 책 자체가 엄청 유명한 책이고, 이 책의 키워드만 검색해도 많은 사람들이 정리해놓은 글이 많아서, 이것의 내용을 정리할 생각은 없다. 어쨌든 내용을 이해하려고 글을 이것저것 읽어보는데, ‘객체 지향적 프로그래밍’에 대한 설명들이 역시나 조금씩 포함되어 있었다. 어떤 설명을 보거나 들어도 늘 뜬구름을 잡는 것 같았던 개념이었는데, 뭔가 느껴진(?) 것..
-
Kruskal's algorithm : 최소 신장 트리(MST, Minimum Spanning Tree) 찾기Study/Algorithm 2023. 8. 31. 16:30
BOJ 문제 최소 스패닝 트리(1197), 도시 분할 계획(1647), 네트워크 연결(1922) 등의 문제들을 풀기 위해 Kruskal Algorithm을 공부했다. 1. 알고리즘 최소 신장 트리(MST, Minimum Spanning Tree)는 가중치(weight)가 있는 간선(edge)들을 갖고 있는 그래프에서, 그래프의 모든 정점(vertex)들을 포함한 트리(tree)이면서, 그 트리가 가진 모든 간선의 가중치의 합이 가장 작게 되는 그래프를 말한다. 예를 들면, 아래의 그래프 G에서 모든 정점을 포함한 트리는 가운데의 그래프에서 빨간 간선들로 이루어진 그래프이고, 그러한 트리는 여러 개가 있을 수 있다.(모든 정점을 포함한 트리를 spanning tree라고 한다.) 하지만, 간선의 가중치의 ..