Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

I'm FanJae.

[20260428] 메서드(Method)와 배열(Array) 본문

Unity/Unity 초격차캠프

[20260428] 메서드(Method)와 배열(Array)

FanJae 2026. 4. 28. 18:18

1. 메서드(Method)

1) 함수(Function)와 메서드(Method)의 공통점

- 함수와 메서드는 둘다 입력 값을 받아 특정 작업을 수행하고 결과를 내는 코드의 집합이다.

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

- 함수와 메서드는 둘다 아래와 같은 공통적인 특징을 가진다.

- 매개 변수(Parameter)를 받을 수 있다.
- 반환값(Return Value)을 가질 수 있다.
- 호출하면 내부의 코드가 실행된다.
- 함수 오버로딩(Function Overloading)이 가능하다.
- 두 개 모두, 재사용성과 코드 분리를 위해 사용한다.

 

※ 결국, 위에서 보았던 코드만 보고 함수인가? 메서드인가? 구분할 수 없다.


2) 함수(Function)와 메서드(Method)의 차이점

① 소속된 위치

- 함수와 메서드의 가장 큰 차이점은 소속된 위치에 있다.

- 일반적으로 함수는 독립적으로 움직이지만, 메서드는 클래스에 소속되어 있다.

// 일반 함수 (C++)
int Add(int a, int b)
{
    return a + b;
}

int main()
{
    int result = Add(1, 2);
}

 

Add() 는 어디에 소속되어 있지 않다. 즉, 클래스나 객체에 소속되지 않은 함수이다.

- 반면, C#에서는 메서드가 클래스, 구조체 같은 타입 내부에 정의된다.

 

class Calculator
{
    int Add(int a, int b)
    {
        return a + b;
    }
}

- 위 코드에서 Add() 는 Calculator 클래스 내부에 정의되어 있다.

- 이 경우, **Add() 는 메서드(Method)**라고 부른다. (C++에서는 이를 ‘멤버 함수’라고도 한다.)

② 접근 지정자의 유무

- 메서드는 클래스나 구조체 내부에 소속되어 접근 지정자라는 것을 가질 수 있다.

- 일반 함수는 특정 클래스의 멤버가 아니므로 보통 접근 지정자의 영향을 받지 않는다.

- 접근 지정자는 이후 객체 지향 문법을 다룰 때 다시 정리한다.


3. 정적 메서드(Static Method)

① 정적 메서드(Static Method)란?

static void Main(string[] args)
{
    Console.WriteLine("Hello,World!");
}

메서드는 객체를 생성한 뒤 호출하는 형태인 인스턴스 메서드객체를 생성하지 않고 호출할 수 있는 정적 메서드로 나눌 수 있다.

- 이때, static 이 붙은 메서드를 **정적 메서드(Static Method)**라고 한다.

- 정적 메서드는 객체를 만들지 않아도 사용할 수 있다.

 

② 정적 메서드(Static Method)와 인스턴스 메서드(Instance Method)의 차이

- 반면, static 을 붙지 않은 메서드는 인스턴스 메서드라서 객체를 생성해야 사용할 수 있다.

- 인스턴스 메시지에 대해서는 객체 지향 문법을 다룰 때 다시 정리한다.


4. 디폴트 매개변수(Default Parameter)

① 디폴트 매개변수(Default Parameter)란?

static void CreateMonster(string name, int level = 1)
{
    Console.WriteLine($"몬스터 생성함 : {name}, 레벨 : {level}");
}

매개 변수를 선언할 때 매개 변수의 디폴트 값. 즉, 기본값을 미리 지정해두는 기능이다.

- 해당 인수를 생략이 가능하며, 미리 선언해 놓은 기본값이 자동으로 들어간다.

 

② 디폴트 매개변수(Default Parameter)의 예시

static void CreateMonster(string name, int level = 1)
{
    Console.WriteLine($"몬스터 생성함 : {name}, 레벨 : {level}");
}
static void Main(string [] args)
{
		CreateMonster("슬라임");
}

- 위와 같이 호출하면 슬라임, 레벨1 짜리를 사용할 수 있다.

 

③ 사용 예시

void PrintLog(string message)
{
    PrintLog(message, "INFO");
}

void PrintLog(string message, string level)
{
    cout << "[" << level << "] " << message << endl;
}

- 디폴트 파라미터가 없으면 비슷한 함수를 여러 개 만들어야 한다.

 

void PrintLog(string message, string level = "INFO")
{
    cout << "[" << level << "] " << message << endl;
}

- 위처럼, 특정 인자를 생략했을 때, 항상 기본값을 사용한다면, 오버로딩 함수를 만들기보다 디폴트 파라미터를 사용하면 코드가 간결해 질 수 있다.


5. ref (★★★★★)

① ref이란?

- ref는 값을 복사해서 전달하는 것이 아니라, 기존 변수를 참조로 전달하는 방식이다.

- 일반 매개 변수는 값이 복사되어 전달된다.

      - 메서드 내부에서 값을 변경해도 원본 변수에는 영향이 없다.

