카테고리 없음

static 란?, 함수 앞에 static가 있으면 정적 메서드, 없으면 인스턴스 메서드

이더23 2024. 9. 19. 17:27

개요

함수 앞에 static 에 대해 알아보겠습니다

 

C#에서 static 키워드는 정적 메서드, 정적 변수 등 클래스 멤버가 객체(인스턴스)와 무관하게 사용되도록 정의할 때 사용됩니다. 이번 글에서는 static의 의미와 특징, 그리고 언제 사용하는 것이 좋은지 알아보겠습니다.

내용 - static이란?

static은 클래스 자체에 속하는 멤버를 정의하는 키워드입니다. 인스턴스(객체)를 생성하지 않고도 클래스 이름을 통해 직접 접근할 수 있습니다. 다시 말해, static이 붙은 메서드나 변수는 모든 인스턴스가 공유하며, 프로그램 실행 중에 오직 하나만 존재합니다.

static 멤버의 특징:

  • 클래스 자체에 속함
  • 객체 없이 호출 가능
  • 프로그램 실행 시 메모리에 단 한 번 할당
  • 인스턴스 멤버와 달리, 객체마다 독립적인 값을 갖지 않음

내용 - static 멤버와 인스턴스 멤버의 차이

구분정적 멤버 (static)인스턴스 멤버

속한 대상 클래스 자체 클래스의 각 객체
접근 방식 클래스 이름을 통해 직접 호출 객체를 생성한 후 호출
메모리 사용 프로그램 실행 시 단 한 번 할당 각 객체마다 별도의 값이 존재
사용 예 공통된 기능(유틸리티 메서드), 공유 데이터 객체마다 독립적인 상태를 가지는 데이터

내용 - 언제 static을 사용할까?

  • 유틸리티 메서드: 객체 상태와 무관한 기능을 수행하는 메서드일 때 사용합니다. 예를 들어, Math 클래스의 Math.Sqrt()는 static으로 정의되어 있습니다.
  • 공유 데이터: 프로그램 전체에서 공유되어야 하는 변수를 정의할 때 사용합니다. 정적 변수는 모든 객체가 동일한 값을 공유합니다.
  • 싱글톤 패턴: 싱글톤(Singleton) 패턴처럼 클래스의 인스턴스가 하나만 존재하도록 보장할 때도 정적 멤버를 사용합니다.

내용 - 함수 앞에 static가 있고 없고의 차이

코드

static void Main(string[] args)
{
    
}

void FirstHomeWork()
{
    Console.Write("이름을 입력하세요 : ");
    string name = Console.ReadLine();
    Console.Write("나이를 입력하세요 : ");
    string age = Console.ReadLine();
    Console.WriteLine($"당신은 {name}이고 {age}살 입니다.");
}

 

위와 같은 상황일때 Main은 정적메서드이고 FirstHomeWork은 인스턴스 메서드여서 Main에서

클래스 이름으로 직접 호출할 수 없으니 Main에서 객체를 생성해서 FirstHomeWork 함수호출해야 합니다.

아니면 static void FirstHomeWork() 로 만들어 정적메서드로 만든 후에는 main에서 함수를 호출하면 오류없이 잘 작동이 된다.

첫번째 코드

internal class Program
{
    static void Main(string[] args)
    {
        Program program = new Program();
         program.FirstHomeWork();
    }

    void PrintMessage() // 인스턴스 메서드
    {
        Console.Write("이름을 입력하세요 : ");
         string name = Console.ReadLine();
         Console.Write("나이를 입력하세요 : ");
         string age = Console.ReadLine();
         Console.WriteLine($"당신은 {name}이고 {age}살 입니다.");
    }
}

 

두번째 코드

internal class Program
{
    static void Main(string[] args) // static 메서드
    {
        PrintMessage(); // 같은 클래스의 static 메서드 호출
    }

    static void PrintMessage() // static 메서드
    {
        Console.Write("이름을 입력하세요 : ");
         string name = Console.ReadLine();
         Console.Write("나이를 입력하세요 : ");
         string age = Console.ReadLine();
         Console.WriteLine($"당신은 {name}이고 {age}살 입니다.");
    }
}

내용 - 정리

  • static 멤버는 클래스 자체에 속하며, 객체 생성 없이 호출할 수 있습니다.
  • 정적 메서드는 공통된 기능을 구현할 때, 정적 변수는 모든 객체가 공유하는 값을 관리할 때 유용합니다.
  • static을 올바르게 사용하면 코드의 효율성과 가독성을 높일 수 있습니다.