본문 바로가기
Java

면접준비 - 자바

by k0o9 2022. 10. 17.

java

• Managed - Unmanaged 언어의 차이는 무엇이고 어떤 장, 단점이 있나요?

Managed Language는 코드가 하드웨어에서 구동되는 것이 아니라 특정 런타임 환경에 의해 관리되고 의존하는 언어이다. 대표적인 예로 java와 C#이 있다. Unmanaged Language는 코드가 하드웨어에서 바로 구동되어지는 언어로 c, c++이 있다.

각각의 장단점으로는 Managed 언어는 메모리를 직접 관리하지 않아도 된다는 점과 코드가 하드웨어에 의존적이지 않고 런타임환경에 의존한다는 것이고 단점으로는 메모리를 직접 관리하지 못하기에 프로그래밍의 자유도가 낮으며 비정기적인 메모리 정리가 이루어진다는 것이다.

Managed Language의 장점으로는 하드웨어에서 바로 구동되므로 속도가 빠르다는 것과 UnManaged Language에 비해 자유도가 높다는 점이다. 단점으로는 메모리를 직접 관리해야한다는 점이 있다.

• Java 접근 제어자에는 무엇이 있는지 설명해주시고 Protect와 Private는 어느 시점에 어떻게 사용될 수 있는지 이야기 해주세요.

자바의 접근 제어자에는 public, protect, private, default가 있다.

protect는 같은 패키지 또는 자식 클래스에서 사용될 수 있으며 private는 자기 자신 클래스에서만 사용될 수 있다.

• JVM의 메모리 구조에 대해서 설명해 주세요.

JVM은 클래스 로더, 실행 엔진, 가비지 콜렉터, 런타임 메모리 영역으로 이루어져있다.

클래스 로더는 클래스 파일들을 엮어서 런타임 메모리 영역으로 적재하는역할을 한다.

실행 엔진은 런타임 메모리 영역에 적재된 클래스 파일들을 기계어로 변경하여 명령어 단위로 실행하는 역할을 한다.

실행 엔진에는 인터프리터 방식과 JIT 컴파일러 방식이 있다.

가비지 콜렉터는 Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.

런타임 메모리 영역은 자바 애플리케이션을 실행할 때 사용되는 메모리 영역이다.

메모리 영역은 메소드 영역, 힙 영역, 스택 영역, PC 레지스터, 네이티브 메서드 스택으로 이루어져있다.

메서드와 힙 영역은 쓰레드가 공유하고 그 외인 스택, pc 레지스터, 네이티브 메서드 스택은 공유 되지 않고 각각 생성된다.

힙 영역은 Young Generation과 Old Generation으로 나누어 진다.

Young Generation : Object가 최초로 할당 되는 장소이며 내부에 Eden과 Survivor0과 Survivor1로 나누어진다. Eden이 꽉차면 Eden의 모든 객체 들의 참조 여부를 따져서 참조가 되어 있는 Object는 Survivor영역으로 옮기고 참조가 없는 Object는 그냥 남겨 놓고 Eden을 청소한다.

Old Generation : Young Generation 여역에서 오랫동안 살아남아 성숙한 Object는 Old Generation 영역으로 이동한다. 이를 Promotion이라고 한다.비교적 오래 살아남는 객체들을 저장하는 공간이다.

• JVM은 어떤 방식으로 코드를 해석하고 실행시키는지 흐름에 맞게 설명해 주세요. (Java 실행 흐름)

자바 파일을 자바 컴파일러가 class 파일로 변경한다. 그 후 클래스 로더에 의해 런타임 메모리 영역에 적재한다. 적재된 클래스 파일들을 실행 엔진에서 기계어로 변경하여 명령어 단위로 실행한다.

• Garbage Collector에 대해 설명하시오

:Heap 영역에 생성된 객체들 중 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.

java의 GC는 JVM 메모리 영역중 힙 영역에서 발생한다.

기본적 동작원리는 다음과 같다.

힙은 Young Generation과 Old Generation, Perm Generation(Mehtod Area의 메타 정보 기록)으로 이루어져있다.

Young Generation은 다시 Eden영역과 Survivor0과 Survivor1영역으로 이루어져 있다.

