글로벌 객체지향 프로그래밍 10주차 - Static
Static

사용 위치에 따라 정적 클래스, 정적 메소드, 정적 멤버함수로 분류됨
Heap 영역은 new 키워드를 이용해 동적으로 메모리에 할당하는 영역을 의미함
- Stack 영역에 저장되는 변수들은 지역변수와 매개변수가 포함됨
- bss 영역은 초기화되지 않은 전역변수와 정적변수가 존재하는 공간으로 모든 값은 0으로 초기화 됨
- Static은 data 영역에 해당으로, 프로그램이 시작될 때 실행되어 프로그램 종료 시에 메모리가 해제 됨.
- 프로그램에서 1개만 존재함
- 클래스가 관리하는 변수로, static이 없는 클래스와 멤버 변수는 객체가 관리
자신이 선언된 위치에 따라, 하위 구성 요소들은 모두 Static여야함.
- Stack과 Heap은 사용 이후, Garbage Collector가 처리함 - BSS는 해당 X
메모리 영역
데이터 영역
- Static 변수가 할당되는 공간
- 프로그램 시작과 동시에 할당 되어, 프로그램 종료 시점에 메모리에서 삭제됨
스택 영역
- 함수 호출 시 지역변수와 매개변수가 저장되는 공간
- 함수 호출 이후 소멸됨
- 마지막으로 호출된 변수의 메모리부터 해제됨
힙 영역
- 프로그래머가 관리하는 메모리 영역
- 동적할당으로 생성되는 메모리 구역임
- 먼저 호출된 메모리부터 해제됨
정적 클래스
- new 키워드를 이용해 인스턴스를 생성 불가
- 모든 멤버는 static으로 선언되어야 함
생성자 포함 불가(static은 new를 사용 X)
- 객체 첫 호출시 생성 및, 프로그램 종료 시 해제
- 정적 클래스는 어디서든 접근 가능
- 전역적으로 접근하는 유틸리티 클래스 생성시 사용하면 유용
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static class Calculator
{
public static int Plus(int a, int b) { return a + b; }
public static int Minus(int a, int b) { return a - b; }
}
public class Program
{
public static void Main(string[] args)
{
int addResult = Calculator.Plus(5, 3);
int minusResult = Calculator.Minus(5, 3);
Console.WriteLine(addResult);
Console.WriteLine(minusResult);
}
}
1
2
3
결과 :
5
2
Static 메소드
인스턴스 직접 생성없이 호출 가능함
메소드 내부에서 객체의 멤버 참조 불가
인스턴스에서 호출 불가
- 객체이름.메소드이름() 사용불가
예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public class UnitConverter{ public const float num = 2.54f; public static float inchToCentimeter(float inch) { return inch * num; } public static float centimeterToInch(float inch) { return inch / num; } } public class Program{ public static void Main(string[] args){ float inch = 24f; float centimeter = 100f; Console.WriteLine("{0} inch convert to {1} centimeter.", inch, UnitConverter.InchTocentimeter(inch)); Console.WriteLine("{0} centimeter convert to {1} inch.", centimeter, UnitConverter.CentimeterToInch(centimeter)); } }
1 2 3
출력: 24 inch convert to 60.96 centimeter. 100 centimeter convert to 39.37008 inch.
정적 필드(메소드)
- 인스턴스 직접 생성없이 접근 가능
- 자료형 앞에 static 키워드 선언해 생성
- 어디서든 접근 가능
- 주로 전역적으로 접근해야 하는 변수에 사용
- Static 메모리 영역에 저장 → 프로그램 종료시까지 메모리 상에서 존재
- 몇 개를 생성해도 클래스 당 1개의 값만 보유
- 사용 이유: 인스턴스 간의 값을 가지기 위해서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Book
{
public static int count = 0;
private string name;
public Book(string name) {
this.name = name;
count++;
}
}
public class Program
{
public static void Main(string[] args)
{
//정적 필드
Book book1 = new Book("Harry Potter");
Book book2 = new Book("The Lord of the Rings");
Console.WriteLine("Created Book Count : " + Book.count);
}
}
1
2
출력 :
Created Book Count : 2
- xxxxxxxxxx 접근제한자 class 클래스명{ 반환형 메소드명(매개변수){ … } 자료형 단어;}c#
- 따라서 인스턴스를 여러개 생성 하여도 클래스 내에는 1개만 존재하므로 book1에서 +1, book2에서 +1을 하여 값이 2이다
- 만약 count에 static이 없을 경우, 각 인스턴스마다 count가 1개씩 생성 되므로 값은 0이다
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.