1. 자바의 final 키워드가 적용되는 세가지 경우에 대해 설명해주세요
1) 변수, 메서드, 클래스에 각각 적용할 수 있습니다
적용 범위에 따라서 의미가 달라지지만 공통적으로 제한의 의미를 가집니다
변수에 Final을 붙이게 되면 그 변수는 상수화가 되어 수정 불가 즉, 불변이 됩니다.
이 때 중요하게 생각해야 할 점은
참조형 변수에 final을 붙이는 경우 "객체를 가르키는 변수"로써 어떤 객체를 가르키는지에 대한 수정이 불가능할뿐
객체 데이터 내부의 값은 변경이 가능하게 됩니다.
Stack 내부의 값 또는 Stack의 값이 가르키는 객체 위치를 변경하는것이 불가능 할 뿐입니다.
primitive value를 final로 초기화 전에 사용시 컴파일 에러 발생
객체의 경우 final 키워드가 들어가게 되면, 선언시 초기화를 하거나 생성자를 통한 주입 또는 setter를 이용한 초기화가 가능합니다.
(스프링에서 Dependency Injection을 공부하면서, 스프링 빈을 주입하는 과정에 있어 선언시 초기화는 DIP를 위반하기 때문에 생성자 주입 또는 setter를 이용한 주입만이 DIP 위반 소지를 제거할 수 있다고 했는데, setter를 통한 주입의 경우 의도하지 않은 변경의 우려가 있기 때문에 생성자를 통해 제한을 하는것이 좋다고 공부했습니다 스프링 프레임워크에서 의존관계주입은 생명주기동안 변경될 이유가 없다는 이유에서 말이죠!)
메서드에 final을 붙이면 해당 메서드의 override를 제한합니다.
상속 받은 클래스에서 해당 메서드를 수정해서 사용하지 못하도록 할 수 있는것이 메서드에 final 키워드를 붙이는 것입니다.
다른 방법으로는 default, private 접근 제어자를 사용함으로써 제한할 수 있습니다.
클래스 선언부에 final을 붙이게 되면 상속 불가능한 클래스가 됩니다.
2. final키워드와 finally, finalize의 차이점을 말해주세요
final 키워드의 경우 이전에 후술한대로 특정한 메서드, 객체, 변수의 사용 또는 생성 범위를 "제한"하는데 그 의의가 있습니다
finally의 경우 try ~ catch ~ finally 또는 try ~ finally 등 예외 발생 여부와 관계 없이 실행되는 코드입니다.
예외처리에 상관 없이 코드의 실행을 보장합니다.
단, System.exit / 중지 호출 Runtime.getRuntime.halt() / 데몬 스레드 / JVM 스택 오버플로우 등의 문제 발생시 코드 호출이 보장되지 않습니다.
finalize의 경우 소멸자 메서드입니다.
리소스 누수 방지를 위해 JVM 가비지 컬렉터의 가비지 컬렉션이 수행되는 과정에서 미사용 자원 정리를 위해 호출되는 메서드입니다.
finalizer는 예측할 수 없고 상황에 따라 위험할 수 있어 일반적으로 불필요함
cleaner는 finalizer보다는 덜 위험하지만 여전히 예측 불가, 일반적으로 불필요 (제때 실행해야하는거는 절대 못함)
-> Cleaner는 스레드 제어는 가능함 여전히 백그라운드에서 GC 아래 수행되기 때문에 비추
https://stackoverflow.com/questions/2506488/when-is-the-finalize-method-called-in-java
When is the finalize() method called in Java?
I need to know when the finalize() method is called in the JVM. I created a test class which writes into a file when the finalize() method is called by overriding it. It is not executed. Can anybod...
stackoverflow.com
자세한 내용에 대해서는 GC를 공부해야 할 필요가 있을 것 같네요
-> finalize()는 GC를 보장하지 않으므로 null을 할당하는것이 좋다고 합니다.
Effective Java에서는 try ~ with ~ resource 또는 try ~ finally를 사용할 것을 권장하고 있습니다.
GC가 일단 알았어 상황 보고 GC 실행할께 했는데 상황 봐서 안하고 있다가 OutOfMemoryError가 날 수도 있다고 합니다.
3. 자바 api 정렬에서 Arrays.sort()는 어떤 정렬 알고리즘을 사용하나요? 최악의 경우 시간복잡도는? Arrays.sort()의 대안은?
일단 알고리즘은 PASS -> 자료구조를 공부하고 기술하겠습니다.
4. 자바 optional에 대해 설명해주세요
자바 Optional의 경우 할당되지 않은 NPE문제로부터 프로그램의 실행을 보호합니다 한번 더 감싼다는 느낌으로 보면 되는데
of와 ofNullable 메서드를 사용할 수 있으며 차이는 of는 인자로 null을 안받고 ofNullable은 null값을 허용한다는 것.
isPresent()를 통해 null인지 아닌지 확인 가능 + 람다를 통해 if문 대신 코드 가독성 향상 가능합니다.
orElse, orElseGet() 등 메서드는 값을 가져올 때 사용 orElse는 null 여부와 관계없이 orElseGet은 null인 경우 그 파라미터 안에 기재된 함수를 실행합니다 / 자세한 내용은 나중에 기록해보겠습니다.
5. 자바 static키워드의 생성시기와 소멸시기를 설명해주세요
먼저 자바 코드가 실행되는 순서
.java 코드 -> 컴파일러 -> .class 파일(바이트코드) -> JVM
JVM에서 일어나는 일
1. 자바 바이트 코드를 로드하여 메소드 영역(Runtime Data Area)에 저장함.
2. JVM의 Runtime Data Area 클래스들 로드
3. Execution Engine에서 Byte Code를 Binary Code로 변환
이때 변수 생명주기
클래스 - 클래스가 Runtime Data Area에 올라갈 때 생성되어 프로그램이 종료되면 소멸한다 (메서드 영역에 저장됨)
인스턴스 - 인스턴스가 생성되어 Heap에 올라가는 경우, 공간이 부족해지면 GC에 의해 소멸한다 또는 프로그램 종료 시
지역변수 - Runtime Data Area 내의 Stack Area에 생성되며 각 스레드마다 하나씩 Stack Area를 갖습니다.
해당 블록 내에서 선언문이 실행될때 생성되어 해당 블록 또는 스레드가 종료되는 경우 소멸합니다.
static은 한번 생성되면 선언문을 또 만나더라도 기존의 생성된 변수를 이용하고 새로 생성하지 않는 것을 의미한다.
프로그램이 실행될 때 Method Area 내에 생성되어 프로그램 종료와 함께 소멸합니다
JVM Tutorial - Java Virtual Machine Architecture Explained for Beginners
Whether you have used Java to develop programs or not, you might have heard about the Java Virtual Machine (JVM) at some point or another. JVM is the core of the Java ecosystem, and makes it possible for Java-based software programs to follow the "write on
www.freecodecamp.org
6. 자바의 객체 리플렉션에 대해 설명해주세요.
JVM에서 바이트 코드가 메소드 영역에 로드되게 되면 부모 자식 클래스의 정보와 메서드 정보 static 변수 및 상수 정보가 여기에 저장됩니다. 자바의 객체 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드 타입 변수들에 접근할 수 있도록 해주는 자바 API를 말합니다. 컴파일 시점이 아닌 런타임 상에서 dynamic하게 특정 클래스의 정보를 추출할 수 있습니다.
이를 이용하여 클래스, 생성자 정보, 메서드 정보, 필드 정보를 가져올 수 있습니다.
단 주의할것이 static 메서드를 사용할때는 .invoke()라는 메서드를 사용하여 객체에 전달하는 인자에 대해 null을 넣어주어야 합니다.
그래야 static 메서드를 실행할 수 있습니다.
static 필드 정보에서 getter나 setter에 대해 전달되는 인자 또한 null을 사용해야합니다
(아직 초기화가 되지 않아 NPE문제가 발생할 수 있습니다)
'면접 준비' 카테고리의 다른 글
[학원 면접 준비] 5일차 (0) | 2023.09.11 |
---|---|
[면접준비] 4일차 (0) | 2023.09.10 |
[면접준비] 3일차 (0) | 2023.09.09 |
[면접준비] 1일차 (0) | 2023.09.07 |