프로그래밍 노트

[MFC]VB의 ByVal, ByRef와 C의 포인터에 관련된 간단한 예제 본문

MFC TIP

[MFC]VB의 ByVal, ByRef와 C의 포인터에 관련된 간단한 예제

띠리 2007. 4. 30. 20:34
나는 VB를 먼저해서 그런지 C의 포인터를 이해하는데 시간이 많이 걸렸던 것같다.
머리가 안좋아서 그런지 포인터를 설명을 들어도 책을 읽어도 이해가 오는데 시간이 많이 걸렸다.
지금도 남에게 포인터를 설명하라고 그러면 그리 속시원하게 알려주지는 못하는 것같다.

포인터의 설명을 들어도 왜 포인터를 써야하는지에 대해서 이해를 특히 못했던 것같다.
VB에서 프로그램을 짜다보면 종종 인수를 ByRef로 넘길때가 있다.
ByRef가 이해가 간다면 그나마 포인터를 조금이나마 이해하기 쉬울 것같다.
포인터에 대한 자세한 설명은 이곳이 아니고라도 자세하게 써있는 곳이 많이 있으니까
여기에서는 VB의 ByVal, ByRef의 예제와 VC에서의 CString을 인수로 넘길때
포인터를 쓰고 안쓰고에 따라 어떻게 달라지는가에 대한 예제만을 올리고자 한다.
포인터를 ByRef와 비슷하게 동작되어진다.

우선 포인터가 이해가 안가면 우선 이렇게 움직이는구나하고 우선은 넘겨보는 것도
좋은 것같다. 하기야 사람에 따라서 안풀리는 것을 꼭 풀고 넘어가야하는 사람과
풀수있는 것을 먼저 풀고나가느냐는 사람들의 성향이니까 어느것이 좋고 나쁜지는 모르겠다.
나는 어느 쪽인가하면 풀리는 것을 먼저 푸는 편이여서 처음에는 이렇게하면 돌아가는구나하고
포인터를 그리 이해하지 못하고 쓴 적이 있는 것같다.
(어쩜 지금도 제대로 이해 못하고 있으려나... -.-;;;)

◆ VB의 ByVal인수와 ByRef인수

    ' ByVal : 호출된 프로시저나 속성은 호출 코드에서 내부 인수로 사용하는

    ' 변수의 값을 변경할 수 없도록 하는 방식으로 인수가 전달되도록 지정합니다.

    Private Sub subByVal(ByVal sByVal As String)


        sByVal = "ByVal data"


    End Sub



    ' ByRef : 호출된 프로시저가 호출 코드에서 내부 인수로 사용하는

    ' 변수의 값을 변경할 수 있도록 하는 방식으로 인수가 전달되도록 지정합니다.

    Private Sub subByRef(ByRef sByRef As String)


        sByRef = "ByRef data"


    End Sub



    Private Sub subParamTest()


        Dim sParam As String


        sParam = "Parameter"


        subByVal(sParam)


        Call MsgBox("인수가 ByVal 일때 :" & vbCrLf & vbCrLf & _

                    "호출된 함수에서 넘겨진 인수를 바꾸어도 " & vbCrLf & _

                    "호출한 함수에서 인수값이 변하지않음 " & vbCrLf & _

                    "-> " & sParam)


        subByRef(sParam)


        Call MsgBox("인수가 ByRef 일때 :" & vbCrLf & vbCrLf & _

                    "호출된 함수에서 넘겨진 인수를 바꾸면 " & vbCrLf & _

                    "호출한 함수에서 인수값이 변함 " & vbCrLf & _

                    "-> " & sParam)

    End Sub



End Class






◆ VC의 일반 인수와 포인터 인수

void subByRef(CString *pcsMunja)

{

    *pcsMunja = "ByRef data";

}


void subByVal(CString csMunja)

{

    csMunja = "ByVal data";

}


void subParamTest()

{

    CString    csTest = "Parameter";



    subByVal(csTest);


    AfxMessageBox("인수를 그냥 넘겼을때:\n\n"

                  "호출된 함수에서 넘겨진 인수를 바꾸어도\"

                  "호출한 함수에서 인수값이 변하지않음\"

                  "-> " + csTest);


    subByRef(&csTest);


    AfxMessageBox("인수를 포인터로 넘겼을때\\n"

                  "호출된 함수에서 넘겨진 인수를 바꾸면\"

                  "호출한 함수에서 인수값이 변함\"

                  "-> " + csTest);

}







Comments