Queenut 2021. 11. 25. 18:51

 * 메소드

 : 프로그램이 준 값을 지시대로 처리해 결과를 만드는 상자.

  처리의 재료가 되는 값을 인수, 결과 값을 반환 값이라 한다.

class A
{
       public int add(int a, int b)
       {
              int x;
              x = a + b;
              return x;
       }
}

add() : 두 정수 값의 합을 구하는 메소드

return() : 메소드를 종료하고 반환 값을 반환하는 역할.

int a, int b : a, b라는 변수가 인수(처리의 재료가 되는 값)

x : 반환 값

 

 

 * 반환 값이 없는 메소드

void disp(int a)
{
       Console.WriteLine("인수의 값은 " + a);
       return;
}

void : 반환 값이 없음을 나타낸다.

disp() : 인수의 정수 값을 표시하는 메소드

return : 반환 값이 없는 경우 ()를 생략할 수 있다.

 

 

 * 인수가 없고 반환 값이 있는 메소드

double half()
{
       b = a / 2.0;
       return b;
}

half() : 같은 객체 내의 필드 a의 값을 2.0으로 나눈 값을 구하는 메소드

 

 

 

 

 * 인수도 반환 값도 없는 메소드

void print()
{
       Console.WriteLine("Hello");
}

print() : 'Hello'라고 표시하는 메소드

 

 

 

 

 * 스코프(scope)

 : 변수의 유효 범위

static void Main()
{
       int n = 2;

       int x = 1;
       if (n > 0)
       {
              int y = 2;
              Console.WriteLine(x + ", " +y);
       }
}

메소드 안에서 선언한 변수를 '지역 변수'라고 부른다.

지역변수의 유효 범위는 변수를 선언한 블록 내로 한정된다.

Ex) int n = 2; 는 아래의 모든 블록을 유효범위로 두며 'n의 스코프'라고 부른다.

    마찬가지로  int y = 2; 는 본인이 있는 블록과 그 아래 Console.~~ 을 유효 범위로 두고 'y의 스코프'라 부른다.

 

선언된 블록 내에서 같은 이름의 변수를 선언할 수 없다.

필드의 유효 범위는 정의한 블록 내의 것으로 한정된다. (→ Main() { 'n의 스코프' } )

 

BUT 지역 변수와 필드는 같은 이름으로 지정할 수 있다!!

class Scope
{
       int zoom = 1;
       void print()
       {
              int zoom = 2;

              Console.WriteLine(zoom + ", " + this.zoom);
       }
}

zoom : 필드명

zoom : 지역 변수명

메소드 안에서 지역 변수와 같은 이름의 필드를 참조할 경우, 앞에 this. 를 붙인다.

 

 

 

 * 같은 객체 내의 메소드 호출

 - 인수를 가진 메소드

class A
{
       public void a(int x)
       {
       Console.WriteLine("인수는 " + x);
       }

       public void b()
       {
       a(5);
       }
}

int x5 는 대응한다.

a 는 메소드명이고

는 인수이다.

a(5); 를 통해 메소드를 호출했다.

 

 

 - 인수를 갖지 않는 메소드

class A
{
       public void a()
       {
              Console.WriteLine("Hello");
       }
       public void b()
       {
              a();
       }
}

a 는 메소드명이다.

 

 

 - 반환 값의 이용

class Calc
{
       public int add(int a, int b)
       {
              return a + b;
       }
       public void print()
       {
              int c;
              c = add(8, 6);
       }
}

intint 은 대응한다.

int a, int b8, 6 은 대응한다.

add 은 메소드명이다.

8, 6 은 인수이다.

메소드의 반환 값의 형과 변수의 형은 같게 설정한다.

 

 

 * 다른 객체의 메소드 호출

다른 객체의 메소드를 호출하려면 '.'를 사용한다.

calc가 왜 다른 객체일까? 같은 클래스 calculation 안에 있으니까 같은 객체가 되는 것 아닌가?

클래스가 달라서 자동으로 다른 객체가 된 걸까?

그리고 밑에 static~Main()~ 은 뭐야. 얘네 없으면 출력 자체가 안 되던데.

 

 

 

 - 출력 인수

