자바

    이펙티브 자바, 쉽게 정리하기 - item 13. clone 재정의는 주의해서 진행하라

    clone 재정의는 주의해서 진행하라 Clonable의 역할 복제해도 되는 클래스임을 나타내는 믹스인 인터페이스이다. Object 클래스에 protected clone()이라는 메서드가 있다. Cloneable 인터페이스는 clone() 메서드의 동작방식을 결정한다. Cloneable을 구현하지 않은 인스턴스에서 clone()을 호출하면 CloneNotSupportedException을 던진다. clone() 사용해보기 static class Entry { String key; String value; public Entry(String key, String value) { this.key = key; this.value = value; } @Override protected Object clone() ..

    자바 믹스인(mixins)이란?

    믹스인이란? 객체지향언어에서 다른 클래스에서 '사용'할 목적으로 만들어진 클래스이다. '포함'으로 설명된다. '상속'과 주로 비교되는 개념이다. (is-a vs has-a) Composition 혹은 Aggregation 이라고 불리기도 한다. 코드 재사용성을 높여주고, 상속의 단점을 해결할 수도 있다. 자바코드에서는 다중 상속의 제한이 없는 인터페이스로 구현하기 용이하다. 대상 타입의 주된 기능에 선택적 기능을 '혼합(mixed in)'한다고 해서 믹스인이라 불린다. 예제 코드 public interface Singer { AudioClip sing(Song s); } public interface Songwriter { Song compose(..

    이펙티브 자바, 쉽게 정리하기 - item9. try-finally보다는 try-with-resources를 사용하라

    try-finally보다는 try-with-resources를 사용하라 자바 라이브러리 내부의 close() 메서드 자바에서는 종종 .close() 메서드를 통해 자원을 닫아줘야 하는 경우가 있다. 주로 외부의 리소스를 사용했을 때이다. 외부의 리소스는 로컬 PC 환경에 존재하는 리소스일 수도 있고, 네트워크로 연결된 다른 컴퓨터에 존재하는 리소스(Connection)일 수도 있다. finalizer를 안전망으로 활용하긴 하지만, item8에서 배웠듯 딱히 믿을만하진 않다. try-finally를 이용하여 리소스 닫기 예제 1 - 반환할 자원이 1개일 때 static String firstLineOfFile(String path) throws IOException { BufferedReader br = ..

    이펙티브 자바, 쉽게 정리하기 - item7. 다 쓴 객체 참조를 해제하라

    다 쓴 객체 참조를 해제하라 Stack 코드의 예제 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 Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } pri..

    이펙티브 자바, 쉽게 정리하기 - item6. 불필요한 객체 생성을 피하라

    불필요한 객체 생성을 피하라 객체 생성의 비용 객체를 매번 생성하고 지우는 것은 반복적으로 발생했을 때 큰 비용이 될 수 있다. 물론 현대 컴퓨터의 성능이 많이 좋아서 작은 객체는 큰 부담이 되지 않을 수도 있다. 계속 같은 내용의 객체를 사용할 것이라면 불변 객체를 만들어놓고 재사용하는 것이 좋다. 불필요한 객체 생성의 예 String 객체의 예 String s = new String("bikini"); 위 코드는 안티패턴이다. 결국 bikini라는 문자열을 사용하고 싶은 건데, 굳이 JVM 문자열 풀에서 가져오지 않을 이유가 없다. String s = "bikini"; 더 간결하면서도 더 옳은 코드이다. Boolean 객체의 예 Boolean boolean = new Boolean(true); 과연 ..

    토비의 스프링 2장 요약 정리 - 테스트

    이 포스팅은 2장을 요약 정리한 것이며, 상세한 정리는 이 링크에서 제공한다. 스프링과 테스트 스프링에서 제공하는 가장 중요한 가치 객체지향, 테스트 현대의 앱이 복잡해져가며, 테스트의 중요성은 더욱 높아지고 있다. 좋은 코드는 테스트하기 쉬운 코드라는 특징을 갖는 경우가 많다. 변화에 대응하는 전략 IoC 그리고 DI 스프링의 의존관계 주입형 코드는 로직 코드의 직접적인 수정이 아닌 외부에서 주입하는 객체의 설정정보를 바꾸는 것만으로 손쉬운 변화가 가능하다. 테스트 코드에 변화가 생겼을 때, 해당 코드가 특정 로직에서 정상적으로 작동하는지 알 수 있게 해준다. 테스트 전략 나쁜 테스트의 예 - 웹을 통한 테스트 테스트하고자 하는 코드 외에 부가적인 코드가 너무 많이 들어간다. 모든 레이어의 기능을 다 ..

    자바 스트링 풀에 대해 쉽게 이해하기

    자바의 스트링 풀 String 객체의 값은 불변이다. 자바에 익숙하지 않은 사람은 String 객체의 값이 불변이라는게 무슨 뜻인지 잘 모를 것이다. 불변이란 것은 한번 저장된 값이 절대 변하지 않는다는 뜻이다. 그런데, String 타입의 변수를 선언하고, 내부의 값을 바꾸면 값이 잘 바뀌는 것처럼 보이는 것은 왜일까? 사실 우리가 문자열 변수의 내용을 변경할 때는 실제로 값이 변경되는 것이 아니라, 스트링풀이라는 저장소에 미리 사용될 문자들이 몽땅 저장되어 있는데, 문자열 변수의 내용 자체가 바뀌는 것이 아니라 문자열 변수가 가리키는 주소만 바뀌는 것이다. @Test public void immutableString() { String a = "abc"; System.out.println("a의 시스..

    이펙티브 자바, 쉽게 정리하기 - item4. 인스턴스화를 막으려면 private 생성자를 사용하라

    인스턴스화를 막으려면 private 생성자를 사용하라 인스턴스화를 막아야 하는 경우 유틸 클래스를 만들 때 java.lang.Math, java.util.Arrays, java.util.Collections와 같은 유틸 클래스를 구성하는 경우에는 해당 클래스가 쓸데없이 인스턴스화 되는 것을 막아야 한다. 객체지향적으로는 곱게 보이지 않을 수 있는 사용방식이다. 유틸 클래스 용도 1: 특정 인터페이스를 구현하는 객체 생성 팩토리 메서드를 모아놓는다. // from Collections 클래스 public static Map synchronizedMap(Map m) { return new SynchronizedMap(m); } Map 인터페이스 타입 객체를 넣으면, SynchronizedMap을 반환해주는 ..

    제네릭 싱글턴 팩토리

    제네릭 싱글턴 팩토리란? public class GenericFactoryMethod { public static final Set EMPTY_SET = new HashSet(); public static final Set emptySet() { return (Set) EMPTY_SET; } } 제네릭으로 타입설정 가능한 인스턴스를 만들어두고, 반환 시에 제네릭으로 받은 타입을 이용해 타입을 결정하는 것이다. 예제 코드 @Test public void genericTest() { Set set = GenericFactoryMethod.emptySet(); Set set2 = GenericFactoryMethod.emptySet(); Set set3 = GenericFactoryMethod.emptySet..

    이펙티브 자바, 쉽게 정리하기 - item2. 생성자에 매개변수가 많다면, 빌더 패턴을 고려하라

    생성자에 매개변수가 많다면 빌더를 고려하라 생성자에 매개변수가 많다면? 영양 정보를 제공해야 하는데, 클래스 내부에 멤버 필드가 매우 많다고 가정하자. static class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; ... } 위 상황에서 경우의 수 별로 생성자로 만드는 것은 무리가 있다. 총 6개의 필드가 있고 이 중에 3개를 뽑는 것만 해도 경우의 수가 6*5*4/3*2가 나온다. 혹여나 만든다해도 실제 객체를 생성..

    자바 WeakMap 쉽게 알아보기

    자바의 Reference 알아보기 자바의 WeakMap 을 이해하기 위해서는 자바의 Reference 를 이해해야 한다. Reference는 WeakHashMap을 이해하기 위한 선행 지식이다. 자바에서는 기본으로 지원하는 int, long, float 과 같은 primitive 타입이 아닌 클래스를 이용하여 변수를 구성하는 경우, Reference 라는 것을 이용하여 변수에 Heap 메모리 영역 내부 실제 값이 있는 주소를 연결시킨다. 보통 변수가 직접 값을 가지고 있는 것이 아니다. 변수는 메모리 주소만 가지고 있는 것이다. Strong Reference (강한 참조) Integer myNumber = 10; 우리가 가장 일반적으로 이용하는 그냥 변수 할당이다. 이를 강한 참조라고 한다. myNumb..

    플라이 웨이트 패턴

    플라이웨이트 패턴(flyweight pattern)이란? 정적인 저장소를 만들어 놓은 뒤에 여러 클래스에서 공용으로 사용할만한 것을 저장해놓고 갖다 쓰는 것을 플라이웨이트 패턴이라고 한다. 실생활에 비유하자면, 마트에서 여러가지 종류의 라면을 미리 사서 주방 찬장에 넣어놓으면 마트에 다녀올 필요가 없는 것과 비슷하다. 실제 사용 예로 자바의 스트링 풀이 있다. @Test public void flyWeightPattern() { String s = "hello"; String s1 = new String("hello"); String s2 = "hello"; System.out.println("s == s1 ? " + (s == s1)); // true System.out.println("s == s2 ..

반응형