

Localtime 클래스 공식 문서 예시를 통해 이전까지 헷갈렸던 접근제어자, static 키워드,private 생성자에 대한 이해도 함께한다.
LocalTime 클래스란?
LocalTime 클래스는 java.time 패키지에 포함되어 있으며, 날짜 정보 없이 시간 정보만을 관리합니다. 이 클래스는 생성된 이후 변경할 수 없는 불변(immutable) 클래스(final)이다. LocalTime 클래스는 시, 분, 초, 나노초를 나타내며, 다양한 시간 연산을 지원하며 모든 연산은 새로운 LocalTime 객체를 반환하게 된다.
1. LocalTime 객체 생성
* Java 공식문서에 생성자가 쓰여있지 않다면?
1. localtime 은 공식 문서에 생성자가 쓰여 있지 않다. 이건 어떤 의미일까?
이 말은 Localtime 의 생성자가 private 하다는 것을 의미한다. 공식 문서를 살펴보면 대신 of와 now라는 정적 팩토링 메소드 (Static Factory Method)가 존재하는 것을 알 수 있다.
# 정적 팩토리 메서드란?
정적 팩토리 메서드는 객체를 생성하기 위해 사용되는 정적 메서드이다. 이는 객체를 생성하는 일반적인 생성자(Constructor)를 대체하거나 보완할 수 있다. 정적 팩토리 메서드는 주로 클래스 이름을 통해 호출된다.
# of 메소드의 원리 - 공식 문서
위 공식문서를 통해 LocalTime 클래스의 of 메소드는 시간 값을 매개변수로 받아서 LocalTime 객체를 반환하는 것을 알 수가 있다. 그렇다면 어떻게 of 클래스는 LocalTime 객체를 만드는 걸까? 그 방식은 lbrary를 살펴보면 알 수 있다.(intellij에서 컨트롤을 눌러 볼 수 있다.)
# of 메소드의 원리 - 라이브러리
public static LocalTime of(int hour, int minute, int second) {
HOUR_OF_DAY.checkValidValue(hour);
if ((minute | second) == 0) {
return HOURS[hour]; // for performance
}
MINUTE_OF_HOUR.checkValidValue(minute);
SECOND_OF_MINUTE.checkValidValue(second);
return new LocalTime(hour, minute, second, 0);
}
public static LocalTime of(int hour, int minute, int second) {
HOUR_OF_DAY.checkValidValue(hour);
if ((minute | second) == 0) {
return HOURS[hour]; // for performance
}
MINUTE_OF_HOUR.checkValidValue(minute);
SECOND_OF_MINUTE.checkValidValue(second);
return new LocalTime(hour, minute, second, 0);
}
위 코드는 java/time/Localtime 라이브러리의 생성자와 of 함수다. 위 구문을 보면 알다시피 LocalTime 생성자의 접근제어자는 private다. 즉, 다른 클래스에서 이 클래스의 생성자에 접근할 수가 없다. (이 덕분에 LocalTime 은 불변성을 유지할 수 있음)
대신 of 메소드에서 private 생성자를 사용해 LocalTime 인스턴스를 생성하고 있는 것을 확인할 수가 있다.
위 코드를 보면 알다시피 LocalTime 생성자
멤버 필드는 static final
# LocalTime의 멤버 변수(라이브러리)
멤버 변수는 다 private 접근제어자로 선언되어 있다. private 접근제어자로 선언되어있을 경우 Java 공식 문서에서는 찾아볼 수 없다. 공식 문서에서는 private이 아닌 public 멤버 변수들을 설명하기 때문이다.
위 라이브러리를 살펴보면 hour,minute,second, nano 4가지의 변수가 멤버 변수로 선언되어 있음을 알 수 있다.
# LocalTime의 정적 필드(Java 공식 문서)
보통 자바 코드를 작성할 때 접근제어자를 표시 안 하는 것은 default(package private)로 해석할 수 있지만 Java 문서에서는 달랐다.
!! 당연히 default라 생각했기에 혼란스웠다.
java Api에서는 위와 같이 static final만 표시되고 접근제어자가 표시되지 않은 것은 default 가 아니라 public이 생략된 것으로 간주할 수 있다. 즉 위 정적 필드들은 모두 public static final field 다.
위 필드들의 type은 모두 Localtime 이다. 이것도 약간 기존까지는 못 본 경우인데 이런 정적 필드를 다음과 같이 다루면 된다.
LocalTime maxTime = LocalTime.MAX;
처음에는 위 코드도 내게 살짝 혼란을 주었다. 순간적으로 정적 필드를 멤버 변수랑 동일시해서 생각하고 LocalTime 멤버 변수를 LocalTime 객체 참조 변수로 가리키는 게 말이 되냐? 라는 의문이었다.
내가 이 순간 착각했던 개념은 두 가지,
1 : 정적 필드와 멤버 변수를 순간적으로 헷갈림
2: 정적 필드의 타입이 자기 자신 class Type 일 수도 있단 것을 헷갈림
먼저 1에 대해 정적 필드는 객체 인스턴스 값이 아닌 클래스 자체가 가지고 있는 것이다. 그리고 2에 대해서 이는 얼마든지 가능하다. 멤버 변수도 얼마든지 자기 자신을 타입으로 가질 수도 있다.
아래는 그 예시
public class Node {
private int value;
private Node leftChild; // 자기 자신을 타입으로 갖는 멤버 변수
private Node rightChild; // 자기 자신을 타입으로 갖는 멤버 변수
'개발 > java' 카테고리의 다른 글
객체지향 프로그래밍의 4가지 요소(2) 캡슐화 (0) | 2024.07.11 |
---|---|
Java의 주요 키워드: this, static, super, final (0) | 2024.07.11 |
Java의 객체 참조 개념 (0) | 2024.07.02 |
향상된 for문(for each 문) (0) | 2024.07.01 |
Java - String class (0) | 2024.05.27 |