- 반면 ref를 사용하면, 메서드 내부에서 값을 변경했을 때 원본 변수에도 변경이 반영된다.

- ref를 사용할 때는 메서드 선언부와 호출부 양쪽에 모두 ref를 붙여야 한다.

 

② 사용 예시

static void ChangeValue(ref int number)
{
    number = 30;
}
static void Main(string[] args)
{
    int number = 10;
    Console.WriteLine($"변경 전 number 값 : {number}");
    ChangeValue(ref number);

    Console.WriteLine($"변경 후 number 값 : {number}");
}

- 이처럼, ref 를 메서드 선언부와 호출부 양쪽에 붙여서 사용한다.

6. out (★★★★★)

① out이란?

- 값을 외부로 내보내기 위한 참조 전달 방식이다.

- 변수의 값을 복사하지 않고, 기존 변수를 참조로 전달한다.

- 여러 개의 값을 반환할 때 주로 사용한다.

- 메서드 내부에서 out 매개변수에는 반드시 값을 할당해야 한다.

- 호출하는 쪽에서는 변수를 미리 초기화해두지 않아도 된다.

 

② 사용 예시

static void Divide(int a, int b, out int result, out int remainder)
{

    // 몫 계산
    result = a / b;

    // 나머지 계산
    remainder = a % b;
}

static void Main()
{
    int result;
    int remainder;

    Divide(10, 3, out result, out remainder);
    Console.WriteLine($"몫 : " + result);
    Console.WriteLine($"나머지 : " + remainder);
}

- 이처럼, 하나의 함수에서 여러 개의 값을 반환할 수 있다.

- 주로, 성공 여부와 함께 결과값을 함께 돌려줄 때 사용한다.


7. in

① in이란?

- 값을 읽기 전용으로 전달하는 참조 전달 방식이다.

- 변수의 값을 복사하지 않고, 참조로 전달한다.

- 메서드 내부에서 값을 읽을 수는 있지만, 수정할 수는 없다.

- 주로 크기가 큰 값 타입, struct를 전달할 때, 복사 비용을 줄이기 위해 사용할 수 있다.

 

② 사용 예시

PlayerStat stat = new PlayerStat
{
    Hp = 100,
    Mp = 50,
    Attack = 20,
    Defense = 10
};

PrintStat(stat);     // 가능
PrintStat(in stat);  // 가능

- 아래처럼 PrintsState(int stat); 과 같이 호출할 경우, 메서드 내부에서 값을 바꿀 수 없다.

 

③ 참조인 경우 (★)

static void PrintArray(in int[] array)
{
    array[0] = 0;
}
static void Main(string[] args)
{
    int[] array = { 1, 2, 3 };

    PrintArray(in array); 
    Console.WriteLine(array[0]); // 변경이 되어 출력된다.
}

 

- in 이 참조 변수 자체의 재할당이나 대입은 막을 수 있다.

- 하지만, 배열과 같은 참조 타입 내부의 데이터 변경까지는 막을 수 없다.

- 즉, 매개변수가 가리키는 대상 자체를 다른 값으로 바꾸는건 가능하지만, 참조된 객체의 내부 변경은 막을 수 없다.


2. 배열(Array)

- C++에서 배열은 같은 데이터 타입을 일렬로 나열한 메모리의 연속이었다.

- 이에 반면, C#에서 배열은 단순한 메모리 블록이 아닌, 객체이다.

1) C# 배열의 특징

int[] numbers = new int[3];

Console.WriteLine(numbers.Length); // 3
Console.WriteLine(numbers.GetType()); // System.Int32[]

C#이 객체이기 때문에, 이와 같은 행위가 가능하다.

 

2) 배열 변수와 참조

int [] a = {1,2,3};
int [] b = a;

 

- 여기서 b=a 는 배열 전체를 복사하는 것이 아니다.

- 같은 배열 객체를 가리키는 참조를 복사하는 것이다.

- 이때, a와 b가 지역변수라면 두 변수는 보통 스텍 프레임에 위치하고, 각각 힙에 있는 배열 객체의 참조값을 가진다.

- 하지만, a와 b가 참조하고 있는 배열의 실제 영역({1,2,3})은 힙 데이터에 저장된다.

 


3) 배열 초기화

① 크기만 지정한 방식의 초기화

int[] numbers = new int[3];

이와 같이 초기화 한 경우, 배열 요소는 타입의 기본값으로 채워진다.

- int의 경우 0으로 초기화 된다.

 

② 값을 직접 넣어서 초기화

int[] numbers = new int[] { 1, 2, 3 };
Console.WriteLine(numbers.Length); // 3

- 이 경우 배열 크기는 값의 개수로 결정된다.

 

③ new int[] 를 생략한 방식의 초기화

int[] numbers = { 1, 2, 3 };

- C#에서는 배열 타입을 이미 알 수 있으면 new int[] 를 생략할 수 있다.

 

④ 2차원 배열의 초기화

int [,] = matrix = new int [3,3];

- C나 C++과 배열 선언 방식이 많이 다르기 때문에 주의해야 한다.

Comments