본문 바로가기

공부/컴퓨터

자바 메소드 형식인자와 VB.Net 형식인자(ByRef)의 비교.

반응형
안녕하세요.
찬 입니다.

오늘 SCJP 문제를 풀면서 느낀게 하고 있어서 적어 봅니다.
바로 Java 에서 객체형 매개변수에 대한 점 입니다.

간단한 예제를 들어서 설명하겠습니다.

public class TestJava {
public static void main(String[] args) {

String str = "A";
someMethod(str);
System.out.println(str);

}

public static void someMethod(String str_) {
str_ = "B";
}
}


위와 같은 소스가 있습니다. 이 소스에서 결과 값은 무엇일까요?


물론. 초보분들을 제외하고는 제대로된 답인 "A" 을 말하실 겁니다.


그 이유를 차근 차근 알아 보도록 하죠.

1. 우선 main() 메소드에서 String 객체를 가리킬 수 있는 str 이란 놈을 만들게 됩니다.

2. 그런뒤에 someMethod 라는 메소드를 호출하게 될때 str 이란 놈을 넘기게 됩니다.

3. someMethod 안에서는 str 이라는 놈을 str_ 로 받게 됩니다.

여기서 중요한 점이 있습니다. str 이라는 놈이 이름만 단순히 바뀌어서 str_ 로 변하는게 아니라는 겁니다.
str이 가지고 있는 값은, "A"라는 문자가 들어 있는 주소라고 볼 수 잇습니다. 그러면 str_ 이 가지고 있는 값은
str 이 가지고 있는 값을 복사해서 str_ 이 가지게 됩니다. 즉, str_ 역시 "A" 라는 문자가 있는 주소를 가지고 있겠지요.
그리고 str_ 에는 다시 "B" 가 들어 있는 주소를 가리키게 됩니다.

4. someMethod() 를 벗어 나면.. str 이라는 놈은 무엇을 가리키고 있나요?
맞습니다. 여전히 "A" 라는 문자를 가리키고 있는 주소를 가지게 됩니다.



이글의 주요 내용은 자바가 레퍼런스를 사용하여 객체를 가리킨다고 해도, 결국에 모든 인자 값은 인자가 가리키고 있는 객체의 주소값을 복사해서 넘긴다는데 주요한 점이 있습니다.
( 물론 C 의 포인터도 "포인터" 라고는 하지만, 실제로는 주소 값이 복사되도록 되어 있습니다.)

이번에는 VB.Net 에 대해서 알아 보도록 하겠습니다.


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim str As String = "A"
SomeMethod(str)
MsgBox(str)
End Sub



Public Sub SomeMethod(ByRef str_ As String)
str_ = "B"
End Sub



vb 를 잘 하시지 못하는 분들도 대략적으로 소스를 이해하실수 있을거라 생각합니다.

우선 Form1_Load 서브루틴이 먼저 수행되게 되어 있습니다.
이곳에서는 str = "A" 라고 해 준뒤에.. SomeMethod(str)을 호출하게 되지요.
그러면 SomeMethod(str) 안에서는 이 값을 바꾸어 주게 됩니다.
그리곤 SomeMethod(str) 메소드를 빠져 나와서 화면에 출력을 하게 되면. 결과는?


바로 B 가 출력이 됩니다.
일반적으로 C, C++, Java 를 해 보신 분이라면 이해가 되지 않으실 수도 있을 겁니다.

VB 에서는 함수의 매개인자를 받을때 ByVal 과 ByRef 로 나뉘게 됩니다.
ByVal 은 우리가 일반적으로 생각하듯이. 복사가 되는게 맞습니다.
그래서 서브루틴(혹은 함수) 내에서 아무리 값을 바꾸어도 값이 바뀌어지지 않게 되죠.

그렇다면 ByRef 는. 이미 위에 Java 를 이용해서 보았을때와 똑같은 형식으로 보이는 코드이지만, 이것은 우리의 예상과는 달리 작동합니다.


프로그래밍 언어론에 보면. 매개변수를 처리하는 방법이 몇가지 됩니다. VB 가 따르는 방법은 아무래도 다음 두 가지중에 하나 같습니다.


1. 매개변수로 넘어간 변수를 그대로 사용한다.
2. 매개변수로 넘길때 복사는 일어 나고, 복사된것을 사용하나, 함수를 종료할때 원래 변수를 복사된것으로 교체 한다.


제가 스레드등을 이용하여 대충 확인하여 본 결과, 1번으로 매개변수를 그대로 사용하는것으로 보입니다.( 값을 바꾸고, Sleep를 주는 동안 스레드로, 인자의 값을 확인해 봤는데, 둘다 동시에 변하는군요. )



제가 최근에 VB.Net을 이용해서 작업을 하는 일이 많았습니다.
데이타베이스 관련 부분 을 위의 VB 문장과 비슷하게 구성을 하였습니다. 레퍼런스는 인자로 받아 들이고 내부에서 객체를 만들어서 넣어 주는것. 저런식으로 다 짜 놓았는데, 생각해 보니깐. 이게 동작하면 안되는것인데 잘 동작하더라구요. 이게 이상해서.. 오늘 Java 와 VB 로 테스트를 해 본 결과 입니다.


물론. 모든것은 기초가 중요하다고 생각합니다. 하지만, 그 언어마다 독특한 특징을 익히는것도 무시할것은 못 되는군요.



참고:

혹시나 위에 자바를 저희가 원하는 방식으로 동작하도록 하고 싶다면 다음과 같은 방법을 사용하면 됩니다.



public static void main(String[] args) {
String str = "A";
str = someMethod(str);
System.out.println(str);
}

public static void someMethod(String str_) {
str_ = "B";
return str_;
}


매개인자는 복사가 되는 문제가 있긴 하지만, return문을 사용하여 메소드 밖으로 나온뒤에 할당하게 된다면 이러한 문제는 벗어날 수 있겠지요.


그냥. 잡다한 글이었습니다.

즐거운 하루 되세요~ ^_^
반응형

'공부 > 컴퓨터' 카테고리의 다른 글

GNU dbm  (0) 2005.09.13
Web(HTML) Form 을 XML Schema 로 표현하기.  (0) 2005.09.05
Mix된 XML Content를 Tag로 감싸게 만드는 소스.  (0) 2005.08.15
RGB to HSI , HSI to RGB  (0) 2005.05.05
윈도우 제어판에 관한 지식들..  (0) 2005.05.04