본문 바로가기

IT/학습

Static -3. static 함수

class StaticFunc
{
    int nonStaticNum = 5;//비정적, 일반적인 필드
    static int staticNum = 10;//정적 필드

    public static void PrintNum()//정적 메서드 만들었슴.
    {
        //Console.WriteLine("비정적 인트값은 : " + nonStaticNum);
        Console.WriteLine("정적 인트값은 : " + staticNum);
    }

    public static void IncreaseAndPrintStaticNum()//정적 메서드는 정적메서드만 부를수 이씀.
    {
        //정적메서드 내에서 지역변수들은 static일 필요는없다.

        int a = 10; // 지역변수는 static안에서 쓰고 사라지는거라 안에서 선언한건 쓸수있음.
        Random rnd = new Random();

        staticNum++;
        PrintNum();
        //PrintNomalNum(); 
    }

    public  void PrintNomalNum()//정적 메서드 만들었슴.
    {
        Console.WriteLine("비정적 인트값은 : " + nonStaticNum);
        //Console.WriteLine("정적 인트값은 : " + staticNum);
    }
}

위에는 테스트를 해본 코드이다.

지금부터 이게 왜 주석처리해놨는지에 대해 쓸것이다.

 

지금 처음에 주석처리 한부분 중에서 nonStaticNum 이게 비정적이라 아래처럼 static 안으로 넣어두면 에러가난다.

 

public static void WriteStaticNum() 
{
      Console.WriteLine(nonStaticNum);
      Console.WriteLine(staticNum);
}

 

할당이 되질 않았는데 호출하려고 해서 그런거다.

 

static property와 마찬가지로, static 함수 내에선 static이나 const만 조작이 가능하다.

 

같은 이유이긴 하지만 정적 함수를 한번 호출해보면 이해가 가능할것이다.

 

StaticFunc temp = new StaticFunc();
temp.writeStaticNum();

라고 적으면 바로 에러가 난다.

static 함수도 객체 개별로 쓸 수 있는 것이 아닌 클래스 소유의 함수이다.

 

클래스명을 통해 사용하면 작동 할 것이다.

 

StaticFunc.writeStaticNum();

 

위에 코드처럼 사용하면 호출이 정상적으로 된다.

 

즉 static 함수 는 호출할때 클래스.메서드명으로 호출하면 된다는 것이다.

 public static void IncreaseAndPrintStaticNum()//정적 메서드는 정적메서드만 부를수 이씀.
    {
        //정적메서드 내에서 지역변수들은 static일 필요는없다.

        int a = 10; // 지역변수는 static안에서 쓰고 사라지는거라 안에서 선언한건 쓸수있음.
        Random rnd = new Random();

        staticNum++;
        PrintNum();
        //PrintNomalNum(); 
    }

이 메서드 부분은 안에 지역변수가 있다.

 

static 안에서는 static만 사용할수 있는데 왜 저건 되냐 ? 싶겠지만

 

정적할당 영역에서 저 메서드가 실행이 되면서 지역변수도 할당이 되면서 사용 되기 떄문에 실행이 가능하다.

a는 함수를 호출하는 시점에 임시로 스택에 생성이 된다는 것이다.

 

요약하자면 되게 간단해진다.

 

static 안에선 지역변수를 제외하곤 static만 쓰면된다! 로 한줄 요약이 된다. 

'IT > 학습' 카테고리의 다른 글

상속(Inheritance)  (0) 2024.12.11
Static -4. static 클래스  (0) 2024.12.11
Static -2 static 프로퍼티  (1) 2024.12.11
Static -1. static 필드와 static 참조형 필드  (0) 2024.12.11
클래스Class  (0) 2024.12.10