C#

메서드

temp-franc 2023. 8. 16. 17:11

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);