본문 바로가기

Language/Java

Named Parameter와 Builder Pattern

728x90
반응형

 

 

요새 Java 코드를 볼 일이 부쩍 늘어났다. 회사에서 사용하는 언어가 Java이기 때문에 당연한 일이 아닌가 싶다. 이제껏 신명 나게 Python을 사용하다가 Java를 보려니 눈에 안 익기도 하고 Java에도 이런 건 있겠지 하던 게 없다거나 해서 마치 다른 문화를 접하는 듯싶다.

 

각설하고 이 글에서 이야기할 부분은 바로 Named Parameter에 관한 부분이다. 우선 Named Parameter가 뭔지부터 알아보자.

 

Named Parameter는 Python을 쓰면서 자주 애용하는 방법인데 다음과 같이 함수의 파라미터를 호출하는 쪽에서 해당 파라미터의 이름을 특정해 넘기는 방식이다.

def method(name, age):
		print(name, age)
		
method(name='jako', age=31)

파라미터를 이름으로 특정하니 파라미터의 위치를 일일이 추적할 필요도 없고, 어떤 값을 넘기는지 명확하게 보이기 때문에 Python으로 개발할 때는 위와 같은 형태를 사용하곤 한다. 그러나 너무 눈에 익었던 나머지 Java도 이와 비슷한 뭔가 가능하겠지라며 생각하고 있었는데

 

Java에는 Named Parameter가 지원되지 않는다고 한다.

 

더 나아가 Python은 함수에 대한 Parameter를 다음과 같이 기본값을 지정해서 사용할 수가 있다.

def method(name:Optional[str] = None): ...

위 코드는 “name”이라는 파라미터를 함수 호출 시 사용하지 않는다는 method 안의 스코프에서 name 변수는 기본값이 None으로 사용된다. 이런 방식도 Java에서는 지원되지 않았다.

 

정리해 보면 Java를 사용하면서 다음 두 가지 불편한 점이 생긴 것이다.

  1. Named Parameter를 지원하지 않으니 위치를 기억하며 넣어줘야 하기에 불편하다.
  2. Parameter Default Value를 지원하지 않으니 함수 바디부에 값을 초기화해줘야 한다.

어떻게 타파할 수 있을까?

 

명쾌한 답은 나오진 않았지만 흡족할만한 방법이 있었지. Design Pattern 중 “Builder Pattern”을 활용하는 것이다. Lombok의 “@Builder” 어노테이션을 활용해 코드를 작성하면 다음과 같이 코드를 만들 수 있다.

@Builder
class Member {
    String name;
    Integer age;

    public static Member withOnlyName(String name) {
        return Member.builder()
                .name(name)
                .age(31)
                .build();
    }
}

위 예제는 withOnlyName이라는 Method에 “name”만 입력받고 age에 대한 기본값은 31로 세팅하고 객체를 생성해서 사용하는 방식의 예이다. 만약 미성년자임을 체크해야 한다면 return 하기 전에 해당 검증 로직을 넣어서 사용해 보는 형태이다.

 

그러나 이는 단순히 객체를 생성할 때의 문제의 해결법이다.

 

만약 미리 작성되어 있는 코드를 분석해야 한다면 호출 대상 함수에 어떤 파라미터를 넘기는지를 쫓아가면서 봐야 하기에 이 부분도 해결이 필요하다.

 

이 부분은 딱히 코드로 푼다기보다는 Intelii j의 Inray Hint를 통해 어느 정도 식별이 가능한 것으로 만족했다.

 

Java는 예전부터 알고 있었지만 실제 사용해 보는 환경에 부닥치니 뭔가 어색하기도 하고 손과 머리에 숙달되기까지 꽤나 시간이 걸릴 듯싶다

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] JDBC & JDBCTemplate & NamedParameterJDBCTemplate  (0) 2024.08.23
[Java] 변수와 상수와 리터럴  (0) 2022.12.07