" /> 글로벌 객체지향 프로그래밍 10주차 - Static | BlackWerf's Blog
포스트

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

Static

  • Image Alt 텍스트
  • 사용 위치에 따라 정적 클래스, 정적 메소드, 정적 멤버함수로 분류됨

  • 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 라이센스를 따릅니다.