처음 객체가 생성되면 Eden영역에 생성된다. 그러다가 Eden 영역이 꽉차게 되면 살아있는 객체들은 survivor 0 으로 이동시켜고 eden영역을 초기화한다. 이때 Eden영역을 초기화하는 작업을 Minor Gc라고 한다. 이렇게 Minor GC가 발생할때 마다 Eden영역과 사용되지 않는 Survivor영역을 초기화하며 살아남은 객체들의 age값을 1씩 증가시킨다. 그러다가 age값이 특정 값을 넘긴 객체들은 Old영역으로 이동시킨다. 이러한 작업을 Promotion이라고 한다. Promotion작업을 여러번 하게되어 Old영역이 꽉차게 되면 Old 영역을 청소하는 Major GC가 발생한다.

이렇게 영역을 나눠서 GC를 구별하는 것은 FULL GC를 막기 위해서이다. FULL GC는 모든 Heap 영역이 꽉차서 풀스캔 후 삭제 하는 것이다. 풀스캔의 경우 시간이 오래걸려서 영역을 나눠서 GC 작업을 한다.

  • Java GC 알고리즘 종류
    • Serial GC
      • Minor GC, Major GC 순차적으로 진행
      • 적은 메모리와 CPU 코어 개수가 적을 때 적합한 방식.
      • Mark-Compact collection method
      • 단일 Thread가 GC를 수행.
    • Parallel GC
      • Serial GC와 기본 알고리즘 동일
      • 멀티 Thread가 GC 수행. Serial Gc에 비해 더 빠르다
    • Parallel Old Gc
      • Parallel GC와 비교하여 Old 영역의 GC만 변경.
      • Mark-Summary-Compaction 단계를 거친다.
        • Summary 단계는 GC를 수행한 영역에 대해서 살아 있는 객체를 식별한다는 점에서 Sweep 단계와 다르다.
    • CMS GC
      • inital Mark > Concurrent Mark > Remark > Concurrent Sweep 방식으로 진행되며 Concurrent Mark, Concurrent Sweep 의 경우 다른 Thread가 실행중인 상태에서 동시에 진행된다.
      • 모든 application의 response time이 중요할때 사용하며 대신 메모리와 cpu를 만히 사용한다
      • 기본적으로 compation작업이 제공되지 않는다.
    • G1GC
      • 기존 JVM 구조와는 다르게 ,Heap 영역이 1MB ~ 32MB이내의 고정된 크기로 2000여개의 영역으로 분할되어있다. 분할된 영역을 Region이라고 한다.
      • 각 Region은 기존 Heap 영역이었던 New, Survivor, Old, Perm 영역을 담당하지만 동적으로 역할이 변경될 수 있다.
      • Region 단위로 살아 있는 Object들을 다른 Region으로 copy 한 후 해당 Region을 비우는 작업을 한다.

• Java 8 버전에 추가된 중요 기능들에 대하여서 설명해주세요.

  • Lambda
  • Stream
  • interface default method
  • Optional
  • LocalDateTime

자바 버전별 특징

  • java 8
    • Lambda
      • 함수형 인터페이스를 구현하는 객체를 만들지 않고 춫상 메서드를 구현해서 해당 인터페이스 사용할 수 있는 표현식
    • Stream
      • 자바에서 일련의 데이터 요소인 배열이나 컬렉션을 처리하기 위해 함수형 스타일을 지원해주는 API이다.
      • 멀티스레드를 활용해서 병렬로 연산할 수 있으며 내부 반복으로 연산을 수행하기때문에 가독성이 증가한다.
    • interface default method
      • 인터페이스에서 메서드 정의 뿐만아니라 구현도 포함하는 메서드를 만들기 위해 사용되어 진다.
    • Optional
    • LocalDateTime
  • java 9
    • 컬렉션
    • 스트림
    • optional → ifPresentOrElse
    • interface의 private Method
    • try-catch-resources
  • java 10
    • var 키워드 추가
    • 병렬처리 GC 도입 → 성능 향상
    • JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능
  • java 11
    • Oracle JDK와 OpenJDK 통합
    • Oracle JDK가 구독형 유료 모델로 전환
    • 서드파티 JDK 로의 이전 필요
    • lambda 매개변수에 var 사용가능
  • java 13
    • 스위치 표현식 값 리턴 가능
  • java 14
    • 스위치 화살표 표준화
    • instance of 패턴 매칭
    • record 기능 추가

• String, StringBuilder, StringBuffer 차이

String : 불변

StringBuilder : 가변, 비동기 → 가장 빠름, thread safe하지 않다.

StringBuffer : 가변, 동기 → 멀티쓰레드일때 사용, thread safe하다

  • 왜 String은 불변일까?
    • 문자열 객체는 재사용될 가능성이 높기에 같은 값일 경우 어플리케이션당 하나의 String 객체만을 생성하게 만들어 힙을 절약하였다.
    • thread-safe 보장.
  • thread-safe : 멀티 스레드 환경에서 프로그램의 실행에 문제가 없어야 한다.

객체 지향 4가지 원칙

  1. 캡슐화 : 데이터 구조와 데이터를 다루는 방법을 결합시켜 묶는다.
  2. 상속 : 상위 클래스의 기능을 하위 클래스가 사용할 수 있다. 중복 코드 재사용
  3. ‘추상화 : 실제 세상을 객체화 하는게 아니라 필요한 정보들의 중심으로 추상화한다.
  4. 다형성 : 다양한 형태로 표현이 가능하다. → 오버라이딩 ,오버로딩
  • 캡슐화 은닉화 차이

: 캡슐화는 어떤 클래스를 이용함에 따라 내부의 흐름을 알 필요없이 사용한다는 특성이고 은닉화는 클래스의 내용을 수정하지 못하게 하여 무결성을 보장하는 특성이다.

객체 지향 5대 원칙

  1. SRP : 단일 책임 원칙 하나의 클래스에 역할과 책임을 많이 주지마라
  2. OCP : 확장에는 열려있지만 주변의 변화에는 닫혀있어야한다.
    • 전략 패턴
    • if else의 문제점 → 커질수록 복잡도 증가, 유지보수 힘듬.
    • 컴포지션또는 상속으로 적용 (깨지기 쉬운 상속문제로 컴포지션 추천)
      • 변경될 것과 변하지 않을 것 구분
      • 이 두 모듈이 만나는 지점에 인터페이스 정의
      • 구현에 의존하기보다 정의한 인터페이스에 의존하도록 코드 작성
  3. LSP : 하위 클래스의 인스턴스는 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다.
  4. ISP : 자신이 구현하지 않은 인터페이스는 사용하지 않아야 한다. (사용할 것만 구현하라)
  5. DIP : 추상화에 의존해라

클래스 ,객체, 인스턴스

  • 클래스 : 연관되어 있는 변수와 메서드의 집합.

  • 객체: 클래스에 선언된 모양 그대로 생성된 실체, 클래스의 인스턴스, 현실세계

  • 인스턴스: ~의 실체화 → 메모리에 할당되어 실제로 사용될때

    : 반드시 클래스와 객체 사이의 관계로 한정지어서 사용되지 않음. , 소프트웨어 세계

interface와 abstract class 차이

추상클래스

  • 사용을 요청할 때 사용, bottom up → 필요기능 모아서 집중
  • 복제(extends), DNA
  • 추상 메서드 + 일반메서드
  • 인스턴스 생성 x
  • IS - A 이다

인터페이스

  • 사용을 요청 받을 때 사용, top down → 필요 기능 구현하여서 분산
  • 설계서(implements)
  • 모조리 추상메서드
  • Has A : ~을 할 수 있는

CheckedException vs UnCheckedException

Error = 해결 할 수 없는 것.

Exception = 해결 할 수 있는 것.

Exception은 CheckedException 과 UnCheckedException이 있다.

  • checked(런타임 자식들 제외)
    • try- catch 또는 throws를 하지 않으면 컴파일 되지 않는다.
    • 트랜잭션 롤백 x
  • unchecked(Runtime 포함한 자식들)
    • 컴파일 실행이 가능하고 콘솔에서 예외발생시 표시해준다.
    • 트랜잭션 롤백

Call By Value vs Call By Reference

메서드를 호출할 때 파라미터를 전달하는 방법.

Call By Value(값에 의한 호출)

  • 함수 호출 시 변수의 값을 복사하여 함수의 인자로 전달

Call By Reference(참조에 의한 호출)

  • 함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달한다.
  • 함수 내에서 파라미터 수정 시 원본에도 반영되낟.

자바는 Call By Value이다. Reference 자체를 매개변수로 넘기는 것이 아니라 주소값만 전달해준다.

오버로딩 vs 오버라이딩

다형성과 관련된 자바의 기능

오버로딩 : 동일한 이름의 메서드를 생성. 이때 매개변수는 달라야한다.

오버라이딩 : 부모 메서드를 재구현하여 새로운 메서드로 사용. 이때 매개변수를 변경할 수 없다.

HashMap vs HashTable vs ConcurrentHashMap

  • HaspMap : thread-safe 보장 안됨, null 허용
  • HashTable : thread-safe 보장, null 허용 x, 내부에 synchronizedd를 통해 메서드 전체에 락
  • ConcurrentHashMap thread-safe 보장, null 허용 x, 성능 우수, 내부적으로 여러 개의 세그먼트를 두고 각 세그먼트마다 별도의 락을 가진다.

자바 불변객체란 무엇인가

재할당은 가능하지만 한번 할당하면 내부 데이터를 변경할 수 없다.

장점

:신뢰도 향상

:접근 메서드에 대한 방어가 필요없다.

: 멀티 스레드 환경에서 동기화 처리없이 객체를 공유할 수 있다.

단점

: 매번 객체가 생성되서 메모리 문제가 생길 수 있다.

  • String이 왜 불변일까?
  • new String() 과 “”(리터럴) 방식의 차이
    • 리터럴을 사용하면 String Constant pool 영역에 존재하게 되고 new를 사용 시 Heap 영역에 존재하게 된다. 리트럴 시 내부적으로 String의 intern()메서드가 호출된다.
    • intern()메서드는 내부적으로 String constant pool에 존재하는지 검색하고 있다면 그 주소값을 반환하고 없다면 String constant pool에 넣고 새로운 주소값을 반환한다.
  • 리플렉션 / 자바 다이나믹 프록시?
    • 리플렉션
      • 객체를 통해 클래스의 정보를 분석해내는 프로그램 기법
      • 자바 에서 JVM이 실행되면 컴파일러를 통해 JAVA파일을 클래스 파일로 변환하여 STATIC영역에 저장. 리플렉션 API는 이 정보를 활용해서 클래스 이름으로 STATIC영역을 검색하여 정보를 가져온다.
      • 지나친 사용은 성능 이슈를 야기하고 접근 지시자를 무시하여 OOP를 깰 수 있다.
    • 다이나믹 프록시
      • 런타임에 생성되는 프록시
      • JAVA의 리플렉션을 활용해서 proxy객체 생성
      • 프록시 대상의 객체가 최소 하나 이상의 인터페이스를 구현했다면 JDK 동적 프록시를 이용하면 된다.(스프링에서 ServiceImpl을 사용해야 하는 이유)

제네릭이란 왜 쓰는지 어디서 써봤는지 알려주세요

컴파일 타임에 강한 타입체크와 불필요한 캐스팅 코드를 삭제하기 위해 사용하는 기능이다.

제네릭을 지원하기 전에는 컬렉션에서 객체를 꺼낼 때마다 형변환을 해야했다.

제네릭을 사용하면 컬렉션이 담을 수 있는 타입을 컴파일러에 알려준다.

equals() vs hashCode() vs ==

== : 2개의 객체가 동일한 메모리 주소인지 확인. (동일성 비교), 프리미티브 타입을 경우에는 값이 같은지

equals() = 객체 내부의 값을 비교한다 (동등성 비교)

hashCode() = 객체를 식별하는 단 하나의 고유한 정수값, Object 클래스는 객체의 메모리 주소를 활용해서 만들어낸다.

'Java' 카테고리의 다른 글

입출력  (0) 2022.05.27
에노테이션  (0) 2022.05.27
Enum  (0) 2022.05.27
Thread  (0) 2022.05.27
예외처리  (0) 2022.05.27