오봉이와 함께하는 개발 블로그
객체 생성 - 정적 팩토리 메소드 본문
정적 팩토리 메소드
정적 팩토리 메서드란 객체 생성의 역할을 하는 클래스 메소드라고 할 수 있겠다.
아래 예시 코드를 보자
public class User {
private String id;
private String password;
public User(String id, String password) {
this.id = id;
this.password = password
}
public static User createUser(String id, String password) {
return new User(id, password);
}
}
위 코드처럼 객체를 new
생성자를 통해 생성하는 것이 아니라, 메소드를 통해서 객체를 생성하는 것을 정적 팩토리 메소드라고 한다.
가장 중요한 것은 이것을 왜 사용하느냐?를 아는 것이라고 생각하기 때문에 바로 어떤 장점을 얻을 수 있는지 알아보자.
메소드이기 때문에 이름이 생긴다.
객체를 만들어서 어떤 용도로 사용할 것인지에 따라 필요한 파라미터가 달라질 것 이다.new
생성자로 객체를 생성하면 내부 구조를 파악하고 있어야 목적에 맞게 객체를 생성할 수 있다.
또, 타인이나 본인이 나중에 코드를 봤을 때 어떤 용도로 생성하는지 알 수 없을 수 있기 때문에 메소드 이름으로 용도나 목적을 담아내면 코드 가독성에 도움을 줄 수 있다는 장점이 생긴다.
하위 객체 반환이 가능하다.
하위 객체를 반환하는 것은 상속을 할 때 볼 수 있다.
정적 팩토리 메소드는 생성자의 역할을 하기 때문에 반환값을 가지고 있음에서 얻을 수 있는 특징이다.
아래 코드를 참고하자
public class User {
private String id;
private String password;
public User(String id, String password) {
this.id = id;
this.password = password
}
public static User of(String id, String password) {
if(id.equals("XXX")) {
return AdminUser();
}
else {
return NormalUser();
}
}
}
캡슐화가 가능하다
먼저 캡슐화에 대하여 알아보자.
캡슐화(Encapsulization
)란 객체의 속성과 행위를 하나로 묶고 실제 구현 내용을 은닉하는 것을 만한다. 생성자를 메서드 안에 숨겨서 내부 상태를 외부에 드러내지 않고 객체 생성을 단순화 하고, 정해진 메소드를 통해 상호작용하도록 유도한다.
아래 코드를 보자
public class UserDto {
private String id
private String password;
pulbic static UserDto from(User user) {
return new UserDto(user.getId(), user.getPassword());
}
}
// User to UserDto
UserDto userDto = UserDto.from(user);
정적 팩터리 메서드를 통해 내부 구현을 모르더라도 쉽게 변환할 수 있다.
만약 정적 팩토리 메소드를 사용하지 않는다면 외부에서 생성자의 내부구현을 모두 드러내야 한다.
UserDto userDto = UserDto.from(user); // 정적 팩토리 메소드 사용
UserDto userDto = new UserDto(user.getId(), user.getPassword()); // 정적 팩토리 메소드 미사용
정리
정적 팩토리 메소드는 생성자 역할뿐 아니라 가독성 좋은 코드를 작성할 수 있도록 도와주고 객체지향적 프로그래밍에 도움을 준다.
도메인에서 객체 생성
의 역할 자체가 중요하다면, 정적 팩토리 메소드 사용을 고려하자.
'자바' 카테고리의 다른 글
강한 결합 깨기 (상속 part) - 내 코드가 그렇게 이상한가요? (0) | 2023.11.16 |
---|---|
결합도와 책무 - 내 코드가 그렇게 이상한가요? (1) | 2023.11.14 |
성숙한 클래스 - 내 코드가 그렇게 이상한가요? (0) | 2023.11.12 |
Java - Reflection API (0) | 2022.11.26 |
Java - Stream의 기본 개념 (0) | 2022.11.26 |