JavaRush /Java Blog /Random-KO /10가지 추상 클래스 및 인터페이스 Java 인터뷰 질문

10가지 추상 클래스 및 인터페이스 Java 인터뷰 질문

Random-KO 그룹에 게시되었습니다
추상 클래스와 인터페이스는 모든 객체 지향 프로그래밍 언어에서 매우 널리 사용됩니다. 그리고 거의 모든 Java 인터뷰에서 이 주제에 대한 질문을 하나 이상 접하게 됩니다. 인터페이스는 소프트웨어 디자이너들 사이에서 인기가 높기 때문에 더 자주 언급되지만 추상 클래스에 대한 질문도 때때로 등장합니다. 후자는 Java 개발 경험이 2년 미만인 주니어 개발자 직책에 대한 지원자에게 가장 자주 질문을 받는 반면, 인터페이스에 대한 질문은 이미 4년을 초과한 경험이 있는 사람들과의 인터뷰에서 가장 자주 접하게 됩니다. 일반적으로 Decorator 또는 Factory 패턴과 같은 Java 디자인 패턴에 대한 다른 질문과 함께 질문됩니다. 10가지 추상 클래스 및 인터페이스 Java 인터뷰 질문 - 1이번 글에서는 다양한 레벨의 Java 인터뷰에서 받았던 추상 클래스와 인터페이스에 대한 일반적인 질문을 살펴보겠습니다. 대부분의 내용은 초보 Java 프로그래머에게도 어렵지 않을 것입니다. 이는 대부분 순수한 지식 질문이지만 Java의 추상 클래스와 인터페이스 간의 차이점 이나 인터페이스 대신 추상 클래스를 선택하는 경우와 같은 일부 질문은 매우 까다로울 수 있습니다. 우리는 주제에 관해 12가지 흥미로운 질문을 제공합니다.
인터뷰에서 질문을 받았거나 추상 클래스 및 인터페이스에 관해 가치 있는 질문을 해야 했지만 이 목록에 없는 경우 댓글로 공유해 주세요.

1. Java에서 추상 클래스가 생성자를 가질 수 있습니까?

예, Java의 추상 클래스에서 생성자를 선언하고 정의할 수 있습니다. 추상 클래스의 인스턴스를 생성하는 것은 불가능하므로 이러한 생성자는 생성자 체인을 형성할 때, 즉 특정 구현 클래스의 인스턴스를 생성할 때만 호출할 수 있습니다. 하지만 면접관이 다음과 같은 질문을 한다고 상상해 보십시오. 어쨌든 추상 클래스의 인스턴스를 만들 수 없다면 생성자의 요점은 무엇입니까? 요점은 추상 클래스에 선언되고 다양한 구현에서 사용되는 공통 변수의 초기 값을 설정하는 데 여전히 사용될 수 있다는 것입니다. 생성자를 선언하지 않더라도 컴파일러는 인수가 없는 기본 생성자를 추상 클래스에 추가합니다. 이것이 없으면 생성자의 첫 번째 명령문은 super()Java의 기본 슈퍼클래스 생성자에 대한 암시적 호출이기 때문에 하위 클래스가 컴파일되지 않습니다.

2. Java의 추상 클래스가 인터페이스를 구현할 수 있습니까? 모든 메소드를 구현해야 합니까?

예, 추상 클래스는 implements. 추상적이기 때문에 모든 메소드를 구현할 필요는 없습니다. 유형을 선언하기 위한 추상 기본 클래스와 인터페이스를 갖는 것이 권장됩니다. 예를 들어 인터페이스 java.util.List와 해당 추상 클래스가 있습니다 java.util.AbstractList. 모든 공통 메서드를 구현하기 때문에 AbstractList특정 구현(예: LinkedListArrayList)은 인터페이스를 직접 구현한 경우처럼 모든 메서드를 구현할 필요가 없습니다 List. 이 솔루션은 인터페이스를 사용하여 유형을 선언하는 이점과 모든 일반적인 동작을 한 곳에서 구현하는 추상 클래스의 유연성을 결합합니다. 조슈아 블로흐(Joshua Bloch)의 책 "Java. 효과적인 프로그래밍”에는 Java에서 인터페이스와 추상 클래스를 사용하는 주제에 대한 훌륭한 장이 있으므로 더 잘 이해하려면 공부하는 것이 좋습니다.

