개발은 재밌어야 한다
article thumbnail
Published 2022. 1. 11. 18:04
[JAVA 자바] 메소드 체이닝이란? JAVA
반응형

지난번 포스팅으로 빌더 패턴에 대해서 알아보았습니다.

https://dreamcoding.tistory.com/56

 

[디자인 패턴] 빌더 패턴(Builder Pattern)

스프링 인 액션 5판 스터디를 진행하던 중에 스프링 시큐리티에서 빌더 패턴이 사용되는 부분을 보고 빌더 패턴에 대한 포스팅을 해보겠습니다. 빌더 패턴은 소프트 웨어 디자인 패턴 중에 하나

dreamcoding.tistory.com

 

 

빌더 패턴도 어찌보면 메소드 체이닝 방식을 사용한 하나의 디자인 패턴인데요.

그 원리 속에 작용하느 메소드 체이닝에 대해서 한번 다시 생각해보면서 한번 어떻게 빌더 패턴이 작용할 수 있는가를 생각해보겠습니다.

마치 쇠사슬 처럼 객체를 연결고리로 함수를 지속적으로 호출한다고 하여 Method Chaining이라고 한다.

메소드 체이닝이란?

말그대로 메소드를 고리마냥 줄줄이 엵어서 메소드를 계속해서 사용할 수 있게끔 하는 방법인데요

사람이라는 각기 다른 상태를 가지고 있는 객체라고 생각하고 People라는 클래스를 만들어 보겠습니다.

1
2
3
4
5
class People {
    private int height;
    private int weight;
    private String residence;
}
cs

키, 몸무게, 사는곳라는 상태를 가지고 있는 객체 변수를 지정을 해줍니다.

보통의 경우 getter, setter를 통해 해당 객체를 생성하고 난 후 값을 세팅할 메소드를 세팅을 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class People {
    private int height;
    private int weight;
    private String residence;
    
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }
    public String getResidence() {
        return residence;
    }
    public void setResidence(String residence) {
        this.residence = residence;
    }
}
 
cs

보통의 경우 객체를 생성 (new) 하고 해당 객체에 각각의 세터를 한줄씩 호출해서 상태값을 세팅을 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.junit.Test;
 
public class TestMethodChaning {
    
    @Test
    public void testSetterObject() {
        People people = new People();
        people.setHeight(180);
        people.setWeight(80);
        people.setResidence("서울");
        
        System.out.println(people.getHeight());
        System.out.println(people.getWeight());
        System.out.println(people.getResidence());
    }
}
cs

 

그럼 메소드 체이닝 방식을 사용을 한다면 어떻게 될까?

 

간단하다 setter 메소드에서 해당 객체를 this를 통해 리턴하면 해당 객체가 리턴이 되고 해당 객체에 다시 메소드를 호출하게 되면 리턴값을 this를 통해 객체를 리턴하는 방식을 계속하면 .메소드().메소드()......를 방식으로 한번에 메소드를 이어 나갈 수 있다.

 이번에는 메소드 체이닝을 활용한 객체를 만들어 보자

차이점은 setter() 메소드에서 void가 아닌 해당 객체를 리턴을 하고 있고 그 아래에서는 해당 객체에 set을 하고 나서 return 값으로 this 즉, 해당 변수가 세팅된 값을 가지고 있는 객체를 리턴하게 된다.

그래서 코드에서 setHeight의 리턴값은 객체(ChainingPeple)이고 해당 객체에 다시 setWeight를 해도 객체(ChainingPeple)이고 다시 해당 객체에 setResidence()를 해도 객체 값이 리턴이 된다.

그래서 생성된 해당 객체에는 정상적으로 getter를 사용하여 값을 반환해보면 정상적으로 값이 세팅이 되어있는 형태를 볼 수 있다.

 

getter setter에서만 사용할 수 있는 개념이 아니라 객체에서 메소드를 사용할때에 return 을 해당 객체로 리턴하게 되면 동일하게 사용을 할 수 있다.

예를 들면 아래와 같은 형태를 보자

Call 클래스에 변수 a,b를 선언하고 call1(), call2(), call3(), call4()메소드를 정의했다고 가정하면

Call 객체를 c로 생성한 후에 call1()메소드를 호출하면 a와b가 값이 1인 Call 객체가 반환이 될것입니다.

 

반환된 Call객체에서 call2()메소드를 호출하면 a와 b의 값이 2인 Call객체가 반환이 됩니다.

마찬가지로 반환된 Call객체에서 call3()메소드를 호출하면 a와 b의 값이 3인 Call객체가 반환이 됩니다.

마지막으로 반환된 Call객체에서 call4()메소드를 호출하면 a와 b의 값이 4인 Call객체가 반환이 됩니다.

 

그럼 최종적으로 생성된 객체는 Call객체이며 a=4, b=4인 값을 가지고 있는객체가 생성이 되고 

아래에 System.out.println(c.a);과 System.out.println(c.b);에서는 마지막으로 반환된 객체인 Call객체의 a와b값인 4만 출력이 될것입니다

출력값
4
4

 

 

 

 

 

 

 

 

반응형
profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!