devnoong.log
article thumbnail
728x90

 

JAVA 8 Date API 에서 출시된 LocalDate는 이전에 사용되었던 Calendar 클래스 대체 용도로 많이 사용되고 있습니다.

 

LocalDate는 인스턴스 객체를 생성해주는 new 연산자를 사용하지 않고,
  of(), now(),parse() 와 같은 Public 정적 패토리 메소드를 이용해 선언되고 있습니다.

 

 

new연산자를 사용 할 수 없는 이유는 생성자가 아래와 같이 Public이 아닌 Private로 구성되어있기때문입니다.

 

 

여기서 하나의 궁금증이 생기지 않나요?

 왜 Public으로 생성자를 만들지 않고 Private으로 선언 해 놓았을까????

 

 

이유는 아래와 같습니다.

 

 

첫번째,  불필요한 객체 생성을 제한하기 위해서 설정해놓는다.

 

localDate에서 제공하는 함수들중 일부분은 정적메소드(클래스 메소드) static으로 제공되고 있습니다.

static함수는 생성자를 이용해 객체를 생성하지 않아도, 메소드를  호출해 사용할 수 있습니다.

 

따라서 불필요하게 객체를 생성할 이유가 없기때문에,
Private으로 선언해 객체 생성을 구조적으로 막아놓은 것입니다.

 

 

불필요한 객체 생성을 제한하면  메모리 사용량을 줄이고, 성능을 향상 시킬 수 있습니다.

 

다만 상속을 받은 함수를 Override할 경우나 static으로 구성되어 있지 않고 Public으로 구성되어 있는 함수들은 LocalDate 객체를 정적메소드를 이용해 생성하고, 해당 객체에 Public 함수를 호출하는 방식으로 구현되어야 합니다.

 

 

 

두번째,  불변성(immutable)을 보장하기 위해서 설정 해 놓는다.

 

LocalDate는 불변(immutable)객체로 한번 생성된 객체의 상태는 변경 될 수 없는 객체입니다.

객체 생성 후 객체 상태가 변경되지 않도록 하기위해 생성자를 private으로 선언하여
외부에서 직접 객체를 생성하지 못하도록 하였습니다.

 

대신에 LocalDate클래스에서는 다양한 동적 팩토리 메소드를 이용하여 객체를 생성 할 수 있도록 제공되고 있습니다.

 

아래의 코드에서 LocalDate를 정적 패토리 메소드인 of를 이용해 선언 후, plusDays 함수를 이용해 날짜를 변경해주고 있습니다. 

 

LocalDate localeDate = LocalDate.of(2022,01,01);
localeDate.plusDays(2);

System.out.println(localeDate.toString());

 

하지만 localeDate의 값을 호출해 확인 해보면 아래와 같이 변경되지 않고 , 기존 값 2022 01 01의 값이 유지되고 있는 것을 확인 할 수 있습니다.

 

이는 LocalDate 객체는 immutable 불변 객체이므로, 기존 객체의 값을 변경하는 것이 아닌 새로운 객체를 반환하기때문에 기존 객체는 유지되고 있음을 볼 수 있습니다.

 

 

 

예시로 위의 코드에서 사용한 plusDays의 함수 내부를 보면 아래와 같이 ofEpochDay 함수를 반환 하고 있습니다.

 

 ofEpochDay  함수는 아래와 같이 private 생성자를 호출하여 새 LocalDate 객체를 반환하고 있습니다.

 

이는 기존 객체의 값은 유지하고 새로운 객체를 반환하는 불변(immutable) 객체의 특성을 나타내고 있습니다.

 

 

 

 

 

 

정리하자면 LocalDate 객체는  불변성(immutable) 을 보장하기 위해서 불필요한 객체 생성을 제한하고자 Private으로 선언해 사용하고 있다라고 정리 할 수 있습니다.

 

 

 

 

 

 

그럼 안뇽~~

 

 

 

728x90