C#/2. 메서드 & 클래스

메서드, 매개변수, 반환 타입, return문, 참조에 의한 전달&반환, ref/out 키워드, 메서드 오버로딩, 명명된 인수, 선택적 인수, 로컬 함수

DOlpa_GB 2025. 3. 21. 00:20

 

 

#2 유니티 엔진 동작 원리 (클래스,메서드,상속,컴포넌트, 브로드캐스팅, MonoBehavior)

이번글에서는 유니티에서 엔진이 동작하는, 정확히는 게임 속 모든 오브젝트들이 움직이는원리에 대해서 알아보려고 한다 그전에, 이미 다른글에도 정리되어 있지만 가장 기본이며 가장 많이

sangeun00.tistory.com

 

 

#3 C# 프로그래밍 (메서드, 간단한 코딩예시, 클래스,인스턴스,접근제한자,참조타입)

이번에 해볼것은 바로 유니티에서 쓰이는 C# 프로그래밍이다하지만 지금 이 글을 쓰고 있는 시점과 비슷하게 이미 나는 C# 공부를 따로 하고 있고  CLR, 변수, 스택과 힙, 데이터 형식, 박싱&언박

sangeun00.tistory.com

 

이미 메서드에 대해서는 질리도록 다뤘기 때문에 정말 마지막으로 짚고 넘어가겠다

 

메서드(Method) : 객체지향 프로그래밍 언어에서 사용하는 용어

일련의 코드를 하나의 이름 안에 묶은것이며 이름을 불러주는것만으로도 실행(호출)할 수 있다

 

클래스 안에 선언되는 메서드는 매개변수와 반환 형식을 가진다

 

class Calculator
{
        public int plus(int a, int b)
        {
            int result = a + b;
            return result;
        }
}

 

여기서 메서드에 들어가는 int a, int b가 매개변수

plus앞에 int와 return이 반환타입이다

 

int x = Calculator.Plus(3,4);

 

그리고 이렇게 메서드 호출이 가능하다

 

 

 

<return문>

 

return문은 이미 앞서 나온 switch문에서도 나왔지만 언제든지 메서드 중간에 호출되어

메서드를 종결시키고 프로그램의 흐름을 호출자에게 돌려줄 수 있다

 

        int Fibocanni(int n)
        {
            if (n < 2)
                return n;
            else
                return Fibocanni(n - 1) + Fibocanni(n - 2);
        }

 

그리고 메서드가 반환할 것이 아무것도 없다면, 즉 반환 형식이 void여도 return문을 사용할 수 있다

 

아래 예시 코드를 확인해보자

 

 

 

 

<매개 변수>

 

이번엔 매개 변수에 대해서 배워볼 것이다. 아는 부분은 넘기고 모르는것만 배우자

 

 

Main 메서드에서 두 변수 x,y에 각각 값을 받는다. 

그리고 swap이라는 메서드에 넣고 a와 b의 값을 바꾼다 하더라도 어디까지나 a,b값이 바뀌는거지

원본인 x,y의 값을 변동이 없다. 

그 이유는 지금까지의 변수들은 전부 값에 의한 전달이었기 때문이다

 

 

 

<참조에 의한 전달>

 

 

하지만 이 값을 변경시킬 수 있는 방법이 있다!

변수 앞에 ref 키워드만 붙여주면 "참조에 의한 전달"로 넘어가 다른 메서드에 있는 변수값을 변경해줄 수 있다

 

값에 의한 전달이 매개변수가 변수나 상수로부터 값을 복사하는것과 달리

참조에 의한 전달은 매개변수가 메소드에 넘겨진 원본 변수를 직접 참조 한다

따라서 메소드안에서 매개변수를 수정하면 이 매개변수가 참조하고 있는 원본 변수에 수정이 이뤄진다

 

 

 

<참조로 반환>

 

참조 반환값을 이용하면 호출자로 하여금 반환받은 결과를 참조로 다룰 수 있도록 한다

class SomeClass
{
    int value = 10;
    
    public ref int method()  // 메소드 이름에 추가
    { 
        return ref value;   // 변수 앞에도 추가
    }
}

 

간단하다 메서드 이름앞에, 그리고 변수 앞에 ref 키워드를 추가해주면 된다

 

 

이런식으로 return 뒤에 반환하는 값에도 ref 키워드를 붙여주면 참조 반환을 해준다

 

 

 

<출력 전용 매개변수>

 

만약 덧셈이나 뺄셈이 아닌 나눗셈처럼, 두개의 매개변수를 받아 두개의 결과값을 내야하는 메서드라고 생각해보자

 

void Divide(int a, int b, ref int mok, ref int nmg)
{    
    mok = a/b;
    nmg = a%b;
}


....


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

Divide(a,b,ref c, ref d);
Console.WriteLine("Mok : {0}, nmg = {1}", mok, nmg);

 

지금까지 배운대로 라면 이렇게 코드를 작성할 것이다

