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

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

무작위의 그룹에 게시되었습니다
실습인가 이론인가? 무엇이 더 중요합니까? 많은 사람들은 자연스럽게 연습이 더 중요하다고 말할 것입니다. 해가 질 때까지 연습하면 행복해질 거예요. 나는 이에 동의하지 않을 것입니다. Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 8 - 1인터뷰 중에는 당신이 연습할 때 얼마나 멋진지 아무도 알 수 없습니다. 대신에 이론적인 내용을 보여 달라는 요청을 받게 될 것입니다. 나중에 모든 단계의 인터뷰를 통과하고 프로젝트에 배정된 후에야 실용적인 기술을 적용하게 될 것입니다. 때때로 테스트 과제를 주기 때문에 여전히 연습이 필요하다며 반대할 수도 있습니다. 나는 동의하지 않지만 내 요점은 이것이 때때로 있지만 인터뷰에서 항상 이론 지식을 입증해야 한다는 것입니다. 차이점을 느끼시나요? 이 모든 것은 당신의 발 아래에 탄탄한 이론적 기초가 있어야 한다는 것을 의미하며, 그것이 우리가 오늘 계속 구축할 것입니다. 좀 더 구체적으로 면접에서 자주 묻는 질문들을 계속해서 살펴보도록 하겠습니다.

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

다음과 같은 열거 형이 있다고 가정합니다 .
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
toString() 메서드 를 호출하여 콘솔에 STUDENT 필드를 표시해 보겠습니다 .
System.out.println(Role.STUDENT.toString());
결과적으로 다음과 같은 콘솔 출력을 얻습니다.
학생
따라서 enum 의 경우 toString() 의 기본 구현은 상수 자체의 이름을 반환한다는 것을 알 수 있습니다.

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

물론이죠. 생성자는 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() 를 선택합니다 . 그런 다음 관련되어야 하는 필드를 선택합니다. 짜잔! 메소드가 자동으로 구현됩니다. 다음은 자동으로 생성된 equals 메소드가 두 개의 필드( int ageString name ) 가 있는 가장 간단한 Cat 클래스를 찾는 방법에 대한 예입니다 .
@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);
}
enum 의 경우 ==equals() 사이에는 실질적인 차이가 없습니다 . Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 8 - 2결국 열거형은 상수를 저장하고 == 를 사용하여 동일한 값을 비교할 때에도 비교된 참조는 항상 동일한 객체를 가리키기 때문에 true 를 얻게 됩니다 . 그리고 equals()를 사용하면 올바른 결과도 얻을 수 있습니다. Enum 에 대한 equals 메소드 의 본문으로 들어가면 Enum 클래스에 다음과 같은 구현이 있는 것을 볼 수 있습니다 . 내부에서는 참조에 대한 오래된 비교를 볼 수 있습니다! 요약하면 enum 의 경우 ==equals() 를 모두 사용하여 올바르게 비교할 수 있습니다 . Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 8 - 3Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 8 - 4

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

열거형 필드에서 int ordinal() 메서드를 호출하면 열거형 값 목록에서 해당 필드의 0부터 시작하는 인덱스를 가져옵니다. 이전에 고려했던 Role 열거형 의 필드에서 이 메서드를 호출해 보겠습니다 .
System.out.println(Role.DIRECTOR.ordinal());
따라서 콘솔에는 다음이 표시됩니다.
2

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

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
출력을 얻었지만 알파벳순은 아닙니다. 요점은 enum 필드를 TreeSet 값이나 TreeMap 키로 사용하면 필드가 자연 순서( enum 에 지정된 순서 )로 정렬된다는 것입니다. 이것이 작동하는 방식을 이해하면 더 나은 코드를 작성하는 데 도움이 됩니다.

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

앞서 언급했듯이 ordinal()은 열거형 필드 목록에서 필드의 인덱스를 반환합니다. 또한 이전 질문을 고려하면서 열거형 필드가 TreeSet ( 정렬된 집합)에 배치될 때 열거형 에서 선언된 순서를 따른다는 것을 알았습니다 . 우리가 알고 있듯이 TreeSetTreeMap은 Comparable 인터페이스 의 CompareTo() 메서드를 호출하여 항목을 정렬합니다 . 이는 Enum 클래스가 Comparable 인터페이스를 구현한다는 것을 알려줍니다 . 이는 정렬 순서를 결정하기 위해 내부적으로 ordinal() 메서드를 사용하는 CompareTo() 메서드를 구현한다는 의미입니다. Enum 클래스 로 이동하면 가정을 확인할 수 있습니다. 메소드 자체의 본문은 다음과 같습니다. 여기서 ordinal () 메소드는 호출되지 않습니다. 대신, 열거 형 요소의 인덱스 번호인 순서형 변수가 사용됩니다. ordinal () 메소드 자체는 ordinal 변수 에 대한 getter에 지나지 않습니다 . Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 8 - 5Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 8 - 6Java 개발자 직위에 대한 취업 면접의 질문과 답변을 살펴보세요.  파트 8 - 7

77. Enum 예제 작성

위에서 논의한 질문에서 나는 이미 enum 의 예를 제시했습니다 . 여기서는 코드를 복제할 이유가 없습니다. 예를 들어 열거형의 생성자에 관한 질문 72를 참조하세요.

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

그럴 수 있고 그래야 합니다! 내 경험을 살펴보면 열거형 의 가장 일반적인 용도 중 하나가 스위치 문과 같은 논리적 구조에 있다는 것을 알 수 있습니다 . 이 경우 가능한 모든 사례 를 제공할 수 있습니다. 각 열거형 필드 에 대한 논리를 작성하면 기본 절도 필요하지 않습니다 ! 결국 String 이나 int 와 같은 숫자 값을 사용하면 예상치 못한 값을 받을 수 있지만 enum에서는 불가능 합니다 . 위의 예에서 switch 문은 다음과 같습니다 .
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // some logic for STUDENT
           break;
       case TEACHER:
           // some logic for TEACHER
           break;
       case DIRECTOR:
           // some logic for DIRECTOR
           break;
       case SECURITY_GUARD:
           // some logic for 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 API는 데이터 스트림과 상호 작용하는 비교적 새로운 방법으로, 빅 데이터를 보다 편리하고 컴팩트하게 처리할 수 있을 뿐만 아니라 일부 스트림 간에 데이터를 병렬로 처리하여 잠재적으로 성능을 향상시킬 수 있습니다.

81. 거래의 주요 속성을 지정하십시오.

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

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

앞서 말했듯이 ACID 속성과 관련하여 격리를 보장하는 것은 리소스 집약적인 프로세스입니다. 따라서 이 속성은 부분적으로 구현됩니다. 격리 수준은 다양합니다. 수준이 높을수록 성능에 미치는 영향이 더 심각해집니다. 트랜잭션 격리 수준으로 이동하기 전에 트랜잭션 격리 부족으로 인해 발생하는 다양한 문제를 고려해야 합니다 .
  • 팬텀 읽기(phantom reads) : 단일 트랜잭션 내에서 두 번 이상 호출된 동일한 요청이 다른 트랜잭션의 삽입으로 인해 다른 결과를 생성하는 경우입니다.

  • 반복 불가능 읽기 : 단일 트랜잭션 내에서 두 번 이상 호출된 동일한 요청이 다른 트랜잭션에 의한 변경(업데이트) 및 삭제로 인해 다른 데이터를 생성하는 경우

  • 더티 읽기(dirty reads) : 트랜잭션에 의해 추가되거나 수정된 ​​후 롤백되는 아직 커밋되지 않은 데이터를 읽습니다.

  • 업데이트 손실 : 하나의 데이터 블록이 여러 트랜잭션에 의해 동시에 변경되고 마지막 블록을 제외한 모든 변경 사항이 손실되는 경우(멀티스레딩의 경쟁 조건과 유사)

공교롭게도 트랜잭션 격리 수준은 어떤 격리 문제로부터 보호하는지에 따라 특징이 지정됩니다. 다음 격리 수준 표와 이를 통해 보호되는 문제를 고려하세요.
격리 수준 팬텀 읽기 반복 불가능한 읽기 더티 읽기 업데이트 손실
직렬화 가능 + + + +
반복 읽기 - + + +
커밋된 내용을 읽었습니다. - - + +
커밋되지 않은 읽기 - - - +
없음 - - - -
그리고 반대 측면도 잊지 마십시오. 격리 수준이 높을수록 트랜잭션을 처리하는 데 더 오랜 시간이 걸립니다(여러 트랜잭션의 병렬 실행을 고려할 때).

83. 진술과 준비된 진술의 차이점은 무엇입니까?

여기서는 JDBC 기능으로 갑자기 변경되었습니다 . 어쨌든 먼저 진술이 무엇 인지부터 알아봅시다. SQL 쿼리를 작성하는 데 사용되는 개체입니다. JDBC는 세 가지 종류( Statement , preparedStatementCallableStatement) 를 사용합니다 . 오늘은 CallableStatement를 고려하지 않겠습니다 . 대신에 우리는 StatementPreparedStatement 의 차이점에 대해 이야기하고 있습니다 .
  1. 명령문은 런타임 입력 매개변수 없이 간단한 SQL 쿼리를 실행하는 데 사용됩니다. prepareStatement는 런타임 시 입력 매개변수를 허용할 수 있습니다.

  2. preparedStatement 에 대한 매개변수를 설정하기 위해 입력 매개변수는 요청에서 물음표로 작성되므로 setDouble() , setFloat() , setInt() , setTime() ... 과 같은 다양한 설정자를 사용하여 일부 값으로 대체될 수 있습니다. 이는 요청에 잘못된 유형의 데이터를 삽입하지 않는다는 것을 의미합니다.

  3. PreparedStatement는 미리 컴파일되어 캐싱을 사용하므로, Statement 객체 로 이루어진 요청보다 약간 빠르게 실행될 수 있습니다 . 따라서 자주 실행되는 SQL 문은 성능 향상을 위해 preparedStatement 객체로 생성됩니다.

  4. 명령문은 SQL 주입에 취약하지만 preparedStatement는 이를 방지합니다.

그리고 그것으로 우리는 그것을 하루라고 부를 것입니다!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION