Java 기술 면접

데일리·2022년 5월 2일
0

기술 지식

목록 보기
5/6

1. Java의 장단점

  • 운영체제가 독립적이다.
    • JVM에서 동작하기 때문에, 특정 운영체제에 종속되지 않는다.
  • 객체지향 언어이다.
    • 객체지향으로 프로그래밍 하기 위해 다양한 지원을 한다(캡슐화, 상속, 추상화, 다형성....)
  • 자동적으로 메모리 관리를 해준다.
    • Garbage Collector라고 불리는 데몬 쓰레드에 의해 GC가 일어난다.
    • GC로 인해 별도의 메모리 관리가 필요 없으며 비즈니스 로직에 집중 할 수 있다.
  • 오픈 소스이다.
    • JDK가 오픈소스
    • 이로 인해 많은 개발자 포럼이 형성되어 있다.
  • 멀티 스레드를 쉽게 구축할 수 있다.
    • 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 때문에 실행되는 운영체제와는 상관없이 쉽게 멀티 스레드를 구현할 수 있다.
  • 동적 로딩을 지원한다.
  • 단점
    • 비교적 속도가 느리다.
      • 자바는 한 번의 컴파일링으로 실행 가능한 기계어가 만들어지지 않고 JVM에 의해 기계어로 번역되고 실행되는 과정을 거치기 때문에 속도가 느리다.
    • 예외 처리가 불편하다.
      - 예외를 직접 선언해야만된다.

2. Java의 제어자의 종류와 특징

  • public: 어떤 클래스의 객체에서도 사용 가능
  • private: 이 클래스에서만 생성된 객체가 사용 가능
  • protected: 이 클래스와 동일 패키지에 있거나 상속관계에 있는 하위 클래스에서만 접근 가능
  • package: 동일 패키지에 있는 클래스만 접근 가능

3. OOP의 4가지 특징

  • 추상화: 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념 집합으로 다루는 것
  • 캡슐화: 정보 은닉: 필요가 없는 정보는 외부에서 접근하지 못하도록 제한 하는 것
  • 일반화 관계: 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정
  • 다형성: 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력

4. non-static, static 차이

  • non-static
    • 공간적 특성: 객체마다 별도로 존재
      • 인스턴스 객체라고 불림
    • 시간적 특성: 객체 생성 시에 멤버가 생성된다.
      • 객체가 생길 때 멤버도 생성
      • 객체 생성 후 멤버 사용이 가능하다.
      • 객체가 사라지면 멤버도 사라진다.
    • 공유의 특성:
      • 공유되지 않는다.
  • static
    • 공간적 특성: 클래스마다 하나가 생성
      • 객체 내부가 아닌 별도의 공간에서 생긴다.
      • 클래스 객체라고 불린다.
    • 시간적 특성: 클래스 로딩 시에 멤버가 생성
      • 객체가 생기기 전에 생성된다.
      • 객체가 생기기전에 사용 가능(즉 객체를 생성하지도 않고 사용 가능)
      • 객체가 사라져도 멤버는 사라지지 않는다.
      • 멤버는 프로그램이 종료될 때 사라진다.
    • 공유의 특성
      • 동일한 클래스의 모든 객체들에 의해 공유된다.
  • final: 객체가 변경 불가능 하도록 만들게 하는 것
    • 원시 변수: 해당 변수는 변경 불가능
    • 참조 변수: 참조 변수가 힙 내의 다른 객체를 변경할 수 없다.
    • 메서드: 오버라이드 할 수 없다.
    • 클래스: 해당 클래스에 하위 클래스를 만들 수 없다.

5. 추상 클래스와 인터페이스의 차이

  • 추상 클래스
    • 상속을 위한 클래스 -> 따로 객체를 생성할 수 없다.
    • 단일 상속만이 가능
    • 모든 접근 제어자를 사용
    • 변수와 상수 선언 가능
    • 추상 메소드와 일반 메소드를 선언할 수 있다.
  • 인터페이스
    - 다중 구현 가능
    - public 접근 제어자만 사용 가능
    - 상수만 선언 가능
    - 추상 메소드만 선언 가능
    => 구분하는 이유는 다중 상속 가능 여부에 따라 용도를 정한다.

5. JVM 영억

  • 메소드 영역: 클래스 변수의 이름, 타입, 접근 제어자 등과 같은 클래스와 관련된 정보 저장
  • 힙 영역: new를 통해 생성된 객체와 배열의 인스턴스를 저장, 가비지 컬렉터는 힙 영역을 청소
  • 스택 영역: 메소드가 실행되면 스택에 1개 씩 쌓인다. 메소드의 리턴 값, 지역 변수, 매개변수 등이 저장
  • PC register: 현재 쓰래드가 실행되는 부분의 주소와 명령을 저장
  • Native Method Stack: 자바 외의 언어로 작성된 코드를 위한 메모리

6. GC

  • 메모리를 정리하는 과정
  • Eden 영역이 꽉차면 Minor GC, Old 영역이 꽉차면 Major GC를 수행
  • 일반적으로 메모리의 사용을 중단한 채로 진행
  • JVM은 GC를 실행하기 위해 애플리케이션의 실행을 멈추는 stop-the-world를 먼저 실행
  • 그 후 GC를 제외한 모든 쓰레드가 작업을 멈추가 GC가 끝나면 다시 작업을 재게
  • GC의 작업
    • Young 영역: 새롭게 생성된 객체들의 위치, 대부분의 객체는 금방 접근 불가능한 상태가 되기 때문에 많은 객체가 Young 영역에 생성되었다가 사라진다.
    • Old 영역: Young 영역에서 계속 사용되어 살아남은 객체가 복사되는 영역
  • Young 영역은 또 1개의 Eden 영역과 2개의 Survivor 영역으로 구성되는데 Young 영역에 대한 GC는 다음과 같다
    • 새로운 객체가 Eden 영역에 생성
    • Eden 영역에 GC가 동작하고 그 중에서 살아남은 객체가 Survivor 0 으로 이동
    • 2번의 동작이 반복되면 Survivor 0이 가득차게 된다.
    • Survivor 0 영역에 GC가 동작하고 살아남은 객체들은 Survivor 1으로 이동하고 Survivor 0을 비우게 된다
    • 위 동작을 반복하여 특정 횟수만큼 살아남은 객체는 Old 영역으로 이동
  • GC의 문제점
    • Survivor 영역 중 하나는 반드시 비어있는 상태로 남아야한다.
    • GC의 로그를 확인하여 옵션을 수정할 지 코드를 수정해야한다.
  • GC에 의한 시스템 중단 시간을 줄이는 법
    • Young 영역과 Old 영역의 힙 크기를 높여 GC의 빈도를 줄이기
    • 객체의 할당을 줄이기
    • 힙 크기를 늘인다고해서 GC의 시간이 늘어날 수도 있다는 생각이 들수 도 있지만, 사실 상 Minor GC의 실행 시간은 힙의 크기보다는 살아남은 객체의 수에 의해 더욱 지연되기 때문에 Young 영역의 크기를 높인다면 GC의 실행 시간과 호출 빈도를 모두 줄일 수 있다.

7. MVC 패턴

  • Model, View, Controller로 설계하는 패턴
  • 사용자가 controller를 조작하면 controller는 모델을 통해서 데이터를 가져오고 그 정보를 바탕으로 담당하는 View를 제어하여 사용자에게 전달한다.
  • Model
    • 애플리케이션의 정보, 데이터를 나타낸다.
    • 정보를 가공하는 컴포넌트
  • View
    • 사용자 인터페이스 요소를 나타낸다.
  • 컨트롤러
    • 데이터와 사용자 인터페이스 요소를 이어주ㅡㄴ다리 역할
  • 사용해야 하는 이유
    • 각자의 역할에 집중할 수 있게 구현
    • 이를 통해 유지 보수성이 높아지고 확장성이 높아진다.

8. Java 8 변화

  • 람다 표현식
    • 메소드를 하나의 식으로 표현 가능
    • 별도의 선언식 없이도 실행할 수 있는 함수 표현식(익명함수)
    • 가독성을 높여준다.
  • stream API
    • 배열이나 컬렉션 데이터들을 효과적으로 읽고 쓰기 위한 메서드
  • 나즈혼
    • 자바스크립트의 기본 엔진으로 오라클의 나즈혼이 도입된다.
  • Optional
    • null이 될 수 있는 객체를 담는 클래스
profile
하루에 한편 씩 읽기 좋은 테크 로그

0개의 댓글