static 란?, 함수 앞에 static가 있으면 정적 메서드, 없으면 인스턴스 메서드
개요
함수 앞에 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을 올바르게 사용하면 코드의 효율성과 가독성을 높일 수 있습니다.