[Java] Static
안녕하세요! 오늘은 Static에 대해 알아봅시다!
Static
디아블로2나 리그 오브 레전드를 플레이 해보신 분들이라면 참으로 많이 들은 단어일 것입니다. 디아블로2에서는 원소술사의 기술 중에 스태틱 필드(공교롭게도 우리가 배울 단어랑 같네요!)가 있고 리그 오브 레전드에서는 스태틱의 단검이 있지요! 두 가지 기술의 공통점이 있는데요, 바로 전기를 사용한다는 점과 고정 데미지가 들어간다는 점입니다. Static을 영어사전에서 찾아보면 정적인, 고정된, 정지상태의 또는 정전기라는 뜻을 가지고 있습니다. '아하! 그렇다면 Static은 뭔가 정적이고 고정된 것이구나!'라고 유념하고 아래의 글을 읽어주시길 바랍니다.
정적 멤버
정적 멤버는 클래스에 고정된 멤버로 인스턴스(객체)를 생성하지 않고 바로 사용할 수 있는 static이 앞에 붙어 있는 필드와 메소드를 칭합니다. 영어로는 static field와 static method라고 합니다.
정적 멤버들의 생김새
public class StaticMembers {
static 타입 필드명 = 초기값;
static 리턴타입 메소드명(매개 변수){
실행문...;
}
}
정적 멤버들의 작동원리
정적 멤버들은 새로운 인스턴스를 생성하지 않아도 '클래스명.정적멤버명'을 사용하면 바로 호출하여 사용할 수 있다. 그 이유는 이들은 프로그램을 실행하면 static 메모리 영역에 저장되어 자유롭게 사용할 수 있게 된다. 문제는 너무 많은 수의 정적 멤버들을 사용하게 된다면 메모리를 차지하는 영역이 많아지게 되고 따라서 컴퓨터가 느려지거나 오류가 생길 수 있다.
정적 멤버들은 언제 사용해야해?
정적 필드(Static Field)
객체마다(생성할 객체, 인스턴스) 공통적으로 사용을 해야 하는 경우에는 정적 필드를 사용하는 것이 좋습니다.
정적 메소드(Static Method)
인스턴스 필드를 사용하여 메소드를 실행해야 한다면 인스턴스 메소드를 사용하고 정적 필드를 사용하여 메소드를 실행해야 한다면 정적 메소드를 사용합니다.
정적 멤버 호출
클래스가 메모리로 로딩되면 바로 정적 멤버들을 사용할 수 있습니다.
class Apple {
static String AppleLaptop = "MacBook Pro";
static void AppleLaptopSizes() {
System.out.println("13-inch, 14-inch, 16-inch");
}
}
public class StaticMembers01 {
public static void main(String[] args) {
System.out.println(Apple.AppleLaptop);
Apple.AppleLaptopSizes();
}
}
/* 출력값
MacBook Pro
13-inch, 14-inch, 16-inch
*/
위의 코드를 보면 인스턴스 생성 없이 바로 클래스명.정적필드명 그리고 클래스명.정적메소드명으로 바로 사용할 수 있습니다.
참고로 인스턴스를 생성하고 다른 클래스들처럼 사용할 수 도 있습니다. 하지만 이클립스에서는 경고 표시가 납니다.
정적 멤버의 단점과 해결방법
인스턴스를 생성하지도 않고 바로 불러낼 수 있다는 장점이 있지만 문제는 생성자를 만들지 않기 때문에 초기화를 할 수가 없다. 그럴 때는 정적 초기화 블록을 이용해 초기화를 해줄 수 있다.
정적 초기화 블록 (Static Block)
class Apple {
static String appleLaptop = "MacBook Pro";
static void AppleLaptopSizes() {
System.out.println("13-inch, 14-inch, 16-inch");
}
static { // 정적 초기화 블록
System.out.println("맥북 사고 싶다.");
}
}
public class StaticMembers01 {
public static void main(String[] args) {
System.out.println(Apple.appleLaptop);
Apple.AppleLaptopSizes();
}
}
/* 출력문
맥북 사고 싶다.
MacBook Pro
13-inch, 14-inch, 16-inch
*/
- 정적 초기화 블록은 클래스가 메모리로 로딩될 때 자동적으로 실행하기 때문에 가장 먼저 실행된다.
- 정적 블록은 클래스 내부에 여러 개가 선언되어도 무관하다.
- 순서대로 실행된다.
정적 메소드와 블록 사용기 주의할 점
이들 내부에 인스턴스 필드나 메소드를 사용할 수 없다. 하지만 사용하고 싶다면 인스턴스를 생성하고 참조 변수로 접근하면 가능하다.
class Apple {
static String appleLaptop = "MacBook Pro";
String ipad = "ipad Pro";
static void AppleLaptopSizes() {
Apple ip = new Apple(); // 인스턴스 생성
System.out.println(ip.ipad); // 참조 변수로 접근
}
static {
System.out.println("맥북 사고 싶다.");
}
}
public class StaticMembers01 {
public static void main(String[] args) {
System.out.println(Apple.appleLaptop);
Apple.AppleLaptopSizes();
}
}
'이것이 자바다'라는 책을 참고 하였습니다. 신용권 저, 한빛미디어 출판
유튜브 링크 : https://www.youtube.com/watch?v=Sos11X7wy1M