메소드(Method) 는 객체지향 프로그래밍 언어의 함수이다.

 

라고 말해도 한번에 이해하기는 힘들 것 이다.

 

함수(Function)에 대하여 알고 있다면 알 수 있는 개념이지만 함수를 아직 모른다면 와닿지 않는다.

 

그동안 사용해온 Main함수에서 출발해본다.

 

모든 C# 프로그램은 여기서 시작한다. Main 함수이다.

 

프로그래밍 언어에서 함수를 표현하는 가장 큰 특징적 기호가 ()이다.

        static void Main(string[] args)
        {
            Console.WriteLine("Hello my friend!")
        }

대체적으로 프로그래밍 소스코드에서 Main() 처럼 괄호 ()가 붙은 대부분의 명령어는 함수이다.

어셈블리어는 다르다. 100프로 일반화는 무리다

 

C#은 Main 함수에서 시작해서 위에서 부터 차례로 명령줄을 읽으면서 내려온다. 프로그램의 마지막 코드에 다다랐을 때 종료하는 프로세스에 들어간다. 이 과정에서는 안보이지만 운영체제와 .NET 프레임워크의 CLR (Common Language Runtime)이 Main 함수를 호출한 관리자이다.

 

Main 함수는 또 다른 함수를 호출 할 수 있다. Console.WriteLine 도 .NET Core의 라이브러리 함수이다. 함수는 하나의 처리 단위로써 동작한다. 결국 전체 프로그램은 함수로 구성되어진다. 사람으로 따지면 머리 몸통 팔 다리가 Main 하뭇에 다 합쳐져 있는 것이다.

 

Console.WriteLine Method (System)

Writes the specified data, followed by the current line terminator, to the standard output stream.

docs.microsoft.com

Main( ) 함수를 C# 에서는 Method 라 부른다. C# 의 모든 함수는 메소드이다. 그 이유는 클래스를 학습하는 챕터에서 알게 된다. 지금은 프로그램은 함수를 모아서 완성한다는 정도만 알면 충분하다.

 

사용자 정의 메소드

 

using System.ComponentModel.DataAnnotations;

namespace CSharpBasic
{
    class Program
    {
        void PrintSomething()
        {
            Console.WriteLine("MS C#");
            Console.WriteLine("And .NET Framework");
        }
        static void Main(string[] args)
        {
            Program pg1 = new Program();
            pg1.PrintSomething();
        }
    }
} 

void PrintSomething 은 사용자 정의 메소드이다. 문자열을 출력한다. 위치를 잘 보면 Main함수의 위에 있다. 두개의 함수는 이 클래스의 동등한 계층에 있다는 것을 말한다.

 

PrintSomething 은 무언가 출력한다.

이 함수를 호출한 것은 Main 함수이다.

        static void Main(string[] args)
        {
            Program pg1 = new Program();
            pg1.PrintSomething();
        }

그런데 호출 방법이 다르다. 이것도 클래스의 사용법에서 알게 된다. 지금은 PrintSomething() 메소드를 사용했다는 것을 기억하면 된다.

 

* 메소드의 명칭은 주로 파스칼케이스로 지은다. 예를 들면 MyClass , MyCalculator, ProductManager, StudentGrade 단어의 시작은 대문자로 하고 단어가 이어질 때 첫글자는 대문자로 한다.

 

 

접근제어자 modifier

접근제한자는 C#의 키워드이다. 클래스와 메소드를 이해하는데 중요한 개념이 담겨있다. 메소드 접근의 권한, 행동 반경등의 설정을 할 수 있다. 역시 클래스 챕터에서 상세하게 다룰 내용이다,

 

간단하게 분류하면 public 은 모두가 사용가능한 메소드 private은 그 클래스 안에서만 사용할 수 있는 메소드다. public 이나 private 이 없는 메소드는 기본적으로 같은 어셈블리 단위에서 사용이 가능하다.

 

Main 에서 봤던 static 키워드는 클래스의 인스턴스가 필요없다. static이 아닌 메소드는 반드시 메모리에 객체를 생성하는 과정을 거쳐야 사용할 수 있다. 메모리에 올라와 있는 객체를 특별히 클래스의 인스턴스라고 부른다. 이쯤 되서 생각하면 왜 OS에서 Main 메소드를 static으로 호출하는지 알 것이다. Main 메소드는 호출하기 위해 인스턴스를 만들 필요가 없다. 클래스가 로드되는 순간 호출가능하도록 장착된다.

 

인수전달하여 호출하기

 

메소드나 함수를 배울 때 고전으로 배우는 사칙연산 메소드를 만들어 본다.

using System;

namespace CSharpBasic
{
    class Program
    {

        static void Main(string[] args)
        {
            Program pg1 = new Program();

            int a = 7;
            int b = 3;
            Console.WriteLine($"a : {a}, b : {b}");

            Console.WriteLine("ADD :" + pg1.Caclulator(a, b, "add"));
            Console.WriteLine("SUB :" + pg1.Caclulator(a, b, "sub"));
            Console.WriteLine("MUL :" + pg1.Caclulator(a, b, "mul"));
            Console.WriteLine("DIV :" + pg1.Caclulator(a, b, "div"));
        }
        int Caclulator(int a, int b, String mode)
        {
            switch (mode){

                case "add":
                    return a + b;
                case "sub":
                    return a - b;
                case "mul":
                    return a * b;
                case "div":
                    return a / b;
            }
            return a + b;
        }
    }
} 

switch case 문을 사용해봤다. 모드를 사용하면 한개의 메소드에서 사칙연산을 모두 처리할 수 있다.

 

여기서 헷갈리지 말아야 할 것이 있다.

 

Main 함수에서 전달하는 a와 b는 인수이다. Calculator에서 전달받는 a와 b는 매개변수이다. 이 둘은 이름이 같아도 같지 않다. 바로 지역변수의 개념 때문이다. 땅과 멤버라고 생각하면 된다. A함수는 A의 땅에 멤버를 가지고 있다, B함수는 B땅에 멤버를 가지고 있다. 이들은 서로의 멤버를 넘겨주지 않고 철저하게 보관한다. 

 

Main 에서 넘겨준 a와 b 를 받은 Calculator의 a 와 b는 복사본에 불과하다. 왜 이렇게 설계했는지 의문을 가질 수도 있겠다. 이 방법은 프로그래머들이 현재까지 베스트라고 판단한 것이다. 메소드들이 전역변수와 Main 함수의 데이터에 손을 대기 시작하면 프로그램은 겉잡을 수 없이 혼란스러워 질 것이기 때문이다.

 

여기에 클래스의 개념이 들어가게 되면 더 미궁으로 빠진다. 처음부터 욕심내지 말고 하나씩하나씩 개념을 챙겨나가도록 한다.

공유하기

facebook twitter kakaoTalk kakaostory naver band