C# 기초 : (C++ 에서 참조자라 불리는) ref 키워드

그리고 out 키워드 (출력 전용 매개 변수)




C++에서 레퍼런스(참조자)는 큰 성능향상을 가져다 주었다.

상수 객체 참조자에 의한 전달 방식이 그 예이다.

call by refference 방식을 구현할 때에도 포인터를

이용하는 것이 아닌 레퍼런스를 이용해 보다 안전하고

간편하게 구현할 수 있었다. C# 또한 마찬가지




하지만 다른점이 있는데

&가 아닌 ref를 붙여줘야 한다는 점


void swap( ref int a, ref int b){

...

}


사용할 떄에도


int x;

int y;


swap(ref x , ref y);




사용할 때에도 왜 귀찮게 ref를 붙여줄까..

생각해봤는데, C++에서 swap함수를 참조자로

만들었다면 사용하는데 있어 이 함수가

call by value를 하는 것인지

call by refference를 하는 것인지

분간이 안간다는 것이다.


하지만 C#에서는 ref를 붙여줌으로써

구분이 가능하다. (단순히 내 생각..)




out 키워드 (출력 전용 매개 변수)

out 키워드는 ref 키워드와 똑같은 일을 하지만

좀 더 안전한 방법으로 일을 한다.




void Divide ( int a , int b, ref int quotient , ref int remainder ){

quotient = a / b;

remainder = a % b;

}


int main(){

int a = 20 , b = 3, c = 0, d = 0;


Divide( a, b, ref c, ref d);

}


a를 b로 나눈 뒤 나머지와 몫을 구해서 c 와 d에 저장한다.

위 코드를 out 키워드로 바꾸어 보자.


void Divide ( int a , int b, out int quotient , out int remainder ){

quotient = a / b;

remainder = a % b;

}


int main(){

int a = 20 , b = 3, c = 0, d = 0;


Divide( a, b, out c, out d);

}




결과는?

ref 키워드와 똑같다. 그렇다면 out 키워드는 왜 쓰는가?




ref 키워드를 이용해서 매개 변수를 넘기는 경우에는 메소드가

해당 매개 변수에 결과를 저장하지 않더라도 컴파일러는

아무런 경고를 하지 않는다. 이와 달리 out 키워드를

이용해서 매개 변수를 넘길 때는 메소드가 해당 매개 변수에

결과를 저장하지 않으면 컴파일러가 에러 메시지를 출력한다.




또한 메소도를 호출하는 쪽에서는 초기화를 하지 않은

지역 변수를 메소드의 out 매개 변수로 넘기는 것이 가능.

컴파일러가 호출당하는 메소드에서 그 지역 변수를

할당할 것을 보장하기 때문이다.




즉, 런타임 에러를 컴파일 타임 에러로 잡아낼 수 있다는 장점이 있다.



[자료구조] 단순 정렬 알고리즘


1. 버블 정렬

2. 삽입 정렬

3. 선택 정렬




정렬 알고리즘을 자료구조로 보기는 힘들지만

자료구조의 구성에 있어 꼭 필요한 부분이기 때문에

정렬 알고리즘에 대해 간략하게 알아보는 시간을 가지겠다.




그 중에서도 단순 정렬 알고리즘


1. 버블 정렬

가장 널리 알려진 정렬방법이 아닌가 한다.

대학교수님이 굉장히 강조를 하셔서 아직 기억에 남아있다.

하지만 n^2 이라는 어마어마한 시간복잡도를 보이기 때문에

정렬 대상이 소규모일 경우에만 사용하도록 한다.




정렬 알고리즘은 개인적인 생각으론 그림으로

이해하는 것이 가장 좋다고 생각하는데, 그림을

그릴 시간이 없는 관계로 ㅜㅜ 

잘 정리해놓은 포스팅을 소개하도록 하겠다.

http://prosto.tistory.com/161




2. 삽입 정렬

선택 정렬과 엄청 유사하다.

키(key)값을 가지고 비교를 해나가며

정렬을 하는 것이 특징이다.

이 또한 밑의 포스팅을 보면 이해가 갈 것이다.

http://prosto.tistory.com/163




3. 선택 정렬

처음부터 마지막까지 해당 자리에

적절한 값을 잡아가는 것이 특징이다.

무척 단순하다. 따라서 구현을 하는 것이

상당히 쉽다. 하지만 단순 정렬 알고리즘은

모두 n^2의 시간복잡도를 보인다는 것.

http://prosto.tistory.com/159




Prosto님의 힘을 빌려 단순 정렬 알고리즘인

버블 정렬, 삽입 정렬, 선택 정렬에 대해 알아보았다.

구현이 간편하다는 장점말고는 딱히 다른 장점을

찾아볼 수가 없다. 때문에 STL의 sort 알고리즘을 보면

위의 단순 정렬 알고리즘이 아닌퀵 소트로 구현이 되어

있다는 것을 볼 수 있다. 퀵 소트는 상당이 복잡한 알고리즘인데

 그 만큼 성능상의 이점이 있기 때문이다.





'C, 자료구조' 카테고리의 다른 글

[자료구조] 연결 리스트의 이해(2)  (0) 2017.04.02
[자료구조] 연결 리스트의 이해(1)  (0) 2017.03.29
[C] 재귀 함수  (0) 2016.12.21
[C] static 변수  (0) 2016.12.21
[C] 함수 포인터와 void 포인터  (0) 2016.12.20

DFS(백트래킹) 알고리즘 문제 : 영역구하기 (정올)




오랜만에 DFS(백트래킹) 알고리즘을 풀어보았다.

DFS는 흔히 재귀로 많이 풀기 때문에 소위 말하는

재귀적인 사고(?)가 필요하다. 코드를 설명하는 부분에도

이러한 부분을 설명하기가 상당히 까다롭기 때문에

설명이 조금 부실하다.




일단 DFS(백트래킹)은 깊이 우선 탐색을 한다.

쉽게 말해 한 방향으로 쭉 들어갔다가 빠져나오는 것

스택의 원리와 같기 때문에 스택을 이용하거나

함수가 스택에 쌓였다가 풀리는 과정을 이용(재귀)

하여 풀 수 있다. 이번 문제는 난이도가 높지는 않은 듯 하다.





01. 변수 선언, 초기화

DFS (백트래킹)문제를 잘 풀기 위해서는

문제를 제대로 이해하고 초기화 하는 것 부터 시작.




02. 재귀 함수

최대한 자세히 설명한다고 했지만

재귀적인 사고(?)가 필요함.




03. 메인 함수



위에 코드에서도 언급했지만

한번의 함수호출로 답을 찾아낼 수 있는 방법이

있는지 조금 더 생각해봐야 할 부분이다.




오늘은 오랜만에 DFS(백트래킹) 알고리즘을 풀어보았다.

사실 초반에 BFS로 풀까 말까 고민하다가 정신없었던 건 사실

DFS, BFS에 익숙해져서 어떠한 알고리즘을 써야하는지

한번에 캐치하는 것도 중요한 듯 하다.

+ Recent posts