Kuma's Curious Paradise
기술면접 질문 답안 모음1 본문
1. Call By Reference란 무엇이고 어떻게 쓰이나요?
Call By Reference가 무엇인지 설명하려면 Call By Value와 비교하며 살펴보는 게 좋을 것 같습니다. 이 둘은 함수나 메서드를 호출할 때 인자를 전달하는 방식을 뜻하며, Call By Value는 객체의 '값을 복사'해서 전달하는, Call By Reference는 객체의 참조(주소)를 직접 전달하는 방식을 말합니다.
자바는 모든 함수가 Call By Value 방식으로 작동합니다. 참조형 변수가 있지만, 그때도 객체의 주소'값을 복사'해서 전달하기 때문에 Call By Reference처럼 보이는 것이지요. 주소값이 전달된다는 점에서 메서드를 호출한 쪽에서 값에 변경을 가하면 객체의 값이 변경된다는 특징이 있습니다.
2. Override와 Overload를 설명해 주세요.
Override는 하위 클래스가 상위 클래스의 메서드를 필요에 맞게 변경해서 사용함을 의미합니다. 이는 상속과 같은 부모 자식 관계, 인터페이스와 구현체의 관계에서도 일어납니다. 메서드 시그니처는 유지되어야 하며, 오버라이드하는 메서드의 접근제어자는 원본 메서드의 접근제어자와 같거나 넓어야 합니다. 필요에 맞게 변형을 가한다는 점에서 자바의 다형성을 잘 보여줍니다.
Overload는 매개변수의 타입과 개수, 순서에 따라 같은 기능을 하는 메서드를 여러 번 정의하는 것을 말합니다. 예를 들면 println() 메서드는 다양한 타입의 변수를 받을 수 있도록 오버로드 되어 코드의 재사용성을 높입니다.
3. JPA는 언제 필요하고 언제 필요하지 않을까요?
이를 이야기하기 위해서는 JPA가 ORM이라는 점을 먼저 말씀드려야 할 것 같습니다. ORM은 테이블로 이루어진 DB와 객체 지향 언어 Java 사이의 간극을 좁혀주기 위해서 나온 언어입니다. 클래스를 테이블로, 하나의 row를 객체로, 필드를 객체의 속성으로 연결시키고 DB에서 일어나는 연산을 메서드로 추상화해서 제공하지요. JPA는 이런 ORM 중 하나로, RDBMS에 최적화되어 있습니다. 따라서 RDBMS를 사용하며, DB를 좀 더 손쉽게 사용하려 한다면 JPA가 필요합니다.
하지만 비관계형 DB인 NoSQL을 사용하거나 JPA가 제공하는 메서드보다 복잡한 쿼리가 필요할 경우, JPA가 제공하는 쿼리가 오히려 더 성능이 떨어질 경우에는 사용하지 않는 편이 좋겠습니다.
4. JPA의 더티 체킹이란 무엇일까요?
엔티티는 DB 테이블에 매핑되는 자바 객체를 말합니다. 엔티티 매니저는 엔티티를 '영속성 컨텍스트' 내에서 관리합니다. 영속성 컨텍스트는 트랜잭션 내에서 엔티티를 저장하고 관리하는 논리적인 공간을 말합니다. 영속성 컨텍스트는 1차 캐시, 더티 체킹과 같은 기능을 통해 성능과 데이터 일관성을 향상시킵니다. 트랜잭션이 종료되면 영속성 컨텍스트가 flush되고 DB에 반영됩니다.
이때 더티 체킹은 영속성 컨텍스트 내에서 엔티티의 변화를 자동 감지하는 매커니즘을 말합니다. find()로 엔티티가 영속성 컨텍스트에 로딩되면, 해당 엔티티는 1차 캐시에 저장됩니다. 예를 들어, 이후 set()으로 특정 필드를 업데이트 하면 찍어놓은 스냅샷과 비교해서 무엇이 달라졌는지 더티 체킹이 감지합니다. 만약 한 트랜잭션 내에서 여러 업데이트가 있다면 UPDATE 쿼리를 모아서 날려 주기도 합니다. '
더티 체킹은 개발자가 꼭 UPDATE 쿼리를 날리지 않아도 DB와 동기화를 자동으로 처리한다는 점에 있습니다. 또한 이 기능은 변경된 데이터만 대상으로 하기 때문에 DB 액세스를 최소화하여 성능 향상에도 기여합니다.
5. JVM이란 무엇이고 왜 필요한가요?
개발자가 자바 소스 코드를 쓰면, 자바 컴파일러는 이를 JVM이 이해할 수 있는 언어인 자바 바이트 코드로 변환합니다. JVM은 이 바이트 코드를 읽어 내어 OS가 이해할 수 있는 적절한 기계어로 변환하여 자바 프로그램이 실제로 실행될 수 있도록 합니다. 이 과정은 자바의 "Write Once, Run Anywhere" 원칙을 가능하게 합니다. 이를 통해 자바 프로그램은 OS 독립적으로 구동될 수 있습니다.
6. Java가 컴파일되는 과정을 설명해 주세요.
먼저 개발자가 Java 언어로 소스 코드를 작성합니다. 이는 자바 컴파일러를 통해 바이트 코드로 변환됩니다. 클래스 로더는 JVM Memory에 바이트 코드를 로드합니다. 실행 엔진은 바이트 코드를 해석하고 실행합니다. 이때 자바 인터프리터는 바이트 코드를 한 줄씩 실행하고, JIT 컴파일러는 자주 등장하는 부분을 네이티브 코드로 미리 변환하여 성능을 높입니다.
7. JVM의 Stack / Heap 메모리 영역에 대해 설명해 주세요.
Heap 영역은 모든 자바 객체와 배열들이 할당되는 곳입니다. 런타임 때 동적으로 할당되며 더 이상 사용되지 않는 객체들이 생기면 GC가 관리하여 처리합니다. Stack 영역은 메서드 호출과 lv, 파라미터가 할당되는는 곳으로, 각 스레드마다 별도의 스택을 가집니다. (Heap은 모든 스레드가 공유합니다.) 메서드를 호출하면 데이터가 push되고, 종료되면 pop되며 후입선출 구조로 작동합니다.
추가적으로 Method Area는 클래스의 메타 정보가 로드됩니다. 클래스의 구조는 어떤지, static 필드, final, static final 상수 등이 저장됩니다.
'기술면접' 카테고리의 다른 글
[cs] MVVM 예시와 함께 이해하기 (1) | 2024.09.03 |
---|---|
[cs] 노출식 모듈 패턴 (0) | 2024.08.06 |
기술면접 질문 답안 모음4 (0) | 2024.05.29 |
기술면접 질문 답안 모음3 (0) | 2024.05.16 |
기술면접 질문 답안 모음2 (1) | 2024.05.09 |