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

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

Random-KO 그룹에 게시되었습니다
실습인가 이론인가? 무엇이 더 중요합니까? 물론 많은 사람들은 연습이 더 중요하다고 말할 것입니다. 마찬가지로, 최선을 다해 연습하면 행복해질 것입니다. 나는 감히 이에 동의하지 않습니다. Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 8 - 1인터뷰 중에는 당신이 얼마나 연습을 잘하는지 아무도 알 수 없습니다. 이론에 따라 정확하게 전체 내용을 질문받게 됩니다. 그리고 나서야 모든 인터뷰를 거쳐 프로젝트에 들어갈 때 실무 능력을 발휘하게 될 것입니다. 당신은 이의를 제기할 수 있습니다. 때때로 그들은 당신에게 테스트 과제를 주지만 여전히 연습이 필요합니다. 나는 논쟁하지 않고 때로는 주어지지만 문제의 사실은 때때로이지만 이론적 인터뷰는 항상 일어난다는 것입니다. 차이점을 느끼시나요? 그러므로 당신의 발 아래에는 탄탄한 이론적 기초가 있어야 하며, 우리는 오늘도 이를 계속해서 강화할 것입니다. 즉, 면접 시 자주 묻는 질문을 계속해서 분석해보겠습니다 .

71. Enum에 대한 toString() 메서드를 재정의하지 않으면 어떻게 됩니까?

다음 열거형이 있다고 가정해 보겠습니다 .
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
학생 에 대해 toString()을 호출하여 콘솔에 학생을 표시해 보겠습니다 .
System.out.println(Role.STUDENT.toString());
콘솔 결과:
학생
즉, 기본적으로 enumtoString()은 상수 자체의 이름입니다.

72. Enum 내부에 생성자를 지정할 수 있나요?

물론이지. 내부 열거형 변수의 값은 생성자를 통해 설정됩니다. 예를 들어, 각 역할의 연령 범위를 나타내기 위해 이전 열거형 ( ageFromageTo )에 두 개의 필드를 추가해 보겠습니다 .
public enum Role {
   STUDENT(5,18),
   TEACHER(20,60),
   DIRECTOR(40,70),
   SECURITY_GUARD(18,50);

   int ageFrom;
   int ageTo;

   Role(int ageFrom, int ageTo) {
       this.ageFrom = ageFrom;
       this.ageTo = ageTo;
   }
}

73. ==와 같음()의 차이점은 무엇입니까?

이것은 가장 일반적인 Java 개발자 인터뷰 질문 중 하나입니다. 간단한 값( int , char , double ...) 을 비교할 때 변수에 특정 값이 포함되어 있고 비교할 수 있으므로 == 를 사용하여 비교한다는 사실부터 시작하겠습니다 . 그리고 기본 변수는 완전한 개체가 아닙니다. Object 에서 상속되지 않으며 equals() 메서드가 없습니다 . 객체를 참조하는 변수를 비교하는 경우 ==는 동일한 객체를 참조하는지 여부에 관계없이 참조 값만 비교합니다. 그리고 한 객체가 다른 객체와 동일하더라도 ==를 통한 비교는 다른 객체이기 때문에 부정적인 결과( false )를 제공합니다. 아시다시피, equals() 메소드는 참조 변수를 비교하는 데 사용됩니다 . 이는 객체를 완전히 비교하는 데 필요한 Object 클래스 의 표준 메서드 중 하나입니다 . 그러나 즉시 명확히 할 가치가 있습니다. 이 메서드가 올바르게 작동하려면 이 클래스의 개체를 비교하는 방법을 정확하게 작성하여 재정의해야 합니다. 메서드를 재정의하지 않는 한 기본적으로 == 로 개체를 비교합니다 . IntelliJ IDEA 에서는 IDEA 도구를 사용하여 자동으로 재정의할 수 있습니다. -> alt + insert , 나타나는 창에서 equals() 및 hashCode() 선택 -> 참여할 클래스 필드 선택 -> 짜잔, 자동 구현 방법이 완료되었습니다. 다음은 int ageString name 이라는 두 개의 필드가 있는 간단한 Cat 클래스에 대해 자동으로 생성된 equals 메소드 가 어떻게 보이는지에 대한 예입니다 .
@Override
public boolean equals(final Object o) {
   if (this == o) return true;
   if (o == null || this.getClass() != o.getClass()) return false;
   final Cat cat = (Cat) o;
   return this.age == cat.age &&
           Objects.equals(this.name, cat.name);
}
enums 에 대한 ==같음의 차이점에 대해 이야기하면 그다지 많지 않습니다. 결국 enum은 상수를 저장하고 ==를 사용하여 유사한 값을 비교할 때에도 참조는 항상 동일한 객체에 대한 것이기 때문에 true를 받게 됩니다 . 글쎄요, equals를 사용할 때 기능도 올바르게 작동할 것입니다. 특히 enum 에 대한 equals 메소드 의 본문으로 들어가면 Enum 클래스에서 메소드 구현이 다음과 같은 것을 볼 수 있습니다 . 내부 - 참조로 좋은 오래된 비교! 요약하자면, enum 의 경우 ==같음을 통한 비교가 정확합니다.Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 8 - 2Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 8 - 3Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 8 - 4

