본문 바로가기
[ Program ]/c#스터디

30.함수2

by 관이119 2021. 10. 9.

함수에 대한 기본적인 내용은 앞장들에서 다 설명한거같다.

참고로 함수 = 메서드 라고도 부른다.

 

다시 내용을 상기시켜보면 함수의 기본형식은 다음과 같다.

함수명()

{

     작업할내용

}

 

( ) 괄호가 특정이름뒤에 붙어있으면 함수이고 최소 단위라고 생각하면 된다.

당연한 말이지만 한 클래스 내에는 여러개의 함수가 존재할 수 있다.

물론 한 네임스페이스 내에 여러개의 클래스도 존재할 수 있다.

 

함수에서 받는 파라미터는 몇가지 형태가 있다.

가장기본적인 형태는 다음과같다.

함수명(형식 변수명)

{

     작업할 내용

}

 

예제는 다음과 같다.

public string testf(string str)

{

      return $"{str} 을 리턴함";

}

위 예제는 이제 다 이해할수 있을거라 생각한다.

 

그림1

 

그림1 과 같은 예제가 있다고 생각해보자.

어떤결과가 나올까?

생각하기전에 알아둘점은 프로그램은 무조건 위에서 아래로 흐른다.

버튼이 클릭되는 순간 str1 변수에 "aaa" 를 대입하고 functest 를 실행한 후에 MessageBox 를 실행한다는 말이다.

그런데 str1 을 함수에 넣어서 함수내에서 message1 에 "bbb" 를 대입했다.

그리고나서 출력을 실행했는데 str1 은 "bbb" 를 출력하지않을까 생각할수 있다.

하지만 실행해보면 그렇게 되지 않는다.

 

안되는 이유는 메모리관점과 같이 생각해야 하는데 stack 에 저장되는 데이터는 함수파라미터로 전달할때 값을 복사하고 heap 에 저장되는 데이터는 함수파라미터로 전달할때 참조복사를 넘긴다.(heap 과 stack 은 22강 그림2를 참조할것)

값복사와 참조복사차이는 아래 그림2를 보자.

 

그림2

 

그림2에서 왼쪽에 aaaa 라는 string 원본이 있다고 생각하고 보면 위쪽 화살표는 aaaa 자체를 복사해서 대상에게 넘겨준다.

아래화살표는 aaaa 라는 원본을 가리키는 이정표를 넘겨주는데 이정표가 가리키는 대상자체는 그대로이기때문에 참조복사를 할경우 원본의 값을 변경할수도 있고 결국 원본의 값 그자체가 된다.

저 두 아래위 화살표의 차이가 stack 에 저장되는지 heap에 저장되는지의 차이인데 stack 은 우리가 기존에 정의해서 사용하던 int,double,string 등 이있고 나중에 배우겠지만 class나 stringbuilder 같은것들은 heap 에 저장된다.

 

사실string 도 마우스 우클릭해서 따라 들어가보면 class 인데 왜 값복사처럼 원본값이 변하지않냐고 생각할수 있다.

그에 관한 내용은 아래 참조내용을 읽어보자.

guslabview.tistory.com/187

 

[.NET] C# 문자열 메모리 처리 방식(About 불변 클래스)

이전 글을 통해서 C#에서 값 형식과 참조 형식에서 어떻게 데이터가 처리가 되고, 메모리 구조에서 어떤식으로 할당/해제 되는지에 대해서 설명드렸습니다. 이에 대한 내용 확인을 원하시면 아

guslabview.tistory.com

 

내용이 조금 복잡해졌는데 학문적연구는 나중으로 미루고 int,double 같은 숫자형과 string,datetime 처럼 내가 변수에 직접 값을 한줄로 입력하는건 stack 에 저장되고 값복사로 작동하고 나머지대부분은 참조복사로 작동한다고 생각하면된다. 

 

그림1처럼 값복사로 작동하는 부분도 참조복사로 변경할수 있다.

파라미터에 ref 를 붙여서 넘겨주면 된다.

 

그림3

 

 

위 그림3을 보면 파라미터로 str1 을 넘기는곳과 받는곳 모두 ref 를 앞에 붙여줬는데 이경우 참조복사로 변경되어 최종결과값이 "bbb" 로 출력된다.

내용이 잘 이해가 되지않으면 위쪽 부분을 반복해서 읽어보기 바란다.

 

위에서 살펴본 ref 변수 외에 out 변수도 사용할수 있다.

out 는 말그대로 출력해주는 파라미터 이다.

함수에서 return 을 해서 결과값을 반환해줄수 있는데, 반환은 하나밖에 할수 없기때문에 여러개의 값이 리턴이 필요할때 사용하게 된다.( 배열이나 객체로 반환하기 때문에 사실 잘쓰이지는 않는다. )

 

그림4

 

예제를 그림4와 같이 바꿔주면 예상할수 있듯이 ccc 가 출력된다.

 

그리고 함수를 호출할때 원래는 파라미터를 순서대로 넘겨줘야하는데 이름을 지정해주면 순서에 상관없이 호출할 수도 있다.

그림5

 

그림5와 같이 호출하면 되는데 위에서 title 은 title 로 content 는 content 로 같은이름을 찾아서 파라미터를 넘겨준다.

개인적으로 저렇게 다써주는게 더 귀찬은거같다.........

 

 

그리고 아래경로에서 C# 4.0 : Optional 파라미터 와 C# params 도 읽어보자.

www.csharpstudy.com/CSharp/CSharp-method.aspx

 

C# 메서드 파라미터 - C# 프로그래밍 배우기 (Learn C# Programming)

C# 메서드 클래스내에서 일련의 코드 블럭을 실행시키는 함수를 메서드라 부른다. 메서드는 0 ~ N개의 인수를 갖을 수 있으며, 하나의 리턴 값을 갖는다. 리턴 값이 없으면 리턴 타입을 void로 표시

www.csharpstudy.com

개인적으로 프로그램하면서 Named 나 Optional이나 params로 직접 함수를 만든적은 없는것같다.

하지만 프레임워크에서 제공하는 기존 함수에는 params 가 상당히 자주사용된다.

내용들을 꼭 확인하고 알아두고 넘어가도록하자.

 

 

 

숙제

***숙제 : 버튼을 누를때마다 카운트를 증가시켜서 텍스트박스에 출력해주는 프로그램을 만들어보자.(함수 필수사용)

'[ Program ] > c#스터디' 카테고리의 다른 글

32.인텔리센스/오버로딩  (0) 2021.10.09
31.업데이트내역 프로그램만들기 / splite  (0) 2021.10.09
29.접근제한자, 네임스페이스 , 클래스  (0) 2021.10.09
28.함수1  (0) 2021.10.09
27.Object  (0) 2021.10.09

댓글