본문 바로가기

Java/Design patterns

객체 생성 코드를 단순화 하는 메소드 체이닝 패턴(Method chaining pattern)

메소드 체이닝 패턴(Method chaining pattern)

어떤 객체(Instance)의 필드 값을 저장하는 가장 단순한 방법은 필드에 직접 엑세스하여 값을 입력하는 것입니다.

People people = new People();
people.name = "James";
people.gender = "Man";
people.age = 28;

필드의 은닉이 필요하면 필드 값을 입력하는 메소드를 사용하여 실제 구현 내용을 외부로부터 감추게 됩니다.

이를 객체 지향 프로그래밍(Object Oriented Programming)에서는 캡슐화(Encapsulation)라고 부릅니다.

가장 흔히 볼 수 있는 코드가 캡슐화까지 진행된 형태입니다.

People people = new People();
people.setName("James");
people.setGender("Man");
people.setAge(28);

캡슐화까지 진행된 코드는 별 문제가 없어보이지만, 코드의 반복 사용량이 많고 가독성이 떨어진다는 문제가 있습니다.

위에서 보인 아주 단순한 샘플 코드에서조차 people 변수명이 4번 사용되었습니다.

People peopleA  = new People(), peopleB = new People(), peopleC = new People();
peopleA.setName("James");
peopleA.setGender("Man");
peopleA.setAge(28);
peopleB.setName("Kanna");
peopleB.setGender("Woman");
peopleB.setAge(52);
peopleC.setName("Rokie");
peopleC.setGender("Man");
peopleC.setAge(33);

그저 객체 3개를 생성하는 코드일 뿐인데 가독성은 급격하게 나빠집니다.

메소드 체이닝 패턴(Method chaining pattern)은 반복된 코드 사용량을 줄이는 방법으로 생산성을 높이고, 위와 같은 이슈에 대해서 가독성을 좀 더 높일 수 있는 해결책이 됩니다.

메소드 체이닝 패턴은 굉장히 손쉽게 구현 할 수 있습니다.

캡슐화 과정에서 작성된 메소드가 자기 자신(this) 객체를 반환하는 것으로 시작되며, 그것이 필요한 전부입니다.

public People setName(String name)
{
	this.name = name;
	return this;
}
	
public People setGender(String gender)
{
	this.gender = gender;
	return this;
}
	
public People setAge(int age)
{
	this.age = age;
	return this;
}

메소드가 자기 자신에 대한 객체를 반환하기 때문에, 메소드를 호출한 직후 이어서 다음 메소드를 호출 할 수 있습니다.

위에서 보인 샘플 코드와 완전히 똑같은 실행 결과를 갖는, 객체 3개를 생성하는 코드입니다.

  • 메소드를 실행하는 변수를 확인 할 필요가 없어 가독성 향상
  • 반복된 코드 사용이 줄어들어 생산성 증가
People peopleA  = new People()
	.setName("James")
	.setGender("Man")
	.setAge(28);
People peopleB  = new People()
	.setName("Kanna")
	.setGender("Woman")
	.setAge(52);
People peopleC  = new People()
	.setName("Rokie")
	.setGender("Man")
	.setAge(33);

상용 IDE에서도 메소드 체이닝 패턴을 손쉽게 작성하기 위한 기능과 단축키를 제공합니다.

그만큼 장점이 명확하지만, 단점이 없는 것은 아닙니다.

메소드 체이닝을 사용하여 위와 같은 코드를 작성하게 되면, 하나의 코드 라인에서 여러개 메소드가 호출되기 때문에 정확한 오류 지점을 확인하는데 어려움이 있을 수 있습니다.

다음 샘플 코드에서Exception이 발생하면, 어느 메소드에서 발생한 Exception인지 확인이 불가능합니다.

메소드가 체이닝 되며 동일한 코드 라인에서 실행되기 때문입니다.

public static People born(String name, String gender, int age)
{
	return new People().setName(name).setGender(gender).setAge(age);
}