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

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

Random-KO 그룹에 게시되었습니다
안녕하세요, 월드! 지속적인 개발은 모든 개발자에게 매우 중요합니다. 결국, 중단하면 소유권이 주장되지 않고 완전히 시장에서 사라질 위험이 있습니다. IT 세계는 끊임없이 발전하고 앞으로 나아가고 있으므로 이에 따라 움직여야 합니다. 그러나 동시에 고전 (고전 주제)을 잊지 않기 위해 새롭고 신선한 기술에만 집중할 수는 없습니다. 오늘 저는 Java 개발자를 위한 "고전적인" 주제에 대한 질문 분석을 계속하고 싶습니다. Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 6 - 1내 답변이 최종 권위가 아니라는 점에 유의합니다. 이것이 바로 이러한 질문에 대한 정답을 보는 방법이며 귀하는 일부 질문에 동의하지 않을 수도 있습니다. 이는 매우 정상적인 현상이므로 댓글로 여러분의 의견을 자유롭게 공유해 주세요. 분석 부분에 대한 링크는 기사 끝에 있습니다.Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 6 - 2

라이브러리 및 표준

52. 최대 절전 모드란 무엇입니까? JPA와 최대 절전 모드의 차이점은 무엇입니까?

이 질문에 대답하려면 먼저 JPA 가 무엇인지 이해해야 합니다 . JPA 는 간단한 Java 객체의 객체 관계형 매핑을 설명하고 이러한 객체를 저장, 검색 및 조작하기 위한 API를 제공하는 사양입니다. 즉, 우리가 기억하는 것처럼 관계형 데이터베이스 (DB)는 상호 연결된 많은 테이블의 형태로 제공됩니다. JPA 객체가 관계형 데이터베이스와 상호 작용하는 방법을 설명하는 널리 사용되는 표준입니다. 보시 다시피 JPA는 추상적이고 무형의 것입니다. 그것은 아이디어 자체, 접근 방식과 같습니다. Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 6 - 3동시에 Hibernate는 JPA 패러다임을 구현하는 특정 라이브러리입니다 . 즉, 이 라이브러리를 사용하면 데이터베이스(엔티티)의 데이터를 나타내는 개체를 통해 관계형 데이터베이스로 작업할 수 있습니다. 그들이 말했듯이 이 라이브러리는 JPA 의 이상에 매우 가깝고 아마도 그것이 인기를 얻은 이유일 것입니다. 아시다시피 사용의 인기는 추가 개발 및 개선에 대한 좋은 논거입니다. 또한 이 도구를 자주 사용하는 것 뒤에는 이미 이 도구와 관련하여 가능한 질문과 불가능한 질문을 모두 정리한 거대한 커뮤니티가 있습니다. 다음은 이 기술의 모든 어두운 부분을 자세히 조사한 책의 예 입니다 . 즉, Hibernate는 가능한 한 많이 연구되었으며 신뢰할 수 있는 것으로 나타났습니다. 실제로 Spring 측의 이상적인 JPA 구현조차도 일반적으로 내부적으로 Hibernate를 사용하는 것은 아무것도 아닙니다.

53. 캐스케이딩이란 무엇입니까? Hibernate에서는 어떻게 사용되나요?

앞서 말했듯이 Hibernate에서 통신은 엔터티 라고 불리는 데이터 객체를 통해 수행됩니다 . 이러한 엔터티는 데이터베이스의 일부 특정 테이블을 나타내며, 기억하는 것처럼 Java 클래스에는 다른 클래스에 대한 참조가 포함될 수 있습니다. 이러한 관계는 데이터베이스에 반영됩니다. 데이터베이스에서는 일반적으로 외래 키(OneToOne, OneToMany, ManyToOne의 경우) 또는 중간 테이블(ManyToMany의 경우)입니다. 엔터티 간의 관계에 대한 자세한 내용은 이 문서에서 확인할 수 있습니다 . 엔터티에 다른 관련 엔터티에 대한 링크가 있는 경우 연결 유형을 나타내기 위해 @OneToOne, @OneToMany, @ManyToOne, @ManyToMane라는 주석이 해당 링크 위에 배치됩니다. 해당 매개변수에서 속성 값( 계단식 )을 지정할 수 있습니다. 이 연결의 캐스케이드 유형입니다. JPA 에는 엔터티와 상호 작용하기 위한 특정 방법(지속, 저장, 병합...)이 있습니다 . 계단식 유형은 이러한 메서드가 대상 엔터티에서 사용될 때 연결된 데이터가 어떻게 작동해야 하는지 보여주기 위해 정확하게 사용됩니다. 그렇다면 계단식 전략(계단식 유형)은 무엇입니까? JPA 표준은 6가지 유형의 계단식 사용을 의미합니다.
  • PERSIST - 저장 작업이 계단식으로 발생합니다( save()persist() 메서드의 경우 ). 즉, 다른 엔터티와 관련된 엔터티를 저장하면 해당 엔터티도 데이터베이스에 저장됩니다(아직 존재하지 않는 경우).

  • MERGE - 업데이트 작업이 계단식으로 발생합니다( merge() 메서드의 경우 )

  • REMOVE - 제거 작업이 계단식으로 발생합니다( remove() 메서드 ).

  • ALL - 한 번에 세 개의 계단식 작업 포함 - PERSIST - MERGE - REMOVE

JPA 에는 지속성 엔터티 (현재 세션(연결)에 의해 제어되는 데이터베이스의 데이터와 연관된 엔터티)라는 개념이 있습니다 . 변경했지만 데이터베이스에 변경 사항을 저장하지 않으면 데이터베이스의 데이터가 계속 변경됩니다.
  • DETACH - 관련 엔터티는 세션( detach() 메서드 )에 의해 관리되지 않습니다. 즉, 변경 시 데이터베이스의 데이터가 자동으로 변경되지 않습니다. 지속성 상태에서 분리(JPA에서 관리하지 않는 엔터티) 상태로 전송됩니다.

  • REFRESH - 엔터티가 데이터베이스의 데이터로 업데이트될 때마다( refresh() - 분리된 개체 업데이트) 관련 엔터티가 동일한 방식으로 업데이트됩니다. 예를 들어, 데이터베이스에서 가져온 데이터를 어떻게든 변경했고 원래 값을 반환하려고 합니다. 이 경우 이 작업이 유용할 것입니다.

Java 개발자 인터뷰의 질문과 답변을 분석합니다.  파트 6 - 4Hibernate는 이러한 표준 계단식 작업을 모두 지원하지만 자체적으로 세 가지 작업도 도입합니다.
  • REPLICATE - 둘 이상의 데이터 소스가 있고 데이터를 동기화하려는 경우에 사용됩니다(최대 절전 모드 - 복제). 모든 엔터티에는 생성에 문제가 없도록 식별자(id)가 있어야 합니다(동일한 엔터티가 데이터베이스마다 다른 ID를 가지지 않도록).

  • SAVE_UPDATE - 계단식 저장/삭제(Hibernate 메소드의 경우 - saveOrUpdate )

  • LOCK 은 DETACHED 의 반대 작업입니다 . 즉 , 분리된 엔터티를 다시 지속성 상태로 전환합니다 . 엔터티는 현재 세션에서 다시 추적됩니다.

계단식 유형을 선택하지 않으면 엔터티에 대한 작업이 연관된 다른 엔터티에 영향을 미치지 않습니다.

54. Entity 클래스는 추상 클래스일 수 있나요?

단락 2.1 엔터티 클래스 의 JPA 사양 에는 " 추상 클래스와 구상 클래스 모두 엔터티가 될 수 있습니다 ." 라는 줄이 있습니다 . 따라서 대답은 '예'입니다. 추상 클래스는 엔터티가 될 수 있으며 @Entity로 주석을 달 수 있습니다.

55. 엔터티 매니저란 무엇인가요? 그 사람은 무슨 책임이 있나요?

우선, EntityManager는 데이터베이스와 엔터티를 상호 작용하는 데 사용되는 JPA의 핵심 구성 요소 중 하나라는 점에 주목하고 싶습니다. 일반적으로 이는 엔터티와 데이터베이스 간의 상호 작용 방법을 호출합니다(지속, 병합, 제거, 분리)... 그러나 또한 이 구성 요소는 일반적으로 전체 응용 프로그램에 대한 구성 요소가 아니라는 점에 유의하고 싶습니다. 가볍고 종종 제거되며 EntityManagerFactory를 사용하여 새 것이 생성됩니다 . JDBC 와 유사점을 그리면 EntityManagerFactory는 DataSource 유사하고 EntityManager Connection 과 유사하게 됩니다 . 앞서 현재 연결에 의해 제어되는 엔터티로서 지속성 엔터티를 언급했습니다 . 따라서 이 엔터티는 현재 연결과 밀접하게 관련된 EntityManager 및 트랜잭션 열기/닫기를 담당하는 TransactionManager 에 의해 정확하게 관리됩니다. 아래 그림에서 엔터티의 수명 주기를 볼 수 있습니다. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 5EntityManager는 엔터티가 관리됨 단계에 있을 때 엔터티를 관리합니다(현재 엔터티는 EntityManager와 연결되어 있기 때문에 영구적입니다). 즉, 더 이상 새로운 것이 아니며 아직 제거되지 않았습니다. 엔터티가 새로 추가되거나 제거되면 해당 엔터티도 분리된다고 말할 수 있습니다. EntityManager에 의해 관리되지 않습니다. EntityManager에는 다양한 전략이 있습니다. 즉, 전체 애플리케이션에 대해 하나의 싱글톤 EntityManager가 있을 수도 있고, 각 연결에 대해 매번 새로운 EntityManager가 생성될 수도 있습니다. Spring을 사용하면 EntityManager의 생성/삭제가 내부적으로 자동으로 제어됩니다(그러나 이것이 사용자 정의할 수 없다는 의미는 아닙니다 ^^). 하나 이상의 EntityManager가 지속성 컨텍스트를 형성한다는 점은 주목할 가치가 있습니다 . 지속성 컨텍스트는 엔터티 인스턴스가 데이터베이스의 유사한 엔터티와 동기화되는 환경입니다(앞서 말했듯이 이는 지속성 엔터티에만 작동합니다). JPA (내가 적극 권장하는) 에 대해 더 깊이 파고들면 이러한 개념을 매우 자주 접하게 될 것입니다.

56. Assert 클래스란 무엇입니까? 왜 그것을 사용합니까?

JPA 에서 그런 클래스에 대해 들어본 적이 없기 때문에 이것이 코드의 단위 테스트에 사용되는 라이브러리의 JUnit 클래스 를 참조한다고 가정하겠습니다 . 이 라이브러리의 클래스인 Assert는 코드 실행 결과를 확인하는 데 사용됩니다( assert 는 특정 위치에 특정 상태/데이터가 있다는 명령문입니다). 예를 들어, 고양이를 생성해야 하는 메서드를 테스트하고 있습니다. 메소드를 실행하고 결과를 얻습니다.
Cat resultOfTest = createCat();
하지만 올바르게 생성되었는지 확인해야 합니다. 그렇죠? 따라서 이전에 createCat() 메서드 에서 얻은 cat에서 기대하는 매개변수를 정확하게 사용하여 특정 cat( expectedCat) 을 수동으로 생성했습니다 . 다음으로 Assert 클래스를 사용하여 결과를 확인합니다.
Assert.assertEquals(resultOfTest, expectedCat);
고양이가 다르면 AssertionError 예외가 발생하여 예상 결과가 수렴되지 않음을 알려줍니다. Assert 클래스에는 예상 결과를 확인하는 많은 작업을 다루는 다양한 메서드가 있습니다. 그 중 일부는 다음과 같습니다.
  • AssertTrue(<boolean>) - 인수로 받은 예상 값은 true 여야 합니다.

  • AssertFalse(<boolean>) - 인수로 수신된 예상 값은 false 여야 합니다.

  • AssertNotEquals(<object1>, <object2>) - 인수로 받은 객체는 같음( false ) 을 사용하여 비교할 때 달라야 합니다.

  • AssertThrows(<ClassNameOfException>.class, <ExceptionObject>) - 두 번째 인수는 첫 번째 인수로 지정된 클래스의 예외가 될 것으로 예상됩니다. 즉, 일반적으로 두 번째 인수 대신에 다음을 수행해야 하는 메서드가 호출됩니다. 필수 유형의 예외를 발생시킵니다)

57. 자바에서 문자열 특성화하기

String 은 문자열 값(문자 시퀀스)을 저장하고 조작하는 일을 담당하는 Java의 표준 클래스이며 불변 클래스입니다( 앞에서 불변에 대해 썼습니다 ). 이 클래스의 개체 데이터는 생성 후에 변경할 수 없습니다. StringBuilderStringBuffer 클래스 는 두 개의 사실상 동일한 클래스이며 유일한 차이점은 둘 중 하나가 멀티스레드 환경(StringBuffer)에서 사용하기 위한 것이라는 점입니다 . 이러한 클래스는 String 과 유사 하지만, String 과 달리 변경 가능합니다 . 즉, 객체가 일단 생성되면 새 객체를 생성하지 않고도 해당 객체가 나타내는 문자열을 수정할 수 있습니다. 실제로 이 메서드는 표준 String 메서드와 다르며 문자열 변경 요구 사항을 충족하는 것을 목표로 합니다(이 메서드를 빌더라고 부르는 것은 당연합니다). 이 기사에서 String , StringBufferStringBuilder 에 대해 자세히 알아보세요 .

58. String 객체를 생성하는 다양한 방법은 무엇입니까? 어디서 생성되나요?

문자열을 생성하는 가장 일반적인 방법은 이중 괄호 안에 필요한 값을 지정하는 것입니다.
String str = "Hello World!";
new를 통해 직접 이 작업을 수행할 수도 있습니다 .
String str = new String("Hello World!");
문자 배열에서 시작하는 문자열을 만들 수 있습니다.
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
일부 객체에서 실행되는 toString 메소드 의 결과 :
String str = someObject.toString();
다른 메서드의 결과와 마찬가지로 문자열 표현을 반환합니다. 예를 들어:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
아시다시피 문자열을 만드는 방법은 매우 다양할 수 있습니다. String 개체가 생성 되면 문자열 pool 에 저장됩니다 . 이에 대해서는 아래 질문 중 하나에서 자세히 설명하겠습니다.

59. Java에서 두 문자열을 비교하고 정렬하는 방법은 무엇입니까?

Java에서 값을 비교하려면 이중 등호 == 가 사용됩니다 . int 와 같은 간단한 값을 비교해야 한다면 이를 사용합니다. 그러나 이 방법은 본격적인 개체를 비교하는 데는 적용되지 않습니다. 이 경우 동일한 객체를 가리키는지 여부에 관계없이 참조만 비교합니다. 즉, 내부 필드의 값이 정확히 동일한 두 개체를 비교할 때 == 를 통한 비교는 false 결과를 제공합니다 . 개체의 동일한 필드에도 불구하고 개체 자체는 서로 다른 메모리 셀을 차지합니다. 그리고 String 클래스의 객체는 믿을 수 없을 만큼 단순함에도 불구하고 여전히 객체입니다. 그리고 ==를 통한 비교 도 적용할 수 없습니다(문자열 풀이 있음에도 불구하고). 여기에서 Object 클래스의 표준 메소드가 작동 합니다 . 이는 올바르게 작동하려면 클래스에서 재정의되어야 합니다(그렇지 않으면 기본적으로 == 를 사용하여 비교합니다 ). 이는 String 클래스 에서 재정의되므로 이를 가져와 사용합니다.
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 6일치 비교에 대해 이야기했으니 이제 정렬 비교에 대해 살펴보겠습니다. 결국, 무언가를 정렬하려면 어떤 원리로 정렬해야 하는지 알아야 합니다. 이를 위해 표준 정렬 세트인 TreeSet을 사용할 수 있습니다 . 이 기사에서 Java의 다양한 컬렉션에 대해 자세히 알아볼 수 있습니다 . 이 목록은 레드-블랙 트리 알고리즘을 기반으로 작동하며 지정된 정렬 원칙에 따라 집합을 정렬합니다. 앞서 말했듯이 특정 유형의 개체를 정렬하는 방법을 이해해야 합니다. 비교기는 정렬을 위한 비교 방법을 설정하는 데 사용됩니다 . 일반적으로 정렬하려는 클래스에 대해 이러한 기능을 구현해야 하지만 문자열 의 경우 이미 구현되어 있습니다. 따라서 필요한 행을 TreeSet 에 추가하면 정렬됩니다.
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
콘솔 출력:
ABC

60. 문자열을 문자로 변환하는 알고리즘을 제시하십시오. 적절한 코드를 작성하세요

앞서 말했듯이 String 클래스의 객체 에는 다양하고 유용한 메서드가 많이 있습니다. 그 중 하나가 toCharArray 입니다 . 이 메서드는 문자열을 문자 배열로 변환합니다.
String str = "Hello world";
char[] charArr = str.toCharArray();
다음으로 인덱스로 호출할 수 있는 문자 배열이 있습니다.
char firstChar = charArr[0]; // H

61. 문자열을 바이트 배열로 변환하거나 그 반대로 변환하는 방법은 무엇입니까? 적절한 코드를 작성하세요

toCharArray 메소드 와 유사하게 String 클래스 에는 문자열의 바이트 배열을 반환하는 getBytes 메소드가 있습니다 .
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
오늘의 분석 부분은 논리적으로 끝났습니다. 관심을 가져주셔서 감사합니다!Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 7
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION