- 다시 한 번 정보가 중복되지 않도록 이 기사 시리즈 와 교차하는 질문은 건너뛰겠습니다. 이 자료에는 가장 일반적인(인기 있는) Java Core 인터뷰 질문이 포함되어 있으므로 읽어 보는 것이 좋습니다.
- DOU에 대한 질문은 우크라이나어로 제공되지만 여기서는 모든 내용을 러시아어로 설명하겠습니다.
- 답변을 더 자세히 설명할 수 있지만 그렇게 하지 않겠습니다. 왜냐하면 각 질문에 대한 답변이 전체 기사를 차지할 수 있기 때문입니다. 그리고 어떤 면접에서도 그렇게 자세히 물어보지는 않습니다.
11. Object 클래스의 모든 메소드 이름을 지정하십시오.
Object 클래스에는 11가지 메서드가 있습니다.- Class<?> getClass() — 현재 객체의 클래스를 가져옵니다.
- int hashCode() — 현재 객체의 해시 코드를 가져옵니다.
- boolean =(Object obj) - 현재 객체를 다른 객체와 비교합니다.
- Object clone() - 현재 객체의 복사본을 생성하고 반환합니다.
- String toString() — 객체의 문자열 표현을 가져옵니다.
- void inform() - 이 객체의 모니터에서 대기 중인 하나의 스레드를 깨웁니다(스레드 선택은 무작위입니다).
- void informAll() - 이 객체의 모니터에서 대기 중인 모든 스레드를 깨웁니다.
- void wait() - 현재 모니터에서 현재 스레드를 대기 모드로 전환(고정)하고 일부 inform 또는 informAll이 스레드를 깨울 때까지 동기화된 블록에서만 작동합니다.
- void wait(long timeout) - 또한 현재 모니터(현재 동기화된 모니터)의 현재 스레드를 고정하지만 타이머를 사용하여 이 상태를 종료합니다(또는 다시: inform 또는 informAll이 깨어날 때까지).
- void wait(long timeout, int nanos) - 위에서 설명한 것과 유사한 방법이지만 동결을 종료하기 위한 더 정확한 타이머가 있습니다.
- void finalize() - 이 개체를 삭제하기 전에 가비지 수집기가 이 메서드를 (마지막으로) 호출합니다. 점유된 자원을 정리하는 데 사용됩니다.
12. 리소스를 다룰 때 try-with-resources와 try-catch-finally의 차이점은 무엇입니까?
일반적으로 try-catch-finally를 사용할 때 마지막 블록은 리소스를 닫는 데 사용되었습니다. Java 7에서는 리소스를 해제하기 위한 try-catch-finally와 유사 하지만 더 간결하고 읽기 쉬운 새로운 유형의 연산자 try-with-resources를 도입했습니다. 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();
}
왠지 더 쉬워질 것 같지 않나요? 단순화 외에도 몇 가지 사항이 있습니다.
-
try-with-resources 에서 괄호 안에 선언된 리소스(닫혀질)는 AutoCloseable 인터페이스와 해당 인터페이스의 유일한 메서드인 close() 를 구현해야 합니다 .
close 메소드는 암시적 finally 블록 에서 실행됩니다 . 그렇지 않으면 프로그램이 주어진 리소스를 닫는 방법을 정확히 어떻게 이해할 수 있을까요?
그러나 대부분의 경우 리소스 구현과 종료 방법을 직접 작성하는 경우는 거의 없습니다.
-
블록 실행 순서:
- 차단 해 보세요 .
- 암시적 finally .
- 이전 단계에서 예외를 포착하는 catch 블록입니다 .
- 드디어 명시적 .
일반적으로 목록에서 아래쪽에 나타나는 예외는 위쪽에 나타나는 예외를 방해합니다.
13. 비트 연산이란 무엇입니까?
비트 연산은 논리 연산과 비트 시프트를 포함하는 비트 문자열에 대한 연산입니다. 논리 연산:-
비트 AND - 비트 값을 비교하며, 이 과정에서 0(false)으로 설정된 비트는 결과의 해당 비트를 0으로 설정합니다. 즉, 비교되는 두 값 모두에서 비트가 1(true)인 경우 결과도 1이 됩니다.
- AND , & 로 표시
예: 10111101 & 01100111 = 00100101
-
비트 OR은 이전 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
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000
14. Java의 객체는 어떤 표준 불변 클래스입니까?
Immutable 은 원래 매개변수를 변경할 수 없는 객체입니다. 변경하려는 매개변수와 함께 특정 유형의 새 객체를 반환하는 메서드가 있을 수 있습니다. 일부 표준 불변 객체:- Java에서 가장 유명한 불변 객체는 String입니다.
- 표준 유형(Boolean, Character, Byte, Short, Integer, Long, Double, Float)을 래핑하는 래퍼 클래스 인스턴스.
- 특히 큰 숫자(BigInteger 및 BigDecimal)에 일반적으로 사용되는 객체;
- 스택 추적의 단위인 객체(예: 예외 스택 추적) StackTraceElement;
- File 클래스의 객체 - 파일을 변경할 수 있지만 동시에 파일 자체는 변경할 수 없습니다.
- UUID - 요소의 고유 ID로 자주 사용됩니다.
- java.time 패키지의 모든 클래스 객체;
- 로캘 - 지리적, 정치적 또는 문화적 지역을 정의하는 데 사용됩니다.
15. 일반 객체에 비해 불변 객체의 장점은 무엇입니까?
- 이러한 개체는 다중 스레드 환경에서 사용될 때 안전 합니다 . 이를 사용하면 스레드 경쟁 조건으로 인한 데이터 손실에 대해 걱정할 필요가 없습니다. 일반 개체로 작업하는 것과는 달리 이 경우에는 매우 신중하게 생각하고 병렬 환경에서 개체를 사용하기 위한 메커니즘을 해결해야 합니다.
- 불변 객체는 맵에서 좋은 키입니다. 왜냐하면 가변 객체를 사용한 다음 객체의 상태가 변경되면 HashMap을 사용할 때 혼란스러울 수 있기 때문입니다. 객체는 여전히 존재하지만, containKey()를 사용하면 객체 가 존재하지 않을 수 있습니다. 찾을 수 있습니다.
- 불변 객체는 프로그램이 실행되는 동안 절대 변경되어서는 안 되는 불변(상수) 데이터를 저장하는 데 적합합니다.
- "실패에 대한 원자성" - 불변 객체가 예외를 발생시키는 경우에도 원치 않는(깨진) 상태로 남아 있지 않습니다.
- 이러한 클래스는 테스트하기 쉽습니다.
- 복사 생성자 및 복제 구현과 같은 추가 메커니즘은 필요하지 않습니다.
OOP에 대한 질문
16. 절차적 프로그래밍과 비교하여 일반적으로 OOP의 장점은 무엇입니까?
따라서 OOP의 장점은 다음과 같습니다.- 복잡한 애플리케이션은 절차적 프로그래밍보다 작성하기가 더 쉽습니다. 모든 것이 작은 모듈(서로 상호 작용하는 개체)로 나누어지고 결과적으로 프로그래밍이 개체 간의 관계로 귀결되기 때문입니다.
- OOP를 사용하여 작성된 애플리케이션은 수정하기가 훨씬 쉽습니다(디자인 개념을 따르는 한).
- 이에 대한 데이터와 작업은 단일 엔터티를 형성하므로 애플리케이션 전체에 번지지 않습니다(절차적 프로그래밍에서 흔히 발생함).
- 정보 캡슐화는 사용자의 가장 중요한 데이터를 보호합니다.
- 클래스를 사용하면 각각 고유한 속성 값을 갖는 많은 개체를 만들 수 있으므로 동일한 코드를 다른 데이터로 재사용할 수 있습니다.
- 상속과 다형성을 사용하면 유사한 기능을 복제하는 대신 기존 코드를 재사용하고 확장할 수도 있습니다.
- 절차적 접근 방식보다 애플리케이션 확장이 더 쉽습니다.
- OOP 접근 방식을 사용하면 구현 세부 사항을 추상화할 수 있습니다.
17. OOP에 어떤 단점이 있는지 알려주세요
불행히도 다음과 같은 항목도 있습니다.- OOP에는 무엇이든 작성하기 전에 숙달해야 하는 많은 이론적 지식이 필요합니다.
- OOP의 아이디어는 실제로 이해하고 적용하기가 쉽지 않습니다(마음속으로 철학자가 되어야 합니다).
- OOP를 사용하면 시스템 구성이 더욱 복잡해지기 때문에 소프트웨어 성능이 약간 저하됩니다.
- OOP 접근 방식은 모든 것이 일반 변수보다 훨씬 더 많은 메모리를 차지하는 클래스, 인터페이스, 메서드로 구성되므로 더 많은 메모리가 필요합니다.
- 초기 분석에 필요한 시간은 절차적 분석보다 더 깁니다.
18. 정적 다형성과 동적 다형성이란 무엇입니까?
다형성을 통해 객체는 동일한 클래스나 인터페이스에 대해 다르게 동작할 수 있습니다. 다형성에는 초기 바인딩 과 후기 바인딩 이라고도 알려진 두 가지 유형이 있습니다 . 정적 다형성 또는 이전 바인딩:- 컴파일 타임(프로그램 라이프사이클 초기)에 발생합니다.
- 컴파일 타임에 실행할 메소드를 결정합니다.
- 메소드 오버로딩은 정적 다형성의 한 예입니다.
- 초기 바인딩에는 개인용, 정적 및 터미널 메서드가 포함됩니다.
- 상속은 초기 바인딩에 관여하지 않습니다.
- 정적 다형성에는 특정 개체가 포함되지 않지만 클래스에 대한 정보가 포함되며 해당 유형은 변수 이름 왼쪽에 표시됩니다.
- 런타임에 발생합니다(프로그램이 실행되는 동안).
- 동적 다형성은 런타임 시 메서드가 어떤 특정 구현을 갖게 될지 결정합니다.
- 메서드 재정의는 동적 다형성의 예입니다.
- 후기 바인딩은 특정 객체, 해당 유형의 참조 또는 해당 슈퍼클래스를 할당하는 것입니다.
- 상속은 동적 다형성과 연관되어 있습니다.
GO TO FULL VERSION