정적(static) 필드
static :사전적으로 정적이라는 뜻을 가지고 있음. -움직이지 않는다
C#에서의 static : 메소드나 필드가 클래스의 인스턴스가 아닌 클래스(의 멤버) 자체에 소속되도록 지정하는 한정자
그 틀을 이용한 인스턴스가 여러개 존재할 수는 있으나 클래스는 프로그램에 유일하게 존재.
그리고 어떤 필드가 클래스에 소속된다는 것은 곧 그 필드가 프로그램 전체에서 유일하게 존재한다는 것을 의미
static으로 한정하지 않은 필드: 자동으로 인스턴스에 소속됨
static으로 한정한 필드: 클래스에 소속됨
왜 static필드를 쓸까?
아까도 말했듯이 static으로 수식한 필드는 프로그램 전체에 걸쳐 하나밖에 존재하지 않음
=> 프로그램 전체에 걸쳐 공유해야 하는 변수가 있다면 정적 필드를 이용
클래스의 필드를 public static int a; 처럼 static으로 수식하면
기존의
MyClass obj1 = new MyClass();
obj1.a = 1; 처럼 하는게 아니라
인스턴스를 만들지 않고 클래스의 이름을 통해 필드에 직접 접근하면 된다
어떻게?
MyClass.a = 1;
지웅이의 부가 설명:
게임에서 보통 골드, 캐쉬 등 유일해야 하는 값을 만들때 씀
MyClass obj1 = new MyClass(); 이런식으로 인스턴스를 만들면
obj1은 클래스의 모든필드를 다 가지고 있음. int a, int b, c..등등
하지만 정적필드는 MyClass.a라고 써줘야 하고 여기서의 a는 정적필드기 때문에 이 값을 변경하면
어짜피 모든곳에서의 이 값이 다 바뀜.
그리고 인스턴스자체에서 static을 불러오는 것 자체가 불가능하다
많은 사람들이 모르는데 static또한 stack과 heap처럼 데이터형이다
아까 설명한것처럼 static은 유일하게 존재. 이를이용한 디자인패턴이 싱글톤이다
정적 메소드
정적메소드 역시 정적 필드처럼 인스턴스가 아닌 클래스 자체에 소속됨
또 마찬가지로 메소드가 클래스의 인스턴스를 생성하지 않아도 호출이 가능하다
우리가 여태까지 했던건 정적메소드의 반댓말인 인스턴스 메소드(인스턴스를 생성해야만 호출가능)
정적메소드는
public static void ...로 선언
보통 객체 내부의 데이터를 이용해야 하는 경우에는 인스턴스 메소드를 선언하고
내부 데이터를 이용할 일이 없는 경우에는 별도의 인스턴스 생성없이 호출할 수 있도록 메소드를
정적으로 선언
어떤 경우에 인스턴스/정적 메소드를 사용할지는 .NET클래스 안에 좋은 예들이 많다
static 과 static public의 차이
갑자기 궁금해져서..
https://luv-n-interest.tistory.com/838
static과 static public 의 차이, 정적 변 [Unity]
조금 궁금한 주제였다. 근데 알아볼 기회가 생겨서 바로 알아봤다. 우선 우리는 Static은 정적선언이고 Stack 영역에 저장되어 프로그램이 내려가기 전까지 계속 있을 것이란 것을 알고 있다. 그렇
luv-n-interest.tistory.com
위 블로그 요약
: static은 정적선언이고 stack 영역에 저장되어 프로그램이 내려가기 전까지 계속 있을 것이란걸 알고 있다
그렇다면 어차피 정적인데 public을 붙이나 마나 아무데서나 불러올 수 있는 것 아닌가?
아니다
그냥 static을 쓸때처럼 접근제한자를 설정하지 않으면 자동으로 protected로 암묵적으로 선언된다.
즉, 자신을 포함한 파생클래스만 사용이 가능하다 = static으로만 선언하면 다른 클래스에선 불러올 수 없다!
반면 static public 은 모든 클래스에서 사용 가능
static public vs public static?
참고로 여기선 static public과 public static의 차이는 없지만, 대부분의 개발자들은 public static의 순서로 사용한다한다
내가 공부하고 있는 책은 static public으로 사용함. 상관없다
https://stackoverflow.com/questions/4147668/public-static-vs-static-public-is-there-a-difference
"public static" vs "static public" - is there a difference?
sealed class PI { public static float number; static PI() { number = 3.141592653F; } static public float val() { return number; } } What's the difference between public static and static
stackoverflow.com