면접 (Java)/준비

[면접] 기초 면접 (1~6)

hihyuk 2024. 3. 25. 09:41

1. Call by reference란 무엇이고 보통 어떻게 쓰이나요?

핵심 키워드 : 값, 참조, 복사, 객체 전달 / 값 전달

  "Call by reference는 메소드 호출 시 변수의 메모리 주소를 전달하는 방식으로, 이를 통해 메소드 내에서 직접 변수의 값을 변경할 수 있습니다. 이 방식을 사용하면, 메소드 내의 변경사항이 호출한 쪽의 변수에도 반영되기 때문에, 대규모 데이터 처리나 필요한 상태의 변경을 보다 효율적으로 수행할 수 있습니다."

 

꼬리 질문 > Java에서는 Call by reference를 직접 지원하나요?

  "Java에서는 모든 메소드 호출이 기본적으로 Call by value 방식으로 이루어집니다. 이는 기본 데이터 타입이든 객체 참조이든, 전달된 인자의 복사본을 생성해 메소드에 넘긴다는 의미입니다. 객체를 메소드에 전달할 때, 그 객체의 참조값(메모리 주소)이 복사되어 전달되므로, 메소드 내에서 객체의 상태를 변경할 수 있습니다. 그러나 이는 참조의 값이 복사되는 것이므로, 진정한 의미의 Call by reference는 아닙니다. 따라서 Java에서는 메소드 내에서 참조 자체를 변경해도 호출자에게 영향을 미치지 않습니다."

 

2. Override 와 Overload 를 설명해주실 수 있을까요?

핵심 키워드 : 덮어쓰기, 재정의, 상속, 같은 이름, 파라미터(매개 변수)

  "Override는 상속 관계에 있는 하위 클래스가 상위 클래스의 메서드를 재정의하는 것을 말합니다. 이는 동일한 메서드 시그니처(이름, 파라미터)를 가지지만, 하위 클래스에서 해당 메서드의 행동을 다르게 구현할 수 있게 합니다. 주로 기존 기능을 확장하거나 수정할 필요가 있을 때 사용됩니다.

반면, Overload는 같은 이름의 메서드를 여러 번 정의하지만, 파라미터(매개 변수)의 타입이나 개수를 다르게 해서 각 메서드를 구별하는 기법입니다. 오버로딩을 통해 하나의 메서드 이름으로 다양한 입력 유형에 대응할 수 있으며, 이는 코드의 가독성과 재사용성을 향상시키는 데 도움을 줍니다."

 

꼬리 질문 > Override와 Overload를 사용할 때 주의해야 할 점이 있나요?

  "Override를 할 때는 상위 클래스의 메소드와 동일한 시그니처를 유지해야 하며, '@Override' 애노테이션을 사용하여 컴파일러에게 명시적으로 알리는 것이 좋습니다. 이는 오버라이드의 의도를 명확히 하고, 오타나 시그니처 불일치로 인한 오류를 사전에 방지할 수 있습니다. Overload 시에는 메소드의 매개변수 타입, 개수, 순서가 각각 달라야 합니다. 이를 통해 컴파일러가 올바른 메소드를 호출할 수 있도록 해야 하며, 너무 많은 오버로딩은 코드의 복잡성을 증가시킬 수 있으니 적절한 사용이 중요합니다. "

 

3. JPA는 언제 필요하고 언제 필요하지 않은지 설명해주실 수 있을까요?

핵심 키워드 : ORM, SQL, 영속성, 더티 체킹, 객체 지향

  "JPA는 ORM 기술을 활용해 객체 지향 프로그래밍과 관계형 데이터베이스 간의 간극을 줄이는 데 필요합니다. 주로 객체의 영속성 관리와 복잡한 SQL 없이 데이터를 쉽게 처리하고자 할 때 유용하며, 더티 체킹 같은 고급 기능으로 개발 효율성을 높입니다. 그러나, 매우 간단한 CRUD 작업이나 성능 최적화가 필수적인 상황에서는 JPA의 오버헤드가 부담될 수 있습니다. 따라서, 프로젝트의 복잡성, 개발자의 데이터베이스 제어 필요성, 성능 요구 사항을 고려해 JPA의 적용 여부를 결정해야 합니다."

 

꼬리 질문 > JPA를 사용할 때 성능 문제는 어떻게 해결할 수 있나요?

  "JPA를 사용하면서 발생할 수 있는 성능 문제를 해결하기 위해, 첫째, 적절한 페치 전략(지연로딩과 즉시로딩)을 선택하는 것이 중요합니다. 불필요한 데이터 로딩을 방지하여 성능을 향상시킬 수 있습니다. 둘째, JPA의 캐시 기능을 활용하여 반복적인 데이터 조회 시 데이터베이스 접근을 최소화합니다. 마지막으로, 배치 처리와 같은 JPA의 고급 기능을 사용하여 대량의 데이터를 효율적으로 처리하고, N+1 쿼리 문제를 해결하기 위한 전략을 적용해야 합니다. 이러한 접근 방식을 통해 JPA 사용 시 발생할 수 있는 성능 저하 문제를 최소화할 수 있습니다."

 

4. JPA의 더티 체킹이란 무엇인가요?

핵심 키워드 : 변경 감지, 커밋, 스냅샷, Transaction,

  "JPA의 더티 체킹은 엔티티의 상태 변경을 자동으로 감지하는 기능입니다. 트랜잭션 내에서 엔티티의 속성이 변경되면, JPA는 그 변경 사항을 데이터베이스에 자동으로 반영합니다. 이 과정은 트랜잭션이 시작될 때 엔티티의 초기 상태를 스냅샷으로 저장하고, 트랜잭션이 커밋되기 전에 이 스냅샷과 현재 엔티티의 상태를 비교하여 변경된 부분을 찾아내는 방식으로 작동합니다. 더티 체킹으로 인해 개발자는 엔티티의 변경 사항을 데이터베이스에 명시적으로 저장하기 위한 코드를 작성할 필요가 없어집니다. 이 기능은 JPA가 제공하는 영속성 컨텍스트의 일부로, 애플리케이션의 데이터 관리를 훨씬 편리하게 만들어 줍니다."

 

꼬리 질문 > 더티 체킹 기능을 사용할 때, 성능에 미치는 영향은 어떻게 관리할 수 있나요?

  "JPA의 더티 체킹은 매우 유용하지만, 대규모 엔티티에서는 성능 저하를 일으킬 수 있습니다. 성능 관리를 위해, 변경 감지가 필요한 필드만 선택적으로 감시하거나, @Version 애노테이션을 사용하여 엔티티의 버전 관리를 통한 충돌 방지와 함께 효율적인 더티 체킹을 수행할 수 있습니다. 또한, 필요 없는 엔티티의 자동 변경 감지를 방지하기 위해 EntityManagerdetach 메소드를 사용하여 엔티티를 영속성 컨텍스트에서 분리하는 전략도 고려할 수 있습니다. 이러한 방법들을 통해 더티 체킹의 이점을 유지하면서 성능을 최적화할 수 있습니다."

 

5. JVM 이란 무엇이고 왜 필요한지 설명해주실 수 있을까요?

핵심 키워드 : OS, Write Once Run AnyWhere, 컴파일, 기계어, 자연어, 바이트 코드

  "JVM(Java Virtual Machine)은 자바 프로그램이 실행되는 가상의 컴퓨팅 머신입니다. 자바 소스 코드는 컴파일러에 의해 바이트 코드로 변환되며, 이 바이트 코드는 다양한 운영 체제(OS)에서 JVM을 통해 실행될 수 있습니다. 이 과정에서 "Write Once, Run Anywhere"의 이념이 실현됩니다; 즉, 한 번 작성한 코드를 다양한 OS에서 변경 없이 실행할 수 있게 됩니다. JVM은 바이트 코드를 해당 OS가 이해할 수 있는 기계어로 변환하는 역할을 하며, 이는 프로그램의 이식성을 크게 향상시킵니다. 또한, JVM은 메모리 관리, 가비지 컬렉션 등 프로그램 실행에 필요한 여러 관리 기능을 제공합니다. 이러한 특성 덕분에, 자바 애플리케이션은 다양한 환경에서 안정적으로 실행될 수 있으며, 개발자는 특정 OS에 종속되지 않는 애플리케이션 개발에 집중할 수 있습니다."

 

꼬리 질문 > JVM에서 가비지 컬렉션(GC)의 역할은 무엇이며, 어떻게 작동하나요?

  "JVM 내에서 가비지 컬렉션(GC)은 사용되지 않는 메모리를 자동으로 회수하는 중요한 역할을 합니다. 프로그램 실행 도중 생성된 객체 중에서 더 이상 참조되지 않는 객체들을 탐지하여, 그 메모리를 재사용 가능하게 만듭니다. 이 과정은 개발자가 메모리 관리에 신경 쓰지 않아도 되게 하며, 메모리 누수를 방지하여 애플리케이션의 안정성을 높여줍니다. 가비지 컬렉션은 여러 알고리즘을 통해 효율적으로 작동하며, JVM의 성능과 안정성에 큰 영향을 미칩니다."

 

6. Java가 컴파일 되는 과정은 어떻게 되는지 설명해주실 수 있을까요?

핵심 키워드 : 바이트 코드, class 파일, 기계어, 자연어

  "Java 컴파일 과정은 자바 소스 코드(.java 파일), 작성된 자연어 코드를 컴퓨터가 이해할 수 있는 중간 형태인 바이트 코드로 변환하는 과정입니다. 이 변환은 자바 컴파일러에 의해 수행되며, 결과물은 .class 파일로 저장됩니다. 이 .class 파일은 Java Virtual Machine(JVM)에 의해 각기 다른 운영 체제 상에서 실행될 수 있는데, JVM은 바이트 코드를 해당 시스템의 기계어로 실시간 변환(Just-In-Time 컴파일)하여 실행합니다. 이 과정은 Java의 플랫폼 독립성을 보장하는 핵심이며, "Write Once, Run Anywhere" 원칙을 가능하게 합니다."

 

꼬리 질문 > 자바 컴파일 과정에서 발생할 수 있는 오류는 어떤 것들이 있나요, 그리고 이를 어떻게 해결할 수 있나요?

  "자바 컴파일 과정에서는 주로 구문 오류(Syntax errors), 타입 오류(Type errors), 그리고 런타임 오류(Runtime errors)의 가능성이 미리 검출됩니다. 구문 오류는 잘못된 코드 작성으로 발생하며, 컴파일러가 명확한 오류 메시지를 통해 지적해 줍니다. 타입 오류는 변수 타입 불일치 등에서 발생하고, 이 역시 컴파일러가 검출해 줍니다. 이러한 오류들은 컴파일러의 오류 메시지를 주의 깊게 읽고 코드를 수정함으로써 해결할 수 있습니다. 오류 해결 후, 바이트코드는 JVM에서 안정적으로 실행될 준비가 됩니다. 오류 해결 과정은 개발자에게 자바 언어의 규칙을 더 잘 이해할 수 있는 기회를 제공합니다."