74. Enum에서 ordinal() 메소드는 무엇을 합니까?

열거 형 요소 에 대해 int ordinal() 메서드를 호출할 때 일반적인 열거형 시리즈에서 이 값의 0부터 서수를 가져옵니다. 앞서 설명한 열거형 의 한 요소 인 Role에 대해 이 메서드를 사용해 보겠습니다 .
System.out.println(Role.DIRECTOR.ordinal());
따라서 콘솔에 다음이 표시됩니다.
2

75. Java에서 TreeSet 또는 TreeMap과 함께 Enum을 사용할 수 있습니까?

TreeSetTreeMap 에서 열거형 유형을 사용할 수 있습니다. 그리고 우리는 다음과 같이 쓸 수 있습니다:
TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
콘솔에는 다음이 표시됩니다.
학생 교사 디렉터 SECURITY_GUARD
우리는 알파벳 순서가 아닌 출력을 받았습니다. 요점은 TreeSet 값에 대해 enum 요소를 사용하거나 TreeMap 에 대한 키로 요소를 사용하면 요소가 자연 순서( enum 에 지정된 순서 )로 정렬된다는 것입니다. 이러한 기능을 이해하면 더 나은 코드를 작성하는 데 도움이 됩니다.Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 8 - 5

76. Enum에서 ordinal()과 CompareTo() 메소드는 어떤 관련이 있나요?

앞에서 설명한 것처럼 ordinal()은 일반 열거 목록에 있는 값의 서수를 반환합니다. 또한 이전 질문을 분석하면서 예를 들어 TreeSet (정렬된 집합)에 있는 열거형 요소가 enum 에서 선언된 순서를 따른다는 것을 확인했습니다 . 우리가 알고 있듯이 TreeSetTreeMap은 Comparable 인터페이스 의 CompareTo() 메서드 를 호출하여 요소를 정렬합니다 . 이것으로부터 우리는 Enum 클래스가 Comparable 인터페이스를 구현하고 , 이를 CompareTo() 메소드에서 구현하고 , ordinal()이 정렬 순서를 설정하는 데 사용된다고 가정할 수 있습니다. Enum 클래스 에 들어가면 다음 사항이 확인됩니다. 그리고 메서드 자체의 본문은 다음과 같습니다. 여기서 ordinal() 메서드는 호출되지 않습니다. 대신, 열거 형 요소의 서수인 서수 변수가 사용됩니다. ordinal() 메서드 자체는 ordinal 변수 에 대한 getter에 지나지 않습니다 .Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 8 - 6Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 8 - 7Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 8 - 8

77. EnumM 예제 작성

위에서 논의한 질문에서 나는 이미 열거형의 예를 제시했지만 코드를 복제하는 것이 의미가 없다고 생각합니다(예: 열거형의 생성자에 대한 질문 번호 72).

78. 스위치 케이스에 Enum을 사용할 수 있나요?

가능하고 필요합니다! 내 실습을 되돌아보면 enum을 사용하는 가장 일반적인 장소 중 하나가 switch 와 같은 논리적 구성이라는 것을 알게 되었습니다 . 이 경우 가능한 모든 케이스 변형을 제공할 수 있으며 모든 열거형 값 에 대한 논리를 작성한 후 기본 연산자를 사용할 필요조차 없습니다! 결국, 문자열 이나 숫자 값(예: int 유형)을 사용하는 경우 예상치 못한 값을 받을 수 있으며, 이는 enum을 사용하여 불가능합니다 . 앞서 설명한 예에서 스위치는 어떤 모습일까요 ?
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // некая логика для STUDENT
           break;
       case TEACHER:
           // некая логика для TEACHER
           break;
       case DIRECTOR:
           // некая логика для DIRECTOR
           break;
       case SECURITY_GUARD:
           // некая логика для SECURITY_GUARD
           break;
   }
}

79. Enum 인스턴스에서 사용 가능한 모든 값을 얻는 방법은 무엇입니까?

열거형의 모든 인스턴스를 가져와야 하는 경우 특정 열거형 의 사용 가능한 모든 값의 배열을 자연 순서( enum 에 지정된 순서대로 )로 반환하는 value() 메서드가 있습니다 . 예:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
콘솔에 다음 출력이 표시됩니다.
학생 교사 디렉터 SECURITY_GUARD

스트림 API

80.Java에서 Stream이란 무엇인가요?

Java Stream은 데이터 스트림과 상호 작용하는 비교적 새로운 방법으로, 이를 통해 대용량 데이터를 보다 편리하고 컴팩트하게 처리할 수 있을 뿐만 아니라 특정 개수의 스레드 간에 데이터 처리를 병렬화하여 사용 성능을 향상시킬 수 있습니다. 기능. 이 주제는 간단히 말해서 더 깊이 논의할 수 없으므로 여기 에 이 ​​주제를 자세히 알아보는 데 도움이 될 수 있는 기사 링크를 남겨 두겠습니다 .Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 8 - 9

81. 거래의 주요 속성은 무엇입니까?

주제는 Stream API라고 하는데 문제는 트랜잭션에 관한 것입니다. 흠... 먼저 트랜잭션이 무엇인지 알아보겠습니다. 트랜잭션은 데이터 작업의 논리적 단위를 나타내는 순차적 데이터베이스 작업 그룹입니다. 트랜잭션은 병렬로 실행되는 다른 트랜잭션과 독립적으로 데이터 무결성을 유지하면서 완전히 성공적으로 완료될 수도 있고, 전혀 완료되지 않을 수도 있습니다. 이 경우 아무런 효과가 없습니다. 따라서 트랜잭션에는 줄여서 ACID 라고 하는 네 가지 주요 속성이 있습니다 . 이 약어의 각 문자가 어떻게 나타나는지 살펴보겠습니다. A - 원자성 - 원자성 - 이 속성은 트랜잭션이 시스템에 부분적으로 기록되지 않음을 보장합니다. 모든 하위 작업이 수행되거나 아무 것도 수행되지 않습니다( 모두 또는 전혀 수행되지 않음 ). C - 일관성(Consistency) - 일관성은 성공적인 각 트랜잭션이 유효한 결과만 기록하도록 보장하는 속성입니다. 즉, 이는 성공적인 거래의 경우 시스템이 특정 데이터에 부과하는 모든 규칙과 제한 사항이 충족된다는 보장입니다. 그렇지 않으면 거래가 완료되지 않고 시스템의 데이터가 이전 상태로 돌아갑니다. 상태. I - 격리 - 격리는 트랜잭션 실행 중에 병렬 트랜잭션이 결과에 영향을 주어서는 안 된다는 속성입니다. 이 속성은 자원 집약적이므로 일반적으로 특정 단열 문제를 해결하는 특정 수준의 단열을 허용하여 부분적으로 구현됩니다. 이에 대해서는 다음 질문에서 더 자세히 논의하겠습니다. Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 8 - 10D - 내구성 - 이 속성은 사용자가 시스템으로부터 트랜잭션이 완료되었다는 확인을 받은 경우 자신이 수행한 변경 사항이 일부 오류로 인해 취소되지 않을 것임을 확신할 수 있도록 보장합니다. 즉, 귀하가 거래가 성공적으로 완료되었다는 확인을 이미 받은 경우 일종의 운영 체제 오류가 귀하의 데이터에 아무런 영향을 미치지 않는다는 것을 확신할 수 있습니다.

82. 트랜잭션 격리 수준은 무엇입니까?

앞서 말했듯이 ACID 격리를 제공하는 것은 리소스 집약적인 프로세스입니다. 따라서 이 속성은 부분적으로 만족됩니다. 격리 수준은 다양하며, 수준이 높을수록 생산성에 미치는 영향은 더 커집니다. 트랜잭션 격리 수준으로 이동하기 전에 트랜잭션 격리 부족으로 인한 다양한 문제를 살펴봐야 합니다 .
  • 팬텀 리딩(phantom reading) - 동일한 트랜잭션 내에서 동일한 샘플(동일한 쿼리)이 반복적으로 호출되는 경우, 수신된 데이터가 달라지는 현상은 다른 트랜잭션에 의한 데이터 삽입으로 인해 발생합니다.

  • 비반복 읽기 - 동일한 트랜잭션 내에서 동일한 샘플(동일한 쿼리)이 반복적으로 호출되는 경우 수신된 데이터가 다릅니다. 이는 다른 트랜잭션에 의한 데이터 변경(업데이트) 및 삭제로 인해 발생합니다.

  • 더티 읽기 - 나중에 확인되지 않은(롤백) 트랜잭션에 의해 추가되거나 변경된 데이터를 읽는 프로세스입니다. 잘못된 데이터를 읽는 중입니다.

  • 업데이트 손실 - 서로 다른 트랜잭션이 동일한 데이터를 동시에 변경하면 마지막 변경 사항을 제외한 모든 변경 사항이 손실됩니다(멀티 스레드 환경의 "경합 조건" 문제를 연상시킵니다).

트랜잭션 격리 수준은 어떤 격리 문제로부터 보호하는지에 따라 다릅니다. 단열 수준과 단열 수준이 보호하는 문제를 표 형식으로 고려해 보겠습니다.
격리 수준 환상의 독서 비반복 읽기 더러운 독서 업데이트 손실
직렬화 가능 + + + +
반복 읽기 - + + +
커밋된 내용을 읽었습니다. - - + +
커밋되지 않은 읽기 - - - +
없음 - - - -
그리고 동전의 다른 면을 잊지 마십시오. 격리 수준이 높을수록 트랜잭션을 처리하는 데 더 오랜 시간이 걸립니다(여러 트랜잭션이 병렬로 실행되는 경우). 이 주제에 대해 더 자세히 알아보고 싶다면 시작하는 데 도움이 되는 훌륭한 기사가 있습니다.

83. Statement와 ReadyStatement의 차이점은 무엇입니까?

그리고 여기서 JDBC 기술 의 기능으로의 전환은 그다지 원활하지 않습니다 . 그럼 먼저, 실제로 State가 무엇인지 알아봅시다 . SQL 쿼리를 생성하는 데 사용되는 개체입니다. JDBC는 세 가지 유형 ( Statement , preparedStatementCallableStatement) 을 사용합니다 . 오늘은 CallableStatement를 보지 않을 것입니다 . StatementReadyStatement 의 차이점에 대해 이야기해 보겠습니다 .
  1. 명령문은 동적으로 삽입된 매개변수 없이 간단한 SQL 쿼리를 실행하는 데 사용됩니다. prepareStatement는 입력 매개변수를 동적으로 삽입하는 기능과 함께 사용됩니다.

  2. preparedstatement 에서 매개변수를 설정하기 위해 요청의 입력 매개변수는 물음표로 작성된 다음 setDouble() , setFloat() , setInt() , setTime() .. 과 같은 다양한 설정자를 사용하여 값 대신 일부 값을 삽입합니다 . .. 결과적으로 잘못된 유형의 데이터를 쿼리에 삽입하지 않게 됩니다.

  3. PreparedStatement 는 "사전 컴파일"되어 캐싱을 사용하므로 해당 실행은 명령문 개체 에서 쿼리하는 것보다 약간 더 빠를 수 있습니다 . 결과적으로 자주 실행되는 SQL 쿼리는 성능 향상을 위해 preparedStatement 객체로 작성됩니다 .

  4. 명령문은 SQL 주입에 취약한 반면, ReadyStatement는 SQL 주입을 방지합니다. 이 기사 에서 SQL 주입 제거 및 Java 보안의 기타 모범 사례에 대해 자세히 알아보세요 .

Java 애플리케이션을 데이터베이스 - JDBC에 연결하는 기술을 공부하기 시작했다면 이 기사 부터 시작하는 것이 좋습니다 . 글쎄, 오늘은 이쯤에서 그만 두겠습니다.Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 8 - 11
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION