자바는 두 가지 객체 소멸자를 제공합니다. 그 중 finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요합니다. 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 합니다. finalizer는 나름의 쓰임새가 몇 가지 있긴 하지만 기본적으로 쓰지 말아야 합니다. 그래서 자바 9에서는 finalizer를 사용 자제(deprecated) API로 지정하고 cleaner를 그 대안으로 소개합니다. ⇒ 하지만 자바 라이브러리에서도 finalizer를 여전히 사용합니다. cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요합니다. 자바에서는 접근할 수 없게 된 객체를 회수하는 역할을 가비지 컬렉터가 담당하고, 프로그래머에게는 아무런 ..
C, 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_INITAL_CAPACITY]; } public void push(..
똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많습니다. 재사용은 빠르고 세련됐습니다. 특히 불변 객체(아이템 17)는 언제든 재사용할 수 있습니다. 다음 코드는 하지 말아야 할 극단적인 예입니다. String s = new String("bikini"); // 따라 하지 맙시다! 이 문장은 실행될 때마다 String 인스턴스를 새로 만듭니다. 완전히 쓸데없는 행위입니다. 생성자에 넘겨진 "bikini" 자체가 이 생성자로 만들어내려는 String과 기능적으로 완전히 똑같습니다. 이 문장이 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없는 String 인스턴스가 수백만 개 만들어질 수도 있습니다. 다음은 개선된 버전의 코드입니다. String s = "bikini"..
싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말합니다. 싱글턴의 전형적인 예로는 함수(아이템 24)와 같은 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있습니다. 그런데 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있습니다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이죠. 싱글턴을 만드는 방식 싱글턴을 만드는 방식은 보통 둘 중 하나입니다. 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해둡니다. [1]. publ..
정적 패터리와 생성자에는 똑같은 제약이 하나 있습니다. 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점입니다. 이런 클래스용 생성자 혹은 정적 팩터리는 어떤 모습일까요? 점층적 생성자(telescoping constructor) 패턴 프로그래머들은 이럴 때 점층적 생성자 패턴을 즐겨 사용했습니다. 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 2개까지 받는 생성자 형태로 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식입니다. 다음 코드가 그 예입니다. 지면상 선택 매개변수가 4개까지 늘어난 코드를 예로 들었습니다. public class NutritionFacts { private final int servingSize; // 필수 pri..
클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다. 다음 코드는 boolean 기본 타입의 박싱 클래스(boxed class)인 Boolean에서 발췌한 간단한 예시 코드다. 이 메서드는 기본 타입인 boolean 값을 받아 Boolean 객체 참조로 변환해준다. package java.lang; public final class Boolean implements java.io.Serializable, Comparable { /** * The {@code Boolean} object corresponding to the primitive * value {@code true}. */ public static final Boolean TRUE = new Boolean(true); /..
자바 8에는 다양한 기술들을 살펴보려고 하는데, 그 세 번째는 메서드 레퍼런스이다. 람다가 하는 일이 기존 메서드 또는 생성자를 호출하는 거라면, 메서드 레퍼런스를 사용해서 매우 간결하게 표현할 수 있다. 메서드 레퍼런스 실습을 위해 간단한 클래스를 작성하였다. public class Greeting { private String name; public Greeting() { } public Greeting(String name) { this.name = name; } public String hello(String name) { return "hello " + name; } public static String hi(String name) { return "hi " + name; } public Str..
자바 8에는 다양한 기술들을 살펴보려고 하는데, 그 첫 번째는 함수형 인터페이스다. 함수형 인터페이스에 대한 설명 예전부터 사용이 되던 인터페이스 추상 메서드가 딱 하나만 있으면 함수형 인터페이스가 된다. Single Abstract Method(SAM) 인터페이스 abstarct는 생략 가능 인터페이스임에도 불구하고 인터페이스 내부에 static 메서드, default 메서드를 다룰 수 있다. static 메서드나 default 메서드가 있더라도 이 외의 추상 메서드가 단 하나라면 함수형 인터페이스가 된다. 자바가 제공해주는 @FunctionalInterface 애너테이션을 통해 인터페이스를 보다 견고하게 관리할 수 있다. @FunctionalInterface public interface DoSome..
- Total
- Today
- Yesterday
- 이펙티브 자바
- kkoon9
- AWS
- 디자인 패턴
- Kotlin
- 객체지향
- 이팩티브 자바
- BOJ
- 백준
- 코테
- 디자인패턴
- 클린 아키텍처
- node.js
- programmers
- 클린 코드
- Olympiad
- JPA
- 프로그래머스
- BAEKJOON
- Spring
- MSA
- Algorithm
- Java
- 정규표현식
- C++
- Effective Java
- kotest
- 알고리즘
- 테라폼
- Spring Boot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |