일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Mac
- 파이썬
- Python
- PostgreSQL
- dataframe
- PANDAS
- PySpark
- Google Spreadsheet
- numpy
- c#
- Apache
- Java
- list
- math
- gas
- hive
- Excel
- SQL
- django
- Google Excel
- Kotlin
- google apps script
- array
- Tkinter
- GIT
- Github
- string
- matplotlib
- Redshift
- Today
- Total
달나라 노트
C# : static (정적 데이터) 본문
코드를 작성하다보면 빈번하게 보이는 키워드 중 하나인 static이라는 키워드가 있습니다.
아래 예시를 보시죠.
아래 코드에 대한 정확한 의미는 차차 풀어나갈 것이니 일단 static이라는 키워드가 어디에 있는지 봅시다.
using System;
class Monster
{
public int hp = 0;
public int mp = 0;
public static int call_count = 0;
public Monster()
{
hp = hp + 100;
mp = mp + 100;
call_count = call_count + 1;
}
public void show_call_count()
{
Console.WriteLine("Call count = " + call_count);
}
}
class MyProgram
{
static void Main()
{
// golem object
Monster golem = new Monster();
golem.hp = 1000;
golem.mp = 300;
Console.WriteLine(golem.hp);
Console.WriteLine(golem.mp);
golem.show_call_count();
// kerberos object
Monster kerberos = new Monster();
Console.WriteLine(kerberos.hp);
Console.WriteLine(kerberos.mp);
kerberos.show_call_count();
}
}
public static int call_count = 0;
static void Main()
위 코드에서는 특히 위 2개의 부분에서 보이네요.
class Monster
{
public int hp = 0;
public int mp = 0;
public static int call_count = 0;
...
}
특히 Monster class를 보면 그 차이가 두드러집니다.
Monster class에서 선언된 변수는 위와같이 총 3개인데 hp, mp는 static 키워드가 없고, call_count라는 변수만 static 키워드가 있습니다.
대체 무슨 차이일까요?
hp, mp같은 변수의 목적부터 생각해봐야합니다.
Monster class를 따로 생성해두는 이유가 무엇일까요?
Monster별로 hp, mp값은 모두 다를테지만 hp, mp라는 속성을 가지고 있다는 것은 동일하겠죠.
따라서 우리는 여러 몬스터를 생성할 때 모든 몬스터마다 hp, mp 변수를 매번 선언해주는게 아니라
위처럼 Monster class에 hp, mp 값을 기본적으로 가지고있게 하고 Monster class로부터 개별 몬스터들의 객체를 생성하여 혹시나 어떤 몬스터에 mp값을 누락한다던지 등의 실수를 방지하기 위함입니다.
이 내용을 명심하고 hp, mp값의 존재 의미를 다시 곱씹어봅시다.
hp, mp라는 값은 사실 Monster class를 위해서 존재하는게 아니라 Monster class를 이용해서 만들어질 golem, kerberos같은 객체를 위해 존재하는 것이죠.
hp, mp값은 Monster class 안에 선언되어있지만 사실상 Monster class를 가져와서 만들어질 어떠한 객체를 위한겁니다.
hp, mp같이 static 키워드가 없는 채로 선언된 모든 class 속의 변수는 그 class를 이용해서 만들어질 객체와 연결되어있는 것입니다.
반면에 static 키워드를 이용하여 생성된 call_count 변수는 무엇일까요?
static 키워드를 붙여서 생성한 것은 class 그 자체와 연결됩니다.
class 그 자체와 연결된 static 상태와의 변수와 그렇지 않은 일반 변수의 차이를 알아봅시다.
using System;
class Monster
{
public int hp = 0;
public int mp = 0;
public static int call_count = 0;
public Monster()
{
hp = hp + 100;
mp = mp + 100;
call_count = call_count + 1;
}
public void show_call_count()
{
Console.WriteLine("Call count = " + call_count);
}
}
class MyProgram
{
static void Main()
{
// golem object
Monster golem = new Monster();
golem.hp = 1000;
golem.mp = 300;
Console.WriteLine(golem.hp);
Console.WriteLine(golem.mp);
golem.show_call_count();
// kerberos object
Monster kerberos = new Monster();
Console.WriteLine(kerberos.hp);
Console.WriteLine(kerberos.mp);
kerberos.show_call_count();
}
}
-- Result
1000
300
Call count = 1
100
100
Call count = 2
맨 처음 봤던 코드입니다.
코드를 실행해보면 결과가 위처럼 나옵니다.
static으로 선언된 call_count 변수를 선언한 이유는 Monster class가 몇번이나 선언되는지 알기 위해서 선언한 것입니다.
Monster class 부분을 봅시다.
class Monster
{
public int hp = 0;
public int mp = 0;
public static int call_count = 0;
public Monster()
{
hp = hp + 100;
mp = mp + 100;
call_count = call_count + 1;
}
public void show_call_count()
{
Console.WriteLine("Call count = " + call_count);
}
}
hp, mp는 일반 변수로 선언하고 있습니다.
call_count는 static 변수로 선언하죠.
그리고 public Monster() 에서와 같이 생성자를 만들었습니다.
hp, mp는 기본값인 0에서 100을 더하도록 했고,
call_count는 기본값인 0에서 1을 더하도록 했습니다.
즉, Monster class가 어딘가에서 호출되어 어떠한 객체를 만들 때 마다 Monster class의 생성자가 실행되어 hp값은 100, mp값도 100으로 설정하며 call_count 변수는 1을 더해줍니다.
여기까지만 보면 hp, mp와 call_count 변수간에 큰 차이가 없어보입니다.
하지만 결과를 볼까요?
class MyProgram
{
static void Main()
{
// golem object
Monster golem = new Monster();
golem.hp = 1000;
golem.mp = 300;
Console.WriteLine(golem.hp);
Console.WriteLine(golem.mp);
golem.show_call_count();
// kerberos object
Monster kerberos = new Monster();
Console.WriteLine(kerberos.hp);
Console.WriteLine(kerberos.mp);
kerberos.show_call_count();
}
}
-- Result
1000
300
Call count = 1
100
100
Call count = 2
- Monster golem = new Monster();
- golem.hp = 1000;
- golem.mp = 300;
golem 객체를 생성하고 hp, mp를 1000, 300으로 설정했습니다.
그러니 당연히 1000, 300으로 결과가 나오고 call_count는 기본값인 0에서 1을 더하니 1로 출력되겠죠.
그리고 나서 Monster class를 불러와 kerberos 객체를 생성하고 hp, mp, call_count값을 출력해봤습니다.
hp, mp는 위에서 생성자에 의해 기본값인 0에서 100이 더해져서 100으로 설정된다고 했으니 당연히 100이 출력되고 있습니다.
근데 call_count가 2로 출력되고있습니다.
분명히 Monster class에서 call_count 변수는 0이 기본값이며 생성자에 의해 Monster class가 호출될 때 1이 더해진다고 했습니다.
그러면 당연히 kerberos 객체가 생성될 때에도 call_count변수가 0으로 셋팅된 후 생성자에 의해 1이 더해져서 1이 출력되어야하지 않을까요?
왜 2가 출력된걸까요?
그 이유는 바로 call_count 변수가 static으로 선언되었기 때문입니다.
static으로 선언된 call_count 변수는 Monster class를 이용하여 만들어지는 golem, kerberos같은 객체와는 연결되어있지 않고 Monster class 자체에 연결되어있습니다.
즉, 오로지 생성될 객체를 위한 변수인 hp, mp는 Monster class로 인해 만들어 질 때 마다 초기값인 100부터 시작합니다.
하지만 static으로 선언된 call_count 변수는 Monster class 자체와 연결되어있어서 Monster class가 여러 번 호출된다고 해도 Monster class 자체에 귀속되어있기 때문에 hp, mp처럼 객체별로 초기화되지 않는 것이죠.
이렇게 static으로 선언한 변수를 이용하면 Monster class가 몇 번 호출되었는지 알 수 있습니다.
이렇게 단순히 객체마다 초기화되는 값이 아니라 class 자체에 연결시킬 내용은 static 키워드를 이용하여 선언해야합니다.
'C# > C#' 카테고리의 다른 글
C# : KeyEventHandler (키보드 입력 이벤트, Keyboard input event, KeyDown, KeyUp) (0) | 2022.03.30 |
---|---|
C# : EventHandler (마우스 이벤트 처리) (Window 클릭, 버튼 클릭, 마우스 오버, Window click, Button click, mouse over) (3) | 2022.03.30 |
C# : abstract, virtual (class template 생성하기) (0) | 2022.03.23 |
C# : array (0) | 2022.03.23 |
C# : break, continue (0) | 2022.03.23 |