22.4.19 [HackerRank]Java Static Initializer Block

🌱 배경지식

flag

  • 상태를 기록하고 처리 흐름을 제어하기 위한 boolean 변수이다. 조건에 따라 true or false를 나타내는 boolean타입의 변수이기 때문에 토글 기능에 사용하기도 한다.

flag 사용 방법 예시

백준 2753 윤년
public class Main {
	public static void main(String[] args) {
    
		boolean yearTF = true;	// flag 변수를 선언.
        
		for (int i = 2002; i < 2022; i++) {		
			if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)) {  //조건에 부합할 경우 
				yearTF = true;  //flag 변수에 true,
			} else {
				yearTF = false;  // 그렇지 않을 경우 false를 대입.
			}
			
			if(yearTF) {
				System.out.println(i + ": [ 윤년 ]");
			} else {
				System.out.println(i + ":   평년  ");
			}
		}
    }
}    

Static Initialization Blocks

정적 초기화 블럭. 클래스에서 정적 변수나 매서드는 클래스 타입에 대한 인스턴스화 없이도 호출하거나 참조할 수 있다.
Static initialization block은 클래스를 로딩하는 시점에 한번만 호출되며, 인스턴스 변수나 인스턴스 메소드에 접근하지 못한다.
(<-> Instance는 객체가 생성될 때 마다 호출되며, Super 생성자보다 먼저 호출된다.)

Q. 왜 객체 생성 전 초기화를 하는가?
A. 객체 생성 전에도 메모리가 존재하기 때문이다.

static 키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 Staic영역에 할당된다. Static영역에 할당된 메모리는 모든 객체가 공유하지만 Garbage Collector의 관리 영역 밖에 존재하기 때문에 Static영역에 있는 멤버들은 프로그램 종료시까지 메모리가 할당된 채로 존재한다. 메모리는 프로그램 시작때부터 차지하고 있으며 메모리에 내내 값이 유지된다. 객체 생성 전에도 메모리가 존재하므로 객체 생성 전에 미리 초기화를 해주어야 한다.

✏️ 해설 및 분석

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

 static int B; // static으로 B,H를 입력 받는다.
 static int H;
 static boolean flag = true; //flag 변수를 true로 선언
 
 static {   
     Scanner sc = new Scanner(System.in); 
     B = sc.nextInt();
     H = sc.nextInt();
     
     if((B<=0 || H<=0)) {
         flag = false; // B나 H가 0보다 작으면 false를 내주고 아래 문구를 프린트한다. 
         System.out.println("java.lang.Exception: Breadth and height must be positive");
     }
 }

public static void main(String[] args){
		if(flag){
			int area=B*H;
			System.out.print(area);
		}
		
	}//end of main

}//end of class

👉 참고

좋은 웹페이지 즐겨찾기