일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- snmp
- 백준
- 정규식 문자열 출력
- python popen
- c3 축 가리기
- linux시간으로 변경
- influxdb 설치
- InfluxDB
- grafana dashboard
- regex_search
- python subprocess
- c3 second
- centos pyhon 설치
- gcc regex
- CentOS7
- gcc 업데이트
- subporcess path
- telegraf
- snmp test
- c3 축 없애기
- c3 초
- c++ 정규식
- c3 step graph
- selinux port 등록
- python os
- semanage
- 1697
- 정규식 컴파일
- 정규식 활용
- g++ 업데이트
- Today
- Total
리셋 되지 말자
클래스의 static 블록 본문
static 블록
자바에서는 객체 생성자가 존재하지만 클래스 생성자는 존재하지 않는다. 그러나 클래스가 스태틱 영역에 배치될 때 실행되는 코드 블록이 있는데, 바로 static 블록이다.
- Driver01
package staticBlock;
public class Driver01 {
public static void main(String[] args) {
동물 뽀로로 = new 동물();
}
}
- 동물
package staticBlock;
public class 동물 {
static {
System.out.println("동물 클래스 준비");
}
}
- 결과
동물 클래스 준비
static 블록 예시
package staticBlock;
public class Driver01 {
public static void main(String[] args) {
System.out.println("메인 시작");
}
}
위와같은 코드를 실행했을 때, 아래와 같은 결과가 나올 것이라 예상할 수 있다.
동물 클래스 준비
메인 시작
하지만 결과는 '메인 시작'만 출력된다. 그 이유는 '동물' 클래스를 사용하는 코드가 없어서 동물 클래스의 static 블록이 실행되지 않기 때문이다. Driver02의 main() 메서드를 실행하면 동물 클래스는 T 메모리 스태틱 영역에 자리 잡지도 않는다.
그리고 static 블록에서 사용할 수 있는 속성과 메서드는 당연히 static 멤버 뿐이다.(객체 멤버에 접근할 방법이 없기 때문)
객체 멤버는 클래스가 static 영역에 자리 잡은 후에 객체 생성자를 통해 heap에 생성된다. 클래스의 static 블록이 실행되고 있을 때는 해당 클래스의 객체는 하나도 존재하지 않기 때문에 static 블록에서는 객체 멤버에 접근할 수 없다.
-> 프로그램이 시작될 때 모든 패키지와 모든 클래스가 T 메모리의 스태틱 영역에 올라간다고 설명했었다. 하지만 실제로는 해당 패키지 또는 클래스가 처음으로 사용될 때 로딩되는 것이 맞다.
static 블록 예시2
package staticBlock;
public class Driver02 {
public static void main(String[] args) {
System.out.println("메인 시작");
동물 뽀로로 = new 동물();
}
}
- 결과
메인 시작
동물 클래스 준비
static 블록 예시3
package staticBlock;
public class Driver02 {
public static void main(String[] args) {
System.out.println("메인 시작");
동물 뽀로로 = new 동물();
동물 코끼리 = new 동물();
}
}
- 결과
메인 시작
동물 클래스 준비
- 동물 클래스의 인스턴스로 여러 개 만들어도 동물클래스의 static 블록은 한 번만 실행되는 것을 알 수 있다.
static 블록 예시4
package staticBlock;
public class Driver05 {
public static void main(String[] args) {
System.out.println("main 메서드 시작");
System.out.println(Animal.age);
}
}
class Animal {
static int age = 0;
static {
System.out.println("Animal 클레스 시작");
}
}
-결과
main 메서드 시작
Animal 클레스 시작
0
- 클래스의 정적 속성에 접근할 때에도 static 블록이 싱핼되는 것을 알 수 있다.
정리
클래스 정보는 해당 클래스가 프로그램 코드에서 맨 처음 사용될 때 T 메모리의 스태틱 영역에 올라간다. 이때, 단 한번 해당 클래스의 static 블록이 실행된다. 여기서 클래스가 제일 처음 사용될 때는 아래의 세 가지 경우중 하나다.
- 클래스의 정적 속성을 사용할 때
- 클래스의 정적 메서드를 사용할 때
- 클래스의 인스턴스를 만들 때
프로그램 실행 시에 모든 클래스의 정보가 올라가지 않는 것은 스태틱 영역도 메모리이기 때문이다.
-> 메모리를 최대한 늦게 사용하고 최대한 빨리 반환하는 것이 정석이다.(물론 스태틱 영역은 프로그램이 끝날 때까지 계속 스태틱 영역메 머문다...)더 자세한 것은 JUnit의 @Before 클래스를 참조
참고
static 블록과 유사하게 클래스의 인스턴스를 위한 인스턴스 블록도 존재한다. 아무런 표시없이 {}블록을 사용하게 되면 인스턴스가 생성될 때마다 {} 블록이 실행된다. {} 블록은 객체 생성자가 실행되기 전에 먼저 실행된다. 객체는 주로 생성자를 통해 초기화 하기 때문에 잘 사용되지 않는다. 관심이 있다면 아래의 url 참고
https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
[
Initializing Fields (The Java™ Tutorials > Learning the Java Language > Classes and Objects)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See JDK Release Notes for information about new fe
docs.oracle.com
](https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html)
package staticBlock;
public class Driver05 {
public static void main(String[] args) {
System.out.println("main 메서드 시작");
System.out.println(Animal.age);
Animal 동물 = new Animal();
}
}
class Animal {
static int age = 0;
static {
System.out.println("Animal 클레스 시작");
}
{
System.out.println("인스턴스화 시작");
}
public Animal() {
System.out.println("생성자 시작");
}
}
- 결과
main 메서드 시작
Animal 클레스 시작
0
인스턴스화 시작
생성자 시작
'Java(폐지) > Java 공부' 카테고리의 다른 글
instanceof 연산자 (0) | 2020.07.20 |
---|---|
final 키워드 (0) | 2020.07.20 |
생성자(constructor) (0) | 2020.07.20 |
abstract 키워드 - 추상 메서드와 추상 클래스 (0) | 2020.07.20 |
참조 변수의 복사 (0) | 2020.07.20 |