static은 고정된이라는 이름 자체에서도 알 수 있듯이, 어떠한 객체에 정적인 속성을 부여하는 키워드 입니다.
1. Static 사용법
- Static을 사용하지 않았을 경우
Monster클래스의 멤버변수 name과 hp는 정적이지 않기 때문에 객체 각각의 값을 가집니다.
그렇기 때문에 실행 결과가 위처럼 Monster객체 monster1과 monster2가 서로 다른 이름을 출력한 것입니다.
- Static 활용시
Monster클래스의 멤버변수 name을 static으로 지정해주었습니다.
static으로 지정된 name은 스태틱 메모리 영역에 할당되며 단 하나만 존재하게 됩니다.
Monster 클래스의 name은 단하나만 존재하기 때문에
monster1에서 생성자로 "슬라임"이라는 이름을 변경해도 처음에만 "슬라임"이라는 이름을 가졌을 뿐,
이후 monster2 객체가 생성되는 과정에서 "주황버섯"으로 이름이 바뀌게 됩니다.
2. Static의 특징
Static이 가지는 여러가지 특징에 대해 알아보겠습니다.
- 1. 객체에서 사용할 수 없음
Monster 클래스의 정적 멤버 변수인 name은 Monster 객체 monster1에서 접근 할 수 없습니다.
Monster 클래스의 정적 멤버 함수인 Attack()은 Monster 객체 monster2에서 접근 할 수 없습니다.
이는 메모리 영역의 차이 때문인데 static변수는 스태틱 메모리 영역,
new 키워드를 사용한 객체는 힙메모리 영역을 사용하기 때문입니다.
따라서 monster1은 static변수 name과 사용하는 메모리 영역이 다르기 때문에 그 값에 접근 할 수 없습니다.
monster2의 경우도 동일합니다.
- 2. 객체를 만들지 않아도 사용가능
Monster 내부의 정적 멤버 변수 name과 정적 멤버 함수 Attack()은 따로 객체를 만들지 않아도 호출하거나
그 값을 변경할 수 있습니다.
우리가 자주 사용하는 Console.WriteLine()도 역시 정적 멤버 함수입니다.
우리가 Console로 된 객체를 만들지 않아도 해당 함수를 호출할 수 있는 이유입니다.
같은 예로 유니티의 GameObject.Destroy() 키워드 역시, 정적 멤버 함수 이기 때문에 우리는 GameObject로된
객체를 사용하지 않아도 해당 함수를 호출할 수 있는것입니다.
Static의 이러한 특징은 사실 몬스터의 이름과 같은 변수에 적용하기보다
어느 곳에서나 공유되어야하는 함수나 값 혹은 규칙을 만들 때 유리하게 작용할 수 있습니다.
위처럼 Monster 클래스에서 관리해야하는 오직 단하나만 존재해야하는 값인
몬스터의 갯수등을 예로들 수 있습니다.
- 3. Static Class 안의 객체들은 Static으로만 이뤄진다.
static으로 된 class Player를 만들 경우에 static을 붙이지 않으면 에러가 납니다.
Player 클래스 안의 멤버 변수 name과 hp는 스태틱 메모리 영역을 사용하지 않기 때문에 사용할 수 없기 때문입니다.
사용하려면 역시 static 키워드를 붙여 정적 멤버 변수로 변경해야합니다.
- 4. 정적 메서드 내에서 정적이 아닌 멤버 변수나 함수를 호출 할 수 없는 이유
이유는 간단합니다. 정적 멤버 함수들은 객체가 할당되지 않아도 호출할 수 있기 때문에 정적 함수내에서는
정적인 멤버가 아니면 호출 할 수 없습니다.
우리가 Main() 함수내에서 외부 매서드를 호출할때 static키워드를 붙이지 않으면 안되는 이유 또한 같습니다.
결국 Main함수도 Program이라는 클래스 안에 존재하는 정적 멤버 함수기 때문에
객체를 만들지 않아도 호출 할 수 있습니다.
그렇다면 왜 Static으로된 정적 함수안에 있는 지역변수들은 static키워드를 붙이지 않아도 되는걸까요?
Static키워드를 붙이게 되면 일반적으로 프로그램 시작시 스태틱 메모리에 할당되고 프로그램이 끝나기 전까지
그 값이 사라지지 않습니다. 우리가 아무데서나 static 멤버들을 사용할 수 있던 이유입니다.
그러나 함수에서 사용되는 지역변수들은 함수가 호출될때 생성되고 함수가 끝나면 소멸하게 됩니다.
따라서 함수가 정적 함수라고 한들 사용되는 지역변수들은 해당 함수에게만 영향을 미치기 때문에 굳이
Static을 붙일 이유가 없습니다.
'C#' 카테고리의 다른 글
C# virtual, override (1) | 2024.01.05 |
---|---|
C# Partial (2) | 2024.01.05 |
C# Class (0) | 2024.01.04 |
C# JSON 사용 방법(직렬화, 역직렬화) (1) | 2024.01.03 |
C# 틱택토 만들기(Console) (1) | 2023.12.30 |