class Calc
{
       public void div(int a, int b, out int q, out int r)
       {
              q = a / b;
              r = a % b;
       }

       public void print()
       {
              int x, y;
              div(10, 3, out x, out y);
       }
}

반환 값 외에 인수를 사용해 복수의 값을 반환할 수도 있다.

호출하는 쪽도 out을 붙인다.

out int q, out int rout x, out y 는 대응한다.

 

다른 방법으론,

public void print()
{
       div(10, 3, out int x, out int y);
}

int 로 리스트 안에서 변수를 선언할 수도 있다.

 

 

 - 참조 전달

class Calc
{
       static void Add10(ref int a)
       {
              a = a + 10;
       }
       public void print()
       {
              int x = 100;
              Add10(ref x);
       }
}

ref 를 이용하면 참조 전달이 된다.

int a 와 x 은 대응한다.

 

 

 

뭔 소리야! 앞에 쓴 out이랑 ref랑 다른게 뭔데!! → 그래서 팀원들에게 질문함

★팀원의 답변★

=> 값 전달은 Main()을 기준으로 값이 전달만 될 뿐 원래 정한 값에는 변함이 없다.

그러나 참조전달은 Main()에서 전달받은 값을 바꿔도 Main()안에 있는 값 까지 다같이 바뀐다.

 

 * Main()은 한 프로그램에 한 개만 올 수 있다.

 

값 전달은 공식적으로 call by value.

참조 전달은 call by reference 라고 부른다.

 

 

여기서 중요한 것은, outref (reference의 함수이름, 준말)둘 다 참조 전달이라는 것!! (OMG!)

 

위의 것을 설명하기에 앞서 return을 알아야 하는데,

return은 한 개만 반환할 수 있다.

return a;  //a는 값

만 가능하지

return a, b;  //a와 b는 값

같은 것은 불가능하다.

그래서 복수의 값을 반환하기 위해 out이랑 ref같은 것을 만들었다.

 

즉, outref의 공통점은

 1. call by reference

 2. 복수의 값을 반환할 수 있음

이다.

 

그렇다면 차이점은?

1. out변수를 초기화하지 않아도(값을 주지 않아도) 쓸 수 있다.

class Calc
{
       public void div(int a, int b, out int q, out int r)
       {
              q = a / b;
              r = a % b;
       }

       public void print()
       {
              int x, y;
              div(10, 3, out x, out y);
       }
}

아까 앞에서 out을 사용해본 식인데 잘 보면 int x, y라고만 되어있지 = 3, = 1 같은 값을 주진 않았다.

그러나 ref

class Calc
{
       static void Add10(ref int a)
       {
              a = a + 10;
       }
       public void print()
       {
              int x = 100;
              Add10(ref x);
       }
}

int x = 100 이라고 값을 주었다. 즉, 초기화해야!! 쓸 수 있다.

 

 

Q. out예시 부분에서, 위에 q랑 r이라고 다 써놨는데 왜 밑에서 다시 int x랑 y를 또 정의하는거지??

→A. 사실 변수 div옆에 괄호 안의 글자는 그냥 '상자', '껍데기'라고 볼 수 있다. 진짜 값은 Main() 아래에 들어가는 것.

사실 x, y 안써도 된다고...!

아 진짜 무슨 책이 보면 볼수록 헷갈려

 

A. 또, 함수 앞에 계속 int, string같은 형을 써주는 이유는, 이걸 받아들이는 게 컴퓨터이기 때문이다.

컴퓨터가 사람이 지시한데로 뭘 해보려면 일단 지시를 받을 공간을 만들어야 한다.

형마다 필요한 공간이 다르므로, 어떤 형태인지 알아야 그 만큼의 공간을 만들 수 있으니까! 꼭 들어간다.

 

A. 변수를 선언했다면 밑에도 같은 방식으로 쓰여야 한다.

int Score(a, b)

...뭐더라?

머리론 이해했는데 말로 나오지 않으므로, 나중에 수정해야겠다...

 

함수의 선언 이름은 내맘대로~ 그래도 개발자들끼리 합의한 이름이 있다.

대충 str은 string, div는 divide 등등

 

 

 

참고링크

http://tcpschool.com/c/c_function_basic

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com