Object 클래스는 객체를 만들 수 있는 구체 클래스면서 중요한 특징으로 모든 클래스의 부모 클래스라는 점이 있다는 것을 기억해야 한다. Object 클래스에는 equals, hashCode, toString, clone 등 몇 가지 메서드가 포함되어 있는데 이러한 메서드들은 모두 재정의를 염두에 두고 제작된 메서드이다. 따라서 이러한 메서드들을 재정의할 때 지켜야 하는 일반 규약들이 명확하게 정의되어 있다. 이러한 일반규약은 당연히 지켜진다고 가정되기 때문에 지키지 않았을 때 HashSet, HashMap과 같은 것에서 오동작을 발생시킬 수 있다. 이번 포스팅에서는 Object 클래스에 포함되어 있는 equals, hashCode, toString, clone 을 재정의할 때 지켜야할 일반규약에 대해..
자바 라이브러리에는 직접 close 메서드를 통해 닫아줘야 하는 것들이 많다. 가장 쉽게 접할 수 있는 Scanner 클래스부터 객체를 사용한 후 close 메서드를 통해 닫아줘야 한다. 이외에도 InputStream, OutputStream, java.sql.Connection 등 다양한 것들이 존재한다. 자원을 사용한 후 close 메서드 호출을 통해 닫아주는 것을 가볍게 생각하면 안된다. 왜냐하면 예측할 수 없는 성능 문제로 이어질 수 있기 때문이다. try-finally 전통적으로 자원을 사용한 후 닫기 위한 방법으로 아래 예제코드와 같은 try-finally를 많이 사용했습니다. static String firstLineOfFile(String path) throws IOException { B..
C, C++에서와는 다르게 JAVA에서는 GC(가비지 컬렉터) 덕분에 메모리 관리에서 어느정도 벗어나 프로그래밍에 더욱 집중할 수 있다. 하지만, 그렇다고 해서 JAVA는 메모리 관리를 하지 않아도 된다고 오해해서는 절대 안된다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { this.elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push() { ensureCapacity(); elements[size++] = e; } public ..
제목에서 느낄 수 있듯이 객체를 생성하는데도 컴퓨터 자원이 필요하기 때문에 이를 최소화하기 위한 아이템이다. 제목 그대로 불필요한 객체를 매번 생성하는 것이 아니라 하나의 객체를 재사용 함으로써 더 빠르고 세련된 코드를 짤 수 있다. (불변 객체는 언제든 재사용할 수 있다.) String s = new String("ch4njun"); String s = "ch4njun"; 위 코드에서 첫 번째 코드는 절대 하지 말아야할 극단적인 예시이다. 생성자를 통해 만들려는 객체는 인자로 넘긴 "ch4njun"과 기능적으로 완벽하게 동일한 객체이기 때문이다. 첫 번째 코드를 사용할 때마다 새로운 String 객체를 만드는데 모두 "ch4njun"과 동일한 기능을 가지는 객체가 된다. 즉 첫 번째 코드가 호출됨으로써..
이번 포스팅은 제목에서 무슨말을 하려 하는지 충분히 이해가 되리라 생각한다. 그럼 간단하게 인스턴스화를 막아야하는 상황에는 어떠한 것이 있는지 살펴보도록 하자. 정적 메서드와 정적 필드만 담은 클래스를 구성하고자 할 때 인스턴스화를 막을 수 있다. 정적 메서드와 정적 필드만 포함되어 있다면 이러한 코드들은 인스턴스를 생성하지 않아도 이미 메모리에 올라가있는 상태로 사용할 수 있다. 따라서 인스턴스화할 이유가 없는 것이다. (이 방법 자체가 객체 지향적으로 사고하지 않는 것이기 때문에 추천하진 않지만 쓰임새가 분명히 존재한다.) 예를 들면 아래 상황에서 위와 같이 정적 메서드와 정적 필드만 담은 클래스를 구성할 수 있다. java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 관련..
https://ch4njun.tistory.com/233 [아이템1] 생성자 대신 정적 팩터리 메서드를 고려하라 고전적으로 객체를 생성하는 방법에는 Public 생성자를 사용하는 방법이 있다. 하지만 이러한 방법 외에도 정적 팩토리 메서드를 제공하는 방법이 있다. 정적 팩터리 메서드란 해당 클래스의 객 ch4njun.tistory.com 위에서 정적 팩토리 메서드에 대해서 소개했는데 이러한 정적 패고리 메서드와 public 생성자에는 공통적인 애로사항이 있다. 생성자에 선택적 매개변수가 많아진다면 그에 대응하기 어렵다는 점이다. 선택적 매개변수란 특정 인스턴스 변수를 반드시 초기화하지 않아도 되는 것들에 대한 매개변수를 말한다. 예를 들어 특정 클래스에 A, B, C 인스턴스 변수가 있다고 가정했을 때 ..