
- 불필요하게 정보가 중복되지 않도록 이 기사 시리즈 와 겹치는 질문은 건너뛰겠습니다 . 가장 일반적인(인기 있는) Java Core 인터뷰 질문을 다루고 있으므로 이 기사를 읽어 보는 것이 좋습니다.
- 답변을 더 자세히 설명할 수 있지만 그렇게 하지 않겠습니다. 왜냐하면 각 답변이 전체 기사에 영향을 미칠 수 있기 때문입니다. 그리고 어느 누구도 취업 면접에서 그런 수준의 세부사항을 묻지 않을 것입니다.
11. Object 클래스의 모든 메소드 이름을 지정하십시오.
Object 클래스 에는 11가지 메서드가 있습니다.-
Class<?> getClass() — 현재 객체의 클래스를 가져옵니다.
-
int hashCode() — 현재 객체의 해시 코드를 가져옵니다.
-
boolean equals(Object obj) — 현재 객체를 다른 객체와 비교합니다.
-
Object clone() — 현재 객체의 복사본을 만들고 반환합니다.
-
String toString() — 객체의 문자열 표현을 가져옵니다.
-
void inform() — 이 객체의 모니터에서 대기 중인 하나의 스레드를 깨웁니다(스레드 선택은 무작위입니다).
-
void informAll() — 이 객체의 모니터에서 대기 중인 모든 스레드를 깨웁니다.
-
void wait() — 현재 스레드가 알림 또는 informAll 호출이 스레드를 깨울 때까지 현재 모니터에서 대기하도록 합니다(현재 스레드를 동결)(동기화 블록에서만 작동).
-
void wait(long timeout) — 현재 스레드가 현재 모니터(현재 동기화 블록)에서 대기하도록 만듭니다. 그러나 대기 상태를 종료하기 위한 시간 제한이 있습니다(또는 다시 통지 또는 informAll 호출이 스레드를 깨울 때까지).
-
void wait(long timeout, int nanos) — 이 방법은 이전 방법과 비슷하지만 시간 제한이 더 정확합니다.
-
void finalize() — 이 메서드는 가비지 수집기에 의해 객체가 제거되기 전에 (최종적으로) 호출됩니다. 획득한 자원을 정리하는 데 사용됩니다.
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();
}
이제는 좀 더 간단해졌죠? 더 간단한 코드 외에도 주목해야 할 몇 가지 사항이 있습니다.
-
try-with-resources 에서 괄호 안에 선언된 리소스(닫힐 리소스)는 AutoCloseable 인터페이스와 유일한 close() 메서드를 구현해야 합니다.
close 메소드는 암시적 finally 블록 에서 실행됩니다 . 그렇지 않으면 프로그램이 리소스를 닫는 방법을 정확히 어떻게 알아낼 수 있을까요?
그러나 리소스 구현과 종료 방법을 직접 작성하는 경우는 거의 없을 것입니다.
-
블록은 다음 순서로 실행됩니다.
- 시도 블록 .
- 암시적 finally 블록입니다.
- 이전 단계 에서 발생한 예외를 포착하는 catch 블록 .
- 명시적인 finally 블록입니다.
일반적으로 목록에서 아래쪽에 던져진 예외는 위쪽에 던져진 예외를 방해합니다.
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
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000


