-
I. 메서드
: 특정한 작업을 수행하기 위해 사용되는 독립적인 기능 단위
: 코드의 재사용성과 모듈화를 위해 사용.
!! 메서드를 사용해야하는 이유
1. 재사용이 용이함.
: 동일한 작업을 직접 반복하지 않고, 필요할 때마다 해당 작업의 기능을 가진 메서드를 호출할 수 있음.
2. 모듈화 가능.
: 코드를 작은 단위로 분리하고 관리할 수 있음.
3. 가독성과 유지보수성 증가.
: 특정 작업을 메서드를 통해 대체할 수 있으므로, 코드가 간결해지고 가독성이 좋아짐.
: 또한, 모든 반복되는 작업을 일일히 수정하는 것에서, 메서드를 사용함으로써 메서드만 수정하여 전체를 수정할 수 있게 됨.
4. 코드의 추상화
: 동일한 작업에 대해, 메서드이름을 통해 해당 작업이 어떤 작업을 하는 지 파악할 수 있음.
II. 메서드의 선언과 호출
"접근제한자" "static 여부" "리턴 타입" "메서드 이름"("매개변수")
1. 접근 제한자(Access Modifier)
: 객체 지향 프로그래밍에서 클래스의 멤버(필드, 메서드, 속성 등)에 대한 접근 권한을 지정하는 키워드
1. public : 모든 외부의 접근을 허가함.
2. private : 같은 클래스 내에서만 접근을 허가함.
3. protected : 같은 클래스 내부와 파생 클래스에서 접근을 허가함.
4. internal : 같은 **어셈블리 내에서 접근을 허가함.
**어셈블리 (assembly)
: NET 런타임 환경에서 실행할 수 있는 코드와 리소스, 메타데이터를 포장하고 배포하는 단위2. static 여부
: 메서드가 정적인지 아닌지를 나타냄.
**정적 메서드 (Static Method)
: 특정 객체의 인스턴스와는 관계없이 호출할 수 있는 메서드.
internal class MethodsBasic { static void Main(string[] args) { // 스태틱 메서드 Add 사용 int plused = Calc.Add(3, 5); Console.WriteLine(plused); // 인스턴스 메서드 AddInstance 사용 Calc calc = new Calc(); // calc 라는 새로운 인스턴스 생성 calc.SetElement(3); // 인스턴스에 숫자 3 추가 calc.SetElement(5); // 인스턴스에 숫자 5 추가 int result = calc.GetTotal(); Console.WriteLine(result); } } class Calc { public static int Add(int a, int b) // 스태틱 메서드 { int sum = a + b; return sum; } private int total; public Calc() { total = 0; } public void SetElement(int value) // 인스턴스 메서드 { total += value; } public int GetTotal() // 인스턴스 메서드 { return total; } }
3. 리턴 타입(Return Type)
: 메서드가 반환하는 값의 데이터 타입을 지정하는 키워드
1. void
: 메서드가 반환하는 값이 없음.
public void Greeting() { Console.WriteLine("안녕하세요"); }
2. 값 타입
: 변수의 값을 매개변수로 보내, 메서드를 통해 직접 값을 반환
public int Add(int a, int b) { return a + b; // int 값 반환 } public float Minus(int a, int b) { return a - b; // float 값 반환 }
3. 참조 타입 (함수 선언시, 변하는 것 없음)
: 객체나 클래스 인스턴스를 반환
: 변수의 주소를 매개변수로 보내, 메서드를 통해 다시 변수의 메모리 주소를 반환
: 즉, 참조 타입을 통해, 원본에 영향을 줄 수 있다.
static void Main(string[] args) { int a = 3; int b = 5; Console.WriteLine("a : " + a); // a : 3 Console.WriteLine("b : " + b); // b : 5 Calc calc = new Calc(); calc.Swap(ref a, ref b); Console.WriteLine("a : " + a); // a : 5 Console.WriteLine("b : " + b); // b : 3 !! 참조값을 매개변수로 날려서, 값 자체를 바꿈. } class Calc { public void Swap(ref int a, ref int b) { int temp = b; b = a; a = temp; } }
4. 기타
: Tuple, ValueTuple, Dictionary 등과 같은 복합 데이터 형식 혹은, 자신이 사전에 정의한 구조체(Struct)를 메서드의 반환 타입으로 사용할 수 있다.
// 매개변수로 구조체를 활용한 메서드 예시 internal class MethodsBasic { static void Main(string[] args) { DataTypeManager dataTypeManager = new DataTypeManager(); string dataName = "short"; int[] dataInfo = { 2, -32768 }; DataType newData = dataTypeManager.SetData(dataName, dataInfo); Console.WriteLine($"Data Type Name: {newData.typeName}"); Console.WriteLine($"Byte Size: {newData.byteSize}"); Console.WriteLine($"Minimum Value: {newData.minValue}"); } } public struct DataType { public string typeName { get; set; } public int byteSize { get; set; } public int minValue { get; set; } } public class DataTypeManager { public DataType SetData(string dataName, int[] dataTypeArray) { DataType getNew = new DataType { typeName = dataName, byteSize = dataTypeArray[0], minValue = dataTypeArray[1]}; return getNew; } }
>
4. 매개변수 (Parameters)
: 메서드에 전달되는 입력 값.
: 배열, 문자열, 구조체, 기본 데이터 형식 등을 매개변수로 사용 가능하다.
: 반환 타입과 달라도 상관 없다.
public int GetStringLength(string input) { return input.Length; }
III. 메서드 오버로딩
: 동일한 이름의 메서드를 다양한 매개변수 목록으로 다중 정의하는 개념.
: 작업이나 기능은 동일하나, 입력값에 따라 다르게 동작해야 할 때 사용함.
void PrintMessage(string message) { Console.WriteLine("Message: " + message); } void PrintMessage(int number) { Console.WriteLine("Number: " + number); } // 메서드 호출 PrintMessage("Hello, World!"); // 문자열 매개변수를 가진 메서드 호출 PrintMessage(10); // 정수 매개변수를 가진 메서드 호출
IV. 재귀 호출
: 메서드가 자기 자신을 호출하는 것.
: 따로, 종료 조건이 없거나 모호하다면, 무한루프에 빠지게 된다.
void CountDown(int n) { if (n <= 0) { Console.WriteLine("Done"); } else { Console.WriteLine(n); CountDown(n - 1); // 자기 자신을 호출 } } // 메서드 호출 CountDown(5);