전체 글

전체 글

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

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

    SQL Server, DB 인덱싱 간단 정리

    이 글은 천천히 차근차근 읽으시는 것을 추천드립니다. 처음 접하면 내용이 매우 어렵습니다. DB Server 인덱싱에 대한 간략한 설명 참고링크 인덱싱 했을 때 장점 데이터 검색이 매우 빠르다. 데이터의 중복이 방지된다. (Primary key, Unique) LOCK 이 최소화 된다. 그와 동시에 동시성이 증대된다. 인덱싱 했을 때 단점 물리적인 공간을 차지한다. 기존의 데이터를 복사해 인덱싱하기 때문에 테이블의 소비 용량이 2배가 된다. 인덱스에 대한 유지/관리 부담이 생긴다. 어떤 테이블에 어떤 인덱스가 있는지 잘 관리해야 한다. 데이터가 적다면 유지/관리 부담이 더 클 수 있다. 데이터가 매우 작은 경우, 인덱싱 장점이 별로 쓸모가 없다. 인덱싱에 따른 테이블 구조의 3가지 형태 (힙, 클러스터형..

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

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

    토비의 스프링 1장 요약 정리 - 오브젝트와 의존관계

    토비의 스프링 1장 요약 정리 - 오브젝트와 의존관계

    이 글은 요약 정리이며, 상세한 정리는 여기 에 있다. 1.1 초난감 DAO public class UserDao { public void add(User user) throws SQLException, ClassNotFoundException { Class.forName("org.postgresql.Driver"); String user = "postgres"; String password = "password"; Connection c = DriverManager.getConnection( "jdbc:postgresql://localhost/toby_spring" , user , password ); PreparedStatement ps = c.prepareStatement( "insert into ..

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

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

    이펙티브 자바, 쉽게 정리하기 - item5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

    자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 정적 유틸리티 클래스와 싱글턴 클래스의 남용 문제 정적 유틸리티 클래스로 구현한 맞춤법 검사기 살펴보기 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 인스턴스 생성 방지 public static boolean isValid(String word) { ... } public static String suggestions(String typo) { ... } } 이전에 우리는 정적 유틸리티 클래스를 배웠다. 위의 코드는 정적 유틸리티 클래스를 활용한 맞춤법 검사기의 예이다. 싱글턴 클래스로 구현한 맞춤법 검사기 살펴보..

    이펙티브 자바, 쉽게 정리하기 - 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을 반환해주는 ..

    이펙티브 자바, 쉽게 정리하기 - item3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

    private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴 패턴의 쓰임새 무상태 객체 (오직 메서드 실행을 위해 쓰이는 객체 등) 설계상 유일해야 하는 시스템 컴포넌트 싱글턴 패턴의 단점 싱글턴 객체를 사용하는 클라이언트의 테스트가 어려워짐 mock이 어려워진다. 싱글턴 구현법 생성자를 private으로 숨긴다. 인스턴스를 public static final 멤버에 생성해놓고 불러 쓴다. 인스턴스는 private static final 멤버에 넣어놓고, 공개된 public static 메서드로 불러 쓴다. INSTANCE 자체를 public으로 공개하기 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elv..

    제네릭 싱글턴 팩토리

    제네릭 싱글턴 팩토리란? 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 ..

반응형