-
초기화 블록은 클래스가 생성될때 무조건 수행되는 블록입니다.
종류에는 클래스 초기화블록 , 인스턴스 초기화 블록이 있습니다.
이름에서도 알수 있는듯이 클래스 초기화 블록은 클래스 호출 시 한번 , 인스턴스 초기화 블록은 인스턴스 생성시 마다 수행됩니다.
또한 클래스 초기화 블록은 static을 이용하기에 static 초기화 변수라고 이름을 나타내기도 합니다.
예를 보겠습니다.
방문시 방문수를 출력하는 클래스 입니다.
public class Visit { int people; static { System.out.print("클래스 초기화변수로 방문하였습니다."); } { System.out.print("인스턴스 초기화변수로 방문하였습니다."); } public Visit() { System.out.print("(0명)"); } public Visit(int people) { this.people = people; System.out.print("("+people+"명)"); } } public static void main(String[] args) { System.out.println(new Visit()); System.out.println(); System.out.println(new Visit(1)); }
이 경우 출력 값은 아래와 같은 순서로 출력이 됩니다.
1.클래스 초기화변수로 방문하였습니다.
2.인스턴스 초기화변수로 방문하였습니다.(0명)
3.인스턴스 초기화변수로 방문하였습니다.(1명)보시는 바와 같이 클래스 초기화블록은 한번 인스턴스 초기화 블록은 인스턴스 생성시마다 수행을 한다는 것을 알 수 있습니다.
그리고 클래스 초기화 블록은 인스턴스가 생성되기 전에 호출 되므로 인스턴스의 변수에 접근할 수 없습니다.
이걸 어떻게 활용할 수 있을까를 생각해보면 enum의 경우 상수들은 static final로 생성되므로 접근이 가능하므로
클래스 초기화블록으로 활용할 수 있습니다.
보통 enum으로 요소를 찾을 경우 stream으로 filter을 걸거나 for문을 돌려 해당 요소를 찾아 사용합니다.
당연 Map과 같이 특정 키로 요소를 찾는 것이 속도적으로 이점이 있습니다.
활용편 예제
//음료 enum public enum beverages{ AMERICANO("아메리카노",3000), CAFELATTE("카페라떼",4000), EMPTY("없음",0); String name; int amt; beverages(String name,int amt) { this.name = name; this.amt=amt; } private static final Map<String, beverages> map = new HashMap<>(); static{ for(beverages b : beverages.values()){ map.put(b.name, b); } } public static beverages getMyBeverage(String name) { return map.get(name); } } //방문 클래스 public class Visit { int people; { System.out.print("인스턴스 초기화변수로 방문하였습니다."); } public Visit() { System.out.print("(0명)"); } public Visit(int people) { this.people = people; System.out.print("("+people+"명)"); } public String getCoffePay(String name) { beverages myBeverage= beverages.getMyBeverage(name); System.out.println(); return myBeverage.name +"를 " + people+"잔 구매하였고 구매비용은" + people * myBeverage.amt + "입니다."; } } //출력문 public static void main(String[] args) { Visit visit= new Visit(1); System.out.println(visit.getCoffePay("아메리카노")); }
결과는 아래와 같습니다.
인스턴스 초기화변수로 방문하였습니다.(1명)
아메리카노를 1잔 구매하였고 구매비용은3000입니다.enum을 생성 시 map을 static으로 생성하고 이를 초기화 블록을 통해 배열을 Map에 Key , Value 형태로 담았습니다.
그러면 매번 배열을 for문을 돌리는 것보다 속도적 이점이 분명 있습니다.
'개발 > java' 카테고리의 다른 글
익명클래스 (1) 2022.01.01 stream vs parallelStream (0) 2021.12.30 Builder 패턴 활용기 (0) 2021.12.25 Stream.of vs Arrays.stream (0) 2021.12.23 제네릭이 멀까 (0) 2021.12.22