CodeGym/Java Blog/무작위의/Java 개발자 직책에 대한 취업 면접의 질문과 답변을 살펴보세요. 5부
John Squirrels
레벨 41
San Francisco

Java 개발자 직책에 대한 취업 면접의 질문과 답변을 살펴보세요. 5부

무작위의 그룹에 게시되었습니다
회원
안녕 안녕! 오늘날 Java 개발자에 대한 수요가 매우 높습니다. 물론 제가 여러분에게 일자리를 제공해드릴 수는 없지만 여러분이 새로운 지식을 얻고 부족한 부분을 메울 수 있도록 도와드리겠습니다. 이제 Java 개발자 인터뷰 질문에 대한 검토를 계속하겠습니다. 기사 끝 부분에서 리뷰의 이전 부분에 대한 링크를 찾을 수 있습니다. Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 5 - 1

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

나는 이전에 캡슐화를 달성하는 데 사용되는 Java 요소에 대한 질문에서 액세스 수정자를 다루었습니다. 하지만 그래도 상기시켜 드리겠습니다. Java의 액세스 한정자는 특정 Java 구성 요소에 부여된 액세스 수준을 설명하는 키워드입니다. 다음과 같은 액세스 한정자가 존재합니다.
  • public — 이 수정자로 표시된 요소는 공개입니다. 즉, public 한정자로 선언된 필드, 메서드, 클래스는 자체 패키지와 외부 패키지 모두에서 다른 클래스에 표시됩니다.
  • protected — 이 수정자로 표시된 요소는 다른 패키지에 있더라도 현재 패키지 또는 파생 클래스의 자체 클래스 어디에서나 액세스할 수 있습니다.
  • 액세스 수정자가 표시되지 않으면 기본값 (또는 수정자가 전혀 없음)이 암시적으로 적용됩니다. 다른 패키지에 있는 파생 클래스에 표시된다는 점을 제외하면 이전 항목과 유사합니다.
  • private — 이것은 모든 수정자 중에서 가장 비공개입니다. 현재 클래스 내의 요소에만 액세스할 수 있습니다.

40. 정적 및 비정적 메서드의 주요 기능을 설명하세요.

주요 차이점은 정적 메서드가 클래스에 속한다는 것입니다. 실제로 이 클래스의 인스턴스를 만들 필요는 없습니다. 정적 메서드는 클래스 유형에서만 호출할 수 있습니다. 예를 들어 고양이를 쓰다듬는 정적 메소드가 있다고 가정해 보겠습니다.
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Pet the cat: " + cat.getName());
   }
이를 호출하기 위해 CatService 클래스 의 인스턴스가 필요하지 않습니다 .
Cat cat = new Cat(7, "Bobby");
CatService.petTheCat(cat);
대조적으로, 일반적인 메소드는 객체에 바인딩(속해)됩니다. 이를 호출하려면 메소드가 호출될 인스턴스(객체)가 있어야 합니다. 예를 들어, 고양이가 비정적 메서드 meow()를 가지고 있다고 가정해 보겠습니다 .
class Cat {
   public void meow() {
       System.out.println("Meow! Meow! Meow!");
   }
이 메서드를 호출하려면 고양이의 특정 인스턴스가 필요합니다.
Cat cat = new Cat(7, "Bobby");
cat.meow();

41. 정적 및 비정적 메서드에 적용되는 주요 제한 사항은 무엇입니까?

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

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

static 키워드 로 표시된 요소는 클래스 인스턴스에 속하지 않고 클래스 자체에 속합니다. 클래스 자체가 로드될 때 로드됩니다. 정적 요소는 프로그램 전체에서 동일하지만 비정적 요소는 특정 개체에서만 동일합니다. 다음 요소는 정적일 수 있습니다.
  • 클래스의 필드;
  • 클래스의 초기화 블록;
  • 클래스의 메소드;
  • 클래스의 중첩 클래스(물론 이것은 동어반복이기도 합니다).
정적 메서드는 재정의될 수 없습니다. 클래스에 속하고 상속되지 않지만 동시에 오버로드될 수 있습니다.

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

나는 이전 기사에서 이에 대해 이미 답변했습니다. 메소드는 추상이면서 동시에 정적일 수 없습니다. 메서드가 추상적인 경우 이는 해당 메서드가 하위 클래스에서 재정의되어야 함을 의미합니다. 그러나 정적 메서드는 클래스에 속하며 재정의될 수 없습니다. 이는 모순을 만들어내며, 컴파일러는 이에 대해 알아차리고 화를 냅니다. 이러한 상황에 처하게 되면 애플리케이션 아키텍처의 정확성에 대해 진지하게 생각해야 합니다(힌트: 분명히 뭔가 문제가 있음). Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 5 - 2

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

비정적 메서드에서 정적 메서드를 사용할 수 있습니다. 아무것도 그것을 방해하지 않습니다. 즉, 그 반대는 불가능합니다. 정적 메서드는 클래스의 특정 인스턴스를 참조하지 않고는 비정적 메서드를 사용할 수 없습니다. 클래스의 정적 멤버는 this 참조 에 액세스할 수 없다는 점을 기억하세요 . 클래스의 구체적인 개체는 원하는 만큼 가질 수 있으며 각 개체에는 자체 참조인 this 참조가 포함됩니다. 그렇다면 어떤 참조를 사용할지 결정하는 방법은 무엇 일까요 ? 어, 그렇지 않아요. 그렇기 때문에 정적 요소는 특정 객체에 대한 참조 없이는 비정적 요소를 참조할 수 없습니다. 기본적으로 정적 메서드는 특정 개체에 대한 참조가 있는 경우에만 비정적 메서드를 사용할 수 있습니다. 예를 들어, 메소드 인수로 들어온 것:
public static void petTheCat(Cat cat) {
   System.out.println("Pet the cat: " + cat.getName());
}
여기서는 정적 petTheCat() 메서드 에서 Cat 개체 의 일반적인 비정적 메서드인 getName을 호출하는 것을 볼 수 있습니다 .

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

Java에는 다중 상속이 없다는 점을 기억할 것입니다. 인터페이스는 이에 대한 대안입니다. 인터페이스는 매우 간단한 클래스와 같습니다. 기능을 정의하지만 구체적인 구현은 아닙니다. 해당 작업은 이러한 인터페이스를 구현하는 클래스에 맡겨집니다. 인터페이스의 예:
public interface Animal {
    void speak();
}
클래스에 의한 인터페이스 구현의 예
class Cat implements Animal {

