Java

    [Effective Java] 아이템 9. try-finally보다는 try-with-resources를 사용하라.

    아이템 9. try-finally보다는 try-with-resources를 사용하라. 자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야하는 자원이 많다. 예를 들자면, InputStream, OutputStream, Connection 등이 있다. 이러한 "자원 닫아주기" 행위는 놓치기 쉽기 때문에 예측할 수 없는 성능 문제로 이어지기도 한다. OutOfMemory와 같은.. 전통적으로는 자원 닫힘을 보장하는 수단으로서 try-finally 구문이 사용되었다. BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } 하지만 자원을 여러개 사용하게..

    [Effective Java] 아이템 8. finalizer와 cleaner 사용을 피하라.

    아이템 8. finalizer와 cleaner 사용을 피하라. 사실 2장에서 이 부분이 이해하기에 가장 까다로웠다. 자바에서는 두 가지 객체 소멸자를 제공한다. 그것이 바로 finalizer와 cleaner이다. 이 두 가지 객체 소멸자를 사용하면 명시적으로 바로 메모리를 해제할 수 있을까? 그건 아니다. 언젠가 해제될 순 있지만 곧바로 해제하는 것은 불가능하다. finalizer는 예측할 수 없고 상황에 따라 위험할 수 있다. 예를 들어, 불완전한 객체가 생성되고 해당 객체의 하위 객체에서 finalizer를 구현하며, finalizer의 정적 필드에 자신의 참조를 할당하여 가비지 컬렉터가 수집하지 못하게 막을 수 있다. cleaner는 Java9부터 finalizer의 대체제로 제시된다. cleane..

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

    아이템 7. 다 쓴 객체 참조를 해제하라 이 글에서 다루는 내용은, 말 그대로 다 쓴 객체 참조를 해제하라! 라는 것이다. 자바를 사용하다 보면 GC라는 것이 동작한다. 따라서 우리는 다른 C++과 같이 메모리 관리를 필요로하는 언어보다 좀 더 메모리를 신경쓰지 않고, 프로그래밍을 할 수 있다는 장점이 있다. 혹시라도 GC에 대해서 잘 모르는 독자가 있다면, 이 글을 참조하길 바란다. 하지만, 우리가 신경쓰며 객체 참조를 해제해주어야할 때가 있다. 일반적으로 자기 메모리를 직접 관리하는 클래스라면 메모리 누수에 주의하여야한다. 예를 들어, 다음 코드에서 메모리 누수가 일어나는 위치를 찾아보자. public class Stack { private Object[] elems; private int size;..

    엘레강트 오브젝트 내용 정리

    이 글은 엘레강트 오브젝트: 새로운 관점에서 바라본 객체지향을 읽고 정리한 내용입니다. 올해 중반 스터디로 한번 정리했던 내용을, 다시 한번 정리합니다. 1장 출생 1.1 -er로 끝나는 이름을 사용하지 마세요 클래스는 객체의 능동적인 관리자이다. (클래스는 객체의 어머니이다.) 클래스 이름을 짓는 적절한 방법은 객체가 노출하고 있는 기능에 기반한 것이 아닌, 클래스가 무엇인지에 기반해야한다. 예를 들어, CashFormatter가 아닌 Cash라고 명명해야한다. 즉, 객체는 그의 capability로 특징지어져야한다. 여기서 -er로 끝나는 이름을 짓는다면, 그것은 바로 기능에 기반하여 클래스를 명명했다고 볼 수 있다. ex. Manager, Controller, Handler, Converter 이와..

    [Java] Garbage Collection

    Garbage Collection이란? 우선 Garbage(가비지)라는 것은 유효하지 않은 메모리를 나타낸다. Java에서는 유효하지 않은 메모리를 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해준다. Java에서는 대신 명시적으로 불필요한 데이터임을 표현하기 위해 일반적으로 null을 선언한다. 즉, 가비지 컬렉션(이하 GC)이란 메모리 관리 기법 중 하나로, 동적 할당한 메모리 영역 중 유효하지 않은 영역을 해제하는 기능이다. 동적으로 할당한 메모리 영역 : heap 영역 유효하지 않은 영역: 어떤 변수도 가리키지 않을 때 Java에서도 System.gc()를 호출할 수 있지만, 해당 메서드를 호출하는 것은 시스템의 성능에 매우 큰 영향을 미칠 수 있다. GC가 왜 필요할까? 따라서 GC를 ..

    JAVA Reflection Use Cases

    1. 해당 클래스에 등록된 모든 메서드 가져오기 @Test void run() throws Exception { Class clazz = Junit3Test.class; Method[] methods = clazz.getMethods(); } 2. 해당 클래스에 등록된 메서드 명 가져오기 for (Method method: methods) { if (method.getName().startsWith("test")) { // method 명이 "test"로 시작하는 메서드를 가져온다. } } 3. 메서드 실행시키기 method.invoke(clazz.getDeclaredConstructor().newInstance()); 4. 해당 클래스에 등록된 메서드명에 특정 어노테이션이 포함되어있는 메서드 가져오기 ..

    Enum으로 분기문 다루어보기

    다음과 같은 요구사항이 있다. 로그인 사용자의 경우 연령별 요금으로 계산 청소년: 운임에서 350원을 공제한 금액의 20%할인 어린이: 운임에서 350원을 공제한 금액의 50%할인 - 청소년: 13세 이상~19세 미만 - 어린이: 6세 이상~ 13세 미만 이 또한 if-else를 통해 사용자가 청소년인지, 어린이인지, 혹은 그에 해당하지 않는 지 확인한 뒤 그에 알맞은 요금을 계산해서 리턴할 수 있다. 하지만, 이번에는 Enum을 이용해 처리해보자. 사실 Enum을 사용하는 이유는 Enum의 필드로서 함수형 인터페이스를 받은 뒤, 그에 알맞은 Enum Type을 갖도록 함으로서 분기문을 다룰 수 있기 때문이다. 먼저 코드로 보자면 다음과 같다. public enum AgePolicy { TWENTIES(..

    책임연쇄패턴으로 분기문 처리하기

    책임 연쇄 패턴이란 명령 객체와 일련의 처리 객체를 포함하는 디자인 패턴이다. 각각의 처리 객체는 명령 객체를 처리할 수 있는 연산의 집합으로 구성되고, 체인 안의 처리 객체가 다룰 수 없는 명령은 다음 처리 객체로 체이닝되어 넘겨진다. 주어진 요구사항은 다음과 같다. 요금 계산 방법 기본운임(10㎞ 이내) : 기본운임 1,250원 이용 거리초과 시 추가운임 부과 10km초과∼50km까지(5km마다 100원) 50km초과 시 (8km마다 100원) 9km = 1250원 12km = 10km + 2km = 1350원 16km = 10km + 6km = 1450원 75km = 10km + 40km + 25km = 2450원 이 경우, 분기문으로 처리한다면 다음과 같이 처리할 수 있다. if (distance..

    List.. 너 도대체 뭐냐?

    java.lang.UnsupportedOperationException가 발생한다. public class Sections { private List sections = new ArrayList(); public Sections() { } public Sections(List sections) { this.sections = sections; } public void addSection(Section section) { sections.add(section); } } @BeforeEach void setUp() { //1. UnSupportOperation 발생 안함. List sectionInputs = new ArrayList(); sectionInputs.add(SECTION); sections =..

    패키지 구조는 어떻게 구성하는 것이 좋을까?

    목차 패키지 구조별 장단점 요약 나의 경험을 바탕으로 패키지 구조에 대한 생각 정리 참고 자료 패키지 구조는 어떻게 가져가는 것이 좋을까?에 대해서 걸어둔 링크의 글을 먼저 확인해보고, 이 글을 읽으면 더 도움이 되리라 생각한다. 우선, 저 글을 요약해보자면 패키지 구조를 구성할 때에는 다음과 같은 두 가지 안이 대표적으로 존재한다. 우선, 두가지 안에 대해 SLIPP글에서 말한 장단점을 요약해보고, 내가 경험한 바를 마지막에 작성하겠다. 1안 - layer 우선 장점 도메인 모델 위주 개발에 적합하다. 패키지간 중복 코드 발생 가능성이 적어진다. 단점 모듈 단위로 분리 시 어려움이 있다. 2안 - 모듈 우선 장점 모듈 단위로 분리할 때 유리하다. 단점 각 패키지간 순환 참조가 발생할 가능성이 높다. 각..