C# - 3

HOHO·2023년 7월 3일
0

C#

목록 보기
3/3

var 데이터형식

컴파일러에게 변수의 타입을 추론하도록 한다. var 키워드를 사용하면 변수의 타입을 직접 명시하지 않고도 컴파일러가 변수의 초기화 식을 분석하여 타입을 유추. 이를 "암시적 형식 지정"이라고 한다.
var는 지역변수로만 사용할수 있다.

규칙

  1. var 키워드로 변수를 선언할 때 반드시 초기화식이 있어야 합니다.

  2. 초기화식을 통해 변수의 타입이 유추되며, 컴파일러는 변수의 타입을 해당 식의 결과 타입으로 결정합니다.

  3. var 키워드로 선언된 변수는 한 번 타입이 결정되면 다른 타입의 값을 할당할 수 없습니다. 즉, 변수의 타입은 초기화식의 결과 타입과 일치해야 합니다.

var name = "John";           // 문자열 타입으로 추론
var age = 30;                // 정수 타입으로 추론
var pi = 3.14;               // 실수 타입으로 추론
var isEmployed = true;       // 부울 타입으로 추론
var person = new Person();   // Person 클래스 타입으로 추론

연산자 우선순위

출처


값에 의한 호출(Call by value) / 참조에 의한 호출(Call by reference)

참고

C#에서는 "pass by reference"를 "참조에 의한 전달"이라는 용어로 사용하고, "call by reference"를 "참조에 의한 호출"이라는 용어로 사용합니다.

즉, C#에서는 "pass by reference"와 "call by reference"를 구분하여 사용합니다. 하지만 C++에서는 둘 다 "참조에 의한 호출"로 통용되며, 구분하여 사용하지 않습니다.

using System;

namespace ConsoleApplication1
{
    class Test1
    {
        public static void plus(int x, int y) 
        {
            x += 10;
            y += 5;
        }
        public static void minus(ref int x, ref int y)
        {  
            x -= 10; 
            y -= 5;
        }
        public static void Main(string[] args)
        {
            int x = 10;
            int y = 5;
            Console.WriteLine("origin x : {0} ,y : {1}", x, y);
            //x = 10, y = 5
            plus(x, y);
            Console.WriteLine("plus x : {0} ,y : {1}", x, y);
            //x = 10, y = 5
            minus(ref x, ref y);
            Console.WriteLine("minus x : {0} ,y : {1}", x, y);
            //x = 0, y = 0

        }
    }
}

plus메소드 -> 값에 의한 전달, minus메소드는 -> 참조에 의한 전달
call by value는 메소드가 매개변수를 받아들일때 데이터의 복사가 이뤄진다 그래서 x,y의 값이 변하지않음
call by reference는 데이터의 복사가 아니라 원본변수를 직접 참조한다
(C, C++에서의 포인터 개념)
메소드 선언부에 ref키워드를 붙여주고, 호출시에 다시 ref키워드를 붙여준다
ref는 메소드 내부 기존변수를 영구적으로 수정할때 사용한다

out, in 키워드

in
in 키워드는 함수 선언과 호출에 모두 붙일 수 있으며 호출에는 안 쓰고 선언에만 쓰는 경우도 가능합니다.
in으로 보내는 변수 역시 초기화를 생략할 수 없으며 함수 내부에서는 읽기만 가능합니다.
읽기가 강제는 아닙니다.
또 쓰기가 불가능하기 때문에 함수가 호출되고 값이 바뀔 수가 없습니다.


-> 성능 개선과 안정성을 위해 매개변수를 읽기 전용으로 전달할 때 사용. 매개변수의 값이 변경되지 않아야 하며, 해당 값에 대한 참조만 필요한 경우에 유용

out
일반적으로 메서드는 한 개의 값을 반환하거나 void를 반환 하지만 때로는 여러 값을 반환해야 하는 경우가 있을 수 있다. 이때 out을 사용하여 메서드에서 반환할 여러 값을 매개변수로 전달
메서드 내부에 생성된 값을 반환하기위 해 사용되며,
쓰기가 강제되기 때문에 함수가 호출되고 나면 무조건 값이 바뀌어 있다.

    class TestConsole
    {
        public static void Main(string[] args)
        {
            void InandOut(in int a, ref int b, out int c, out int d, int e)
            {
                //a = 10; in 키워드로 쓰기 불가 에러
                Console.WriteLine("Method Call a : " + a); //Method Call a : 10
                Console.WriteLine("Method Call b : " + b); //Method Call b : 5
                c = a * b;
                d = a / b;
                b = d * 2;
                e += 1;
                Console.WriteLine("Method Call b : " + b); //Method Call b : 4
                Console.WriteLine("Method Call c : " + c); //Method Call c : 50
                Console.WriteLine("Method Call d : " + d); //Method Call d : 2
                Console.WriteLine("Method Call e : " + e); //Method Call e : 2
            }

            int a = 10;
            int b = 5;
            int e = 1;
            InandOut(in a, ref b, out int c, out int d, e);
            Console.WriteLine("after b : " + b); //after b : 4
            Console.WriteLine("after c : " + c); //after c : 50
            Console.WriteLine("after d : " + d); //after d : 2
            Console.WriteLine("after e : " + e); //after e : 1
        }
    }

a는 in 키워드로 메서드 내부 쓰기 불가
b는 ref 키워드로 인한 참조호출 -> value가 바뀌었다
c, d out 키워드로 메서드 내부 계산결과 반환
e는 아무런 키워드가 없으므로 pass by value 데이터 복사만 이뤄지므로 메서드 호출 이후 1의 값을 가진다


Pass by reference를 사용하는 상황은 크게 3가지가 있습니다.

  1. 커다란 Struct 변수를 함수 인자로 보내고 싶은데 메모리 복사하는 연산이 부담스러울 때
  2. 어떤 Referece Type 변수의 생성을 함수 안에서 해야할 때 (string 변수에서 특히 많이 발생)
  3. 함수로부터 여러 타입의 리턴 값을 받고 싶을 때
profile
기계 그잡채가 되고싶다

0개의 댓글