Static Method

 

static 메소드를 작성해보자.

 

static method ?? C#과 같은 객체 지향 프로그래밍 언어에서는 메소드를 호출하기 전에 인스턴스를 만들어야 한다.

 

static 을 달아놓으면 인스턴스를 생성하지 않아도 메소드를 호출 할 수 있다.

 

위의 문장은 static method 를 설명하려고 하지만 결과적으로 외계어 처럼 들리는 것 같다.

 

아직까지 글쓴이도 static을 쉽게 설명하는 방법을 찾으려고 노력중이다.

 

처음에는 일단 편하게 생각해야 한다. static이란 용어 자체가 C#에만 쓰이는 용어가 아니라 그 자체로 혼동스러운 측면이 있다.

 

그래서 그냥 static 을 붙여놓으면 처음부터 호출이 가능하다로 받아들이면 좋다.

 

 static 이 없으면 객체를 생성해야 되고 붙어 있으면 이미 메모리에 올라와 있는 것이다.

 

https://stackoverflow.com/questions/38957519/how-does-c-sharp-handle-the-memory-for-static-members

 

너무 스트레스 받을 필요는 없다. 스택오버플로우에서 같은 주제로 치열하게 논쟁하는 사람들의 글을 볼 수 있다.

시간여행

 

뭘 좀 아는 사람들도 온라인 상에서 치고 박고 싸우는데 이제 막 프로그래밍 이란 닻을 올리고 출항한 이들에겐 가혹한 시련 일 것이다.

 

프로그래밍은 시작하기도 쉽지만 포기하기도 쉽다.

 

다음의 예제가 설명한다.

 

using System;

namespace CSharpBasic
{
    class Program
    {
        static void Main(string[] args)
        {
            printSomething();
        }
        static void PrintSomething()
        {
            Console.WriteLine("Method called");
        }
    }
}

 

이 코드는 단순하다. 콘솔 아웃풋에 무언가 출력한다. 그러나 static을 제외하면 아래와 같은 메시지를 출력한다

 

static 이 아니라서 실행할 수 없습니다가 아니라, 메소드에 개체 참조가 필요하다는 오류이다. 개체 참조가 바로 인스턴스다.

 

바꿔말하면 메모리에 메소드가 로드되어 있지 않다는 말이다. 그렇다면 static은 로드되어 있는가? 그렇다. 메모리의 어느 한 영역에 로드되어 있기 때문에 메소드를 사용할 수 있는 것이다. 언제 로드하는가? 이 클래스(Program)를 .NET frameworkd 의 CLR(Common Language Runtime) 이 로드하는 시점이다. 다른 말로 프로그램 실행시킬때... 이다.

 

사실 static 의 첫번째 예는 Main 함수이다. Main 함수가 static 인 것은 여기서 부터 프로그램이 시작되서 끝나기 때문이다. static 멤버는 프로그램이 종료될 때까지 메모리에서 해제되지 않는다. 일반 메소드들은 인스턴스를 생성하고 적절한 시점에 GVC(가비지 콜렉터)에 의해서 자동으로 메모리가 해제된다. (C에서는 수동으로 해야했다) static 메소드는 그럴일이 없다. 

 

static 과 일반 method 를 비교하다 보면 결론을 알 수 있을 것이다.

메소드 작성법

static 메소드의 원리에 대해서 알아봤으니까 메소드를 작성해보자. 인스턴스를 생성하지 않을 것이므로 static 메소드를 만들어 본다.

 

다음의 문법으로 작성된다.

 

[return type] [method name]  ( [parameter list])
{
  // method body
}

반환값    메소드 이름    ( 매개변수 리스트...)
{
   // 메소드 몸체
}

 

반환값은 호출한 곳으로 돌려보내주는 값이다. 메소드 이름은 식별자(identifier)  이고 이 메소드에 집어넣는 인수를 받을 매개변수의 리스트가 괄호안에 들어간다. 메소드 몸체는 실제 코드가 해야할 일을 정의하는 곳이다.

 

using System;
namespace CSharpBasic
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 5;
            int b = 7;
            Console.WriteLine(Square(a));
            Console.WriteLine(Square(b));
        }
        static int Square(int a)
        {
            return a * a;
        }
    }
}

 

문법을 따라서 메소드를 작성해본다. 숫자값을 받아서 제곱을 반환하는 메소드이다.

 

함수 매개변수의 숫자는 1개 이상을 입력할 수 있다.

 

다음의 예제는 사각형의 넓이에서 정육면체의 부피까지 구하는 메소드들을 정의한다.

 

using System;
namespace CSharpBasic
{
    class Program
    {
        static void Main(string[] args)
        {
            double w1 = 5.0;
            double h1 = 7.0;
            double l1 = 3.0;
            
            Console.WriteLine("Square of " + w1 + " : " + Square(w1));
            Console.WriteLine("Rectangle of " + w1 + ", " + h1 + " : " +  Rectangle(w1, h1));
            Console.WriteLine("Cube of " + w1 + " : " + Cube(w1));
            Console.WriteLine("Cuboid of " + w1 + ", " + h1 + ", " + l1 + ", " +  Cuboid(w1,h1,l1));            
        }
        static double Square(double width)
        {
            return width * width;
        }
        static double Rectangle(double width, double height)
        {
            return width * height;
        }
        static double Cube(double width)
        {
            return width * width * width;
        }      
        static double Cuboid (double width, double height, double length)
        {
            return width * height * length;
        }
    }
}

정사각형의 넓이를 구하려면 매개변수가 2개,

 

직사각형의 넓이를 구하려면 매개변수가 2개,

 

직육면체의 부피를 구하려면 매개변수가 3개

 

이런 식으로 현실의 수학 문제를 C#의 메소드로 구현할 수가 있다.

 

수학에서는 크기의 제한이 없겠지만 double 형을 사용하면  ±5.0 × 10−324 ~ ±1.7 × 10308

 

범위의 연산을 할 수 있다. 굉장히 큰 숫자이고 대부분 현실과 관련한 문제를 풀기에 충분한 자료형이다.

 

MSDN

 

부동 소수점 숫자 형식 - C# 참조

기본 제공 C# 부동 소수점 형식인 float, double 및 decimal에 대해 알아보기

docs.microsoft.com

 

공유하기

facebook twitter kakaoTalk kakaostory naver band