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

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

Random-KO 그룹에 게시되었습니다
안녕 안녕! 오늘날 Java 개발자에 대한 수요가 높습니다. 물론, 저는 여러분에게 공석을 제공할 수는 없지만 여러분이 새로운 지식을 얻고 격차를 줄일 수 있도록 노력할 것입니다. 그래서 우리는 Java 개발자를 위한 250개 이상의 인터뷰 질문을 계속해서 분석합니다 . 분석의 이전 부분에 대한 링크는 기사 끝에 있습니다.Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 5 - 1

39. Java의 액세스 수정자는 무엇입니까? 이름을 지정하십시오. 그것들은 무엇을 위해 사용됩니까?

이전에 Java 캡슐화 요소에 대한 질문에서 액세스 수정자를 설명했습니다. 하지만 어쨌든 상기시켜 드리겠습니다. Java의 액세스 한정자는 특정 Java 구성 요소에 부여된 액세스 수준을 설명하는 키워드입니다. 액세스 수정자는 다음과 같습니다.
  • public - 이 수정자가 있는 요소는 공개적으로 액세스 가능합니다. 저것들. 필드 및 메서드, public 한정자로 선언된 클래스는 현재 패키지와 외부 패키지 모두에서 다른 클래스에 표시됩니다.
  • protected - 이 수정자가 있는 요소는 현재 패키지의 현재 클래스나 하위 클래스의 어느 곳에서나 액세스할 수 있습니다. 다른 패키지에 있더라도 마찬가지입니다.
  • default 또는 누락된 수정자 - 이 수정자는 액세스 수정자가 전혀 지정되지 않은 경우 암시적으로 사용됩니다. 다른 패키지에 있는 하위 클래스에 가시성이 허용된다는 점을 제외하면 이전 항목과 유사합니다.
  • private 은 모든 수정자 중에서 가장 비공개적이므로 현재 클래스 내의 요소에만 액세스할 수 있습니다.
Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 5 - 2

40. 정적 메소드와 가변 메소드의 주요 특징을 말해 보세요.

매우 이상한 공식 - "가변 방법". 확실히 이것은 일반적인 비정적 메서드를 나타냅니다. 따라서 주요 차이점은 정적 메서드가 클래스에 속하며 실제로 이 클래스의 인스턴스를 만들 필요가 없다는 것입니다. 클래스 유형을 통해서만 호출할 수 있습니다. 예를 들어 고양이를 쓰다듬는 정적 메서드가 있습니다.
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
이를 호출하기 위해 CatService 클래스의 인스턴스가 필요하지 않습니다 .
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
일반적인 메서드는 객체에 바인딩(속해)되어 있지만 이를 호출하려면 해당 메서드가 호출될 인스턴스(객체)가 있어야 합니다. 예를 들어, 고양이는 비정적 메소드인 meowing을 사용합니다.
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
이 메서드를 호출하려면 고양이의 특정 인스턴스가 필요합니다.
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. 정적 및 "가변" 메서드에 대한 주요 제한 사항은 무엇입니까?

앞서 말했듯이 일반 메서드의 주요 제한 사항은 메서드가 호출될 인스턴스가 항상 있어야 한다는 것입니다. 그러나 정적 메서드에는 이것이 필요하지 않지만 현재 개체가 존재하지 않기 때문에 현재 개체의 요소에 대한 this 참조를 참조할 수 없습니다.

42. static 키워드는 무엇을 의미하나요? 정적 메서드를 재정의하거나 오버로드할 수 있나요?

static 키워드 로 지정된 요소 는 클래스의 객체가 아닌 클래스에 속하며, 클래스 자체가 로드될 때 로드됩니다. 정적 요소는 전체 프로그램에 대한 유일한 요소이고 일반 요소는 특정 개체에 대한 유일한 요소입니다. 정적은 다음과 같습니다.
  • 클래스 필드;
  • 클래스 초기화 블록;
  • 수업방식;
  • 클래스의 내부 클래스(그러나 이는 여전히 동어반복입니다).
정적 메서드는 재정의할 수 없습니다. 클래스에 속하고 상속되지 않지만 동시에 오버로드될 수 있습니다.

43. 메소드가 정적이면서 동시에 추상적일 수 있나요?

이전 기사에서 이미 언급한 바 있습니다. 메소드는 추상이면서 동시에 정적일 수 없습니다. 메소드의 추상성은 후속 메소드에서 재정의되어야 함을 의미합니다. 동시에 정적 메서드는 클래스에 속하며 재정의될 수 없습니다. 이로 인해 모순이 발생하고 컴파일러는 이를 보고 저주하기 시작합니다. 그러한 상황이 발생하면 애플리케이션 아키텍처의 정확성에 대해 진지하게 생각해야 합니다(결국 분명히 뭔가 문제가 있음).Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 5 - 3

44. 일반 메소드 중간에 정적 메소드를 사용할 수 있나요? 그 반대? 왜?

정적 메소드는 이를 방해하는 것이 없기 때문에 일반 메소드에서 사용할 수 있습니다. 동시에 반대 상황은 불가능합니다. 정적 메서드는 이 클래스의 특정 인스턴스에 대한 참조가 없으면 일반 메서드를 사용할 수 없습니다. 그리고 우리가 기억하는 것처럼 정적 클래스 멤버에는 이 참조를 사용할 수 없습니다. 원하는 만큼 클래스의 특정 개체가 있을 수 있으며 각 개체 내부에는 자체에 대한 참조가 있습니다 . 그러면 이 링크가 어떤 링크를 취해야 하는지 어떻게 이해합니까 ? 하지만 절대 안돼. 따라서 정적 요소는 특정 개체에 대한 참조 없이는 비정적 요소를 참조할 수 없습니다. 실제로 정적 메서드는 특정 개체에 대한 참조가 있는 경우에만 비정적 메서드를 사용할 수 있습니다. 예를 들어, 인수로 나온 것:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
여기서 우리는 정적 메소드 petTheCat가 Cat 객체 의 일반적인 비정적 메소드인 getName 호출하는 것을 볼 수 있습니다 .

45. 인터페이스란 무엇입니까? 최종 인터페이스가 있을 수 있나요?

우리가 기억하는 것처럼 Java에는 다중 상속이 없습니다. 인터페이스는 이에 대한 대안입니다. 인터페이스는 매우 단순한 클래스처럼 보입니다. 이러한 인터페이스를 구현(구현)하는 클래스에 의해 구현되는 특정 구현 없이 기능을 정의합니다. 인터페이스 예:
public interface Animal {
    void voice();
}
클래스에 의한 인터페이스 구현의 예:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
인터페이스 사용에 대해 알아야 할 주요 사항은 다음과 같습니다.
  1. 인터페이스 메소드는 특정 메소드 본문 없이 헤더만 포함해야 합니다. 추상적이어야 합니다(그러나 abstract 키워드를 사용하지 않음 ). 이에 대한 예외는 메소드 본문이 필요한 정적 및 기본 메소드입니다.
  2. 클래스는 쉼표로 구분하여 작성되는 많은 인터페이스(내가 말했듯이 다중 상속의 대안)를 구현할 수 있습니다. 클래스 Lion은 Animal, Wild를 구현합니다 .
  3. 인터페이스는 키워드- 인터페이스를 사용하여 생성됩니다 .
  4. 클래스로 인터페이스를 구현할 때 키워드는 Implements 입니다 .
  5. 특정 인터페이스를 구현하는 클래스는 모든 추상 메서드를 구현하거나 자신을 추상으로 선언해야 합니다.
  6. 인터페이스를 사용하는 주요 목적은 다형성(다양한 형태를 취하는 객체의 능력)을 구현하는 것입니다.
  7. 일반적으로 메소드에 대한 액세스 수정자는 인터페이스에 작성되지 않습니다. 기본적으로 public 이며 public 이외의 다른 수정자는 지정할 수 없습니다. Java 9부터 메소드에 개인 수정자를 사용할 수 있습니다 .
  8. 인터페이스 변수는 기본적으로 static final , 즉 상수입니다. 항상 인터페이스에서 직접 초기화해야 합니다.
  9. 인터페이스 개체를 만들 수 없습니다.
인터페이스가 최종적일 수 있는지 여부에 대한 질문에 대한 대답은 물론 그렇지 않습니다. 결국 인터페이스의 본질은 구현되는 것입니다. 그리고 우리 모두가 잘 기억하는 것처럼 클래스 수준의 final은 상속이 불가능하고 인터페이스의 경우 구현이 불가능합니다. 구현하고 사용할 수 없는 인터페이스가 필요한 이유는 무엇입니까? 맞습니다. 그럴 필요가 없습니다! 그리고 컴파일러는 그렇게 생각합니다.)) Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 5 - 4Java 8 인터페이스에 정적 메소드가 도입되었을 때만 의미가 나타 났지만 인터페이스가 최종적일 수 없다는 사실은 바뀌지 않았습니다. 저는 인터페이스에 대해 매우 피상적으로 이야기했습니다. 왜냐하면... 이것은 광범위한 주제입니다. 이에 대한 자세한 내용은 Java의 인터페이스추상 클래스와 인터페이스의 차이점 에 대한 기사를 참조하세요 .

46. ​​​​정적 필드는 어디에서 초기화할 수 있나요?

정적 필드를 초기화할 수 있습니다.
  • 선언 시 직접 등호 = ;
  • 정적 초기화 블록에서;
  • 비정적 초기화 블록에서는 객체가 생성될 때마다 이 필드가 이 초기화 블록으로 덮어쓰여진다는 점을 이해해야 합니다.
  • 클래스 생성자에서. 이 생성자가 호출될 때마다(즉, 이 생성자를 통해 객체가 생성될 때) 이 필드를 덮어씁니다.
  • 정적 메소드에서;
  • 비정적 메소드에서;
  • 내부 정적 및 비정적, 로컬 및 익명 클래스에서.

47. 익명 클래스란 무엇입니까?

익명 클래스는 자체 유형이 없는 클래스입니다. 내가 무슨 말을하는거야? 인터페이스에 관해 이야기할 때 인터페이스 객체를 생성할 수 없다고 언급했습니다. 인터페이스를 구현하는 클래스의 객체만 생성할 수 있습니다. 클래스에서 인터페이스를 구현하고 싶지 않지만 여전히 인터페이스 유형의 객체가 필요한 경우 어떻게 해야 합니까? 그리고 아마도 이것은 이 객체를 사용하는 단일 사례일 것입니다. 그리고 완전한 구현 클래스를 만들 필요도 없습니다. 어떻게 하시겠습니까? 오른쪽! 익명 수업을 통해! AnimalJava 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 5 - 5 인터페이스 가 있다고 가정해 보겠습니다 .
public final interface Animal {
   public void voice();
}
익명 클래스를 통해 이 인터페이스를 인스턴스화하려면 다음을 수행하십시오.
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
그런 다음 이 개체와 해당 개체에 구현된 메서드( voice ) 를 안전하게 사용할 수 있습니다 . 즉, 익명 클래스는 지금 바로 여기에서 이 인터페이스와 모든 추상 메서드를 구현합니다. 그렇지 않으면 구현되지 않은/추상 메소드가 있으므로 인터페이스/추상 클래스 객체를 생성할 수 없습니다. 앞서 언급했듯이 익명 클래스는 인터페이스의 추상 메서드를 구현하는 것뿐만 아니라 추상 클래스의 추상 메서드를 구현하는 데에도 사용됩니다. 이 접근 방식은 객체가 한 번 사용되거나 지정된 메서드 구현이 한 번만 필요하고 필요한 추상 클래스/인터페이스를 구현하는 별도의 클래스를 만들 필요가 없는 상황에 적합합니다. 그러나 작업에서 익명 클래스를 사용하는 경우는 거의 없습니다. 원칙적으로 여전히 일반 클래스가 선호됩니다. 이 기사에서 익명 클래스에 대한 자세한 내용을 읽을 수 있습니다 .

48. 기본 클래스란 무엇입니까?

나에게 이것은 매우 이상한 질문이고 아마도 함정 질문일 것입니다. 왜냐하면 Java에는 기본 클래스와 같은 것이 없기 때문입니다. 아마도 우리가 이미 고려한 기본 유형의 개념을 제외하면 말입니다. 우리가 기억하는 것처럼 Java에는 byte , short , int , long , float , double , char , boolean 의 8가지 기본 유형이 있습니다 .Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 5 - 6

49. "래퍼" 클래스란 무엇입니까?

Java에서 기본 유형을 사용할 때의 주요 문제점은 해당 유형이 여전히 클래스가 아니며 Java가 여전히 OOP 언어라는 것입니다. 즉, 이 언어로 작성된 프로그램은 개체 간의 상호 작용으로 축소됩니다. 글쎄요, 프리미티브는 객체가 아닙니다. 여기에는 메소드가 없으며 심지어 Object 클래스의 표준 메소드도 없습니다 . 그렇다면 Map 에서 기본 요소를 키로 사용해야 한다면 어떻게 될까요 ? 그런 다음 hashCode 메소드를 호출해야 합니다 . 거기에서 equals 메소드를 호출할 수도 있습니다 . 그럼 어쩌지? 프리미티브가 아닌 클래스가 있어야 하는 순간이 매우 많이 있을 수 있습니다. 이로 인해 프로그램에서 프리미티브가 사용되지 않고 바람직하지 않은 요소가 됩니다. 이는 OOP의 아이디어 자체를 파괴하기 때문입니다. 그러나 모든 것이 보이는 것만큼 나쁘지는 않습니다. 결국 Java에는 기본 래퍼 개념이 있습니다. 각 기본 유형에는 아날로그 클래스가 있습니다.
  • 바이트 -> Byte.class
  • 짧은 -> Short.class
  • int -> Integer.class
  • -> Long.class
  • 플로트 -> Float.class
  • 더블 -> Double.class
  • 문자 -> Character.class
  • 부울 -> 부울.클래스
이는 단순한 유형을 표현하지만 다양하고 기능적인 메소드를 갖춘 본격적인 클래스 형태입니다. 이러한 클래스를 편리하게 사용하기 위해 오토박싱(autoboxing)과 언박싱(unboxing)의 개념이 도입되었습니다. 오토박싱 - 필요한 경우 기본 유형을 아날로그 클래스로 자동 변환합니다(예: int 에서 Integer 로 ). Unboxing은 이전 프로세스의 반대 프로세스입니다. 즉, 기본 래퍼 클래스를 기본 유형으로 자동 변환합니다(예: Integer 에서 int 로 ). 기본 래퍼 클래스와 자동박싱언박싱 프로세스 의 도입 덕분에 기본 유형은 OOP 언어(Java)의 완전한 구성원이 될 수 있었습니다. 이 주제에 대해 자세히 알아보려면 이 기사를Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 5 - 7 읽어 보시기 바랍니다 .

50. 중첩 클래스란 무엇입니까? 언제 사용되나요?

