JavaRush /Java Blog /Random-KO /Java 개발자 인터뷰의 질문과 답변을 분석합니다. 3부

Java 개발자 인터뷰의 질문과 답변을 분석합니다. 3부

Random-KO 그룹에 게시되었습니다
안녕하세요! 특별한 훈련 없이 비행기 조종 방법을 배우는 것이 불가능한 것처럼, 필요한 이론적 기초를 공부하는 데 오랜 시간을 들이지 않고는 Java 개발자가 되는 것도 불가능합니다. 오늘 우리는 정확히 이에 대해 작업할 것입니다. 우리는 Java 개발자를 위한 250개 이상의 인터뷰 질문을 계속 분석 하고 이에 대한 답변을 제공할 것입니다. 분석의 첫 번째 부분 과 두 번째 부분은 다음과 같습니다 . 예, 물론 이러한 모든 질문 없이도 훌륭한 Java 개발자가 될 수 있습니다. 그러나 Java 언어의 모든 면을 잘 이해하고 있다면 이점을 얻을 수 있으며 미래 고용주의 눈에 더 바람직한 후보자가 될 것입니다.Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 3 - 1

20. 캡슐화를 담당하는 언어 요소는 무엇입니까?

우리가 기억하는 것처럼 캡슐화는 클래스의 구현 세부 사항을 숨깁니다. 즉, 우리 클래스가 외부에서 사용될 때 내부 내용과 논리가 명확하지 않습니다. 그리고 이를 담당하는 언어 요소는 무엇입니까? 당연히 접근 수정자 ! private 한정자를 사용하여 숨겨야 할 사항을 표시합니다 . 예를 들어 클래스의 비공개 필드나 특정 내부 기능을 구현하는 데 도움이 되는 일부 내부 메서드가 있습니다. 그리고 외부 액세스를 제공하려는 항목에 공개 액세스 수정자를 추가합니다 . 예를 들어, 일부 기능(여러 개인 메서드를 사용할 수 있음)을 제공하는 메서드 또는 클래스의 개인 필드에 액세스하기 위한 동일한 getter 및 setter가 있습니다. 아, 그리고 클래스의 선택된 부분에 대한 액세스를 보다 유연하고 구체적으로 구성하는 데 사용할 수 있는 기본보호된 수정 자도 있습니다 .

21. 상속을 담당하는 언어 요소는 무엇입니까?

상속은 다른 클래스를 기반으로 클래스를 만들 수 있는 메커니즘입니다. Java에서는 이러한 목적으로 확장 키워드가 사용됩니다 . 예를 들어 Cat 클래스가 있고 그 후속 클래스인 Lion 을 만들고 싶습니다 . 코드에서는 다음과 같이 보일 것입니다:
public class Lion extends Cat
이는 Lion 클래스가 Cat 클래스의 정적 메서드와 변수 를 제외한 모든 메서드와 변수를 상속한다는 의미입니다. 또한 상속을 담당하는 언어 요소에는 super 가 포함됩니다 . 이것은 this 와 유사한 참조 이지만 this 는 호출된 개체를 참조하는 반면 super 는 현재 상위 개체를 참조합니다. 일반적으로 super가 사용됩니다.
  1. 슈퍼클래스 생성자를 호출하려면: 예를 들어 Cat 클래스에는 생성자에서 초기화해야 하는 내부 변수 이름이 있습니다. Lion 클래스 생성자 에서는 다음과 같습니다.

    public Lion(final String name) {
       super(name);
    }
  2. 상위 필드 및 메소드에 액세스하려면: 예를 들어 Cat 클래스에는 초기화된 age 필드가 있습니다 .

    public class Cat {
       int age = 10;
동시에 Lion 에는 동일한 초기화 필드가 있습니다 .
public class Lion extends Cat {
   int age = 15;
Lion 개체에서 상위 개체의 age 변수 에 액세스하려면 super를 통해 이 작업을 수행해야 합니다 .
super.name

22. 다형성을 담당하는 언어 요소는 무엇입니까?

다형성은 하나의 서명 개체가 다양한 형태(다중 구현)를 취할 수 있는 능력입니다. Java에서는 구현확장Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 3 - 2 키워드가 다형성을 담당한다고 안전하게 말할 수 있습니다 . 구현 - 인터페이스를 만들 때 일부 클래스에서 가능한 형식 중 하나를 구현하지만 이것이 유일한 형식은 아닙니다. 그렇죠? 구현 구현이 어떻게 생겼는지 기억해 봅시다 :
public class Cat implements Animal
그리고 Cat 클래스에서는 Animal 인터페이스 에 제시된 모든 추상 메소드를 구현해야 합니다 . 상속에도 마찬가지입니다. 자손 클래스에서는 이미 존재하는 메소드 구현을 재정의할 수 있습니다. 예를 들어 여러 하위 항목 -> 동일한 메서드의 여러 다른 재정의입니다. 글쎄요, 슈퍼클래스는 추상적이고 각 하위 클래스에 대해 특별한 방식으로 구현되어야 하는 특정 메서드를 가지고 있습니다. 즉, 그 방법은 다양한 형태를 취할 것이라고 말할 수 있다. 또한 @Override 주석은 구현된 메서드 위에 배치되어 슈퍼클래스나 인터페이스의 하나 또는 다른 메서드를 구현하거나 재정의(구현이 이미 슈퍼클래스에 존재하는 경우)한다는 것을 나타내는 this 에 도움이 될 수 있습니다 . 이는 선택 사항이며 오류를 더 쉽게 감지하는 데 사용됩니다. 이 주석을 사용하면 슈퍼클래스/인터페이스 메서드를 재정의/구현하려는 컴파일러에 표시하고 메서드 시그니처에 실수가 없도록 보장합니다.

23. 솔리드란 무엇인가요? 예를 들다

SOLID 는 Robert Martin이 만든 OOP의 5가지 기본 설계 원칙의 약어입니다. S - 단일 책임 원칙(Single-responsibilityprinciple) - 단일 책임 원칙으로, 클래스는 단 하나의 목표와 단일 목적만을 가져야 한다고 명시합니다. 즉, 모든 작업을 수행하는 클래스를 생성해서는 안 됩니다. 이 경우 "Divine Object" 안티패턴을 재현할 수 있습니다. Cat 개체가 있는 경우 내부 기능과만 상호 작용하는 메서드가 포함되어야 하며 이 인스턴스와 관련 없는 비즈니스 논리는 포함되지 않아야 합니다. 예를 들어, 이러한 유형의 객체를 어딘가에 저장하는 경우가 있습니다. 이 외부 기능( Cat 관련 )은 다른 클래스, 즉 이 유형의 개체에 대한 비즈니스 논리를 제공하는 작업을 수행하는 일부 서비스로 전송되어야 합니다. O - 개방-폐쇄 원칙 - 개방성/폐쇄성의 원칙. 이는 소프트웨어 엔터티(클래스, 인터페이스)가 확장을 위해 열려 있어야 하고 수정을 위해 닫혀 있어야 함을 의미합니다. 예를 들어, 기존 Cat 클래스의 기능과 유사 하지만 약간 다른 기능이 필요했습니다. Cat 클래스 의 기능을 변경하고 이미 사용된 위치를 깨는 대신 상속이나 구성을 사용합니다 . 결과적으로 우리는 Cat 클래스의 기능을 수정하여 목표를 달성했지만 동시에 이를 변경하거나 손상시키지 않았습니다. L - Liskov 대체 원리 - Barbara Liskov의 대체 원리. 원칙에 따르면 기본 유형을 사용하는 함수는 이를 알지 못한 채 기본 유형의 하위 유형을 사용할 수 있어야 합니다. 예를 들어, Cat 클래스는 근본적으로 동작을 변경하지 않고도 Lion 과 같은 그 자손과 상호 교환이 가능해야 합니다 . 일반적인 논리(동작)는 동일하게 유지되지만 특정 기능 구현의 세부 사항은 변경됩니다. I - 인터페이스 분리 원리 - 인터페이스 분리의 원리. 이 원칙은 하나의 범용 인터페이스보다 전문화된(좁게 초점을 맞춘) 인터페이스를 많이 갖는 것이 더 낫다는 것을 나타냅니다. 예를 들어, 사용자가 이 메서드만 필요한 일부 인터페이스를 구현했지만 이 인터페이스에는 원하는 메서드의 논리와 아무 관련이 없는 9개의 메서드가 더 있습니다. 이 경우 사용자는 10가지 인터페이스 메서드를 구현해야 하며 그 중 9개는 불필요합니다! 대신, 필요할 경우 구현할 수 있는 10개의 서로 다른 인터페이스를 만드는 것이 좋습니다. 글쎄, 10개는 아니지만 몇 개는 인터페이스의 공통 목적과 밀접하게 관련된 메소드를 갖습니다. D - 종속성 반전 원칙— 의존성 역전의 원리. 원칙에 따르면 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 됩니다. 이 원칙은 "추상은 세부 사항에 의존해서는 안 되고, 세부 사항은 추상화에 의존해야 한다"라고도 설명됩니다. 즉, 인터페이스를 참조하여 논리를 구축한 다음 필요한 인터페이스를 구현하는 클래스인 특정 개체를 이 기능에 전달해야 합니다. 예를 들어 Cat 인터페이스 와 그 구현 중 일부(예: LionHomeCat ) 가 있는 경우 Cat 인터페이스 유형 으로 상호 작용 논리를 구체적으로 구축한 다음 Lion 또는 HomeCat 의 특정 구현으로 대체 하지만 그 반대는 아닙니다.

24. 클래스, 객체, 인터페이스란 무엇인가요?

우리가 기억하는 것처럼 Java는 OOP 언어입니다. 즉, Java 프로그램은 객체 간의 상호 작용을 기반으로 구축됩니다. 이 프로그램은 각 개미가 객체인 개미집과 같다는 것이 밝혀졌습니다. Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 3 - 3객체는 내부 데이터와 상호 작용하는 다양한 방법(함수)을 포함하는 그룹화된 데이터입니다. 그리고 클래스는 객체를 생성하기 위한 지침이자 템플릿입니다. 즉, 동일한 명령에 따라 구성되고 서로 다르거나 동일한 데이터 값으로 채워진 객체가 많이 있을 수 있습니다. 삶의 예를 들자면, 클래스는 건물의 그림이고, 객체는 이 그림을 바탕으로 구체적으로 만들어진 건물이라고 할 수 있습니다. 인터페이스는 클래스와 유사하지만 인터페이스를 사용하여 객체를 만들 수 없다는 점만 다릅니다. 그들의 목표는 Java에 추상화 요소를 추가하는 것입니다. 보다 정확하게는 클래스와 객체 간의 관계에 유연성을 추가합니다. 유연성이란 앞서 설명한 다형성과 추상화를 의미하며, 이는 결국 애플리케이션의 내부 아키텍처를 구축할 수 있는 많은 기회를 열어줍니다.

25. POJO 클래스란 무엇입니까? 그러한 수업의 예를 들어보세요.

Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 3 - 4POJO - Plain Old Java Object - 좋은 오래된 Java 객체: 특정 클래스에서 상속되지 않고 비즈니스 모델에 필요한 것 이상의 서비스 인터페이스를 구현하지 않는 클래스의 간단한 객체입니다. 즉 , POJO 클래스는 특별한 요구사항이 없는 클래스일 뿐입니다. 유일한 요구 사항은 특정 프레임워크에 연결된 다양한 부가 기능이 없다는 것입니다. 일반적으로 이러한 클래스는 다른 클래스에서 상속되지 않으며( 동일 패키지의 POJO 클래스 제외) 인터페이스를 구현하지 않습니다. 때로는 Serialized 또는 Cloneable 과 같은 표준 라이브러리의 마커 인터페이스에 대해 예외가 발생합니다 . 주석을 사용하지 않습니다. 타사 라이브러리에 의존하지 마십시오. 그러나 POJO에는 비즈니스 논리와 모든 종류의 생성자가 포함된 메서드가 있을 수 있습니다. 클래스의 의미를 변경하지 않는 주석을 허용하는 경우(객체의 목적과 해당 작업의 논리는 변경되지 않음) POJO에는 XML 또는 JSON 에서 역직렬화된 JPA 엔터티 엔터티DTO 객체 도 포함될 수 있습니다 . 주석에 지정된 규칙입니다. 또한 POJO 클래스 에 대해 equalshashCode를 재정의하는 것이 좋습니다 . 이는 해당 역할을 더 잘 수행하는 데 도움이 될 수 있습니다. POJO 클래스 예 :
public class User {
   private Long id;
   private String firstName;
   private String lastName;
   private Long age;

   public User(final Long id, final String firstName, final String lastName, final long age) {
       this.id = id;
       this.firstName = firstName;
       this.lastName = lastName;
       this.age = age;
   }

   public Long getId() {
       return this.id;
   }

   public String getFirstName() {
       return this.firstName;
   }

   public String getLastName() {
       return this.lastName;
   }

   public Long getAge() {
       return this.age;
   }

   @Override
   public boolean equals(final Object o) {
       if (this == o) return true;
       if (o == null || this.getClass() != o.getClass()) return false;
       final User user = (User) o;
       return Objects.equals(this.id, user.id) &&
               Objects.equals(this.firstName, user.firstName) &&
               Objects.equals(this.lastName, user.lastName) &&
               Objects.equals(this.age, user.age);
   }

   @Override
   public int hashCode() {
       return Objects.hash(this.id, this.firstName, this.lastName, this.age);
   }
}

26. 클래스에는 어떤 요소가 포함될 수 있나요?

클래스에는 다음 요소가 포함될 수 있습니다.
  • 클래스 필드;
  • 정적 클래스 필드;
  • 초기화 블록;
  • 정적 초기화 블록;
  • 생성자(기본적으로 항상 비어 있음이 정의됨);
  • 행동 양식;
  • 정적 메소드;
  • 다양한 주석(클래스 자체 또는 해당 구성요소 위에 표시될 수 있음)
  • 제네릭 ;
  • 다른 클래스로부터의 상속( extends ) 또는 인터페이스로부터의 구현( implements ).

27. 자바의 상속에 대해 설명해보세요. super 키워드를 사용하면 어떤 이점이 있나요?

위에서 나는 이미 Java의 상속과 super 키워드 에 대해 이야기했습니다 . 몇 가지 중요한 사항을 더 언급하겠습니다.
  1. 하나의 클래스만 상속하는 것이 가능합니다. Java에는 다중 상속이 없습니다(그러나 Java 8에 기본 메소드가 등장하면서 이 설명은 매우 논란의 여지가 있습니다).
  2. 비공개 메서드와 필드도 상속되므로 상속인이 이에 액세스할 수 없습니다. (그러나 예를 들어 비공개 필드가 있고 이에 대한 공개 또는 보호 getter 및 setter가 있는 경우 해당 필드를 사용하여 작업할 수 있습니다. 그들을 통해).
  3. 최종 클래스는 상속되지 않습니다.
  4. final 메소드는 재정의되지 않습니다(그러나 상속 및 오버로드될 수 있음).
  5. 정적 메서드와 변수는 상속되지 않습니다(객체가 아니라 클래스에 연결되어 있기 때문).
  6. 추상 클래스에서 상속할 때 해당 추상 메서드의 구현이 필요하거나 현재 클래스도 추상으로 선언되어야 합니다.
  7. 상위 클래스에 기본이 아닌 생성자가 있는 경우 하위 클래스에서 이를 재정의해야 합니다(그러나 @Override 는 덮어쓰지 않습니다).
  8. 하위 항목의 재정의된 메서드는 액세스 한정자를 사용하여 확장할 수 있습니다: private -> default -> protected -> public .
  9. 하위 항목의 재정의된 메서드는 기록된 예외의 범위를 좁힐 수 있습니다(예: Exception -> IOException -> FileNotFoundException).
Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 3 - 5

28. 메소드 서명이란 무엇입니까? 올바른 서명과 잘못된 서명의 예를 들어보세요.

메소드의 시그니처는 메소드 이름과 들어오는 매개변수의 유형(그리고 매개변수의 순서가 중요함)으로 구성됩니다. 메서드 서명에는 반환 값이나 발생하는 예외가 포함되지 않습니다. 올바른 서명의 예:
doSomething(int, double, double)
잘못된 서명의 예:
void doSomething(int firstArg, int secondArg) throws Exception
반환 유형 및 발생하는 예외 목록과 결합된 메서드 서명을 메서드 계약 이라고 합니다 . 오늘은 그게 다야. 나중에 봐요!Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 3 - 6
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION