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

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

Random-KO 그룹에 게시되었습니다
안녕하세요! JavaRush에는 다양한 사람들이 모였습니다. 우리 중 일부는 개발에 많은 시간과 노력을 투자하여 Java 개발자가 되기를 원하는 반면, 다른 일부는 이미 Java 개발자입니다. 어떤 경우든 테스트, 즉 기술 인터뷰를 준비해야 합니다. 이 시험은 쉽지 않으며 도덕적 준비와 더불어 기술적 준비도 필요합니다. 나는 최근 dou에서 Java 개발자 인터뷰 질문면접 질문과 답변을 분석합니다.  파트 1 - 1 의 큰 목록을 발견했습니다 . 이러한 질문은 주니어, 미들, 시니어 등 다양한 레벨로 구분됩니다. 놀라지 마십시오. 모든 질문이 쉬운 것은 아니지만 별표가 있는 질문은 거의 질문되지 않습니다. 질문도 좋지만 대부분의 질문에 답변해 드리고 싶습니다. 한 기사의 범위에 들어가지 않을 것이 분명하며, 결국 거기에는 많은 질문이 있습니다. 따라서 이것은 그러한 질문에 답하는 일련의 기사가 될 것입니다. 몇 가지 사항을 즉시 강조하겠습니다.
  1. 이에 대한 주요 질문과 답변이 포함된 훌륭한 기사 가 있습니다 . 일부 질문은 위에 제시된 목록(250개 이상)과 중복되므로 정보가 다시 중복되지 않도록 이러한 질문을 건너뜁니다.

  2. 질문은 우크라이나어로 제공되지만 JavaRush 참가자의 대다수는 러시아어를 사용하므로(저도 대부분) 답변은 러시아어로 제공됩니다.

  3. 매우 자세하게 작성하는 경우 일부 질문에 대한 답변에는 별도의 기사가 필요할 수 있으므로 답변은 간단합니다. 그리고 인터뷰 중에는 면접관이 필요한 주제에 대해 인터뷰하는 데 한 시간 밖에 걸리지 않기 때문에 그렇게 자세하고 방대한 답변이 필요하지 않습니다. 더 깊게 파고 싶으신 분들을 위해 링크를 남겨두겠습니다.

그럼 시작해 보겠습니다.

주니어 레벨 질문과 답변

면접 질문과 답변을 분석합니다.  파트 1 - 2

일반적인 문제

1. 어떤 디자인 패턴을 알고 있나요? 작업에 사용한 두 가지 템플릿에 대해 알려주세요.

매우 다양한 템플릿이 있습니다. 이 기사와 이 기사를 통해 해당 템플릿에 대해 알아볼 수 있습니다 . 글쎄요, 자세히 알아보고 싶으신 분들은 『Head First』라는 책을 읽어보시길 추천드립니다. 디자인 패턴" . 도움을 받으면 가장 기본적인 디자인 패턴을 자세하고 쉽게 공부할 수 있습니다. 인터뷰에서 예시로 사용할 수 있는 디자인 패턴에 관해 염두에 두어야 할 사항은 다음과 같습니다.
  • Builder 는 자주 사용되는 템플릿으로, 기존 개체 생성의 대안입니다.
  • 본질적으로 다형성을 나타내는 전략 패턴입니다 . 즉, 하나의 인터페이스가 있지만 이 인터페이스의 어떤 특정 구현이 기능으로 전송되었는지에 따라 프로그램의 동작이 변경됩니다(이제 전략은 실제로 Java 애플리케이션의 모든 곳에서 사용됩니다).
이것이 충분하지 않다면 Spring 에 주의를 기울 이십시오(이미 익숙하다면). 왜냐하면 Spring은 위아래로 패턴으로 가득 찬 프레임워크의 전체 플랫폼이기 때문입니다. 제가 말하는 내용에 대한 몇 가지 예는 다음과 같습니다.
  • Factory - ApplicationContext(또는 BeanFactory)에 있습니다.
  • 싱글톤 - 모든 빈은 기본적으로 싱글톤입니다.
  • 프록시 - 본질적으로 Spring의 모든 것은 AOP와 같이 어떤 방식으로든 이 패턴을 사용합니다.
  • 책임 체인은 Spring Security가 작동하는 개념을 기반으로 하는 패턴입니다.
  • 템플릿 - Spring Jdbc에서 사용됩니다.

자바 코어

면접 질문과 답변을 분석합니다.  파트 1 - 3

2. Java에는 어떤 데이터 유형이 있습니까?

Java에는 기본 데이터 유형이 있습니다.
  • byte — -128에서 127 사이의 정수, 무게는 1바이트입니다.
  • short — -32768에서 32767 범위의 정수, 무게는 2바이트입니다.
  • int — 정수 -2147483648 ~ 2147483647, 무게는 4바이트입니다.
  • long — 9223372036854775808 ~ 9223372036854775807 범위의 정수, 무게는 8바이트입니다.
  • float — -3.4E+38 ~ 3.4E+38 범위의 부동 소수점 숫자, 무게는 4바이트입니다.
  • double — -1.7E+308에서 1.7E+308 범위의 부동 소수점 숫자, 무게는 8바이트입니다.
  • char — UTF-16의 단일 문자, 무게는 2바이트입니다.
  • 부울true/false , 무게는 1바이트입니다.
그리고 힙의 객체를 가리키는 참조 데이터 유형입니다 .

3. 객체는 기본 데이터 유형과 어떻게 다릅니까?

첫 번째 차이점: 차지하는 메모리 양: 프리미티브는 자체 값만 포함하기 때문에 거의 차지하지 않는 반면 객체는 프리미티브와 다른 객체에 대한 참조 등 매우 다양한 값을 포함할 수 있습니다. 두 번째 차이점: Java는 객체 지향 언어이므로 그 안에 있는 모든 것이 객체 간의 상호 작용을 통해 작동하며 기본 형식은 잘 맞지 않습니다(사실 이것이 Java가 100% 객체 지향 언어가 아닌 이유입니다). 셋째, 두 번째에 이어 Java는 객체 간의 상호 작용에 중점을 두기 때문에 이러한 객체에는 객체를 관리하기 위한 다양한 메커니즘이 있습니다. 예를 들어 생성자, 메소드, 예외(주로 객체에서 작동) 등이 있습니다. 실제로 기본 요소가 이 객체 지향 환경에 어떻게든 관여(작업)할 수 있도록 기본 유형( Integer , Character , Double , Boolean ...) 에 대한 래퍼가 발명되었습니다.

4. 매개변수를 참조로 전달하는 것과 값으로 전달하는 것의 차이점은 무엇입니까?

기본 필드는 해당 값을 저장합니다. 예를 들어 int i = 9 로 설정하면 ; 필드 i는9를 저장합니다 . 객체에 대한 참조가 있다는 것은 객체에 대한 참조, 즉 메모리에 있는 객체의 주소 값이 있는 필드가 있음을 의미합니다.
Cat cat = new Cat();
객체에 대한 참조가 있는 필드에는 , 메모리 주소 값도 저장되는 것으로 나타났습니다. 즉, cat은 새로운 Cat() 객체 의 주소 값을 메모리에 저장합니다. 매개변수를 메소드에 전달하면 해당 값이 복사됩니다. 프리미티브의 경우 프리미티브의 값이 복사됩니다. 따라서 이 방법은 복사본에 적용되어 원본에는 영향을 주지 않습니다. 참조 유형의 경우 메모리 주소의 값이 각각 복사되며 주소는 가리키는 개체와 동일합니다. 그리고 이 새 링크를 사용하여 개체를 변경하면 이전 링크로 변경됩니다(결국 둘 다 동일한 개체를 가리킵니다).

5. JVM, JDK, JRE란 무엇입니까?

JVM - Java Virtual Machine은 컴파일러에 의해 미리 생성된 Java 바이트코드를 실행하는 가상 머신입니다. JRE(Java Runtime Environment )는 기본적으로 Java 애플리케이션을 실행하기 위한 환경으로, JVM , 표준 라이브러리 및 Java 프로그래밍 언어로 작성된 애플릿과 애플리케이션을 실행하기 위한 기타 구성 요소가 포함되어 있습니다. 즉 , JRE는 컴파일된 Java 프로그램을 실행하는 데 필요한 모든 것이 포함된 패키지이지만 애플리케이션 개발을 위한 컴파일러나 디버거와 같은 도구 및 유틸리티는 포함하지 않습니다. JDK - Java Development Kit - JRE 의 확장 세트 , 즉 Java 애플리케이션 실행뿐만 아니라 개발을 위한 환경입니다. JDK에는 JRE에 있는 모든 것과 다양한 추가 도구(Java에서 애플리케이션을 만드는 데 필요한 컴파일러 및 디버거(Java 문서도 포함))가 포함되어 있습니다.면접 질문과 답변을 분석합니다.  파트 1 - 4