   @Override
   public void speak() {
       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. 인터페이스의 인스턴스를 생성할 수 없습니다.

인터페이스가 최종적일 수 있는지에 대한 질문에 대한 대답은 물론 '아니오'입니다. 실제로 인터페이스를 갖는 목적은 인터페이스를 구현하는 것입니다. 그리고 우리 모두가 잘 기억하는 것처럼 클래스 수준의 최종 수정자는 클래스를 상속할 수 없게 만들고 인터페이스의 경우 구현을 불가능하게 만듭니다. 구현하거나 사용할 수 없는 인터페이스가 왜 필요한가요? 당신 말이 맞아요. 우리는 그렇지 않아요! 그리고 컴파일러는 동의합니다. :) Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 5 - 3실제로 Java 8부터 정적 인터페이스 메소드가 도입되면서 일리가 있을 수 있지만 인터페이스가 최종일 수 없다는 사실은 바뀌지 않습니다. 나는 인터페이스에 대해 매우 피상적으로만 이야기했습니다. 왜냐하면 이것은 광범위한 주제이기 때문입니다. 이에 대한 자세한 내용은 Java 인터페이스 에 대한 기사 와 추상 클래스와 인터페이스의 차이점을 참조하세요 .

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

정적 필드를 초기화할 수 있습니다.
  • 선언 즉시 등호( = )를 사용합니다.
  • 정적 초기화 블록에서;
  • 비정적 초기화 블록에서(그러나 객체가 생성될 때마다 이 초기화 블록이 실행될 때 정적 필드가 덮어쓰여진다는 점을 이해해야 합니다.
  • 클래스 생성자에서. 생성자가 호출될 때마다(즉, 이 생성자를 사용하여 객체가 생성될 때마다) 필드를 덮어씁니다.
  • 정적 메소드에서;
  • 비정적 메소드에서;
  • 중첩된 정적 및 비정적, 로컬 및 익명 클래스에 있습니다.

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

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

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

Java에는 기본 클래스와 같은 것이 없기 때문에 이것은 오해의 소지가 있는 질문, 아마도 속임수 질문이라고 생각합니다. 앞서 살펴본 원시 유형의 개념만 있습니다. Java에는 byte , short , int , long , float , double , char , boolean 의 8가지 기본 유형이 있다는 것을 기억하세요 .

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

Java에서 기본 유형을 사용할 때의 주요 문제점은 해당 유형이 클래스가 아니며 Java가 OOP 언어라는 것입니다. 즉, 이 언어로 작성된 프로그램은 개체 간의 상호 작용에 해당합니다. 그러나 프리미티브는 객체가 아닙니다. 여기에는 메소드가 없으며 심지어 Object 클래스의 표준 메소드도 없습니다. 하지만 Map 에서 기본 요소를 키로 사용해야 하는 경우에는 어떻게 해야 할까요 ? 그런 다음 hashCode() 메서드를 호출해야 합니다 . 거기에서 equals() 메서드를 호출할 수도 있습니다 . 그럼 어쩌지? 기본이 아닌 수업이 필요한 순간이 많이 있습니다. 이는 OOP의 개념 자체를 위반하기 때문에 프로그램에서 기본 요소를 사용할 수 없고 바람직하지 않은 요소로 만듭니다. 하지만 상황은 생각보다 나쁘지 않습니다. 결국 Java에는 원시 래퍼(Primitive Wrapper)라는 개념이 있습니다. 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 - 5 읽어 보시기 바랍니다 .

50. 중첩 클래스란 무엇입니까? 어디에 사용되나요?

중첩 클래스는 그 자체가 다른 클래스의 멤버인 클래스입니다. Java에는 이러한 중첩 클래스가 4가지 있습니다. 1. 내부 클래스 이러한 종류의 클래스는 다른 클래스의 본문에서 직접 선언됩니다. 내부 클래스는 비정적 중첩 클래스이며 외부 클래스의 모든 전용 필드 또는 인스턴스 메서드에 액세스할 수 있습니다. 예를 들어 얼룩말이라는 동물이 있는 동물원을 만들어 보겠습니다.
public class Zoo {
   class Zebra {
       public void eat(String food) {
           System.out.println("Zebra eats " + food);
       }
   }
}
복잡하지 않죠? 내부 클래스의 인스턴스를 생성하는 예를 살펴보겠습니다.
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.eat("apple");
이미 본 것처럼, 먼저 인클로징 클래스의 객체를 생성해야 합니다. 그런 다음 개체 참조를 사용하여 내부 클래스의 인스턴스를 만듭니다. 또한 내부 클래스(비정적 중첩 클래스)는 정적 메서드나 정적 필드를 가질 수 없다는 점을 지적하고 싶습니다 . 이는 내부 클래스가 외부 클래스의 인스턴스와 암시적으로 연결되어 있으므로 자체적으로 정적 메서드를 선언할 수 없기 때문입니다. 2. 정적 중첩 클래스 이 클래스는 이전 범주와 유사하지만 클래스 선언에 static 액세스 수정자가 있습니다. 이러한 종류의 클래스는 외부 클래스의 비정적 필드에 액세스할 수 없으므로 내부 클래스보다는 외부 클래스의 정적 부분처럼 보입니다. 하지만 이 클래스는 외부 클래스의 모든 정적 멤버, 심지어 비공개 멤버에도 액세스할 수 있습니다. 정적 중첩 클래스의 예:
public class Zoo {
   static class Zebra {
       public void eat(String food) {
           System.out.println("Zebra eats " + food);
       }
   }
}
이전과 약간 다르게 생성되었습니다.
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.eat("apple");
여기서는 정적 중첩 클래스의 객체를 생성하기 위해 외부 클래스의 객체가 필요하지 않습니다. 외부 클래스 내에서 이를 찾으려면 중첩 클래스의 이름만 알면 됩니다. 3. 로컬 클래스 로컬 클래스는 메소드 본문 내부에 선언된 클래스입니다. 로컬 클래스의 객체는 바깥쪽 메서드 내에서만 생성하고 사용할 수 있습니다. 예:
public class Zoo {
   public void feed(String animal, String food) {
       switch(animal) {
           case "zebra":
               class Zebra {
                   public void eat(String food) {
                       System.out.println("Zebra eats " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.eat(food);
               ...
예는 다음과 같습니다.
Zoo zoo = new Zoo();
zoo.feed("zebra", "apple");
Feed() 메소드 에 대한 코드를 보지 못했다 면 로컬 클래스가 존재한다고 의심조차 하지 않았을 것입니다. 그렇지 않습니까? 로컬 클래스는 static 또는 temporary 가 될 수 없지만 abstract 또는 final 로 표시될 수 있습니다 (이 두 수정자를 동시에 사용하면 충돌이 발생하므로 둘 다는 아니고 둘 다는 아님). 4. 익명 클래스 위에서 이미 익명 클래스에 대해 이야기했으며 기억하겠지만 익명 클래스는 인터페이스와 클래스라는 두 가지 소스에서 생성될 수 있습니다. 사용 이유 중첩된 정적 및 비정적 클래스가 사용되는 이유는 때로는 더 일반적인 클래스에 작은 클래스를 포함하고 함께 유지하여 더 높은 응집력과 공통 목적을 갖는 것이 더 나기 때문입니다. 기본적으로 중첩 클래스를 사용하면 코드 캡슐화를 높일 수 있습니다. 클래스가 단일 메서드 내에서만 사용되는 경우 로컬 클래스를 사용하도록 선택할 수 있습니다. 이 경우 애플리케이션 전체에 코드를 분산시켜야 합니까? 아니요. 내 경험상 로컬 클래스를 사용하는 사람을 본 적이 없다고 덧붙이겠습니다. 왜냐하면 로컬 클래스가 필요한지 여부는 매우 논란의 여지가 있기 때문입니다. 인터페이스 또는 추상 클래스의 특정 구현이 한 번만 필요한 경우 익명 클래스를 사용할 수 있습니다. 이 경우 구현이 포함된 별도의 본격적인 클래스를 만들 필요가 없습니다. 대신, 우리는 이를 단순하게 유지하고 익명 클래스를 사용하여 필요한 메서드를 구현하고 객체를 사용한 다음 잊어버렸습니다(물론 가비지 수집기는 이를 잊지 않았습니다). 여기에 있는 기사를 통해 중첩 클래스에 대한 이해가 향상될 것입니다.

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

다양한 유형의 클래스가 있으며 다양한 액세스 한정자가 적용됩니다.
  • 외부 클래스에는 공용 액세스 수정자가 있거나 수정자가 전혀 없을 수 있습니다 (기본 수정자).
  • 내부 클래스 (비정적 중첩 클래스)는 4개의 액세스 한정자 중 하나를 가질 수 있습니다.
  • 중첩된 정적 클래스는 protected를 제외한 액세스 한정자 중 하나를 가질 수 있습니다 . 왜냐하면 이 수정자는 클래스의 모든 정적 멤버와 모순되는 상속을 의미하기 때문입니다(정적 멤버는 상속되지 않음).
  • 로컬 클래스는 기본 수정자만 가질 수 있습니다(즉, 수정자가 전혀 없음).
  • 익명 클래스 에는 클래스 선언이 없으므로 액세스 한정자가 전혀 없습니다.
오늘은 여기서 마치겠습니다. 곧 봐요!Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 5 - 6
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다