728x90

알고리즘을 가르치던 중 Static이 무엇인지 질문을 받았다. 내 답변은 '정적..' 더 이상 자세한 설명을 할 수 없었다.

사용법은 알고 있었고, 과거에 궁금해서 공부를 했었지만(까먹음) 추상적으로 이해하는 것 같아 제대로 공부하고 기록하기 위해 작성하려 한다.

 

프로그래머스에서 알고리즘을 풀 때 개발 툴에서 테스트용으로 main method를 활용하는 경우 함수를 참조하려면 함수를 static으로 선언해야 된다. 왜냐하면 main method가 static으로 선언되었기 때문이다.('public static void main(Staring[] args)') 도대체 static은 무엇일까?


1. Static이란?

 static은 정적이라고 표현하며 '고정된'이란 의미를 가지고 있다. static은 변수와 메서드로 선언할 수 있는데 이 둘을 합쳐서 '정적 멤버'라고 한다. 이 정적 멤버는 JVM에서 클래스 로딩 시 메서드 영역에 적재하게 되는데 이때 클래스별로 관리되기 때문에 클래스의 로딩이 끝나면 즉시 사용 가능하다.

 

(메모리에 대한 이해를 돕기 위해 참조)

https://jfbta.tistory.com/106

 

CS개념잡기 1탄 ] 메모리의 구조 및 프로그램 실행 과정 알기

1. 메모리의 데이터가 쌓이는 과정 우리는 컴퓨터를 사용할 때 많은 프로그램을 사용한다. 프로그램을 실행하면 메모리에 쌓이면서 프로세스가 수행하게 된다. 이때 메모리는 무슨 역할을 하는

jfbta.tistory.com

2. Static(정적)과 전역의 차이

Static Heap
클래스들이 할당 객체들이 할당
GC 관여하지 않음 GC 관여
메모리를 공유 메모리를 공유하지 않음

static으로 생성되면 Heap 영역이 아닌 Static 영역에 할당되며 위 '표'와 같은 차이가 존재한다.

또 GC가 관여하지 않아 프로그램이 종료 시까지 메모리가 할당된 채로 존재하기 때문에 성능 저하의 원인이 될 수 있다.

 

3. Static 사용하는 경우

프로그래머스에서 알고리즘 문제를 개발 툴로 풀 때 main method를 사용하기 위해 함수를 만들 때 사용했다.

현업에서 사용하는 프로젝트 소스도 어떤 경우에 static을 쓰고 있는지 찾아보았으나, 마찬가지인 이 경우 외엔 없었다.

 

4. Static 사용법

 ① 정적 변수

String str = "welcome to 초고도"; // X
static String str = "welcome to 초고도"; // O

public static void main(String[] args) {
    System.out.println(str);
}

 ② 정적 메서드

// X
public String solution() {
	return "welcome to 초고도";
}

// O
public static String solution() {
	return "welcome to 초고도";
}

public static void main(String[] args) {
    System.out.println(solution());
}

실제로 개발 툴로 사용해보면 메인 함수가 정적으로 선언되었기 때문에 정적으로 선언되지 않은 변수, 메서드는 에러가 발생할 것이다.

728x90
TOP