6. JVM을 사용하는 이유는 무엇입니까?

위에서 언급했듯이 Java Virtual Machine은 컴파일러에서 미리 생성된 Java 바이트코드를 실행하는 가상 머신입니다. 즉, JVM은 Java 소스 코드를 이해하지 못합니다. 따라서 먼저 .java 파일이 컴파일됩니다 . 이 파일은 컴파일 후에 이미 .class 확장자를 가지며 JVM이 이해하는 것과 동일한 바이트 코드 형식으로 표시됩니다. 각 OS에는 자체 JVM이 있으므로 바이트코드 파일을 수신한 후 JVM은 이를 실행하고 해당 파일이 발생하는 OS에 맞게 조정합니다. 실제로 JVM이 다르기 때문에 JDK(또는 JRE) 버전은 OS마다 다릅니다(각각 자체 JVM이 필요함). 다른 프로그래밍 언어에서 개발이 어떻게 작동하는지 기억해 봅시다. 프로그램을 개발하면 해당 코드가 특정 OS용 기계어 코드로 컴파일되어 실행될 수 있습니다. 즉, 각 시스템마다 다른 버전의 프로그램을 작성해야 합니다. 반면 Java에서는 이중 코드 처리(JVM 코드 바이트의 컴파일 및 처리) 덕분에 크로스 플랫폼의 이점을 누릴 수 있습니다. 일단 코드를 생성하고 이를 바이트코드로 다시 컴파일한 후 모든 OS로 전송하면 로컬 JVM이 코드를 실행합니다. 이것은 Java의 전설적인 속성입니다. 한 번 작성하면 어디서나 실행됩니다 . 이에 대한 자세한 내용은 " 자바 애플리케이션 내부적으로 컴파일 및 실행면접 질문과 답변을 분석합니다.  파트 1 - 5 " 기사를 참조하세요 .

7. 바이트코드란 무엇입니까?

위에서 말했듯이 컴파일러는 Java 코드를 중간 바이트코드 (.java 확장자를 가진 파일을 .class 확장자를 가진 파일로)로 변환합니다. 바이트코드는 여러 면에서 기계어 코드와 유사하지만 실제 프로세서가 아닌 가상 프로세서의 명령어 세트를 사용한다는 점만 다릅니다. 또한 프로그램이 실행되는 실제 프로세서에 대한 명령 실행을 최적화하는 JIT 컴파일러 사용에 초점을 맞춘 섹션이 포함될 수 있습니다. 온더플라이 컴파일이라고도 불리는 JIT 컴파일은 프로그램이 실행되는 동안 바이트코드를 머신이나 다른 형식으로 컴파일하여 바이트코드를 사용하는 프로그램의 성능을 높이는 기술입니다. 짐작할 수 있듯이 JVM은 바이트코드를 실행할 때 JIT 컴파일러를 사용합니다. 바이트코드 예제를 살펴보겠습니다. 면접 질문과 답변을 분석합니다.  파트 1 - 6너무 읽기 쉽지 않나요? 글쎄, 이것은 우리를 위한 지침이 아니라 JVM을 위한 지침입니다. 다음은 이 문제를 더 잘 이해하는 데 도움이 되는 기사 입니다 .

8. JavaBean의 특징은 무엇입니까?

JavaBeans 는 특정 규칙이 있는 Java 클래스입니다. 다음은 JavaBean 작성에 대한 몇 가지 규칙입니다 .
  1. 클래스에는 공용 액세스 한정자가 있는 빈(매개 변수 없음) 공용 액세스 생성자가 포함되어야 합니다 . 이 생성자를 사용하면 불필요한 문제 없이 이 클래스의 객체를 생성할 수 있습니다(따라서 매개변수에 대한 불필요한 소란이 없습니다).

  2. 클래스의 내부 필드는 표준이어야 하는 getset 메소드를 통해 액세스됩니다. 예를 들어, 필드 가 name 이면 getNamesetName 등입니다. 그러면 다양한 도구(프레임워크)가 복잡함 없이 Bean의 내용을 자동으로 결정하고 업데이트할 수 있습니다.

  3. 클래스에는 equals() 메서드 hashCode()toString() 의 재정의된 버전이 포함되어야 합니다 .

  4. 클래스는 직렬화 가능해야 합니다. 즉, 마커 인터페이스( 직렬화 가능 또는 외부화 가능 인터페이스 구현 )가 있어야 합니다 . 이는 Bean의 상태를 안정적으로 저장, 저장 및 복원하는 데 필요합니다.

면접 질문과 답변을 분석합니다.  파트 1 - 7이 자료 에서 JavaBeans 유형에 대해 읽을 수 있습니다 .

9. OutOfMemoryError란 무엇입니까?

OutOfMemoryError는 JVM(Java Virtual Machine) 작동과 관련된 중요한 런타임 오류 중 하나입니다. 사용 가능한 메모리가 부족하여 JVM이 객체를 할당할 수 없고 가비지 수집기가 더 많은 메모리를 할당할 수 없을 때 호출됩니다. OutOfMemoryError의 일부 유형 :
  • OutOfMemoryError: Java 힙 공간 - 메모리가 부족하여 Java 힙에 개체를 할당할 수 없습니다. 오류는 메모리 누수로 인해 발생하거나 기본 힙 크기가 현재 애플리케이션에 비해 충분히 크지 않기 때문에 발생할 수 있습니다.

  • OutOfMemoryError: GC 오버헤드 한도 초과 - 데이터 양이 힙에 거의 맞지 않기 때문에 가비지 수집기가 항상 실행되고 Java 프로그램이 매우 느리게 실행되므로 결과적으로 가비지 수집기의 오버헤드 한도가 초과됩니다. 초과되고 이 오류로 인해 애플리케이션이 충돌합니다.

  • OutOfMemoryError: 요청한 배열 크기가 VM 제한을 초과합니다 . 이는 애플리케이션이 힙 크기보다 큰 배열에 메모리를 할당하려고 시도했음을 나타냅니다. 이는 다시 기본 메모리 할당이 부족하기 때문일 수 있습니다.

  • OutOfMemoryError: Metaspace - 힙에 메타데이터에 할당된 공간이 부족합니다(메타데이터는 클래스 및 메서드에 대한 지침입니다).

  • OutOfMemoryError: 이유 때문에 크기 바이트를 요청합니다. 스왑 공간 부족 - 힙에서 메모리를 할당하려고 할 때 일부 오류가 발생했으며 결과적으로 힙에 메모리가 부족했습니다.

10. 스택 추적이란 무엇입니까? 그것을 얻는 방법?

스택 추적은 애플리케이션에서 지금까지 호출된 클래스 및 메서드 목록입니다. 다음과 같이 애플리케이션의 특정 지점에서 스택 추적을 호출할 수 있습니다.
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
이 방법으로 우리는 LIFO 순서(Last In First Out) 로 정렬된 스택 추적 요소 배열을 얻게 됩니다 . 면접 질문과 답변을 분석합니다.  파트 1 - 8Java에서 스택 트레이스라고 하면 원칙적으로 오류(또는 예외)가 발생할 때 콘솔에 표시되는 스택 트레이스를 의미합니다. 다음과 같이 예외의 스택 추적을 얻을 수 있습니다.
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
음, 콘솔에서 예외 스택 추적을 출력하는 것에 대해 이야기하고 있다면:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
또한 오류, 확인되지 않은 예외 또는 처리되지 않고 전달만 되는 확인된 예외가 있는 경우 애플리케이션이 충돌할 때 자동으로 콘솔에서 예외의 스택 추적을 받게 됩니다. 콘솔의 스택 추적 예외에 대한 작은 예: 여기에서면접 질문과 답변을 분석합니다.  파트 1 - 9 스택 추적에 대한 자세한 내용을 읽을 수 있습니다 . 오늘은 이 문제에 집중하겠습니다.면접 질문과 답변을 분석합니다.  파트 1 - 10
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION