꾸준한 스터디
article thumbnail
[Item 4] 인스턴스화를 막으려거든 private 생성자를 사용하라
Effective Java/정리 2023. 1. 9. 21:47

정적인 필드와 메서드를 담은 클래스의 구현은 객체 지향적인 사고는 아니자만, 공통점이 있는 메서드 혹은 팩터리들을 제공할 때 사용되기도 한다. 자바 진영에서 제공하는 기본 타입, 유틸성 인터페이스 등이 있고, 이외로 final 클래스가 있다. 위 예시처럼 정적으로 선언한 만큼 인스턴스 생성하지 못하도록하는 설계 의도가 담겨 있다. 여기서 아이템 4의 제목의 의미가 나타난다. 설계 의도대로 인스턴스화를 막으려면, private 생성자를 선언하라는 것이다. 생성자를 선언하지 않으면, 기본 생성자가 컴파일 타임에 생성되기 때문이다. Private로 선언하여도 클래스 내부에서는 접근이 가능하기에 생성자 호출 시 Assertion Error 예외를 방생시켜 실수를 방지 할 수 있다. 또한 상속 관계에서 하위타입 ..

article thumbnail
팩터리 패턴 (Factory Pattern)
Effective Java/정리 2023. 1. 9. 00:38

팩토리 패턴이란 객체 생성을 위해 필요한 인터페이스를 만든 후, 인터페이스를 구현한 팩토리를 통해 어떤 객체를 만들지 결정하는 디자인 패턴이다. 종류 공통점 차이점 팩터리 메서드 패턴 객체의 생성부 캡슐화를 통해 낮은 결합도를 만들며 구체적인 타입에 의존하지 않도록 해준다. 상속을 통해 팩토리 메서드를 오버라이딩하여 생성부를 구현한다. 추상 팩토리 패턴 객체 집합을 생성하기 위한 정의를 추상객체에 위임하고 구현체에서 세부적인 집합 생성 과정을 구현한다. 팩토리 메서드 패턴 생성할 객체 타입을 예측할 수 없거나 객체 생성의 책임을 서브 클래스에게 위임하고 정보 은닉을 하고자 할때 사용된다. 장점 - 객체지향의 원칙 중 하나인 개방 폐쇄의 원칙에 의거할 수 있다. 즉, 확장에는 열려있고 변경에는 닫혀있다. ..

아이템6 불필요한 객체 생성을 피하라
Effective Java/정리 2023. 1. 8. 23:13

같은 기능이 요청올 때 마다 매번 새로운 인스턴스를 생성하기 보다는 하나의 객체가 재사용되는게 나을때가 있다. 불변객체라면 언제든 재사용할 수 있다. 문자열을 변수에 할당 할 때 String s = new String ("문자열"); String s2 = "문자열"; 생성자 방식은 매번 인스턴스를 만들지만 리터럴 방식은 하나의 String 인스턴스를 사용한다. 또한 이 방식은 똑같은 문자열을 선언할 경우 fly weight pool에 있는 문자열 참조값을 같이 사용할 수 있다. Boolean 클래스의 생성자 같은 경우 deprecated 되어 있으므로 정적 팩터리 메서드인 Boolean.valueOf(string)을 사용하는 것이 좋다. 생성 비용이 비싼 객체 (CPU나 메모리 많이 잡아먹는 애)라면 더..

아이템5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
Effective Java/정리 2023. 1. 8. 19:29

어플리케이션을 만들다보면 어떤한 객체의 기능을 공통적으로 사용해야 하는 경우가 생긴다. 예를 들어 맞춤법 검사기라는 객체를 만들고 맞춤법 검사하는 메서드를 만들어 어디에서든 문장값이 주어지면 맞춤법이 맞는지 true, false 값을 내뱉는 메서드를 만든다고 가정했을 때 개발자는 정적 유틸리티 클래스를 만들어 전역으로 사용하려 할 수 있다. 맞춤법 검사를 할때 받은 문자열을 확인하려면 사전객체에 의존하게 된다. 클래스 내에 사전 객체가 생성되어 사용하는데 이 사전객체를 개발 초기에는 한글사전만 필요하다고 했다 치더라도 어플리케이션이 커져가며 영어도 검사하고 일본어, 중국어도 검사하게 될 가능성이 있다면 클래스에서 여러 자원 인스턴스를 지원하게 해야 유연해진다. 정적 유틸리티 클래스와 싱글턴 방식은 1개의..