물론 이렇게 만들어도 코드에 큰 문제는 없으나 출력전용 매개변수로 조금 더 안전하게 코드를 짤 수 있다

 

void Divide(int a, int b, out int mok, out int nmg)
{    
    mok = a/b;
    nmg = a%b;
}


....


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

Divide(a,b,out c, out d);
Console.WriteLine("Mok : {0}, nmg = {1}", mok, nmg);

 

사용법은 아주 간단하다. ref 키워드를 out으로 바꿔주기만 하면 된다

그럼 왜 굳이 키워드를 바꾸냐? ref 키워드로 매개변수를 넘길 경우 메서드가 해당 매개변수에 결과를 저장하지 않아도

컴파일러는 아무 경고를 하지 않지만 out 키워드를 이용하여 매개변수를 넘길때

메서드가 해당 매개변수에 결과를 저장하지 않으면 컴파일러가 에러 메세지를 전달한다고 한다

....그냥 out 키워드가 더 안전하다 정도로만 알고 넘어가자

 

 

 

 

<메서드 오버로딩>

 

오버로딩(onerloading)이란 "과적하다"라는 의미로

메서드 오버로딩이란 하나의 메서드 이름에 여러개의 구현을 올리는것을 의미한다

 

int Plus(int a, int b)
{
   return a+b;
}

 

이런 간단한 메서드가 있다고 치자. 그리고 만약 이 Plus() 메서드가 int 타입에 이어 double 타입도 지원해주고 싶다면?

 

굳이 다른 이름으로 새로운 메서드를 만들것이 아닌 메서드 오버로딩을 이용하면 된다

 

 

int Plus(int a, int b)
{
   return a+b;
}

double Plus(double a, double b)
{
   return a+b;
}

 

이렇게 오버로딩을 해놓으면 메서드 호출 코드에 사용되는 매개변수의 수와 형식에 따라 분석해서 

어떤것을 사용하게 될지 결정해준다

 

int num1 = Plus(1,2);
double num2 = Plus(1.1,2.2);

 

이렇게 하면 일일이 기능에 따라 메서드의 이름을 정해줘야하는 프로그래머에게도, 

메서드를 사용하는 사용자에게도 높은 생산성을 제공한다

 

이건 처음보는데 정말 이로운 기능인것 같다...

 

 

 

 

<명명된 인수>

말 그대로 메서드를 호출할 때 인수의 이름에 근거해서 데이터를 할당할 수 있다

 

 

이건 바로 예시 코드부터 보겠다. 둘다 같은 기능이지만 매개변수로 넣어줄 값 앞에

이름을 명시하여 들어갈 값 앞에 ':' 을 붙여주면 된다

일일이 모든 매개변수 앞에 이름을 붙이는건 번거롭지만 잘 이용한다면 분명히 도움이 될 것 같다

 

 

 

 

<선택적 인수>

메서드의 매개변수는 기본값을 가질 수 있다. 즉, 매개변수를 특정값으로 초기화하듯 선언할 수 있다

 

 static void PrintProfile(string name, string phone = "123456")
 {
     Console.WriteLine($"name : {name}, phone : {phone}");
 }

 

이런 식으로 메서드에서 미리 phone의 값을 "123456"으로 초기화 해줬으니

메서드를 호출할때 name의 값만 입력할 수 있다

 

 

위 사진을 보면 미리 phone 값을 "123456"으로 초기화 해주었으니

메서드를 호출할 때 name만 매개변수로 넣어줘도 자동으로 phone의 값까지 출력되는 것을 확인할 수 있다

 

 

 물론 메서드 호출시 따로 값을 지정해주면 그것이 반영된다

 

 

 

 

<로컬 함수>

 

 

로컬 함수는 메서드 안에서 선언되고, 선언된 메서드 안에서만 사용하는 특별한 함수이다

사실상 이중 메서드...같은 느낌이라고 나는 생각하지만 어쨋든 클래스의 멤버가 아니니

거의 메서드의 모습과 흡사하지만 메서드가 아닌 함수로 불린다

 

        public void Method()
        {
            int count = 0;
            localfunction(1, 2);
            localfunction(3, 4);

            void localfunction(int a, int b)
            {
                Console.WriteLine($"count : {++count}");
            }
        }

 

여기서 localfunction() 이 바로 로컬 함수이다. Method안에서 선언되었고  Method는 count라는 지역 변수를 가지고 있지만

로컬 함수인 localfunction에서는 변수 count를 자유자재로 읽고 쓸 수 있다

 

주로 로컬 함수는 메서드 밖에서 다시 쓸 일 없는 반복적인 작업을 하나의 이름 아래 묶어놓는데 제격이다

 

예시코드이다. 조금 복잡하긴 한데 중요한건

 

ToLowerChar라는 로컬함수가 ToLowerString이라는 메서드 안에서만 돌아간다는것을 알면 된다

 

 

반응형