I'm FanJae.
[20260428] 메서드(Method)와 배열(Array) 본문
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++과 배열 선언 방식이 많이 다르기 때문에 주의해야 한다.
'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [20260429] 구조체(struct)와 클래스(class)의 차이점 (C#) (0) | 2026.04.29 |
|---|---|
| [20260429] string / StringBuilder / 사용자 정의형 타입(struct, enum) (0) | 2026.04.29 |
| [20260427] C# 값 형식(Value Type)과 참조 형식(Reference Type) (0) | 2026.04.27 |
| [20260427] C#의 기본적인 내용 정리 (0) | 2026.04.27 |
| [C#] 콘솔 지뢰찾기 만들기 (0) | 2026.04.24 |