
코드를 리팩토링하던 중 사용자의 request를 받아 response 하는데 필요한 파라미터들을 추출해내야 했다.
그 후 그 파라미터들을 사용해 응답 데이터를 만들어야 하는 상황이다.
문제는 응답 데이터를 만드는 과정이 복잡하다 보니 여러 개의 메소드로 분리를 하고, 각 메소드로 파라미터들을 계속해서 넘겨주어야 한다는 것이었다.
하나의 메소드에 많으면 6개의 파라미터를 넘겨주게 되었고, 이게 최선인가하는 생각이 들어 다른 방법을 찾아보았다.
이때, 찾은 방법이다
함수의 인수를 통해 데이터를 전달하는 것은 코드를 읽는이에게 복잡함을 줄 수 있다. 다음 함수로 데이터를 전달하는 경우에는 Parameter로 넘기지 말고 Instance 변수를 활용하면 코드가 깔끔해진다.
public class TestClass {
private StringBuffer buffer;
public void test1() {
this.buffer = new StringBuffer();
}
public void test2() {
buffer.append("Parameter로 넘기지 말고 Instance 변수를 활용한다!");
}
}
[출처] https://mangkyu.tistory.com/45
String은 불변 객체이다.
객체의 값을 변경할 수 없다는 뜻이다.
public final class String implements java.io.Serializable, Comparable {
private final byte[] value;
}
String 클래스를 보면 final로 선언되어 있어 값을 바꾸지 못하는 것이다.
String s = "hello";
s = str + "world";
위와 같이 String 문자열에 새로운 문자열을 + 기호를 사용해 더했을 때, 메모리에서는 어떻게 저장이 될까❓

hello 문자열이 먼저 String 변수 s에 저장이 되고, 기존 문자열에 world 문자열을 더했을 때는 기존 객체의 값이 변경되는 것이 아니라 hello world 라는 새로운 객체가 생성이 되는 것이다. 그럼 s 변수는 새로운 객체를 가리키고, 이전의 객체는 가비지 컬렉터에 의해 제거된다.
StringBuffer와 StringBuilder는 가변 객체이다
모두 문자열을 생성하는 객체인 것은 동일하지만
객체의 공간이 부족해지는 경우 버퍼의 크기를 유연하게 늘려준다.
두 클래스는 내부 버퍼에 문자열을 저장해두고 추가, 수정, 삭제 작업을 할 수 있다.
이렇게 append, delete 등의 속성을 사용하여 동일 객체내에서 문자열 크기를 변경할 수 있다.
public final class StringBuffer implements java.io.Serializable {
private byte[] value;
}
내부구조를 보면 final 키워드가 없는 것을 볼 수 있다.
따라서 값이 변경될 때마다 새롭게 객체를 만드는 String 보다 훨씬 빠르기 때문에, 문자열의 추가, 수정, 삭제가 빈번하게 발생하는 경우라면 StringBuffer와 StringBuilder를 사용하는 것이 이상적이다.

이처럼 파라미터가 여러 개인 메소드와 String 변수에 +기호로 여러 번의 연산을 하는 코드를 수정해보아야겠다.
다음 글에 이어서 👉🏼👉🏼👉🏼