3. 추상 수업이 최종 수업이 될 수 있나요?

아니요, 그럴 수 없습니다. 키워드는 final클래스가 계층 구조의 최상위에 있고 하위 항목을 가질 수 없음을 의미합니다. 그리고 상속자가 없는 추상 클래스는 인스턴스를 생성하는 것이 불가능하기 때문에 진공 상태의 구형 말과 같습니다 abstract class. 따라서 클래스가 abstractfinal이면 하위 항목이 없으며 인스턴스화할 수 없습니다. 클래스 abstractfinal.

4. Java의 추상 클래스가 정적 메소드를 가질 수 있습니까?

예, 추상 클래스는 정적 메서드를 선언하고 정의할 수 있습니다. Java에서 정적 메서드를 만드는 일반적인 원칙만 따르면 됩니다. 왜냐하면 Java에서 정적 메서드를 재정의하는 것이 불가능하기 때문에 개체 지향 디자인에서는 바람직하지 않기 때문입니다. 추상 클래스의 정적 메서드는 매우 드물지만, 그럴 만한 이유가 있다면 사용을 중단할 이유가 없습니다.

5. 추상 클래스를 인스턴스화하는 것이 가능합니까?

아니요, 이렇게 할 수는 없습니다. 추상 클래스의 본질은 그것이 완전하지 않다는 것이며, 하위 클래스에서 완성되어야 한다는 것입니다. 즉, 이 클래스는 사용할 준비가 되지 않았습니다. 예를 들어, 일부 메서드의 구현이 부족할 수 있습니다. 클래스를 사용할 준비가 되지 않았으므로 해당 개체를 만들 수 없습니다. 그러나 추상 클래스의 상속자의 인스턴스를 만들 수 있습니다. 프로그램이 추상 클래스를 인스턴스화하려고 하면 Java 컴파일러에서 오류가 발생합니다.

6. 추상 클래스에는 추상 메서드가 있어야 합니까?

아니요, 추상 클래스에는 추상 메서드가 없을 수도 있습니다. abstract선언에 키워드를 사용하면 Java에서 클래스 추상을 만들 수 있습니다 . 컴파일러는 이 클래스의 인스턴스화 생성을 허용하지 않는 등 모든 구조적 제한을 적용합니다. 그런데 추상 클래스나 인터페이스에 추상 메서드가 있어야 하는지에 대한 질문은 논란의 여지가 있습니다. 제가 보기에는 추상 클래스에는 추상 메서드가 있어야 하는 것 같습니다. 프로그래머가 추상 클래스를 볼 때 가장 먼저 생각하는 것이 추상 클래스이기 때문입니다. 이는 놀라움을 최소화한다는 원칙에 잘 맞습니다.

7. Java에서 추상 클래스와 인터페이스의 차이점은 무엇입니까?

이것은 가장 중요하고 가장 고전적인 Java 인터뷰 질문 중 하나입니다. 모든 수준의 Java 인터뷰에서 이 질문을 몇 번이나 봤는지 셀 수 없습니다. 특히 이 질문이 흥미로운 이유는 지원자가 사례를 제시할 기회가 있다는 점입니다. 추상화, 캡슐화, 다형성, 상속 등 객체지향 프로그래밍의 기본에 대한 질문에 대답하는 것은 쉽지만, 이러한 미묘한 뉘앙스에 관해서는 취업 지원자들이 혼란스러워서 가장 먼저 떠오르는 것을 말하는 경우가 많습니다. 이 질문에 대한 답변은 별도의 기사(특히 Java 8의 변경 이후)가 필요하지만 간단히 말해서 다음과 같습니다.
  • 인터페이스는 객체의 동작(메서드)만 설명하지만 상태(필드)는 없지만( 제외 public static final) 추상 클래스는 상태(필드)를 가질 수 있습니다.

  • 추상 클래스는 상속(확장)되고 인터페이스는 구현(구현)됩니다. 하나의 클래스만 상속할 수 있지만 원하는 만큼 인터페이스를 구현할 수 있습니다. 인터페이스는 다른 인터페이스를 확장(확장)할 수 있습니다.

  • 추상 클래스는 "is-a" 관계가 있을 때 사용됩니다. 즉, 하위 클래스가 기본 추상 클래스를 확장하고 인터페이스는 서로 전혀 관련되지 않은 다른 클래스에 의해 구현될 수 있습니다.

