본문 바로가기
스터디일지

CS 면접 질문 대비 1번 ~ 10번

by 똥쟁이핑크 2023. 10. 11.

기술 면접을 준비해야 하는 입장에서 프로젝트도 해야 하니 정신없지만 

내 답변과 모범답안을 보고 잘못된 지식은 바로 잡고 채워나가야겠다.

하루에 적어도 하나씩 채워나가 보자~!!

 

  1. Call by reference란 무엇이고 보통 어떻게 쓰이나요?
    - 나의 답변 :
    int a = 1;이라 했을 때 직접 변수의 값인 1을 사용하지 않고 a의 주소값에 접근하여 해당 값을 사용하는 것을 Call by reference라고 한다.
    참고한 사이트 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9E%90%EB%B0%94%EB%8A%94-Call-by-reference-%EA%B0%9C%EB%85%90%EC%9D%B4-%EC%97%86%EB%8B%A4-%E2%9D%93

    - 모범 답안 :
    ---### Call by reference란?
    ---친구에게 책을 빌려주는 상황이라 가정하자 2가지 방법으로 책을 빌려줄 수 있을 것이다.
    첫 번째는 책을 직접 가져다주는 것이다. 복사해서 말이다. 두 번째는 책이 있는 자신의 집 주소를 알려주는 것이다.
    두 번째 경우에는 친구가 책을 보고 해당 책을 수정하면 내 원래 책에도 변화가 생긴다 같은 책이니 말이다.
    Call by reference는 후자와 같다고 할 수 있다.

    ---### Call by Reference를 사용하는 이유는?
    ---Call by Reference는 책을 빌리는 상황처럼 주소만을 다루기에 아까와 동일한 상황에서 거대한 책을 직접 옮길 필요도 복사할 필요도 없다.
    프로그램 적으로 보면 배열이나 객체와 같이 큰 데이터를 전달할 때 복사하는 시간도 메모리도 절약할 수 있다. 이런 점이 Call By Reference를 사용하는 이유이다.---

  2. Override와 Overload를 설명해 주실 수 있을까요?
    - 나의 답변 : 
    Overload - 메서드의 이름은 같으나 자료형이나 인자의 수가 다른 경우, 즉 매개변수가 다르면 얼마든지 정의하여 사용할 수 있다. 특징은 메서드 이름이 같고 리턴형은 같거나 달라도 된다. 파라미터가 같은 경우는 데이터 타입이 달라야 하지만 그렇지 않다면 파라미터 개수가 다르면 된다. 
    Override - 상위클래스의 메서드와 함수를 하위 클래스에 재 정의 하여 사용하는 것을 말하는데 상속관계에 있는 클래스 간에 같은 이름의 메서드를 정의하는 것을 말한다.
    특징은 상위 클래스에 해당 메서드가 존재해야 하고 메서드 이름, 파라미터의 개수와 데이터 타입, 그리고 리턴형이 같아야 한다.
    참고한 사이트 : https://brunch.co.kr/@kimkm4726/2

    - 모범 답안 :
    **오버로드(Overload) : 메서드의 이름은 같고 파라미터의 개수나 타입이 다른 함수를 정의하는 것을 의미한다. (리턴값만을 다르게 갖는 오버로드는 작성할 수 없다.)**-
    **오버라이드(Override) : 상위 클래스의 메서드를 재정의 하는 것이다.**
    **메서드의 이름은 물론 파라미터의 개수나 타입도 동일해야 하며, 주로 상위 클래스의 동작을 상속받은 하위 클래스에서 변경하기 위해 사용된다.**-
    **오버로딩(Overloading)은 기존에 없던 새로운 메서드를 정의하는 것이고, 오버라이딩(Overriding)은 상속받은 메서드의 내용만 변경하는 것이다.**


  3. JPA는 언제 필요하고 언제 필요하지 않은지 설명해 주실 수 있을까요?
    - 나의 답변 :
    JPA 가 필요한 이유는 장점 때문이다. JPA는 내부에서 JDBC API를 사용해서 SQL을 호출하고 DB와 통신하기 때문에 1) SQL을 따로 작성할 필요가 없고
    2) 조회된 결과를 객체로 매핑하는 작업도 대부분 자동으로 처리해 주기 때문에
    3) SQL이 아닌 객체 중심으로 개발할 때 편하게 쓸 수 있다.(SQL의 의존성이 낮아진다.
    4) 그래서 결과적으로 생산성이 증가하고
    5) 유지보수가 쉬워진다.
    필요하지 않은 이유는 설계가 잘못된 경우인데 이때 사용하게 되면 속도 저하 및 일관성을 무너뜨릴 수도 있는 문제점이 발생할 수 있고 복잡하고 무거운 Query문은 속도 개선을 위해 튜닝이 필요하므로 SQL문을 쓰는 게 더 나을 수도 있다.
    참고한 사이트 : https://baby9235.tistory.com/67, https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/

    - 모범 답안 :
    JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준입니다
    JPA가 필요하지 않은 경우는 다음과 같습니다.
    1. 간단한 프로젝트: 작은 규모의 프로젝트에서는 JPA를 사용하지 않고 JDBC와 SQL을 직접 다루는 것이 좋습니다.
    2. 쿼리가 복잡하지 않은 경우: 간단한 쿼리로 데이터베이스와 상호작용할 때는 JPA를 사용하는 대신 직접 SQL을 작성하는 것이 더 효과적일 수 있습니다.
    3. 성능이 매우 중요한 경우: JPA는 객체와 데이터베이스 간의 변환을 처리하는데 일정한 오버헤드가 발생할 수 있습니다.
    매우 높은 성능을 요구하는 애플리케이션의 경우 직접 SQL을 작성하는 것이 더 효율적일 수 있습니다.
    JPA는 객체 중심적인 애플리케이션 개발을 가능하게 하므로 아래와 같을 때 필요합니다.
    1. 복잡한 데이터베이스 관계: 데이터베이스 테이블 간에 복잡한 연관 관계가 있을 때, 복잡한 조인 쿼리를 작성할 필요가 없어집니다.
    2. CRUD 작업이 자주 발생하는 경우: CRUD 작업을 수행할 때 JPA는 객체와 데이터베이스 간의 변환을 자동으로 처리해 줍니다.
    3. 유지보수가 용이한 코드: JPA를 사용하면 데이터베이스 스키마의 변경에 대응하기 쉽습니다. 데이터베이스 스키마가 변경되더라도 Java 코드는 변경하지 않고 JPA 설정만 업데이트하면 됩니다.
    4. 패러다임 불일치 해결: 객체는 상속 구조를 만들 수 있으며, 다형성 구현이 가능하지만, 관계형 데이터베이스의 테이블은 상속이라는 개념이 존재하지 않습니다.
    객체는 참조를 통해 관계를 표현하며 방향을 가지고 있으나, 관계형 데이터베이스는 외래 키를 통해 관계를 표현하며, 방향이 존재하지 않습니다.
    JPA는 객체 간의 상속과 다형성을 데이터베이스에서 표현할 수 있게 해 줘, 객체 중심적으로 데이터베이스를 다룰 수 있게 해 줍니다.


    1) 언제 필요한가?
    (1) 생산성 JDBC 방식의 경우 SQL 쿼리문을 직접 작성해야 데이터베이스에 접근할 수 있지만 JPA는 쿼리문을 별도로 작성할 필요가 없기 때문에 간단한 메서드를 통해 CRUD가 가능하므로 생산성이 높아진다
    (2) 유지보수 JPA를 사용하지 않으면 엔티티 클래스의 필드가 변경되면 모든 SQL을 수정해야 했다 하지만 JPA에서는 쿼리를 직접 작성하지 않기 때문에 필드가 변경되더라도 매핑 정보만 잘 연결하면 SQL 문은 자동으로 작성된다
    (3) 패러다임의 불일치 문제 해결 상속, 연관관계, 객체 그래프탐색, 비교 등의 설계 차이로 인해 발행하는 패러다임 불일치 문제를 해결한다 - 객체는 상속 구조를 만들 수 있으며, 다형성 구현이 가능하지만 관계형 데이터베이스의 테이블은 상속이란 개념이 존재하지 않는다
    - 객체는 참조를 통해 관계를 표현하며 방향을 가지고 있으나, 관계형 데이터베이스는 외래키를 통해 관계를 표현하며, 방향이 존재하지 않는다 또한, 다대다 관계 문제를 해결하기 위해 조인을 사용한다.
    이와 같이 객체와 데이터베이스는 서로 다른 목적을 가지고 설계되었기 때문에 매핑하는 데 있어 여러 문제가 발생하는데 JPA를 사용하면 이런 문제를 모두 해결할 수 있다

    2) 언제 필요하지 않은가?
    (1) 간단한 응용프로그램 개발 작은 규모의 응용프로그램이나 프로토타입을 개발할 때는 JPA의 추가 복잡성은 필요하지 않을 수 있으며 직접 SQL을 작성하거나 경량 데이터베이스를 사용하는 것이 더 효율적일 수 있다
    (2) 성능문제 JPA는 간단한 쿼리를 실행할 때에도 ORM 오버헤드가 발생할 수 있다 응용프로그램의 성능이 매우 중요하다면 직접 SQL을 작성하거나 JPA 기능의 최적화가 필요하다
    (3) 기존 데이터베이스 스키마와의 제한 기존 데이터베이스 스키마가 복잡하거나 ORM과 어울리지 않는 경우, JPA 사용이 어려울 수 있다 이 경우 기존 스키마에 맞게 직접 SQL을 작성하는 것이 좋다
    (4) ORM의 학습곡선 ORM 기술은 학습곡선이 있을 수 있으며 처음 개발자에게는 추가 학습 시간이 필요하므로 간단한 프로젝트에는 도입하지 않는 것이 좋다
    * JPA란? Java에서 사용하는 ORM(Object Relational Mapping) 기술표준 Java 애플리케이션과 JDBC 사이에서 동작하며 자바 인터페이스로 정의됨
    * ORM(Object Relational Mapping) 이란?
    1) 객체와 관계형 데이터베이스의 데이터를 매핑하는 기술
    2) ORM 프레임워크가 객체와 데이터베이스 중간에서 매핑
    3) 객체와 테이블을 매핑하여 패러다임 불일치 문제를 해결
    * JDBC 자바 프로그램이 데이터베이스와 연결되어 데이터를 주고받을 수 있게 해주는 프로그래밍 인터페이스 응용 프로그램과 DBMS 간의 통신을 중간에서 번역해 주는 역할
    *DBMS 데이터베이스를 관리하고 운영하는 소프트웨어
    * 데이터베이스 스키마 관계형 데이터베이스에서 데이터가 구조화되는 방식을 정의한다 여기에는 테이블 이름, 필드, 데이터 유형 그리고 이러한 엔티티 간의 관계 등 논리적 제약조건이 포함된다
    일반적으로 스키마는 시각적 표현을 사용하여 데이터베이스의 아키텍처를 전달하며, 조직의 데이터 관리 규율의 기반이다 이 데이터베이스 스키마 설계 프로세스를 데이터 모델링이라고도 한다

  4. JPA의 더티 체킹이란 무엇인가요?
    - 나의 답변 :
    Transaction 안에서 Entity에 변경이 일어나면 변경 내용을 알아서 자동으로 DB에 반영하는 JPA의 특징이다. 무조건 다 일어나는 것은 아니고 영속성 컨텍스트에 있는 Entity를 대상으로 일어나고 Transaction 안에서만 일어나기 때문에 @Transaction 등으로 묶어주고 변경해야 적용이 된다.

    참고한 사이트 : https://velog.io/@_koiil/JPA-%EB%8D%94%ED%8B%B0-%EC%B2%B4%ED%82%B9-Dirty-Checking

    - 모범 답안 :
    ---### JPA 더티 체킹이란?---
    JPA에서 제공하는 매우 중요한 기능 중 하나이다. 영속성 컨텍스트에서 관리되는 엔티티가 변경되었을 때 변경을 감지하고 DB에 반영하는 기능이다.
    ---### JPA 더티 체킹의 핵심요소---
    1. 영속성 컨텍스트
    JPA에서는 Entity Manager를 통해 데이터 베이스 작업을 처리한다. Entity Manager는 내부적으로 영속성 컨텍스트라는 메모리 영역을 가지며 이 안에 데이터베이스로부터 조회한 Entity 객체들이 저장되어 있다.

    2. 영속 상태의 엔티티
    Entity Manager에 의해 관리되는 Entity 객체를 영속 상태라고 한다. 이 상태의 Entity 객체는 JPA 더티 체킹의 대상이 된다.

    3. 변경 감지
    영속성 컨텍스트의 영속 관계의 Entity 객체의 값이 변하게 되면 JPA는 트랜젝션 커밋시점에 이를 감지하고 변경된 내용을 DB에 반영한다. 이렇게 **변경을 자동으로 감지하고 DB에 반영하는 기능**을 `더티 체킹`이라고 한다.---


  5. JVM 이란 무엇이고 왜 필요한지 설명해 주실 수 있을까요?
    - 나의 답변 :
    JVM 은 자바를 실행하기 위한 가상 컴퓨터인데 사용자가 사용하는 컴퓨터의 OS가 다 다르기 때문에 OS에 맞게 자바 파일을 컴파일하여 실행할 수 있게 해 준다.

    참고한 사이트 : https://yang-droid.tistory.com/48

    - 모범 답안 :
    ---### JVM이란?---
    JVM이란 `자바 바이트 코드(.class)`를 `기계어`로 변환해서 실행시켜 줄 수 있는 `가상의 실행 환경`이다.
    즉 **자바프로그램이 실행하기 위한 가상 환경을 제공**한다.
    ---### JVM의 필요성---
    1. JVM은 각 운영체제와 중간에서 `인터페이스 역할`을 하기에 특정 운영체제에 종속적이지 않고 그로 인해 자바 프로그램이 여러 플랫폼에서 안정적으로 동작할 수 있다.
    2. `JIT 컴파일러`를 보유하고 있어 프로그램 실행 중 `바이트 코드`를 `효율적인 기계어`로 바꾸어주고 이로 인해 실행 속도를 높여 `성능 최적화`가 가능해진다.
    3. 사용되지 않는 메모리를 자동으로 회수하는 `가비지 컬렉션` 기능을 통해 개발자는 메모리 관리에 신경 쓰지 않고 개발에만 집중할 수 있다.
    4. Scala, Kotlin, Groovy와 같은 다른 언어도 JVM에서 동작 가능하여 자바는 JVM으로 인해 많은 라이브러리와 프레임 워크를 통합적으로 사용할 수 있게 되었다.
    5. 바이트코드로 변환되는 과정에서 여러 검사와 최적화가 이루어지므로 시스템을 보다 안전하게 유지할 수 있다.---


  6. Java가 컴파일되는 과정은 어떻게 되는지 설명해 주실 수 있을까요?
    - 나의 답변 :
    1) 자바 파일(.java) 파일을 작성하고 → 2) 자바 컴파일러가 작성된 파일을 바이트 코드로 (.class)로 컴파일한다. 이때 .class는 컴퓨터가 아닌 JVM이 읽을 수 있는 코드다 → 3) 바이트 코드가 JVM의 클래스 로더로 전달이 되고 → 4) 클래스 로더는 JVM의 메모리에 바이트 코드를 올린다. → 5) 그리고 실행 엔진은 메모리에 올라온 바이트 코드를 명령어 단위로 하나씩 가져와서 실행하게 된다. 이 과정이 컴파일이 되는 과정이다.

    참고한 사이트 : https://yang-droid.tistory.com/48

    - 모범 답안 :
    먼저, 프로그래머가 자바 소스 코드를 .java 확장자로 작성합니다.
    Java 컴파일러에 의해 소스 코드가 플랫폼 독립적인 중간 언어인 바이트 코드로 번역되어 .class 파일로 저장됩니다. 컴파일된 .class 파일은 클래스 로더에 의해 JVM의 메모리 영역으로 로딩됩니다.
    이때, 클래스 파일의 내용은 메모리에 운반되고 실행 준비가 상태가 됩니다.
    JVM은 바이트 코드를 읽어 들이고, 인터프리터를 사용하여 바이트 코드를 실행합니다.
    이 과정에서 바이트 코드는 기계어로 번역되지 않고 직접 해석됩니다.
    이것은 자바의 플랫폼 독립성을 보장하는 중요한 부분입니다.
    실행 중에, JVM은 JIT (Just-In-Time) 컴파일러를 활용하여 반복 실행되는 코드 블록을 더 효율적인 기계어로 컴파일합니다.
    이렇게 컴파일된 코드는 메모리에 캐싱되어 성능을 향상시킵니다.
    바이트 코드가 기계어로 번역된 후, JVM은 프로그램을 실행합니다. 프로그램은 자바 언어로 작성된 기능을 수행하게 됩니다.


  7. JVM의 스택과 힙메모리 영역에 대해 아는 만큼 설명해 주실 수 있을까요?
    - 나의 답변 :
    Stack 영역은 정적으로 할당된 메모리 영역이고 Heap은 동적으로 할당된 메모리 영역이다.
    Stack 영역은 Primitive 타입의 데이터가 값과 같이 할당되고 메모리는 Thread당 하나씩 할당된다. 각 Thread 끼리는 서로 접근할 수가 없다.
    Heap 영역은 Object 타입의 데이터가 할당되고 Object를 가리키는 참조변수가 Stack영역에 할당이 된다.
    또한 Heap 영역은 Stack처럼 Thread당 하나씩 있는 게 아니고 Thread가 여러 개이고 Heap 영역은 하나만 존재한다.

    참고한 사이트 : https://devkingdom.tistory.com/226

    - 모범 답안 :
    **Stack의 경우에는 정적으로 할당된 메모리 영역이다. Stack에서는 Primitive 타입 (boolean, char, short, int, long, float, double)의 데이터가 값이랑 같이 할당이 되고, 또 Heap 영역에 생성된 Object 타입의 데이터의 참조 값이 할당된다. 그리고 Stack의 메모리는 Thread당 하나씩 할당된다.
    만약 새로운 스레드가 생성되면 해당 스레드에 대한 Stack이 새롭게 생성되고, 각 스레드끼리는 Stack 영역을 접근할 수가 없다.
    Heap의 경우에는 동적으로 할당된 메모리 영역이다.
    힙 영역에서는 모든 Object 타입의 데이터가 할당이 된다. (참고로 모든 객체는 Object 타입을 상속받는다.)
    Heap 영역의 Object를 가리키는 참조변수가 Stack에 할당이 된다.
    애플리케이션에서의 모든 메모리 중에서 Stack에 쌓이는 애들 빼고는 전부 이 Heap 쌓인다고 보면 된다.**
    **자바의 메모리 구조는 메서드영역, 스택영역, 힙영역으로 구성된다.**-
    **메서드(Method) 영역 : Static 영역이라고도 하며 전역 변수와 정적 멤버변수(static 변수)가 저장되는 영역이다.**-
    **스택(Stack) 영역 : 지역변수, 인자값, 리턴값이 저장되는 영역이고 메서드 안에서 사용되는 기본형 변수들이 값과 함께 저장되고 Heap 영역에 생성된 객체들을 참조하는 주소값이 할당된다.**-
    **힙(Heap) 영역 : 자바 프로그램에서 사용되는 모든 인스턴스 변수(객체)들이 저장되는 영역이며 자바에서는 new를 사용하여 객체를 생성하면 힙 영역에 저장된다. 힙 영역은 메모리 공간이 동적으로 할당되고 해제되며 메모리의 낮은 주소에서부터 높은 주소로 할당이 이루어진다**

  8. 클래스와 인스턴스의 차이에 대해 설명해 주실 수 있을까요?
    - 나의 답변 : 
    클래스는 Object를 만들기 위한 틀이고 필드와 메서드로 이루어져 있다. 필드와 메서드는 생략되거나 하나 이상 작성될 수도 있다. 
    인스턴스는 틀에 생성된 Object하나하나를 인스턴스라고 부른다. 인스턴스는 현실에 있는 객체를 소프트웨어 내에서 구현한 실체라고 생각할 수 있다.

    참고한 사이트 :  https://velog.io/@dongvelop/Java-%ED%81%B4%EB%9E%98%EC%8A%A4-%EA%B0%9D%EC%B2%B4-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4

    - 모범 답안 :
    클래스는 객체를 만들어 내기 위한 설계도 혹은 틀이라고 할 수 있으며, 연관되어 있는 변수와 메서드의 집합입니다. 인스턴스는 클래스를 바탕으로 구현된 구체적인 실체이며, 하나의 클래스를 통해서 다양한 인스턴스들을 만들 수 있습니다.
    다양한 인스턴스가 만들어진다 한들, 서로 다른 행동을 할 수 있게 되니 재활용성을 더욱 높일 수 있습니다.

  9. Garbage Collector의 역할, 원리, 알고리즘에 대해 아는 만큼 설명해 주실 수 있을까요?
    -나의 답변 : 
    Garbage Collector의 역할은 메모리에 있는 데이터 중 메모리 누수를 방지하기 위해 불필요한 것들을 정리해 준다.
    Garbage Collector가 실행될 때는 1) Garbage Collector를 실행하는 Thread를 제외하고 모든 Thread 작업이 중단된다. 2) Garbage Collector가 완료되면 다시 작업이 재개된다.
    1)에서 2)로 넘어갈 때는 식별하는 작업과 해제되는 작업이 진행되는데 식별에서는 사용되는 메모리와 그렇지 않은 메모리를 식별하게 된다. 그리고 사용되지 않는 메모리를 해제하는 작업을 하게 된다.


    참고한 사이트 : https://flightsim.tistory.com/240,https://mangkyu.tistory.com/119

    - 모범 답안 : 
    1) Garbage Collector의 역할 자동 메모리 관리 시스템으로 힙(Heap) 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스
    (1) 특징
    (a) 동작은 자바에 의해 자동 실행되고 어느 시점에 어디에서 시작할지에 따라 다르다
    (b) 동작하면 애플리케이션에 있는 모든 스레드들은 잠시 중단된다

    2) Garbage Collector의 원리
    Mark And Sweep 이란 다양한 GC에서 사용되는 객체를 솎아내는 내부 알고리즘이며 아주 기초적인 청소과정이다
    대상 객체를 식별(Mark) 하고 제거(Sweep) 하며, 객체가 제거되어 파편화된 메모리 영역을 앞에서부터 채워나가는 작업(Compaction)을 수행한다
    (1) Mark 과정 : 먼저 Root Space로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 참조하고 있는지 마킹함
    (2) Sweep 과정 : 참조하고 있지 않은 객체 즉 Unreachable 객체들을 Heap에서 제거
    (3) Compact 과정 : Sweep 이후 분산된 객체들을 heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축함 (GC의 종류에 따라 하지 않는 경우도 있다)

    3) Garbage Collector의 동작과정
    (1) 힙(Heep) 메모리 구조
    A) Young - 새롭게 생성된 객체가 할당되는 영역 - 대부분의 객체가 금방 (Unreachable) 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라짐 - Young 영역에 대한 GC를 Minor GC라고 부른다 - Young 영역을 3가지 영역으로 나눔
    (a) Eden - new를 통해 새로 생성된 객체가 위치 - 정기적인 쓰레기 수집 후 살아남은 객체들은 Survivor 영역으로 보냄
    (b) Survivor 0 / Survivor 1 - 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역 - 특별한 규칙이 있는데 Survivor 0 / Survivor 1 둘 중 하나에는 꼭 비어있어야 한다
    B) Old - Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역 - Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다
    크게 할당되는 이유는 Young 영역의 수명이 짧은 객체들은 큰 공간을 필요하지 않으며 큰 객체들은 바로 Old 영역에 할당되기 때문 - Old 영역에 대한 GC를 Major GC 또는 Full GC라고 부른다

    3) Garbage Collector의 알고리즘 자바의 발전에 따라 힙(Heap)의 사이즈가 커지면서 애플리케이션의 지연 현상이 두드러지게 되었고 이를 최적화하기 위해 다양한 알고리즘이 개발되었다
    (1) Serial
    (a) 서버의 CPU 코어가 1개일 때 사용하기 위해 개발된 가장 단순한 GC
    (b) GC를 처리하는 스레드가 1개 여서 가장 stop-the-world 시간이 길다
    (c) Minor GC에는 Mark-Sweep를 사용하고, Major GC에는 Mark-Sweep-Compact를 사용한다
    (d) 보통 실무에서 사용은 거의 하지 않는다 (디바이스 성능이 안 좋아서 CPU 코어가 1개인 경우에만 사용)

    (2) Paraller GC
    (a) Java 8의 디폴트 GC
    (b) Serial GC와 기본적인 알고리즘은 같지만 Young 영역의 Minor GC를 멀티 스레드로 수행 (Old 영역은 싱글스레드)
    (c) Serial GC에 비해서 stop-the-world 시간 감소

    (3) Paraller Old GC (Parallel Comacting Collerctor)
    (a) Paraller GC를 개선한 버전
    (b) Young 영역뿐만 아니라 Old 영역에서도 멀티 스레드로 GC 수행
    (c) 새로운 가비지 컬렉션 청소 방식인 Mark-Summary-Compact 방식을 이용 (Old 영역도 멀티 스레드)

    (4) CMS GC (Concurrent Mark Sweep)
    (a) 애플리케이션의 스레드와 GC 스레드가 동시에 실행되어 stop-the-world 시간을 최대한 줄이기 위해 고안됨
    (b) 단 GC 과정이 매우 복잡해짐
    (c) GC 대상을 파악하는 과정이 복잡한 여러 단계로 수행되기 때문에 CPU 사용량이 높다
    (d) 메모리 파편화 문제가 있음 (e) Java 9 버전부터 depreacted 되었고 Java 14에서는 사용이 중지됨

    (5) G1 GC (Garbage First)
    (a) CMS GC를 대체하기 위해 jdk 7 버전에서 최초로 release 된 GC
    (b) Java 9+ 버전의 디폴트 GC
    (c) 4GB 이상의 힙 메모리, Stop the World 시간이 0.5초 정도 필요한 상황에 사용 (Heap이 너무 작을 경우 미사용 권장)
    (d) 기존의 GC 알고리즘에서는 Heap 영역을 물리적으로 고정된 Young / Old 영역으로 나누어 사용했지만 G1 GC는 아예 이러한 계념을 뒤엎는 Region이라는 개념을 도입해 사용

    (6) Shenandooh GC
    (a) Java 12에 release
    (b) 레드 햇에서 개발한 GC
    (c) 기존 CMS가 가진 단편화, G1이 가지 pause의 이슈를 해결
    (d) 강력한 Concurrency와 가벼운 GC 로직으로 Geap 사이즈에 영향을 받지 않고 일정한 pause 시간 소요가 특징

    (7) ZGC (Z Garbage Collector)
    (a) Java 15에 release
    (b) 대량의 메모리 (8MB ~ 16TB)를 low-latency로 잘 처리하기 위해 디자인된 GC
    (c) G1의 Region처럼 Z page라는 영역을 사용하며 G1의 Region은 크기가 고정인데 비해 2mb 배수로 동적으로 운영됨 ( 큰 객체가 들어오면 2^으로 영역을 구성해서 처리)
    (d) 최대 장점 중 하나는 Heap 크기가 증가하더라도 stop-the-world의 시간이 절대 10ms를 넘지 않는다는 것 * stop-the-world GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상 GC가 작동하는 동안 GC 관련 Thread를 제외한 모든 Thread는 멈추게 되어 서비스 이용에 차질이 생길 수 있다 * Region 전체 Heap 영역을 체스 같이 분할하여 상황에 따라 Edan, Survivor, Old 등 역할을 고정이 아닌 동적으로 부여

  10. Java Map의 내부 구현은 어떻게 이루어져 있을지 추측해 보실 수 있을까요?
    - 나의 답변 :
    Map은 <Key, Value> 구조로 되어 있고 이 형태로 데이터를 저장하게 된다. 그래서 Key를 이용한 데이터 검색을 할 수 있으나 중복된 Key는 존재할 수 없기에 Value를 저장할 때는 기존에 있는 값을 지워지고 새로운 Value값이 저장된다.
    Map의 종류 중에 HashMap은 Hash Table을 이용해서 데이터를 저장하고 Table에는 Key, Value값으로 저장이 되는데 Bucket이라는 것을 이용하여 Index에 Key와 Value를 저장할 수 있다.
    TreeMap은 node의 연결로 이루어져 LinkedList와 비슷하다. Node에는 Key와 Value가 저장되며 Key 값을 기준으로 좌측과 우측으로 구분해서 저장된다. 
    LinkedHashMap은 HashMap을 상속해서 만들어진 클래스로 HashMap의 특징을 가지고 있다. 또한 객체를 Entry객체로 감싸서 저장된 키의 순서를 보존한다.

    참고한 사이트 : https://jindevelopetravel0919.tistory.com/44

    -모범 답안 :  내 거

[Java] Java Map 내부 구현 파악

Java 에는 Map 이라는 인터페이스 도구가 있다. 대표적으로 Map, HashMap, TreeMap, LinkedHashMap이 있다. 각 Map 인터페이스들의 구조에 대해 정리해보자. Map 기본적으로 Map은 key-value 구조로 구성되어 데이

jindevelopetravel0919.tistory.com

 

 

'스터디일지' 카테고리의 다른 글

CS 면접 질문 대비 21번 ~ 30번  (1) 2023.10.25
CS 면접 질문 대비 11번 ~ 20번  (0) 2023.10.24
Docker 사용해보기  (0) 2023.10.07
MSA란 무엇인가??  (0) 2023.10.05
[WIL] 팀프로젝트를 진행하며....  (0) 2023.09.24