자바

Study/이펙티브 자바

[Effective Java 3E] Comparable을 구현할지 고민하라

💥 개요 compareTo는 equals, hashcode, toString과 다르게 Object의 메서드가 아닙니다. 그리고 equals와 2가지만 제외하면 거의 비슷한데, compreTo는 동치성 비교에 더해 순서까지 비교할 수 있으며, 제네릭합니다. 즉 Compareble을 구현하게 된다면 그 클래스의 인스턴스에는 자연적인 순서가 있음을 뜻합니다. 그래서 Compareble을 구현한 객체의 배열은 Arrays.sort(a)와 같이 손쉽게 정렬이 가능합니다. public class WordList { public static void main(String[] args) { Set s = new TreeSet(); Collections.addAll(s, args); System.out.println(s..

Study/이펙티브 자바

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

💥 개요 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말합니다. 싱글턴의 전형적인 예시로 함수와 같은 무상태성(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있습니다. 그런데 클래스를 싱글턴으로 만들면 사용하는 클라이언트를 테스트하기가 어려워 질 수 있습니다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 mocking 할 수 없기 때문입니다. 💡싱글턴을 만드는 방식 우선 생성자를 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해둡니다. 1. public static 멤버가 final 필드인 방식 private 생성자는 public static 필..

Study/이펙티브 자바

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

💥 개요 정적 팩터리와 생성자에는 똑같은 제약이 하나 있습니다. 매개변수가 많은 경우 문제가 발생하는데, 만약 20개, 30개의 멤버 변수를 가지는 경우가 문제가 발생합니다. 물론 멤버변수가 모두 필수값이라면 클래스로 묶어 처리하는 방법도 있겠지만, 대부분의 경우 대다수의 값이 기본값(0, 혹은 DB에서 정의된 Default Value)이 포함되는 경우가 많이 발생하게 됩니다. 또한 선택적 매개변수를 받아야 하는 경우, 기존에는 원하는 매개변수의 개수에 따라 생성자나 정적 팩터리를 늘려야하는 경우가 발생합니다. 이 클래스의 인스턴스를 만들려면 원하는 매개변수를 모두 포함한 생성자 중 가장 짧은것을 골라 호출하면 됩니다. 하지만 이런 점층적 생성자 패턴은 위에 말한 것처럼 매개 변수의 개수가 늘어날수록 코..

Study/이펙티브 자바

[Effective Java 3E] 생성자 대신 정적 팩터리 메서드를 고려하라

💥 개요 보통 개발시 public 생성자를 자주 사용하는데, 이펙티브 자바에서 조슈아 형님이 정적 팩터리 메서드를 사용하면 아주 행복한 상황들이 일어난다고 합니다. 아래에서 계속 얘기해 볼 텐데 정적 팩터리 메서드는 그 클래스의 인스턴스를 반환하는 생성자와 동일한 역할을 하는 단순 static method를 제공하는 것을 정적 팩터리 메서드라고 합니다. ❤️ 장점 1. 이름을 가질 수 있다. 위와 같은 단순한 생성자를 생각해보면, 생성자를 넘기는 매개변수와 생성자 자체만으로 반환되는 객체의 특성을 정확하게 설명하지 못합니다. 하지만 정적 팩터리는 이름만 잘 지어주게 된다면 특성을 제대로 설명이 가능합니다. 클이언트는 컴퓨터를 얻고 싶다면 compuer를 얻는 정적 팩터리 메서드를 호출하면 되고, 책을 얻..

Languege/Java & Spring

Junit5 상속관계에서 BeforeEach 순서

최근 TDD와 테스트 코드에 사랑에 빠져 사내 프로젝트에 테스트 커버리지를 높이고 있는데 Api 테스트를 할때 보통 로그인이 전제가 되어야 하는데, 도메인 별 테스트를 만들때마다 계속 반복되는 로그인을 하는 로직을 넣는 바보같은 행동을 하고 싶지 않아서 ApiTest를 만들어두고 이곳에 로그인 로직을 두고 Domain 별 테스트에서는 API만 테스트하려 하는데 이때 beforeEach의 순서를 정해야 하는 일이 발생했습니다. Junit5 상속관계에서 BeforeEach 순서는 어떻게 될까? 아래 코드에서 보면 ApiTest의 setUp이 먼저 실행되는걸 확인할 수 있습니다. public class DomainTest extends ApiTest { @BeforeEach void setUp1() { Sys..

Languege/Java & Spring

[JAVA] 자바 Static

Static은 고정된이라는 의미를 가지고 있다. Static 키워드를 사용한다면 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 말한다. 즉, 수명의 주기가 프로그램과 같아 진다는 것이다. 일반적으로 Class는 Static 영역에 생성되고, new 연산을 통해 생성한 Instance는 Heap 영역에 생성된다. Heap영역의 메모리는 Garbege Collector를 통해서 계속해서 관리된다. 하지만 Static 키워드를 통해 생성이 된다면 Static 영역에 할당된 메모리는 모든 객체가 공유하는 특성을 지니며, 이는 Garbege Collecor를 통해서 관리되는 영역이 아니기 때문에 Static을 자주 사용한다면 시스템 성능이 떨어질 수 있다. Static 변수의 특징 - 즉시 호출 가능..

mntdev
'자바' 태그의 글 목록 (2 Page)