중첩 클래스는 다른 클래스의 멤버인 내부 클래스입니다. Java에는 이러한 내부 클래스의 4가지 유형이 있습니다. 1. 내부 클래스 이 유형의 클래스는 다른 클래스의 본문에서 직접 선언됩니다. 중첩된 내부 클래스는 외부 클래스 인스턴스의 모든 전용 필드나 메서드에 액세스할 수 있습니다. 예를 들어 얼룩말이라는 동물이 있는 동물원을 만들어 보겠습니다.
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
복잡한 건 하나도 없지, 그렇지? 내부 클래스 객체를 생성하는 예를 살펴보겠습니다.
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
이미 본 것처럼 내부 클래스의 객체를 생성할 수 있는 참조를 기반으로 프레이밍 클래스의 객체를 생성하는 것이 필수적입니다. 또한 중첩된 내부 클래스는 정적 메서드 나 정적 필드를 가질 수 없다는 점에 유의하고 싶습니다 . 내부 클래스는 외부 클래스의 개체와 암시적으로 연결되어 있으며 내부 클래스에서는 정적 메서드를 선언할 수 없기 때문입니다. 2. 정적 중첩 클래스 이 클래스는 이전 클래스와 유사하지만 클래스 선언 근처에 정적 액세스 수정자가 있습니다. 이러한 종류의 클래스는 외부 클래스의 비정적 필드에 액세스할 수 없으므로 내부 클래스보다는 외부 클래스의 정적 부분에 더 가깝습니다. 이 경우 클래스 데이터는 외부 클래스의 모든 정적 멤버(비공개 멤버 포함)에 액세스할 수 있습니다. 정적 중첩 클래스의 예:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
생성 방법은 이전 방법과 약간 다릅니다.
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
여기서는 중첩된 정적 클래스의 객체를 생성하기 위해 외부 클래스의 객체가 필요하지 않습니다. 외부 클래스에서는 중첩 클래스의 위치를 ​​찾을 수 있도록 해당 유형만 필요합니다. 3. 로컬 클래스 로컬 클래스는 메소드 내부에 선언된 클래스로, 이 메소드 내에서만 로컬 클래스의 객체 생성 및 사용이 가능하다. 예:
public class Zoo {
   public void toFeed(String animal, String food) {
       switch(animal){
           case "зебра":
               class Zebra {
                   void toFeedZebra(String food) {
                       System.out.println("Дать зебре - " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.toFeedZebra(food);
               ...
사용 예:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
toFeed 메소드 에 대한 코드를 보지 않고서는 로컬 클래스가 존재하는지조차 의심하지 않을 것입니다. 그렇죠? 로컬 클래스는 static 또는 temporary 가 될 수 없지만 abstract 또는 final 로 표시될 수 있습니다 (이 두 수정자를 사용하면 충돌이 발생하므로 OR만 가능). 4. 익명 클래스 우리는 위에서 이미 익명 클래스에 대해 이야기했으며 기억하는 것처럼 익명 클래스는 인터페이스와 클래스라는 두 가지 소스에서 생성될 수 있습니다. 내부 정적 및 비정적 클래스를 사용하는 이유는 때때로 작은 클래스를 큰 클래스 내에 포함하고 함께 유지하는 것이 더 낫기 때문입니다. 이렇게 하면 더 높은 결합도와 공통 목적을 갖게 됩니다. 실제로 중첩 클래스를 사용하면 코드 캡슐화가 증가합니다. 로컬 클래스를 선택하는 이유는 해당 클래스가 단일 메서드 내에서만 사용되기 때문일 수 있습니다. 이 경우 애플리케이션 전체에 코드를 분산시켜야 합니까? 아니요. 그러나 동시에 나는 실제로 로컬 클래스의 사용을 본 적이 없다고 덧붙일 것입니다. 그것들의 필요성은 매우 논란의 여지가 있습니다. 글쎄, 익명 클래스를 사용하는 이유는 인터페이스나 추상 클래스의 특정 구현이 한 번만 필요하기 때문일 수 있으므로 이를 구현하는 별도의 본격적인 클래스를 만들 필요가 없습니다. 대신, 간단한 방법으로 익명 클래스를 통해 필요한 메소드를 구현하고 이 객체를 사용한 후 잊어버렸습니다(글쎄, 가비지 수집기가 이에 대해 기억했습니다). 기사 와 Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 5 - 8 기사는 내부 수업을 더 자세히 공부하는 데 도움이 될 것입니다 .

51. 클래스는 어떤 접근 수정자를 가질 수 있나요?

우리가 기억하는 것처럼 다양한 유형의 클래스가 있으며 다양한 액세스 한정자를 적용할 수 있습니다.
  • 외부 클래스는 액세스 수정자를 public으로 가질 수도 있고 수정자(기본 수정자)가 없을 수도 있습니다.
  • 내부 클래스는 4개의 액세스 한정자를 모두 지원합니다.
  • 중첩된 정적 클래스는 protected를 제외한 모든 액세스 한정자를 지원합니다 . 이 수정자는 클래스의 정적 멤버와 모순되는 상속을 의미합니다(정적 요소는 상속되지 않음).
  • 로컬 클래스는 기본 수정자만 가질 수 있습니다(즉, 수정자가 전혀 없음).
  • 익명 클래스 : 클래스 유형 선언이 없으면 액세스 수정자가 전혀 없습니다.
오늘은 여기서 멈추겠습니다. 곧 봐요!Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 5 - 9
시리즈의 기타 자료:
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION