static 연산자는 하기와 같은 네 가지 경우에 적용 가능하다.
- blocks
- variables
- methods
- nested classes
어떠한 멤버가 static으로 선언되어있을 때, 클래스의 오브젝트가 생성되기 이전에 접근 가능하다 이때 접근 시 어떠한 오브젝트의 참조가 필요 없다.
package statickeyword;
public class StaticExercise {
static void method01() {
System.out.println("I am static Method...!");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
method01();
}
}
위의 코드를 예시로 StaticExercise의 인스턴스를 생성할 필요 없이 메서드에 직접적인 호출이 가능하다.
만약 우리가 static 변수를 초기화하기 위해선, 클래스가 로드될 때 딱 한번 실행되는 static 블록 내부에 선언해야 한다.
public class StaticExercise2 {
static int var1;
static int var2;
static {
var1 = 1;
var2 = 2;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//StaticExercise2.var1;
System.out.println(StaticExercise2.var1);
System.out.println(StaticExercise2.var2);
}
}
어떠한 변수가 static으로 선언될 때, 해당 변수의 복사본이 클래스 수준의 모든 오브젝트에 공유된다.
이때 모든 클래스의 인스턴스들은 똑같은 static 변수를 공유한다.
Key Point
- 클래스 수준에서만 static 변수를 생성할 수 있다.
- static 블록과 static 변수는 프로그램에 존재하는 순서대로 실행되어진다.
public class StaticExercise3 {
static {
System.out.println("Inside static block");
}
static int var1 = method01();
static int method01() {
System.out.println("static mehod01");
return 1000;
}
public static void main(String[] args) {
System.out.println("value of var1 ::" + StaticExercise3.var1);
System.out.println("Inside main method");
}
}
static 메서드 제약사항
- They can only directly call other static methods.
- They can only directly access static data.
- They cannot refer to this or super in any way.
public class StaticExercise3 {
int localVariable = 1;
static {
System.out.println("Inside Static Block...!");
}
static int method01() {
// TODO: [method01] junwoochoi 2020/03/04 8:42 오후
// static 메서드에는 지역 변수, 일반 메서드 선언 및 초기화 불가
// localVariable = 2;
// method02();
return 100;
}
private void method02() {
System.out.println("Inside none-static Method...!");
}
public static void main(String[] args) {
System.out.println(StaticExercise3.method01());
System.out.println("Inside Main Method...!");
}
}
static의 활용
class Company {
static String companyName;
static int cnt = 0;
private final String name;
private final int id;
public Company(String name, int id) {
this.name = name;
this.id = id;
cnt++;
}
public static void main(String[] args) {
Company company0 = new Company("choi",01234);
Company company1 = new Company("kim",01235);
System.out.println("생성 횟 수 : "+Company.cnt);
Company.companyName = "카카오";
Company.companyName = "라인";
Company.companyName = "네이버";
System.out.println(Company.companyName);
}
}
References
https://www.geeksforgeeks.org/static-keyword-java/
Code Link
https://github.com/mike6321/PURE_JAVA/tree/master/EffectiveStudy
'Java > Java' 카테고리의 다른 글
(JAVA) Method Overloading에 대해서 (0) | 2020.04.07 |
---|---|
(JAVA) Interning of String in JAVA (0) | 2020.04.02 |
(JAVA) 상속보다는 컴포지션을 사용하자 (0) | 2020.02.27 |
(JAVA) private final 과 private static final (0) | 2020.02.21 |
(JAVA) 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2020.02.20 |