본문 바로가기
웹/Java

StringBuilder 객체를 Call by reference 로 함수 파라미터로 넘기기

by 브래드.권 2013. 4. 30.

 

 

 

Version 1.0

문서 이력

2013-03-28 최초 작성 Ver 1.0

 

 

 

함수를 호출하여 여러 값들을 리턴하려니 배열 사용하기도 뭐하고 해서 객체를 파라미터로 넘겨서 내용을 채운 뒤 사용하는 방법을 사용한 적이 있습니다.

 

저 같은 경우에는 리턴값은 Boolean 으로 함수 실행 성공여부로 하고 함수 실행 시 발생한 에러 메시지를 StringBuilder 객체를 파라미터로 넘겨서 채우도록 했습니다.

 

아래는 StringBuilder 객체를 Call by reference(값참조) 로 함수 파라미터에 넘기는 샘플 코드와 결과 입니다.

 

<샘플 코드>

 

package test;

 

public class Test {

        public static void main(String[] args) {

               StringBuilder sb = new StringBuilder();

               sb.append("This is parent");

               System.out.println("Parent Call-1 : " + sb.toString());

              

               callChild(sb);

              

               System.out.println("Parent Call-2 : " + sb.toString());

        }

       

        private static void callChild(StringBuilder sb) {

//             sb = new StringBuilder();

               sb.append(" / This is child");

               System.out.println("Child Call : " + sb.toString());

        }

}

 

 

<결과>

 

Parent Call-1 : This is parent

Child Call : This is parent / This is child

Parent Call-2 : This is parent / This is child

 

 

위와 같이 callChild 함수 내에서 sb 에 내용을 추가해도 상위 main 함수에서 그 내용을 그대로 가집니다.

 

여기서 주의할 점을 위 샘플 코드로 설명하자면 callChild 함수에서 파라미터로 받은 StringBuilder 객체 sb 를 사용할 때 null 값으로 만들거나 다시 객체 생성을 해서는 안 된다는 점입니다. 왜냐면 Java 에서 객체는 실제 값이 아닌 값이 있는 주소 값을 가지는데 callChild 함수에서 null 처리나 다시 객체 생성을 하게 되면 주소 값을 가지지 않거나 전혀 다른 주소 값을 가지게 되기 때문입니다. 위 샘플 코드에서 주석 처리된 sb = new StringBuilder(); 를 주석 해제 후 실행해 보면 아래 결과와 같이 상위 main 함수에서는 callChild 호출 전 내용을 가지게 됩니다.

 

 

Parent Call-1 : This is parent

Child Call :  / This is child

Parent Call-2 : This is parent