알고리즘을 가르치던 중 Static이 무엇인지 질문을 받았다. 내 답변은 '정적..' 더 이상 자세한 설명을 할 수 없었다.
사용법은 알고 있었고, 과거에 궁금해서 공부를 했었지만(까먹음) 추상적으로 이해하는 것 같아 제대로 공부하고 기록하기 위해 작성하려 한다.
프로그래머스에서 알고리즘을 풀 때 개발 툴에서 테스트용으로 main method를 활용하는 경우 함수를 참조하려면 함수를 static으로 선언해야 된다. 왜냐하면 main method가 static으로 선언되었기 때문이다.('public static void main(Staring[] args)') 도대체 static은 무엇일까?
1. Static이란?
static은 정적이라고 표현하며 '고정된'이란 의미를 가지고 있다. static은 변수와 메서드로 선언할 수 있는데 이 둘을 합쳐서 '정적 멤버'라고 한다. 이 정적 멤버는 JVM에서 클래스 로딩 시 메서드 영역에 적재하게 되는데 이때 클래스별로 관리되기 때문에 클래스의 로딩이 끝나면 즉시 사용 가능하다.
(메모리에 대한 이해를 돕기 위해 참조)
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());
}
실제로 개발 툴로 사용해보면 메인 함수가 정적으로 선언되었기 때문에 정적으로 선언되지 않은 변수, 메서드는 에러가 발생할 것이다.
'Language > Back End' 카테고리의 다른 글
Java ] Comparable과 Comparator의 개념 및 차이 (0) | 2022.03.10 |
---|---|
Java ] 자바 인터페이스(interface), 구현(implements) 사용방법 및 추상 클래스(abstarct)와 차이 비교 (0) | 2022.01.16 |
Java ] int와 Integer의 차이 및 Wrapper Class 맛보기 (0) | 2021.12.14 |
Java ] Math.max와 Math.min 사용예제(10초) (0) | 2021.12.14 |
Java] replaceAll로 숫자 길이만큼 *(별표)로 치환하기. (0) | 2021.12.06 |