☕️ Java/이펙티브 자바

자바는 가비지 컬렉터가 있으므로, 개발자는 메모리 관리에 신경쓰지 않아도 된다고 오해할 수 있으나, 사실을 전혀 그렇지 않다. 물론 C같은 언어에 비해 신경쓸 부분이 적어지는건 사실이지만.. 다음 코드를 보며 설명을 이어가겠다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack(){ elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e){ ensureCapacity(); elements[size++] = e; } public ..
똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 재사용은 빠르고 세련되다. 특히 불변 객체는 언제든지 재사용할 수 있다. 다음 코드는 하지 말아야 할 극단적인 예시이다. String s = new String("신동훈"); 이 문장은 실행될 때마다 String 인스턴스틀 새로 만든다. 완전히 쓸데없는 행위다. 생성자에 넘겨진 "신동훈" 자체가 이 생성자로 만들어내려는 String과 기능적으로 완전히 똑같다. 이 문장이 반복문이나 빈번하게 호출되는 메서드 안에 있다면 쓸데없는 String 인스턴스가 수백만 개 만들어질 수도 있다. String s = "신동훈"; 이 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다. 이에 관련되서는 아..
대부분의 클래스들은 하나 이상의 자원(클래스)에 의존한다. 책에서는 맞춤법 검사기를 예로 들었는데, 한번 살펴보자. 여기 사전에 의존하는 맞춤법 검사기가 있다. 정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private static final Lexicon dictionary = new Lexicon(); private SpellChecker() {} //객체 생성 방지 public static boolean isValid(String word){ //... } public static List suggestions(String typo){ //... } } 위처럼 SpellChecker를 정적 유틸리티 클래스로 만들면 유연하지 않고 테스트하기가 어렵다. 싱글턴을 잘..
개발을 하다 보면 단순히 정적 메서드와 정적 필드만을 담은 클래스(유틸리티 클래스)를 만들고 싶을 때가 있을 것이다. 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이기에 그리 곱게 보이지는 않지만 분명 나름의 쓰임새가 있다. 예컨대 java.lang.Math와 java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리)를 모아놓을 수도 있다. 마지막으로 final 클래스와 관련한 메서드들을 모아놓을 때도 사용한다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 때문이다. 만약 정적 멤버만 담은 유틸리티 클래스를 만들 때, 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 하지만 우리는 유틸리티 ..
싱글턴(Singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴에 대해서는 필자가 정리해 둔 글을 참고하자. [Spring] 싱글톤 컨테이너 (feat. 싱글톤을 구현하는 여러 방식) 싱글톤 싱글톤 패턴은 어떤 클래스의 인스턴스가 오직 하나만 생성되는 것을 보장하며, 이 인스턴스에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴이다. 싱글톤 구현 1. Eager Initialization (이 ttl-blog.tistory.com 클래스를 싱글톤으로 만들면, 이에 대한 테스트코드 작성이 어려워질 수 있다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(Mock) 구현으로 대체할 수 없기 때문이다. 싱글턴을 구현하는 방..
정적 팩터리와 생성자에는 똑같은 제약이 하나 있다. 바로 선택적 매개변수가 많을 때 적절하게 대응하기가 어렵다는 것이다. 점층적 생성자 패턴을 사용할 수 있지만, 매개변수의 개수가 많아질수록 클라이언트 코드를 작성하기에도, 읽기에도 어렵다. 코드를 읽을 때 각 값의 의미가 무엇인지 헷갈릴 것이고, 매개변수가 몇 개인지도 주의해서 세어보아야 할 것이다. 이럴 때 대안으로는 자비빈즈 패턴(JavaBeans pattern)이 있다. 매개변수가 없는 생성자로 객체를 만든 후, 세터를 이용해서 원하는 매개변수의 값을 설정하는 방식이다. 그러나 이러한 방식은 또 다른 단점을 지니는데, 객체 하나를 만들려면 메서드를 여러개 호출해야 하고, 객체가 완전히 생성되기 전까지는 일관성(consistency)이 무너진 상태에..
클래스의 인스턴스를 얻는(생성하는) 전통적인 수단은 public 생성자이다. 그러나 클래스는 생성자와 별도로 정적 팩터리 메서드(static factory method)를 제공할 수 있다. 정적 팩터리 메서드는 객체 생성의 역할을 담당하는 클래스의 메서드이며, 다음은 boolean의 기본 타입인 Boolean에서 발췌한 간단한 예시이다. 정적 팩터리 메서드를 사용하는 방식은 당연히도 장점과 단점이 모두 존재한다. 먼저 장점에 대해서 알아보도록 하자. 정적 팩터리 메서드의 장점 1. 이름을 가질 수 있다. 생성자에게 넘기는 매개변수와 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명하지 못한다. 그에 비해 정적 팩터리 메서드는, 메서드이므로 이름을 가질 수 있으며, 이름만 잘 지은다면 반환될 객체의 특..
말 랑
'☕️ Java/이펙티브 자바' 카테고리의 글 목록 (2 Page)