- Static은 객체를 생성하지 않아도 메소드를 호출할 수 있는 마법의 메소드.
------------------------------------------------------------------------
ex)
public class ReferenceStatic {
public static void main(String args[]) {
ReferenceStatic.staticMethod(); //객체 생성 없이 바로 메소드 호출
}
public static void staticMethod() { //static 메소드 선언
System.out.println("This is a staticMethod.");
}
}
------------------------------------------------------------------------
- 왜 모든 메소드에 static을 선언하지 않았을까?
static 메소드는 클래스 변수만 사용할 수 있다는 단점이 있음.
그렇다고 모든 변수에 static을 선언하게 되면
클래스 내 모든 객체에서 하나의 값만 바라보기 때문에...
큰 문제가 일어날 수 있다.
static String name; // 클래스 변수 선언
public StaticVariable() {} //생성자 생성
public StaticVariable(String name) {
this.name = name;
}
StaticVariable variable1 = new StaticVariable("KMK");
System.out.println(variable1.name);
StaticVariable variable2 = new StaticVariable("JYJ");
System.out.println(variable1.name);
결과 : KMK
JYJ
이유 : name이라는 변수는 다른 객체를 생성해도 첫 번째 이름 그대로이다.
- Static 블록
- 객체는 여러 개를 생성하지만, 한 번만 호출되어야 하는 코드가 있다면 "static 블록"을 사용.
- 객체가 생성되기 전에 한 번만 호출.
- 클래스 내에 선언 O
- 메소드 내에 선언 X
- 클래스 초기화할 때 꼭 수행되어야 할 작업이 있을 경우 유용하게 사용됨.
static {
// 딱 한번만 수행되는 코드
}
------------------------------------------------------------------------
ex)
//StaticBlock 선언
public class StaticBlock {
static int data = 1;
public StaticBlock() {
System.out.println("StaticBlock Constructor.");
}
static {
System.out.println("*** First static block. ***");
data=3;
}
static {
System.out.println("*** Second static block. ***");
data=5;
}
public static int getData() {
return data;
}
}
// makeStaticBlock 메소드를 호출해보자.
public void makeStaticBlock() {
System.out.println("Creating block1");
StaticBlock block1 = new StaticBlock();
System.out.println("Creating block1");
System.out.println("-------------------");
System.out.println("Creating block2");
StaticBlock block2 = new StaticBlock();
System.out.println("Creating block2");
}
//결과를 확인해보자.
Creating block1
***First static block.***
***Second static block.***
StaticBlock Constructor.
Creating block1
-------------------
Creating block2
StaticBlock Constructor.
Creating block2
------------------------------------------------------------------------
이처럼 static 블록은 생성자가 불리지 않더라도, 클래스에 대한 참조가 발생하자마자 호출됨.
*** 자바의 신(이상민 저)을 공부한 내용 중에 기억해야 할 개념들을 정리해 놓은 글 입니다.***
'Java' 카테고리의 다른 글
[JAVA] 6. StringBuffer vs StringBuilder (0) | 2021.04.29 |
---|---|
[JAVA] 5. 일부 완성되어 있는 abstract 클래스 (0) | 2021.04.29 |
[JAVA] 3. 오버로딩(overloading) vs 오버라이딩(overriding) (0) | 2021.04.29 |
[JAVA] 2. 자바의 변수 종류는 총 4가지 (0) | 2021.04.29 |
[JAVA] 1. 자바 파일 컴파일 과정 (0) | 2021.04.29 |