14. Java에는 어떤 표준 불변 객체가 있습니까?
원래 값의 변경을 허용하지 않는 객체는 변경할 수 없습니다. 다른 값을 가진 동일한 유형의 새 객체를 반환하는 메서드가 있을 수 있습니다. 일부 표준 불변 객체는 다음과 같습니다:- 의심할 여지없이 Java의 가장 유명한 불변 유형은 String입니다.
- 표준 유형(Boolean, Character, Byte, Short, Integer, Long, Double, Float)을 래핑하는 래퍼 클래스의 인스턴스.
- 일반적으로 특히 BIG 숫자에 사용되는 BigInteger 및 BigDecimal 개체.
- 스택 추적(예: 예외의 스택 추적)을 구성하는 StackTraceElement 개체입니다.
- File 클래스의 객체 - 파일을 수정할 수 있지만 동시에 객체 자체는 변경되지 않은 상태로 유지됩니다.
- 요소를 고유하게 식별하는 데 자주 사용되는 UUID
- java.time 패키지에 있는 클래스의 모든 객체;
- 지리적, 정치적 또는 문화적 지역을 식별하는 데 사용되는 로캘 개체입니다.
15. 일반 객체에 비해 불변 객체의 장점은 무엇입니까?
-
불변 객체는 다중 스레드 환경에서 사용해도 안전 합니다 . 경쟁 조건으로 인한 데이터 손실에 대해 걱정할 필요가 없도록 만듭니다. 이는 일반 개체로 작업할 때와 다릅니다. 그런 경우에는 병렬 환경에서 객체를 사용할 때 좋은 메커니즘을 생각하고 생각해내야 합니다.
-
불변 객체는 맵의 키로 좋습니다. 변경 가능한 객체를 HashMap 키로 사용한 다음 객체의 상태가 변경되면 데이터 구조가 혼란스러울 수 있습니다. 객체는 계속 존재하지만 ContainsKey()를 사용하면 객체를 찾지 못할 수 있습니다.
-
불변 객체는 프로그램이 실행되는 동안 절대 변경되어서는 안 되는 불변(상수) 데이터를 저장하는 데 적합합니다.
-
또 다른 장점은 실패 원자성입니다. 불변 객체가 예외를 발생시키는 경우 원치 않는(깨진) 상태로 남아 있지 않습니다.
-
이러한 클래스는 테스트하기 쉽습니다.
-
복사 생성자나 객체 복제 구현과 같은 추가 메커니즘이 필요하지 않습니다.
OOP에 대한 질문
16. 절차적 프로그래밍과 비교하여 일반적으로 OOP의 장점은 무엇입니까?
좋습니다. OOP의 장점은 다음과 같습니다.-
복잡한 애플리케이션은 절차적 프로그래밍보다 OOP를 사용하여 작성하기가 더 쉽습니다. 모든 것이 작은 모듈(서로 상호 작용하는 개체)로 나누어지고 결과적으로 프로그래밍이 개체 간의 관계로 축소되기 때문입니다.
-
OOP로 작성된 애플리케이션은 수정하기가 훨씬 쉽습니다(설계 원칙을 올바르게 준수하는 경우).
-
데이터와 데이터 작업이 모두 단일 엔터티를 형성하기 때문에 애플리케이션 전체에 번지지 않습니다(절차적 프로그래밍에서 흔히 발생함).
-
캡슐화 원칙은 사용자로부터 가장 중요한 데이터를 보호합니다.
-
클래스를 사용하면 각각 고유한 값을 가진 많은 개체를 만들 수 있으므로 동일한 코드를 다른 데이터에 재사용할 수 있습니다.
-
상속과 다형성을 사용하면 유사한 기능을 복제하는 대신 기존 코드를 재사용하고 확장할 수도 있습니다.
-
애플리케이션 확장은 절차적 접근 방식보다 더 간단합니다.
-
OOP 접근 방식을 사용하면 구현 세부 사항을 추상화할 수 있습니다.
17. OOP의 단점을 알려주세요
불행히도 다음과 같은 것도 존재합니다.-
OOP에는 무엇이든 작성하기 전에 숙달해야 하는 많은 이론적 지식이 필요합니다.
-
OOP 아이디어는 실제로 이해하고 적용하기가 쉽지 않습니다(마음속으로 작은 철학자가 되어야 합니다).
-
OOP는 시스템의 복잡성 증가로 인해 프로그램 성능을 약간 감소시킵니다.
-
OOP 접근 방식은 모든 것이 클래스, 인터페이스, 메소드로 구성되어 일반 변수보다 훨씬 많은 메모리를 차지하므로 더 많은 메모리가 필요합니다.
-
초기 분석에 필요한 시간은 절차적 접근보다 더 깁니다.
18. 정적 다형성과 동적 다형성이란 무엇입니까?
다형성을 통해 동일한 클래스나 인터페이스의 객체가 다르게 동작할 수 있습니다. 다형성에는 두 가지 유형이 있으며 이는 초기 바인딩과 후기 바인딩이라고도 합니다. 정적 다형성 또는 초기 바인딩:- 컴파일 타임(프로그램 라이프사이클 초기)에 발생합니다.
- 컴파일 타임에 실행할 메소드를 결정합니다.
- 메소드 오버로딩은 정적 다형성의 예입니다.
- 초기 바인딩에는 개인용, 정적 및 최종 메서드가 포함됩니다.
- 상속은 초기 바인딩에 관여하지 않습니다.
- 정적 다형성에는 특정 객체가 포함되지 않고 변수 이름 왼쪽에 나타나는 클래스 유형에 대한 정보가 포함됩니다.
- 런타임에 발생합니다(프로그램이 실행되는 동안).
- 동적 다형성은 런타임 시 메서드가 어떤 특정 구현을 갖게 될지 결정합니다.
- 메서드 재정의는 동적 다형성의 예입니다.
- 후기 바인딩은 특정 객체, 해당 유형의 참조 또는 해당 슈퍼클래스를 할당하는 것을 의미합니다.
- 상속은 동적 다형성과 연관되어 있습니다.
GO TO FULL VERSION