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

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

무작위의 그룹에 게시되었습니다
다시 한 번 안녕하세요, 여러분! 우리는 주니어, 중급 및 시니어 Java 개발자를 위한 질문에 대한 답변을 계속해서 찾고 있습니다. 질문은 매우 흥미 롭습니다. 나는 개인적으로 그것들을 분석하는 것을 좋아합니다. 왜냐하면 그것은 나의 이론적 지식과 때로는 가장 예상치 못한 곳에서 공백을 찾는 데 도움이 되기 때문입니다. Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 2 - 1이전 부분은 이 기사 에서 찾을 수 있습니다 . 하지만 시작하기 전에 다음 사항을 상기시켜드리고 싶습니다.
  1. 불필요하게 정보가 중복되지 않도록 이 기사 시리즈 와 겹치는 질문은 건너뛰겠습니다 . 가장 일반적인(인기 있는) Java Core 인터뷰 질문을 다루고 있으므로 이 기사를 읽어 보는 것이 좋습니다.
  2. 답변을 더 자세히 설명할 수 있지만 그렇게 하지 않겠습니다. 왜냐하면 각 답변이 전체 기사에 영향을 미칠 수 있기 때문입니다. 그리고 어느 누구도 취업 면접에서 그런 수준의 세부사항을 묻지 않을 것입니다.
원하시면 더 깊은 연구를 위한 링크를 남겨두겠습니다. 날아보자!

11. Object 클래스의 모든 메소드 이름을 지정하십시오.

Object 클래스 에는 11가지 메서드가 있습니다.
  1. Class<?> getClass() — 현재 객체의 클래스를 가져옵니다.

  2. int hashCode() — 현재 객체의 해시 코드를 가져옵니다.

  3. boolean equals(Object obj) — 현재 객체를 다른 객체와 비교합니다.

  4. Object clone() — 현재 객체의 복사본을 만들고 반환합니다.

  5. String toString() — 객체의 문자열 표현을 가져옵니다.

  6. void inform() — 이 객체의 모니터에서 대기 중인 하나의 스레드를 깨웁니다(스레드 선택은 무작위입니다).

  7. void informAll() — 이 객체의 모니터에서 대기 중인 모든 스레드를 깨웁니다.

  8. void wait() — 현재 스레드가 알림 또는 informAll 호출이 스레드를 깨울 때까지 현재 모니터에서 대기하도록 합니다(현재 스레드를 동결)(동기화 블록에서만 작동).

  9. void wait(long timeout) — 현재 스레드가 현재 모니터(현재 동기화 블록)에서 대기하도록 만듭니다. 그러나 대기 상태를 종료하기 위한 시간 제한이 있습니다(또는 다시 통지 또는 informAll 호출이 스레드를 깨울 때까지).

  10. void wait(long timeout, int nanos) — 이 방법은 이전 방법과 비슷하지만 시간 제한이 더 정확합니다.

  11. void finalize() — 이 메서드는 가비지 수집기에 의해 객체가 제거되기 전에 (최종적으로) 호출됩니다. 획득한 자원을 정리하는 데 사용됩니다.

hashCode , equals , clone , toStringfinalize 메서드를 올바르게 사용하려면 현재 작업의 세부 사항에 따라 재정의해야 합니다.

12. 리소스 작업 시 try-with-resources와 try-catch-finally의 차이점은 무엇입니까?

일반적으로 try-catch-finally를 사용할 때 마지막 블록 리소스를 닫는 데 사용됩니다. Java 7에는 새로운 try-with-resources 문이 도입되었습니다. 리소스를 해제하는 try-catch-finally와 유사하지만 더 간결하고 읽기 쉽습니다. try-catch-finally가 어떤 모습인지 기억해 봅시다 .
String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
   bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
   bufferedWriter.write(text);
} catch (IOException e) {
   e.printStackTrace();
} finally {
   try {
       bufferedWriter.close();
   } catch (IOException e) {
       e.printStackTrace();
   }
}
이제 try-with-resources를 사용하여 이 코드를 다시 작성해 보겠습니다 .
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
   bufferedWriter.write(text);
} catch (IOException e) {
   e.printStackTrace();
}
이제는 좀 더 간단해졌죠? 더 간단한 코드 외에도 주목해야 할 몇 가지 사항이 있습니다.
  1. try-with-resources 에서 괄호 안에 선언된 리소스(닫힐 리소스)는 AutoCloseable 인터페이스와 유일한 close() 메서드를 구현해야 합니다.

    close 메소드는 암시적 finally 블록 에서 실행됩니다 . 그렇지 않으면 프로그램이 리소스를 닫는 방법을 정확히 어떻게 알아낼 수 있을까요?

    그러나 리소스 구현과 종료 방법을 직접 작성하는 경우는 거의 없을 것입니다.

  2. 블록은 다음 순서로 실행됩니다.

    1. 시도 블록 .
    2. 암시적 finally 블록입니다.
    3. 이전 단계 에서 발생한 예외를 포착하는 catch 블록 .
    4. 명시적인 finally 블록입니다.

    일반적으로 목록에서 아래쪽에 던져진 예외는 위쪽에 던져진 예외를 방해합니다.

