Spring

Java에서 이름이 같은 클래스 처리

기록만이살길 2022. 12. 31. 16:27
반응형

1. 소개

Java의 클래스 이름 지정은 주요 프로그래밍 언어와 마찬가지로 Upper Camel Case 구문이라는 국제 규칙을 따릅니다. 그러나 같은 이름을 가진 클래스를 처리하는 경우 문제가 있습니다.

1998년 JDK의 초기 릴리스 이후 이 비정상적인 상황을 해결하는 방법에 대한 논쟁이 있었습니다. 여기에 JDK-4194542 가 있습니다. 이 주제에 대해 처음으로 공개된 버그이며 그 이후로 JDK 개발 팀의 권장 사항은 정규화된 클래스 이름을 사용하는 것이었습니다. 그럼에도 불구하고 JDK가 이러한 종류의 사용을 허용하는 기능을 곧 갖게 할 계획은 없습니다.

최근 2019년 8월 Java 개발자 커뮤니티는 이 상황을 해결하는 방법에 대한 새로운 제안( JEP )을 제기했으며 전 세계 Java 개발자로부터 더 많은 지원을 받고 있습니다.

이 사용방법(예제)에서는 이름이 같은 클래스를 처리하기 위한 전략과 권장 사항에 대해 설명합니다.

2. 클래스 정의

먼저 사용자 정의 패키지 com.baeldung.date 내에 Date 라는 클래스를 생성해 보겠습니다.

package com.baeldung.date;

public class Date {

    private long currentTimeMillis;

    public Date() {
        this(System.currentTimeMillis());
    }

    public Date(long currentTimeMillis) {
        this.currentTimeMillis = currentTimeMillis;
    }

    public long getTime() {
        return currentTimeMillis;
    }
}

3. 정규화된 클래스 이름

이러한 유형의 사용이 격리되고 자주 반복되지 않을 때 충돌을 피하기 위해 이 접근 방식을 사용할 것입니다. 그럼에도 불구하고 정규화된 이름을 사용하는 것은 일반적으로 좋지 않은 스타일로 간주됩니다.

사용 방법을 살펴보겠습니다. 특히 패키지 이름이 짧고 설명이 있으면 코드를 더 표현력 있게 만들어 혼란을 줄이고 가독성을 높일 수 있습니다.

반면에 내부 객체가 너무 큰 클래스나 메소드인 경우 디버그하는 데 도움이 됩니다.

public class DateUnitTest {

    @Test
    public void whenUsingFullyQualifiedClassNames() {

        java.util.Date javaDate = new java.util.Date();
        com.baeldung.date.Date baeldungDate = new com.baeldung.date.Date(javaDate.getTime());

        Assert.assertEquals(javaDate.getTime(), baeldungDate.getTime());
    }
}

4. 가장 많이 사용하는 것을 가져오기

우리는 가장 많이 사용하는 것을 가져오고 전체 클래스 경로와 함께 가장 적게 사용하는 것을 활용합니다. 이것이 Java 개발자 사이에서 일반적인 기술이자 모범 사례이기 때문입니다.

import java.util.Date;

public class DateUnitTest {

    @Test
    public void whenImportTheMostUsedOne() {

        Date javaDate = new Date();
        com.baeldung.date.Date baeldungDate = new com.baeldung.date.Date(javaDate.getTime());

        Assert.assertEquals(javaDate.getTime(), baeldungDate.getTime());
    }
}

5. 결론

이 기사에서는 특정 상황에 따라 동일한 이름을 가진 클래스를 사용하는 것과 관련하여 두 가지 가능한 접근 방식을 설명하고 이들 간의 주요 차이점을 관찰했습니다.

항상 그렇듯이 이 기사의 전체 코드 샘플은 GitHub 에서 찾을 수 있습니다 .

Generic footer banner
참고
  • https://docs.spring.io/spring-framework/docs/current/reference/html
  • https://www.baeldung.com/java-classes-same-name
반응형