강께르의 개발일지

[문제 풀기] 변수에 관하여 본문

카테고리 없음

[문제 풀기] 변수에 관하여

강께르 2021. 9. 14. 23:41

1. C/C++ 배열과 C# 배열 비교

배열은 동일한 데이터형이 연속적으로 메모리에 저장되어 있는 자료구조를 의미한다.

C++에서는 이를 취급할 때, 포인터를 이용하여 다룬다. 배열의 이름은 포인터로 배열의 첫 번째 주소를 의미하고 임의의 인덱스를 접근할 때는 선언한 데이터형의 바이트 크기만큼 인덱스 값을 곱해 첫 번째 주소값에 더해줘 접근하는 등 포인터와 밀접한 관련이 있다.

C#에서의 배열은 포인터를 주로 다루지 않기에 배열은 하나의 클래스로 구현되어있다. 클래스로서 여러 메소드들을 지니고 있고 사용할 수 있다.

 

2. 피보나치 재귀함수 구현 + 그림판 콜스택 설명

static int Fibo(int x)
{
        if (x == 1)
            return 1;
        else if (x == 2)
            return 1;
        else if (x == 0)
            return 0;
                return Fibo(x - 1) + Fibo(x - 2);
        }
        static void Main(string[] args)
        {
        	string str = Console.ReadLine();
            
            Console.Write(Fibo(Int32.Parse(str)));
        }
}

3. C++에서 포인터 매개변수 왜 콜바이 밸류냐?

C++에서 매개변수로 포인터를 넘길 때, 포인터가 갖고있는 주소값을 넘긴다. 이 때, 매개변수는 할당받은 주소값을 가지고 데이터에 접근하여 읽고 쓰는 것이다.

, 스택 영역에 메모리를 할당받아 주소값을 저장하여 사용한다는 것이다. 만약 메소드 내에서 스택 영역의 메모리에 다른 주소값을 넣는다고 하더라도 메소드를 호출한 함수의 포인터에 아무런 영향을 주지 않는다.

 

4. 콜 바이 밸류, 콜 바이 레퍼런스 차이점을 설명하세요.

콜 바이 벨류는 매개변수를 전달받으면 매개변수로 받은 데이터를 메모리에 저장하기 위해 메모리의 스택 영역에 메모리를 할당받아 데이터를 저장한다. 메소드 내에서 생명주기를 가지고 있는 동안 할당받은 메모리의 값을 읽고 쓰고 메소드 끝나면 그 스택 영역의 메모리를 해제하기에 그 데이터 또한 소멸된다.

콜 바이 레퍼런스는 매개변수로 전달받으면 스택 영역에 데이터를 저장하기 위한 처리를 거치지 않으며 매개변수의 이름으로 전달받은 데이터를 참조받을 수 있도록 공유하는 것이다. 그렇기에 메소드 내에서 읽고 쓰는 것은 메소드 내의 주소값 따위로 접근하는 것이 아니라 접근하고자 하는 데이터의 또 다른 이름인 매개변수로 접근하는 것이기에 변화에 영향을 준다.