try-catch-finally를 사용하고 있는데 try 블록 에서 예외가 발생했다고 상상해 보세요 . 그런 다음 지정된 catch 블록이 즉시 실행되기 시작합니다. 여기서는 또 다른 예외(예: 오류를 더 자세히 설명하는 메시지와 함께)를 작성하고 메서드에서 이 예외를 위쪽으로 던지기를 원합니다. 그런 다음 finally 블록이 실행되고 예외도 발생합니다. 하지만 이번에는 다릅니다. 이 두 가지 예외 중 이 메서드가 궁극적으로 발생하는 예외는 무엇입니까? finally 블록 에서 발생한 예외입니다 ! 하지만 이제 우리는 try-with-resources 에 대한 또 다른 요점에 이르렀습니다 . 동일한 상황에서 try-with-resources가 어떻게 작동하는지 생각해 봅시다 . close() 메서드, 즉 암시 finally 블록 에서 리소스를 닫으려고 하면 try 블록 에서 예외가 발생합니다 . catch 블록은 다음 중 어떤 예외를 포착 합니까 ? try 블록 에 의해 던져진 것 ! 묵시적 finally 블록 의 예외 (loose () 메서드)는 무시됩니다. 이러한 예외 무시를 예외 억제라고도 합니다.

13. 비트 연산이란 무엇입니까?

비트 연산은 일련의 비트에 대한 연산입니다. 여기에는 논리 연산과 비트 단위 이동이 포함됩니다. 논리 연산자:
  • 비트 AND — 비트 값을 비교합니다. 0(false)으로 설정된 비트는 결과의 해당 비트를 0으로 설정합니다. 즉, 비교된 두 값 모두에서 비트가 1(true)이면 결과 비트도 1이 됩니다.

    AND 또는 & 로 표시

    예: 10111101 & 01100111 = 00100101

  • 비트 OR — 이 연산은 이전 연산과 반대입니다. 1로 설정된 비트는 결과의 해당 비트를 1로 설정합니다. 따라서 두 비교 값 모두에서 비트가 0이면 결과 비트도 0이 됩니다.

    OR 또는 | 로 표시됩니다.

    예: 10100101 | 01100011 = 11100111

  • 비트 NOT — 이 연산자는 단일 값에 적용됩니다. 비트를 뒤집습니다(반전). 즉, 1이었던 비트는 0이 됩니다. 그리고 0이었던 것들은 1이 됩니다.

    NOT 또는 ~ 로 표시됨

    예: ~10100101 = 01011010

  • 비트 배타적 OR — 비트 값을 비교합니다. 두 비트가 모두 1이면 결과 비트는 0입니다. 두 비트가 모두 0이면 결과 비트는 0입니다. 즉, 결과 비트가 1이 되려면 비트 중 하나만 1이어야 하고, 다른 비트는 0이어야 합니다.

    XOR 또는 ^ 로 표시됩니다.

    예: 10100101 ^ 01100011 = 11000110

비트 단위 이동 ( >><< )은 피연산자의 비트를 지정된 방향으로 지정된 자릿수만큼 이동합니다. 비어 있는 자리는 0으로 채워집니다. 예를 들어:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
예외는 음수를 오른쪽으로 이동하는 경우입니다. 기억하시겠지만, 부호 있는 숫자의 첫 번째 비트는 부호를 나타냅니다. 이 비트가 1이면 숫자는 음수입니다. 음수를 이동하면 부호 비트가 유지되어야 하므로 빈 위치는 0이 아닌 1로 채워집니다. 예: 10100010 >> 2 = 11101000 즉, Java에는 부호 없는 오른쪽 시프트 연산자(>>>)가 추가로 있습니다. 이 연산자는 >>와 유사하지만 이동하면 피연산자가 음수인지 양수인지에 관계없이 빈 위치가 0으로 채워집니다. 예: 10100010 >>> 2 = 00101000 여기에서 비트 연산에 대해 자세히 알아보세요 . Java의 비트 단위 이동의 예로 HashMaps의 hash()Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 2 - 2 메서드를 사용할 수 있습니다 . 이 방법은 키의 특수 내부 해시코드를 결정하는 데 사용됩니다. 이 방법을 사용하면 충돌 횟수를 최소화하기 위해 HashMap에 데이터를 균등하게 배포할 수 있습니다. Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 2 - 3

14. Java에는 어떤 표준 불변 객체가 있습니까?

원래 값의 변경을 허용하지 않는 객체는 변경할 수 없습니다. 다른 값을 가진 동일한 유형의 새 객체를 반환하는 메서드가 있을 수 있습니다. 일부 표준 불변 객체는 다음과 같습니다:
  • 의심할 여지없이 Java의 가장 유명한 불변 유형은 String입니다.
  • 표준 유형(Boolean, Character, Byte, Short, Integer, Long, Double, Float)을 래핑하는 래퍼 클래스의 인스턴스.
  • 일반적으로 특히 BIG 숫자에 사용되는 BigInteger 및 BigDecimal 개체.
  • 스택 추적(예: 예외의 스택 추적)을 구성하는 StackTraceElement 개체입니다.
  • File 클래스의 객체 - 파일을 수정할 수 있지만 동시에 객체 자체는 변경되지 않은 상태로 유지됩니다.
  • 요소를 고유하게 식별하는 데 자주 사용되는 UUID
  • java.time 패키지에 있는 클래스의 모든 객체;
  • 지리적, 정치적 또는 문화적 지역을 식별하는 데 사용되는 로캘 개체입니다.

15. 일반 객체에 비해 불변 객체의 장점은 무엇입니까?

  1. 불변 객체는 다중 스레드 환경에서 사용해도 안전 합니다 . 경쟁 조건으로 인한 데이터 손실에 대해 걱정할 필요가 없도록 만듭니다. 이는 일반 개체로 작업할 때와 다릅니다. 그런 경우에는 병렬 환경에서 객체를 사용할 때 좋은 메커니즘을 생각하고 생각해내야 합니다.

  2. 불변 객체는 맵의 키로 좋습니다. 변경 가능한 객체를 HashMap 키로 사용한 다음 객체의 상태가 변경되면 데이터 구조가 혼란스러울 수 있습니다. 객체는 계속 존재하지만 ContainsKey()를 사용하면 객체를 찾지 못할 수 있습니다.

  3. 불변 객체는 프로그램이 실행되는 동안 절대 변경되어서는 안 되는 불변(상수) 데이터를 저장하는 데 적합합니다.

  4. 또 다른 장점은 실패 원자성입니다. 불변 객체가 예외를 발생시키는 경우 원치 않는(깨진) 상태로 남아 있지 않습니다.

  5. 이러한 클래스는 테스트하기 쉽습니다.

  6. 복사 생성자나 객체 복제 구현과 같은 추가 메커니즘이 필요하지 않습니다.

OOP에 대한 질문

16. 절차적 프로그래밍과 비교하여 일반적으로 OOP의 장점은 무엇입니까?

좋습니다. OOP의 장점은 다음과 같습니다.
  1. 복잡한 애플리케이션은 절차적 프로그래밍보다 OOP를 사용하여 작성하기가 더 쉽습니다. 모든 것이 작은 모듈(서로 상호 작용하는 개체)로 나누어지고 결과적으로 프로그래밍이 개체 간의 관계로 축소되기 때문입니다.

  2. OOP로 작성된 애플리케이션은 수정하기가 훨씬 쉽습니다(설계 원칙을 올바르게 준수하는 경우).

  3. 데이터와 데이터 작업이 모두 단일 엔터티를 형성하기 때문에 애플리케이션 전체에 번지지 않습니다(절차적 프로그래밍에서 흔히 발생함).

  4. 캡슐화 원칙은 사용자로부터 가장 중요한 데이터를 보호합니다.

  5. 클래스를 사용하면 각각 고유한 값을 가진 많은 개체를 만들 수 있으므로 동일한 코드를 다른 데이터에 재사용할 수 있습니다.

  6. 상속과 다형성을 사용하면 유사한 기능을 복제하는 대신 기존 코드를 재사용하고 확장할 수도 있습니다.

  7. 애플리케이션 확장은 절차적 접근 방식보다 더 간단합니다.

  8. OOP 접근 방식을 사용하면 구현 세부 사항을 추상화할 수 있습니다.

