본문 바로가기

전체 글6

[Effective java] Item6 : 불필요한 객체 생성을 피해라 Item6 : 불필요한 객체 생성을 피해라 객체지향 언어인 자바는 객체 생성을 통해 많은 연산들이 진행된다. 하지만, 그만큼 객체를 생성하는 것은 많은 자원이 소모된다. 메모리에 올라갈 수 있는 객체는 한정돼있다. OOME가 일어날 수도 있고 많은 객체 생성으로 인해 GC가 일어나 연산의 속도가 늦어지기도 한다. 이를 막기 위해선 불필요한 객체의 생성을 피해야 한다. 사용하지 말아야할 코드 1. 문자열 재사용 String s = new String("test"); 해당 코드를 보면 어떠한가? 저렇게 한 줄만 놓고 본다면 문자열을 생성하는데 아무 문제가 되지 않는다. for(int i = 0; i < 1000; i++) { String s = new String("test"); } 자 위의 코드는 어떠한가.. 2021. 4. 18.
[Effective Java] Item5 : 자원을 직접 명시하지말고 의존객체 주입을 사용하라 Item5 : 자원을 직접 명시하지말고 의존객체 주입을 사용하라 스프링 프레임워크를 이용해 개발하는 개발자들은 해당 제목을 보며 자신들의 해왔던 DI(dependency injection)에 대해 떠올릴 것이다. 이 Item에서는 의존하는 객체를 직접 생성하지 말고 주입들 통해 사용하라고 설명하고 있다. 의존객체의 잘못된 사용 평상시 대부분 의존하는 객체를 생성자를 통해 생성(new instance)하고 해당 객체를 사용한다. 하지만 매번 해당 객체를 생성하는 것은 리소스 낭비이기 때문에 우리는 해당 객체를 static 유틸 클래스 혹은 싱글톤 패턴을 이용해서 객체를 가져와서 사용한다. 하지만, 이는 잘못된 구현 형태이다. 책에서는 맞춤법 검사기 클래스가 의존하고 있는 dictionary 클래스에 대해 .. 2021. 4. 10.
[Effective java] Item4 : 인스턴스화를 막으려거든 private 생성자를 사용하라 Item4 : 인스턴스화를 막으려거든 private 생성자를 사용하라 종종 프로그래밍을 하다보면 정적 메서드와 정적 필드만을 담은 클래스를 본적이 있다. 이 책의 저자는 이러한 방식을 객체지향적 으로 사고하지 않는 방식이라며 얘기하지만 많은 이들이 유틸 형태의 클래스를 사용하곤 한다. 그 예로는 java.lang.Math , java.util.Arrays , java.utils.Collections등이 있다. public 생성자 위의 나열한 클래스들의 생성자를 살펴보면 모두가 private 생성자를 사용하고 있다. 그 이유는 자바는 생성자를 명시하지 않으면, 컴파일시에 자동으로 public 생성자를 만들어 주기 때문이다. 이렇게 되면, 유틸 형태의 클래스의 인스턴스화가 가능하다. 그렇다면, 본래의 취지와.. 2021. 4. 3.
[Effective java] item3 : private 생성자나 열거 타입으로 싱글턴임을 보증하라 Item3 : private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴(singleton)에 대해서 많은 자바 개발자들이 들어보았을 것이다. 자바 디자인패턴이나, 스프링에서 bean을 생성하는 정책을 설정할때 singleton을 설정하기도 한다. 싱글턴은 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴의 예로는 무상태 객체(인스턴스 필드를 포함하지 않는 객체, 혹은 컴파일 타임에 정의되어 있는 변하지 않는 상수를 가지는 객체), 혹은 설계상으로 하나의 인스턴스로 동작을 해야하는 시스템 컴포넌트의 경우를 예로 들 수 있다. 이런 싱글턴 객체는 하나의 인스턴스만을 생성해서 시스템 리소스를 아낄 수 있는 장점이 있다. 단점으로는 클래스를 인스턴스로 만들었을 경우 이를 사용하는 클라이언트.. 2021. 3. 28.