8. 인터페이스보다 추상 클래스를 선호하거나 그 반대의 경우를 선호하는 것이 언제 합리적입니까?

이것은 추상 클래스 및 인터페이스에 대한 이전 질문의 연속입니다. 구문상의 차이점이 무엇인지 알고 있다면 이 질문에 대답해도 문제가 발생하지 않습니다. 왜냐하면 이것이 결정을 내리는 데 결정적인 요소이기 때문입니다. 공개된 인터페이스에 새로운 메소드를 추가하는 것은 거의 불가능하므로 향후 개발이 필요할 경우에는 추상 클래스를 사용하는 것이 좋습니다. Java에서 추상 클래스를 개발하는 것은 인터페이스를 개발하는 것보다 쉽습니다. 마찬가지로 인터페이스에 메서드가 너무 많아 이를 모두 구현하는 것이 골치 아픈 경우 기본 구현에 대한 추상 클래스를 만드는 것이 좋습니다. 이 패턴은 Java 컬렉션 패키지에서 따르며 추상 클래스 AbstractListList. 다음과 같은 경우 추상 클래스를 사용하세요.
  • 밀접하게 관련된 여러 클래스 간에 코드를 공유하려고 합니다.

  • 추상 클래스를 확장하는 클래스에는 공통된 많은 메서드나 필드가 있거나 이외의 액세스 한정자가 필요할 것으로 예상합니다 public(예: protectedprivate).

  • 비정적 또는 не-final필드를 선언하려고 합니다. 이를 통해 자신이 속한 개체의 상태에 액세스하고 변경할 수 있는 메서드를 정의할 수 있습니다.
다음과 같은 경우 인터페이스를 사용하십시오.
  • 관련 없는 클래스가 인터페이스를 구현할 것으로 예상합니다. 예를 들어 인터페이스는 Comparable관련 Cloneable되지 않은 많은 클래스에 의해 구현됩니다.

  • 특정 데이터 유형의 동작을 정의하고 싶지만 이를 구현하는 사람이 누구인지는 상관하지 않습니다.

  • 다중 유형 상속을 사용하고 싶습니다.

9. Java의 추상 메소드란 무엇입니까?

추상 메서드는 본문이 없는 메서드입니다. abstract메서드 선언에 키워드를 사용하여 메서드를 정의하지 않고 간단히 선언하면 됩니다 . Java 언어의 인터페이스 내부에 선언된 모든 메소드는 기본적으로 추상 메소드입니다. 다음은 Java의 추상 메소드의 예입니다.
public void abstract printVersion();
이제 이 메서드를 구현하려면 추상 클래스를 확장하고 이 메서드를 재정의해야 합니다.

10. Java의 추상 클래스에 메소드가 포함될 수 있습니까 main?

예, Java의 추상 클래스는 메소드를 포함할 수 있습니다 main. 이는 또 다른 정적 메소드일 뿐이고 추상 클래스는 main인스턴스화하지 않는 한 메소드를 사용하여 실행될 수 있기 때문입니다. 그것이 내가 당신에게 말하고 싶은 전부입니다. 그리고 기억하세요: 추상 클래스와 인터페이스는 객체 지향 분석 및 디자인 프로세스에서 주요 디자인 결정이며 유연한 시스템을 만들고 싶다면 적절한 주의를 기울여 사용해야 합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION