JAVA 생각해 볼 문제들

박동철·2022년 4월 22일
0

언어공부

목록 보기
1/3
post-thumbnail

개요

다음 문제들은 https://dev-nomad.com/80 에서 가져온 문제들이다. 검색해 가면서 답을 찾아 보았다. 해당 답들은 어디까지나 참고용이며 오류가 있을 수 있다.

1. Stream, lamda에 대해서 아는대로 설명해보세요.

2. Wrapper Class에 대해서 설명해보고 Wrapping을 함으로써 얻는 이점과 일급콜랙션에 대해서 사용 예시를 들며 설명해보세요.

3. JVM구조에 대해서 설명, 자바 버전에 따라 어떻게 바뀌는가?

크게 네가지다.

  • ClassLoader : 자바는 어플리케이션 시작시 한번에 로드되지 않기에 런타임 중 필요할 때 마다 동적으로 jvm에 로드하는 역할을 한다.
  • Memory area : 자바 프로그램의 메모리 영역이다.
    1. Heap area
    - 객체의 인스턴스, 동적 할당된 데이터를 저장한다.
    - GC가 일어나는 공간이다.
    - Java 8 이전과 이후로 Heap영역의 구조가 변경되었는데 이전에는 perm 영역이 있었으나 이후 Heap+ MetaSpace공간으로 바뀌었다.
    - MetaSpace는 ClassLoader가 로드한 클래스들의 메타데이터들이 저장되는 공간이다. 기존의 perm공간은 Heap공간 안에 있었다면 MetaSpace는 메모리가 Native 영역에 위치한다.
    2. Stack area
    - 지역변수, 파라미터, 리턴값, 연산에 사용되는 임시 값등이 생성되는 영역이다.
    - 메소드를 호출할 때 마다 개별적으로 스택이 생성된다.
    3. Method area
    - 클래스 맴버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, Type 정보(Interface인지 class인지), Constant Pool, static 변수, final 변수등이 생성되는 영역이다.
    - 모든 쓰레드들이 영역을 공유한다.
    4. PC Register
    - CPU 레지스터와는 다르다. JVM에서 사용되는 영역
    - 쓰레드가 생성될 때마다 생성되는 영역으로 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.
    - 이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 한다. C/C++은 OS의 API를 호출해서 멀티쓰레딩을 하지만 Java는 JVM 내에서 자체적으로 가능하다.
    5. Native Method Stack
    - 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
    - JNI를 위한 스택이다.
    - JNI(Java Native Interface)란?
    - Native Method Library를 실행하는데 필요한 인터페이스
  • Excution Engine
    - Interpreter : 바이트 코드를 읽어 기계어로 변환하여 실행
    - JIT(Just In Time) Compiler : Code Cache 메모리에 캐싱
  • Garbage Collector (GC)
    Garbage Collector(GC)는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.

4. 자바가 컴파일 되는 과정에 대해서 설명해보세요.

추가예정

5. 제네릭 타입을 컴파일하면 class 파일에 제네릭이 남아있나요? generic type erasure에 대해서 설명해보세요.

추가예정

6. 리플렉션에 대해서 설명하세요.

추가예정

7. gc의 동작원리와 gc가 언제 작동되는지 설명하세요.

Garbage Collection이란?

가비지 컬렉션은 메모리 관리 기법중 하나로, 프로그램이 동적으로 할당했던 메모리 영역중에서 필요없게 된 영역을 해제하는 기능이다.

Garbage = Unreachable Object

가비지 컬렉터는 힙 영역에 있는 객체를 사용되는 것과 사용되지 않는 것으로 구분한다.

힙에 있는 객체들에 대한 참조는 다음 4가지 종류 중 하나이다.
- 힙 영역 내의 다른 객체에 의한 참조
- 스택 영역의 Java 메서드 내에서 실행하는 지역 변수, 파라미터, 연산 작업중 피연산자에 의한 참조
- 메서드 영역의 상수 풀이나 정적 변수에 의한 참조
- 아직 메모리에 남아 있는 Native 메서드로 넘겨진 객체에서 참조 (JNI에 의해 생성된 객체에 대한 참조)

이들 중 힙 내의 다른 객체에 의한 참조를 제외한 나머지 3개가 root set으로, reachability를 판가름하는 기준이 된다.

Soft, Weak, Phantom Reference

java.lang.ref는 soft reference와 weak reference, phantom reference를 클래스 형태로 제공한다. 예를 들면, java.lang.ref.WeakReference 클래스는 참조 대상인 객체를 캡슐화(encapsulate)한 WeakReference 객체를 생성한다. 이렇게 생성된 WeakReference 객체는 다른 객체와 달리 Java GC가 특별하게 취급한다(이에 대한 내용은 뒤에서 다룬다). 캡슐화된 내부 객체는 weak reference에 의해 참조된다.

GC가 동작하여 어떤 객체를 weakly reachable 객체로 판명하면, GC는 WeakReference 객체에 있는 weakly reachable 객체에 대한 참조를 null로 설정한다. 이에 따라 weakly reachable 객체는 unreachable 객체와 마찬가지 상태가 되고, 가비지로 판명된 다른 객체들과 함께 메모리 회수 대상이 된다

8. gc 종류별 차이에 대해서 설명하세요. (Serial, Parallel, CMS, G1, Z)

추가예정

9. static에 대해서 아는대로 설명해보세요.

  • static 키워드를 사용해서 static변수와 static메소드를 만들 수 있는데 다른 말로 정적변수, 정적 메소드 라고도 한다. 클래스를 설계할 때 맴버변수 중 모든 인스턴스에 공통적으로 사용해야 하는 것에 static을 붙인다.
  • static이 붙은 맴버변수는 인스턴스를 생성하지 않아도 사용할 수 있다. 클래스가 JVM의 클래스로더로 인해 메모리에 올라갈 때 자동적으로 생성되기 때문이다. 따라서 모든 인스턴스가 하나의 저장공간을 공유한다.
  • static이 붙은 메서드는 인스턴스 변수를 사용할 수 없다.

10. 인터페이스에 대해서 아는대로 설명하고, 인터페이스, 추상클래스, enum의 차이점에 대해서 설명해보세요.

추가예정

11. synchronize VS asynchronize / blocking VS non blocking 차이점

추가예정

12. 동시성 문제가 발생 할 수 있는 상황 2개 예시 들어보세요.

추가예정

13. 직렬화가 무엇이고 왜 해야되는지 설명해보세요.

추가예정

14. error와 exception이 어떻게 다른지 설명하고 어떻게 처리할 수 있는지에 대해 설명해보세요.

에러는 프로그램 코드로 처리할 수 없는 심각한 조건이다.
예외는 프로그램 코드로 처리할 수 있는 예외적인 상황이다. 둘의 중요한 차이점은 시스템에 문제가 생겨서 발생한 것인가, 런타임 중 코드에 의해서 발생한 것이냐의 차이다.
런타임 중 에러를 대처할 수 있는 방법은 없고, 최대한 에러가 발생하지 않게 처리해야 한다.
Exception은 try-catch-throw키워드를 사용해 처리할 수 있다. 이를 예외처리라고 한다.

15. String str = ""; 과 String str = new String(""); 두 코드가 같은지 다른지 설명하고 자세한 동작원리에 대해서 설명해보세요.

String은 매우 특별한 Reference DataType이다. Primitive Type이 아니지만 비슷한 느낌을 준다.
그러나 어디까지나 인스턴스이기 때문에 String 객체는 Heap 영역에 생성된다. 그런데 String 객체는 한번 생성되면 수정되지 않는다.
예를 들어, String str1 = "str" 일때 str1 = str1 + str1 라는 expression은 str1이 "strstr"이라는 값을 가지는 String 인스턴스를 생성해 참조하게 만든다.
이는 새로운 객체를 새롭게 계속 만들어 내기 때문에 메모리 관리 측면에서 상당히 비효율적이다. 이를 해결하기 위한 메모리 영역이 Heap내부에 있는 String Constant Pool이다.
여기에는 기존에 만들어진 문자열 값이 저장되어 있고, str1같은 리터럴로 생성된 같은 값을 가지는 객체는 같은 인스턴스를 참조하게 된다.
하지만 new키워드를 사용해서 String을 생성하게 되면 String Constant Pool에 생성 되지 않고 Heap 영역에 생성되게 된다.

profile
서두르지 말고 한 단계 한 단계 차근차근

0개의 댓글