JavaRush /Java Blog /Random-KO /Java의 Enum에 관한 15가지 개발자 인터뷰 질문(답변 포함!)
Treefeed
레벨 21

Java의 Enum에 관한 15가지 개발자 인터뷰 질문(답변 포함!)

Random-KO 그룹에 게시되었습니다
열거( Enum )는 Java 5 에서 도입되었으며 그 이후로 Java 개발자들 사이에서 꽤 인기를 얻었습니다. 다양한 Java 애플리케이션에서 널리 사용됩니다. Java의 Enum은 C나 C++보다 훨씬 더 다양하기 때문에 흥미로운 사용 사례도 많이 제공됩니다. 그 중 몇 가지는 Java에서 Enum을 사용하는 10가지 방법 기사에서 본 것입니다 . 그러나 이러한 인기에도 불구하고 많은 Java 프로그래머는 여전히 Enum이 제공하는 기능과 Java 코드에서 Enum 사용의 복잡성을 인식하지 못하고 있습니다. 예를 들어 Java에서 인터페이스를 구현하는 Enum의 기능 이나 Enum 외부에서 Enum을 인스턴스화할 수 없는 이유에 대해 질문하는 여러 독자로부터 이는 분명해졌습니다 . 인터뷰에서 이에 대해 질문을 받았다는 점을 언급했습니다. 이는 우리가 인터뷰에서 성공하는 데 도움이 될 뿐만 아니라 학습을 위한 새로운 길을 여는 데 도움이 되는 자주 묻는 질문 목록을 Java Enum으로 작성하도록 영감을 주었습니다 . 이전에 언급했듯이 인터뷰 질문으로 인해 주제를 더 심각하게 받아들이게 되는 경우가 많습니다. 이는 나쁜 일이 아니며 Enum의 성능과 유용성을 고려하면 이제 Enum 마스터가 될 때입니다. 다음은 Enum의 다양한 기능과 속성을 기반으로 한 질문 목록입니다. 면접 준비 자료로 활용하셔도 좋고, 단순히 열거형 안내용으로 활용하셔도 좋습니다. Java를 처음 사용하는 경우 Enum에 대해 새롭고 유용한 내용을 많이 배우게 됩니다. 1) Enum은 Java로 인터페이스를 구현할 수 있습니까? 예, Enum은 인터페이스를 상속할 수 있습니다 . Enum 유형은 클래스인터페이스 와 유사하므로 인터페이스를 상속할 수 있습니다. 이는 경우에 따라 Enum을 사용자 정의 구현으로 사용할 때 놀라운 유연성을 제공합니다. 다음은 이 용량에서 Enum을 사용하는 좋은 예 입니다 . 2) Enum이 클래스를 상속(확장)할 수 있나요? 아니요, 그럴 수 없습니다! 이전에 Enum 유형이 Java의 클래스 또는 인터페이스와 유사하다고 말했기 때문에 예상치 못한 일입니다. 글쎄, 이것이 바로 이전 질문 바로 다음에 이 질문을 묻는 주된 이유입니다. Enum 은 이미 추상 클래스 java.lang.Enum을 상속 하므로 Java는 다중 클래스 상속을 지원하지 않으므로 다른 클래스는 상속할 수 없다는 것이 분명합니다. java.lang.Enum 에서 상속함으로써 모든 열거형에는 ordinal() , value() 또는 valueOf() 메서드가 있습니다 . 3) 객체 인스턴스 없이 Enum을 만드는 방법은 무엇입니까? 컴파일 오류 없이 가능합니까? 면접관들이 좋아하는 까다로운 질문 중 하나입니다 . Enum은 요일 이나 월과 같은 특정 수의 객체 모음으로 간주되므로 아무 것도 없이 Enum을 얻는 것은 의심스러워 보입니다. 하지만 그렇습니다. 예를 들어 유틸리티 클래스를 생성하여 인스턴스 없이 Enum을 생성할 수 있습니다 . 이것은 Enum을 사용하는 또 다른 혁신적인 방법입니다. public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } } 4) Enum에 대해 toString() 메서드를 재정의할 수 있습니까? 재정의하지 않으면 어떻게 되나요? 물론 Enum의 toString() 메소드를 오버라이드할 수 있습니다. java.lang.Object를 상속 하고 toString() 메소드를 사용할 수 있는 모든 클래스를 오버라이드할 수 있기 때문입니다 . 그렇게 하지 않더라도 추상화 때문에 아무것도 잃지 않습니다. Enum 클래스의 기본이 이 작업을 수행하고 Enum 인스턴스의 이름인 이름을 반환합니다. 다음은 Enum 클래스의 toString() 메서드 에 대한 코드입니다 . public String toString() { return name; } name은 컴파일러가 Enum 클래스 자체에서 인스턴스를 생성하고 생성자에서 서수를 생성하는 것에 대한 응답으로 열거형을 생성하는 코드를 할당할 때 지정됩니다. java.lang.Enum 클래스 : protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } 이것은 프로그램에서 Enum 선언에 대한 응답으로 컴파일러에 의해 호출되는 enum 을 생성하기 위한 유일한 생성자 입니다. 5) Enum 외부에서 Enum을 인스턴스화할 수 있나요? 왜 안 돼? Enum에는 공개가 없기 때문에 Enum 경계 외부에서 Enum을 인스턴스화할 수 없습니다 . 생성자이며 컴파일러에서는 그러한 생성자를 도입하는 것을 허용하지 않습니다. 컴파일러는 Enum 유형 선언에 대한 응답으로 대부분의 코드를 생성하기 때문에 Enum 내의 공용 생성자를 허용하지 않으므로 Enum 인스턴스가 내부적으로 선언되어야 합니다. 6) Enum 내부에 생성자를 지정할 수 있나요? 이 질문은 이전 질문 뒤에 오는 경우가 많습니다. 예, 가능합니다. 하지만 이는 전용 또는 패키지 전용 생성자에서만 가능하다는 점을 기억하세요. publicprotected 생성자는 Enum에서 허용되지 않습니다. 여기서 를 볼 수 있습니다 . 7) == 또는 equals() 메소드를 사용하여 Enum을 비교하는 것의 차이점은 무엇입니까? 이것은 여기 에서 자세히 다루는 매우 광범위하고 까다로운 문제입니다 . 8) Enum에서 ordinal() 메소드는 무엇을 합니까? ordinal() 메서드는 Enum 인스턴스가 Enum 내에서 지정된 순서를 반환합니다. 예를 들어 DayOfWeek Enum에서는 요일을 순서대로 지정할 수 있습니다. DayOfWeek.MONDAY.ordinal() public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } 메서드를 호출하면 0이 반환됩니다. 이는 첫 번째 인스턴스를 의미합니다. 이 방법은 실제 상황에 따라 순서를 제공하는 데 매우 유용합니다. 즉, TUESDAY (화요일)가 MONDAY (월요일) 이후 , WEDNESDAY (수요일) 이전임을 나타냅니다. 마찬가지로, 열거형을 사용하여 연도의 월을 나타낼 수 있습니다. 여기서 2월은 1월 뒤에 오고 3월 앞에 옵니다. 모든 사용자 정의 열거형은 추상 클래스 java.lang.Enum 에서 이 메소드를 상속하며 이름과 서수를 사용하는 java.lang.Enum 에서 보호된 생성자를 호출하여 컴파일러에 의해 설정됩니다 . 9) Java에서 TreeSet 또는 TreeMap과 함께 Enum을 사용할 수 있습니까? 이것은 정말 흥미로운 Enum 질문이며 사람들이 지식의 깊이를 테스트하기 위해 묻고 싶어하는 질문입니다. java.lang.Enum 코드를 보기 전까지는 Enum이 TreeSetTreeMap 과 같은 정렬된 컬렉션에서 사용하기 위한 핵심 요구 사항인 Comparable 인터페이스를 상속한다는 사실을 알지 못할 것입니다 . Enum은 기본적으로 Comparable 인터페이스를 상속하므로 TreeSetTreeMap 과 함께 사용할 수 있습니다 . 10) Enum에서 ordinal()과 CompareTo()의 차이점은 무엇입니까? 이는 이전 질문에서 바로 이어집니다. 실제로 CompareTo()는 메서드에서 제공하는 순서를 시뮬레이션합니다. Enum의 자연스러운 순서인 ordinal() 입니다. 간단히 말해서 Enum은 선언된 순서대로 비교를 제한합니다. 또한 이러한 상수는 동일한 유형의 다른 상수와만 비교할 수 있다는 점을 기억할 가치가 있습니다. 서로 다른 유형의 상수를 비교하면 컴파일러 오류가 발생할 수 있습니다. 11) 스위치 케이스에서 Enum을 사용할 수 있나요? 그래 넌 할수있어. 게다가 이는 Enum을 사용하는 주요 이점 중 하나입니다. Enum 인스턴스는 임시 상수로 컴파일되므로 안전하게 케이스 및 스위치 내부에 삽입할 수 있습니다 . 다음은 요일이 포함된 코드의 예입니다. public void developerState(DayOfWeek today){ switch(today){ case MONDAY: System.out.println("Hmmmmmmmm"); break; case TUESDAY: System.out.println("Hmmmm"); break; case FRIDAY : System.out.println("Yeahhhhhh"); break; } } Enum과 Switch는 서로를 잘 보완합니다. 특히 Enum에 소수의 안정적인 상수(예: 일주일 중 7일, 1년 중 12개월 등)가 포함된 경우 더욱 그렇습니다. Enum과 함께 swith 케이스를 사용하는 다른 예입니다 . 12) 전체 Enum 인스턴스를 반복하는 방법은 무엇입니까? java.lang.Enum 을 열었다면 value() 메소드가 모든 Enum 상수의 배열을 반환한다는 것을 알 수 있습니다 . 모든 열거형은 java.lang.Enum 을 상속하므로 value() 메서드를 갖습니다 . 이를 사용하면 특정 유형의 열거형 상수를 모두 반복할 수 있습니다. foreach 루프 와 value() 메서드를 사용하여 진행되는 예를 살펴보세요 . 13) Enum을 싱글톤으로 사용하면 어떤 장점과 단점이 있나요? Enum은 싱글톤 패턴 구현을 위한 빠른 지름길을 제공하며 , Effective Java 책에서도 다루기 때문에 인기 있는 선택입니다. 언뜻 보기에 Enum 싱글톤은 인스턴스화를 제어하고 안전하게 직렬화할 수 있으며 무엇보다도 Enum을 사용하여 스레드로부터 안전한 싱글톤을 쉽게 생성할 수 있다는 점에서 유망하고 매우 편리합니다. 더 이상 변수의 변동성을 이중으로 확인하는 것에 대해 걱정할 필요가 없습니다. 여기에서 이 접근 방식의 장점과 단점에 대해 자세히 알아보세요 . 14) int 열거형과 String 열거형 패턴 대신 Enum을 사용하면 어떤 이점이 있나요? 5년 이상 프로그래밍을 해왔고 여전히 JDK 1.3 또는 1.4를 사용하고 있다면 공용 정적 최종 상수 접두사를 사용하여 잘 알려진 고정 상수 컬렉션을 나타내는 String 및 int 열거 패턴 에 익숙할 것입니다. Days of the Week 와 같은 다양한 항목 . 여기에는 많은 문제가 있습니다. 요일을 담당하는 String 변수는 임의의 값을 가질 수 있으므로 Enum 유형에 대해 독립성이 없습니다 . 마찬가지로 열거 가능한 int는 어떤 값이든 취할 수 있으며 컴파일러는 이를 기꺼이 받아들입니다. 그리고 사용하여 Enum 을 사용하면 컴파일러가 확인하는 유형 안전성을 얻을 수 있습니다. 모든 Java 개발자에게 권장되는 Effective Java에는 이 주제에 대한 몇 가지 흥미로운 생각이 있습니다. 15) 문자열을 Enum으로 변환하는 방법은 무엇입니까? 이는 Java 애플리케이션 개발에서 StringEnum 사용이 인기를 끌면서 매일 제기되는 질문입니다 . Enum을 String으로 변환하는 가장 좋은 방법은 String 인수를 가져와 Enum 으로 반환하는 Enum 자체에 팩토리 메서드를 정의하는 것입니다 . 대소문자를 무시할 수도 있습니다. 다음은 문자열을 열거형으로 변환하는 몇 가지 입니다 . 이것으로 Enum에 관한 15가지 질문( 및 답변 ) 목록이 끝났습니다 . 하지만 기억하세요. 독서는 배우기에 충분하지 않으며 단지 첫 번째 단계일 뿐입니다 . 열거형의 이점을 얻으려면 프로젝트에서 Enum을 사용할 수 있는 위치를 찾으십시오. 이는 실제 경험을 제공할 것이며 이 경험을 통해 예제보다 더 많은 것을 배우게 될 것입니다. 복잡하고 상세한 방법 요구 사항. Enum에 대한 이러한 질문은 지식을 테스트하기 위해 주의를 기울일 가치가 있습니다. 특히 인터뷰를 서두르고 Enum 세계에 자세히 몰입할 시간이 없는 경우 더욱 그렇습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION