1. Jdbc에 대해 설명해주세요
https://en.wikipedia.org/wiki/Java_Database_Connectivity
Java Database Connectivity - Wikipedia
From Wikipedia, the free encyclopedia API for Java Java Database Connectivity (JDBC) is an application programming interface (API) for the Java programming language which defines how a client may access a database. It is a Java-based data access technology
en.wikipedia.org
위키피디아 정의에서 JDBC는 클라이언트를 어떻게 데이터베이스에 접근 시킬것인지에 대해 정의한
자바 프로그래밍 언어를 통해 제공하는 API에 해당합니다.
자바 기반의 자바 데이터베이스 접근을 위한 엑세스 기술이며 자바 표준에 해당합니다.
JDBC는 적절한 드라이버가 제공된다면 어떤 데이터베이스와도 상호작용할 수 있습니다 (자료)
데이터베이스 Connection 객체의 경우 AutoClosable을 상속하고 있기 때문에
try ~ with ~ resource 블록 내에서 사용하여야 합니다
SQL 실행을 위해서는 Statement 객체를 이용합니다,
Statement 객체는 SQL 쿼리 실행을 위한 명령을 인터페이스를 통해 구현하고 있습니다.
Connection 객체 생성 이후 .createStatement() 메서드를 이용하여 Statement를 가져올 수 있습니다.
인터페이스의 구현체로 가져오기 때문에 해당 DB에 맞는 Statement 구현체를 가져올 수 있습니다.
Statement의 .execute() 메서드를 통해 SQL 쿼리를 실행할 수 있습니다.
1) executeQuery() - SELECT문 -> .getResultSet()
2) executeUpdate() - 데이터나 데이터 테이블의 구조를 update하는 경우
3) execute() - 는 위 두가지 모든 경우에 사용가능하지만, 결과가 알수없는 경우에 사용.
stmt.getUpdateCount()를 통해 affected Row Number를 가져올 수 있다.
0 - update command
-1 - select command
PreparedStatement의 경우 parameter가 정해지지 않은 SQL 쿼리를 미리 정형화해놓고 끌어다 쓸수있다.
2. JVM의 구조에 대해 설명해주세요
JVM의 구조는 위의 그림과 같습니다
자바 코드는 클래스 파일, 즉 바이트 코드로 변환된 뒤 클래스 로더에 의해 JVM에 적재되게 되는데
이 때 Runtime Data Area의 메서드 영역에 모든 클래스의 정보와 메서드의 정보, static 변수가 올라가며
메서드 영역의 이 데이터에서 Java Reflection을 이용하여 클래스의 정보를 가져올 수 있습니다.
컴퓨터 구조에서 배우듯이 RDA 내의 PC Register는 어떤 라인을 실행해야할지 나타내며
각각의 코드 실행은 Execution Engine에 의해 실행됩니다.
런타임 도중에 JVM 내의 가비지 컬랙터에 의해 불필요한 Resource의 정리가 일어납니다
기본적으로 Runtime Data Area내에 메소드 영역, 힙, 스택 영역을 갖고 있는데요
GC의 대상은 Stack의 reference variable이 Heap내의 특정 인스턴스를 가르키고 있지 않은 경우
즉, Heap내의 인스턴스에 대응하는 stack의 reference variable이 없는 경우 일어납니다.
Stack Area에는 변수 / 파라미터 / 객체 레퍼런스를 가집니다. 이 영역은 각 스레드별로 독립 공간을 갖습니다
Native Method Stack의 경우 C, C++로 작성된 코드가 적재되며 Execution Engine가 필요로 하는 코드가 저장됩니다
- JNI 가 주로 이쪽 부분을 사용합니다 -
JVM의 클래스 로더에는 3가지 종류가 있습니다
3. 자바 소스코드가 JVM을 통해 실행되는 과정을 설명해주세요
https://hasithas.medium.com/understanding-how-java-virtual-machine-jvm-works-a1b07c0c399a
Understanding how Java Virtual Machine (JVM) works
Most of the developers learn JVM as a black box. You write the code. Then compile it and you get the output. But if you are a Java software…
hasithas.medium.com
참고자료는 위와 같습니다
자바에서 클래스 파일을 로드하는 경우 다음과 같은 과정을 거칩니다.
1) 클래스 메타정보를 읽어오게 됩니다
- 클래스의 이름과 인스턴스 변수의 정보, 직계관계에 있는 부모의 정보와 그것이 클래스인지 열거형인지 인터페이스인지에 대한 정보 등
-> 이것을 메서드 영역에 적재하게 됩니다.
2) 클래스 타입의 객체를 생성하게 됩니다.
JVM에 클래스를 적재하게 되면, Class 클래스로 부터 객체를 생성합니다 -> 이것을 Heap 영역에 적재합니다
그러나 같은 클래스를 다시 적재하려고 하는 경우 Class를 다시 생성하지 않습니다.
코드의 실행은 execution engine에 의해 일어나게 됩니다.
execution engine은 3가지 구성요소로 이루어져 있습니다.
1. 인터프리터 : 바이트코드를 한줄 한줄 읽어 내려가면서 기계어로 번역합니다
2. 컴파일러 : JIT 컴파일러가 인터프리터 방식의 한계인 같은 코드를 두번 읽어올때 똑같은 일을 두번하게 되는 경우와 같이 비효율적인 순간에 작동하면서 인터프리터 방식의 한계를 보완합니다.
한번 실행된 메서드는 인터프리터가 수행하되, 두 번 이상 수행되게 되는 경우 JIT 컴파일러에 의해 바이트코드를 실행하게 됩니다.
JIT는 그렇게 되면 전체 바이트 코드를 네이티브 기계어로 컴파일하고 변환하게 됩니다.
컴파일러 구성
- 중간 코드 생성기(Intermediate Code Generator)
- 코드 최적화기
- 타겟 코드 생성기
- 프로파일러
4. 가비지 콜렉터가 동작하는 과정을 설명해주세요
https://www.baeldung.com/jvm-garbage-collectors
가비지 컬렉션의 매커니즘은 기본적으로 두가지 요소로 구성됩니다
1 - Mark
가비지 컬렉터가 어떤 메모리가 사용중이고 어떤 메모리가 비사용중인지를 검색합니다
2- Sweep
Mark 과정에서검색한 대상 중에서 사용중이지 않은 사실상 비활성상태의 메모리를 제거합니다
- 이러한 GC 매커니즘은 메모리 할당/해제를 자동으로 해줍니다, C언어에서처럼 포인터로 머리 아플 필요가 없습니다
- Dangling Pointer 문제로 인해 발생하는 오버헤드를 줄일 수 있습니다
Dangling Pointer는 객체 파괴를 하게 될 때 기존의 포인터 변수가 해제되지 않아 사실상 쓰레기 값을 가르키게 되는 문제를 말합니다.
여기서 해제되지 않은 객체 포인터(Pointer)를 사용하게 되는 경우, Unexpected Behavior가 나타날 수 있습니다.
Dangling pointer - Wikipedia
From Wikipedia, the free encyclopedia Pointer that does not point to a valid object Dangling pointer Dangling pointers and wild pointers in computer programming are pointers that do not point to a valid object of the appropriate type. These are special cas
en.wikipedia.org
- 자동으로 메모리를 해제하여 자원관리에 용이합니다
단점
- JVM이 객체 참조 여부를 지속적으로 추적해야하기 때문에 더 많은 CPU 자원을 필요로 합니다.
- 프로그래머가 CPU 스케줄링에 직접 간섭할 수 없습니다(finalizer, cleaner로 요청은 하지만 들어만 줄뿐 될지안될지 모릅니다)
- 가끔가다 GC메커니즘의 구현 도중 프로그램이 죽을때가 있습니다
- C의 장점이 메모리 관리가 가능한 Unmanaged 언어라면 Java는 Managed언어라 상황에 따라 메모리 관리가 어렵습니다
5. 자바에서 Runnable인터페이스와 Thread 클래스의 차이점을 설명해주세요
자바는 기본적으로 이중상속을 허용하지 않습니다.
Thread를 상속하게 되는 경우 다른 클래스의 상속이 되지 않으나
Runnable은 interface이기 때문에 상속이 가능합니다.
interface의 구현체로써 Runnable을 구현하는 경우 Thread 객체로 생성해야합니다.
6. 이렇게 두가지 방법이 지원되는 이유를 설명해주세요
위에 설명한 내용과 같습니다
7. 자바의 String/ StringBuffer/ StringBuilder의 차이점에 대해 설명해주세요
https://progyun.tistory.com/106
008. JSCode - 번외편 (5) String vs StringBuilder vs StringBuffer
Final과 불변객체 시카님의 10분 테코톡 발표를 보고 정리된 자료입니다 -> 시카님과 우테코에 감사드립니다! 자바 Final의 정의 - 한번만 할당이 가능하다 / 재할당하려고 하는 경우 컴파일 오류가
progyun.tistory.com
이전에 공부한 내용을 다시 한번 복습합니다.
String은 리터럴 상수일 수 있고 객체타입일 수 있습니다
한번 선언되면 수정이 안되며 문자열의 연결 즉, concatenation이 가능합니다
그에 더해 Synchronized가 적용되어 있어 동시성 문제로부터 안전합니다만 Synchronized가 걸려있어 멀티스레드 환경에서 성능이 다소 떨어질 수 있습니다.
예를 들어 String 객체를 생성한 이후 다른 값으로 concat하게 되는 경우 기존에 생성된 concat 이전의 문자열은 GC Reference 연결이 소실됨으로써 GC에 의해 제거대상이 됩니다.
StringBuffer와 StringBuilder의 특징에 대해 설명하겠습니다
먼저 공통점은 다음과 같습니다
두 객체 모두 인스턴스는 Heap에 저장됩니다.
수정에 있어 이전의 String과는 다르게 기존 객체가 버려지지 않고 수정됩니다.
차이점은 다음과 같습니다.
StringBuffer의 경우 Synchronized가 적용되어 있어 동시성 문제에 안전하고 효율적입니다
StringBuilder의 경우 Synchronized가 적용되어 있지 않기 때문에 동시성 문제를 해결해야합니다.
다만 이 문제가 해결되는 경우 멀티스레딩 환경에서 성능이 더 좋습니다.
스택오버플로우에서는 멀티스레드 환경에서 두 스레드간 버퍼를 공유하지 않는 이상 StringBuilder를 사용하라고 하네요
꼭 Thread-Safe가 필요하다면 차라리 코드블럭에 감싸고 StringBuilder를 쓰라고 합니다
If you are trying to share between threads, you can use StringBuffer, but consider whether higher-level synchronization is necessary, e.g. perhaps instead of using StringBuffer, should you synchronize the methods that use the StringBuilder.
Difference between StringBuilder and StringBuffer
What is the main difference between StringBuffer and StringBuilder? Is there any performance issues when deciding on any one of these?
stackoverflow.com
8. 자바의 String 객체 생성시 리터럴로 생성하는 것과 new String()으로 객체를 생성하는 것의 차이점을 설명해주세요
리터럴로 생성한 객체는 String Constant Pool에 들어갑니다
이미 생성한 객체가 해당 풀에 존재하게 되면 새로 객체를 생성할 때 원래 생성되어 있던 풀 내부의 리터럴을 참조하게 됩니다.
new 생성자를 통해 생성한 String 객체는 같은 값이 String pool에 존재하더라도, Heap 영역에 별도의 객체를 생성합니다.
자세한 내용은 ==과 equals()를 통해 비교해보면 알 수 있습니다.
9. 자바의 Wrapper class에 대해 설명해주세요
Primitive Type을 사용하면 null 값을 할당할 수 없습니다.
https://www.upgrad.com/blog/wrapper-classes-in-java/
Wrapper Classes in Java: What is it, Why do we need it? | upGrad blog
Do you know how primitive data types are converted into objects in Java? Read the article to know that - the essential info about wrapper classes in Java!
www.upgrad.com
https://www.baeldung.com/java-wrapper-classes
Wrapper 클래스를 사용하게 되면 객체의 직렬화에 도움이됩니다.
그에 더해 제너릭 클래스들은 Object 객체로 사용이 가능합니다 - 원시형 타입은 지원하지 않습니다.
그에 더해 Java Collection Framework는 한때 Wrapper 클래스로 변환되어야 Collection 내에 저장할 수 있었습니다.
즉 Wrapper 클래스는 원시형 타입 자료형에 추가기능을 담아 한번 감싸 객체로 만든 형태가 되겠습니다.
10. 자바의 boxing과 unboxing에 대해 설명해주세요
Primitive Type을 객체로 감싸는 것 (encapsulation)을 Boxing
객체로 감싸졌던 Primitive Type을 다시 원시형 타입으로 변환하는 것을 Unboxing이라 합니다
'면접 준비' 카테고리의 다른 글
[학원 면접 준비] 5일차 (0) | 2023.09.11 |
---|---|
[면접준비] 4일차 (0) | 2023.09.10 |
[면접준비] 2일차 (0) | 2023.09.08 |
[면접준비] 1일차 (0) | 2023.09.07 |