Learn business/Java

    Enum과 Generic 함께 사용하기

    개요 코드를 단순하게 만들면서 가독성을 높히기 위한 개발을 하다보면 Enum 타입을 사용하는 것은 흔하게 일어납니다. 또한 if / else 문 사용을 지양하는 방향으로 코드를 만들다 보면 Enum 클래스에 추상 메소드나 인터페이스를 구현하는 일도 마주하게 될 것입니다. 저 역시 조금 더 클린한 코드를 만들기 위해 Enum 클래스를 많이 사용하는데요. 최근에 회사에서 맡은 프로젝트를 진행하면서 Enum 타입을 생성하고 인터페이스를 상속 받아서 각 타입별로 상속 받은 메소드를 구현하고 있었습니다. 그런데 Enum 타입에 정의한 상수별로 각각 다른 타입의 객체를 리턴해주고 싶은 니즈가 생겼습니다. 그 내용을 아래에 공유하고자 합니다. 인터페이스를 구현한 Enum 클래스 ViewAreaBanner 인터페이스를..

    자바 클래스패스

    이전부터 스프링으로 웹 서비스를 개발할 때 테스트 코드를 짜는 것에 대한 중요성은 일찍히 알고 있었다. 테스트 코드를 만들다 보면 항상 봉착하는 문제가 있었는데 내가 설정한 빈 파일 혹은 JSON과 같은 파일을 어떻게 찾아야 하는지였다. 이럴 땐 항상 이미 성공한 다른 코드를 복붙하기에 바빴다. 그러면서 클래스 패스가 무엇인지 정확하게 모른 채 넘어갔었는데 이번 기회에 부셔보자. 1. 클래스 패스(classpath) 클래스 패스는 쉽게 말해 JVM이 프로그램을 실행할 때 클래스를 찾기 위한 기준이 되는 경로라고 생각하면 간단하다. 만약 클래스 패스를 설정하지 않았다면 디폴트는 현재 경로를 바라보게 된다. 우리가 많이 사용하는 intellij IDE도 클래스 패스를 설정하지 않으면 기본적으로 현재 경로에서..

    [5편] 제네릭이란?

    Collectors에 선언된 제네릭 메소드들의 이해 java.util.Collections 에 선언된 변수 혹은 메소드를 보면 도무지 이해하기 힘든 부분들이 많다. 지금까지 1편부터 4편까지 제네릭에 대해서 공부를 해왔지만, 막상 java.util.Collections 에 선언된 메소드들을 보면 답답하다. 이번 포스팅을 통해서 어렵고 난해한 메소드에 대해 친숙해지는 기회가 되었으면 한다. 아래 java.util.Collections에 선언된 sort 메소드를 보자. 위 메소드를 보면 지금까지 공부했던 내용이 다 들어가 있다. 1편부터 4편까지의 내용을 조합해서 위 메소드를 해석하면 대충 어떠한 메소드인지 알 수 있을 것 같기도 하다. 하지만 제네릭 메소드 각각의 위치에 왜 하한 제한이 들어가고, 상한 제..

    [4편] 제네릭이란?

    제네릭은 Overloading 이 가능할까? Type Erasure에 대해서 알아보자. 한 번쯤은 제네릭 메소드를 Overloading 해서 메소드를 구현하고 싶은 생각을 해봤을 것이다.(물론, 아닐 수도 있다.) 제네릭은 Overloading 이 가능할까? 결론부터 말하면 제네릭 메소드는 Overloading 이 불가능하다. 이번 포스팅에서는 왜 Overloading 이 안되는지? 왜 제네릭과 와일드카드를 혼합해서 쓰는지? 를 알아보자. 아래와 같이 제네릭 오버로딩을 해보자 두 outBox 메소드의 매개변수 타입은 분명 서로 다른 것을 알 수 있다. 첫 번째 메소드는 Toy 타입을 상한 제한 하였으며, 두 번째 메소드는 Robot 타입을 상한 제한 하였다. 분명 두 메소드는 서로 다른 타입을 매개변수로..

    [3편] 제네릭이란?

    제한(상한, 하한)된 와일드 카드의 개념에 대한 내용이다. 왜 제한된 와일드 카드를 쓰는지 이해하고, 이를 통해 논리적인 오류까지 잡아낼 수 있는 자바의 힘에 대해 느낄 수 있다. 와일드 카드를 제한하는 방법은 크게 두 가지가 있다. 상한 제한(Upper-Bounded)과 하한 제한(Lower-Bounded)이다. 그 내용에 대해서 확실하게 이해하는게 목표이다. 참고로 제네렉은 제한하는 방법이 ‘extends’ 하나 이고, 와일드 카드는 제한하는 방법이 ‘extends’와 ‘super’이다. wildcard의 상한 제한(Upper-Bounded) 위 메소드의 파라미터를 보면, 이렇게 설명할 수 있을 것 같다. box 파라미터 변수는 Box 타입의 인스턴스의 참조 값을 전달받는 매개변수이다. 그런데 제네릭..

    [2편] 제네릭이란?

    이번 챕터의 중요한 내용은 제네릭과 와일드 카드의 차이점이다. 이것 저것 많은 내용을 참고해서 정리해보았다. 제네릭과 상속에 대한 개념을 알고 아래 내용을 보도록 하자. 해당 글은 effective java의 “[ITEM 26] 로 타입은 사용하지 말라”와 이어지는 내용이다. 제네릭 메소드 그리고 와일드 카드 제네릭 메소드는 클래스 전체가 아니라 하나의 메소드에 대해서만 제네릭 선언을 하고 싶을 때 사용도가 높다. printList1 메소드가 제네릭 메소드이다. 리스트를 파라미터로 받아서 for 문을 돌려서 출력하는 기본적인 메소드이다. printList2 메소드는 제네릭 메소드는 아니고 일반 메소드이다. 다만, 와인드 카드로 매개변수화 된 List 콜렉션을 파라미터로 받고 있다. 사실 printList..

    [1편] 제네릭이란?

    제네릭을 쓰면서도 맞게 쓰는 건지 몰라서 찝찝한 마음에 업무를 했었는데 사내 이펙티브 자바 스터디 중 발표할 수 있는 기회가 생겨 정리를 해봤다. [로 타입(Raw Type)은 사용하지 말라] 로 타입(Raw Type): 제네릭 타입에서 Type Parameter를 전혀 사용하지 않을 때를 말한다. ex) List 의 raw type은 List 이다. 아래 Raw Type의 예제를 보자. 위 예제들은 공통적으로 컴파일은 되지만 Raw Type인 리스트를 사용하여 경고가 발생한다. 그리고 이 코드를 실행하면 ClassCastException이 발생한다. 오류는 컴파일할 때 발견하는 것이 좋다. 이번 글은 제네릭에 대해서 공부했던 내용과 제네릭을 사용하여 컴파일 시에 오류를 잡아 제네릭이 주는 장점을 공유하..