article thumbnail
아이템 4 인스턴스화를 막으려거든 private 생성자를 사용하라
Effective Java/정리 2023. 1. 8. 03:36

static method와 static field 만을 담은 클래스. 보통 유틸성 클래스로 helper의 성격을 갖는 클래스 DateUtility나 StringUtility 공통으로 쓰여질 메서드나 변수를 선언해 놓는 곳. 이런 클래스들은 클래스 메서드와 클래스 인스턴스이니 객체 인스턴스가 필요없는 클래스가 되는데 인스턴스화를 막기위해 abstract 클래스로 만들어 주는 방법이 있지만 해당 클래스를 자식이 상속을 받게되면 인스턴스화가 가능해진다. 프로그램이 시작되면서 (Run) .class 파일들이 JVM 으로 실행되면서 할당된 메모리에 올라갈 때 static이 붙은 멤버들은 static 영역에 할당되어 종료가 될 때까지 전역에서 사용이 가능하다. Heap 영역은 객체가 생성될 때 인스턴스화 된 애들이..

article thumbnail
[Item 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라
Effective Java/정리 2023. 1. 7. 00:52

싱글턴은 인스턴스를 오직 하나만 생성하여 재사용하는 클래스이며 무상태, 유일 객체이다. 인터페이스 정의 없이 클래스를 싱글턴으로 만들면 유일 객체이므로 비용 등이 고려 될 경우 테스트가 불가피해진다. 따라서, 인터페이스 정의 및 구현을 통해 Mock 객체 구현을 통해 테스트를 진행해야한다. mock 테스트 방식이 궁금하다면 하단 github 링크의 mock_test 예제 코드를 참고 바란다. 싱글턴 방식에는 필드, 정적 팩터리, 열거 타입 3가지로 볼 수 있다. 필드 방식 private 기본 생성자를 만들어 놓았기에 필드를 초기화 할 때 한번 호출되어 하나뿐임이 보장된다. 또한 API를 통해 싱글턴 클래스 임을 명확하게 드러낼 수 있고 방식이 간결하다. public class Person { public..

article thumbnail
[Item 2] 생성자에 매개변수가 많다면 빌더를 고려하라
Effective Java/정리 2023. 1. 6. 00:10

필수가 아닌 선택적인 매개변수가 많을때 정적 팩터리와 생성자로 대응하기 쉽지 않다는 점이다. 점층적 생성자 패턴 - 선택 값을 하나씩 추가하여 생성자를 점층적으로 만드는 패턴이다. 매개변수의 개수나 타입이 일치하지 않을 경우 컴파일 오류를 통해 누락된 값을 확인할 수 있는 안전성을 가지고 있다. 그러나, 적당한 개수의 매개변수에 대한 점층적 생성자 패턴은 괜찮아 보일지 몰라도 점점 많아지는 생성자로 클래스 코드의 추가 수정 삭제등 유지보수에 대한 불편함이 있다. 또한 각 생성자의 의미, 어떠한 매개변수가 들어가야 하는지에 대한 가독성이 떨어진다.. public class Jwt { private static final String SECRET_KEY = "1234"; // JWT Secret Key pr..

article thumbnail
[Item 1] 생성자 대신 정적 팩터리 메서드를 고려하라
Effective Java/정리 2023. 1. 4. 00:09

정적 팩터리 메서드란? 클래스 타입의 인스턴스 생성 방식에는 new 연산자를 통한 생성자 호출 방법 대신 정적 팩터리 메서드를 제공할 수 있다. 정적 팩터리 메서드의 장점이 있지만 단점 또한 존재한다. 장점 1. 이름을 가질수 있다. 널리 사용되는 네이밍 컨벤션이 존재하며 자유로운 이름 지정을 통해 생성자에 비해 명확하다. 생성자의 경우 클래스와 동일한 이름과 매개변수의 타입과 개수의 차이를 두어 다양하게 제공 가능하나 각 생성자에 대한 설명 없이는 파악하는데 어려움이 있다. public class Pros1 { private String name; // private 생성자 private Pros1(String name) { this.name = name; } public static Pros1 of(..