17. OOP의 단점을 알려주세요

불행히도 다음과 같은 것도 존재합니다.
  1. OOP에는 무엇이든 작성하기 전에 숙달해야 하는 많은 이론적 지식이 필요합니다.

  2. OOP 아이디어는 실제로 이해하고 적용하기가 쉽지 않습니다(마음속으로 작은 철학자가 되어야 합니다).

  3. OOP는 시스템의 복잡성 증가로 인해 프로그램 성능을 약간 감소시킵니다.

  4. OOP 접근 방식은 모든 것이 클래스, 인터페이스, 메소드로 구성되어 일반 변수보다 훨씬 많은 메모리를 차지하므로 더 많은 메모리가 필요합니다.

  5. 초기 분석에 필요한 시간은 절차적 접근보다 더 깁니다.

18. 정적 다형성과 동적 다형성이란 무엇입니까?

다형성을 통해 동일한 클래스나 인터페이스의 객체가 다르게 동작할 수 있습니다. 다형성에는 두 가지 유형이 있으며 이는 초기 바인딩과 후기 바인딩이라고도 합니다. 정적 다형성 또는 초기 바인딩:
  • 컴파일 타임(프로그램 라이프사이클 초기)에 발생합니다.
  • 컴파일 타임에 실행할 메소드를 결정합니다.
  • 메소드 오버로딩은 정적 다형성의 예입니다.
  • 초기 바인딩에는 개인용, 정적 및 최종 메서드가 포함됩니다.
  • 상속은 초기 바인딩에 관여하지 않습니다.
  • 정적 다형성에는 특정 객체가 포함되지 않고 변수 이름 왼쪽에 나타나는 클래스 유형에 대한 정보가 포함됩니다.
동적 다형성 또는 후기 바인딩:
  • 런타임에 발생합니다(프로그램이 실행되는 동안).
  • 동적 다형성은 런타임 시 메서드가 어떤 특정 구현을 갖게 될지 결정합니다.
  • 메서드 재정의는 동적 다형성의 예입니다.
  • 후기 바인딩은 특정 객체, 해당 유형의 참조 또는 해당 슈퍼클래스를 할당하는 것을 의미합니다.
  • 상속은 동적 다형성과 연관되어 있습니다.

19. OOP의 추상화 원칙 정의 제공

OOP에서 추상화는 중요하지 않은 세부 사항을 제외하면서 객체의 의미 있는 특성 집합을 분리하는 방법입니다. 즉, OOP 접근 방식으로 프로그램을 설계할 때 구현의 세부 사항을 다루지 않고 일반 모델에 중점을 둡니다. Java에서는 추상화가 인터페이스를 통해 구현됩니다 . 예를 들어 자동차가 있는데 그것이 인터페이스가 될 것입니다. 그리고 엔진 시동, 기어 변속과 같은 다양한 상호 작용은 구현 세부 사항을 자세히 조사하지 않고도 사용하는 기능입니다. 실제로, 운전할 때 기어박스가 어떻게 그 목적을 달성하는지, 키가 엔진을 시동하는 방법, 스티어링 휠이 바퀴를 정확히 어떻게 돌리는지에 대해 정확히 생각하지 않습니다. 그리고 일부 기능(예: 엔진)의 구현을 교체하면 이를 눈치채지 못할 수도 있습니다. 그것은 당신에게 중요하지 않습니다. 당신은 구현 세부 사항을 조사하지 않습니다. 당신에게 중요한 것은 행동이 수행된다는 것입니다. 본질적으로 이는 구현 세부 사항을 추상화합니다. 이 시점에서 오늘은 이만 마치겠습니다. 계속하겠습니다!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION