기록이 힘이다.

[자바면접 및 원티드과제] 원티드 자바 과제 본문

JAVA

[자바면접 및 원티드과제] 원티드 자바 과제

dev22 2023. 6. 6. 06:16
728x90

인터프리터 방식과 컴파일 방식의 차이점을 서술해 주세요.

인터프리터 방식(Interpreter)과 컴파일 방식(Compiler)은 프로그래밍 언어 코드를 실행 가능한 형태로 변환하는 데 사용되는 두 가지 주요한 접근 방식입니다.

  1. 인터프리터 방식: 인터프리터는 프로그래밍 언어 코드를 한 줄씩 읽고 해석하여 실행합니다. 코드를 실행하기 전에 매번 번역 과정이 필요하므로 실시간으로 코드를 해석하고 실행할 수 있습니다. 인터프리터는 프로그래밍 언어의 문장을 해석하고 즉시 실행하기 때문에 개발과 디버깅이 빠르고 간편하며, 플랫폼에 종속되지 않고 어디에서나 실행할 수 있습니다. 그러나 실행 시간에 코드를 해석하므로 실행 속도가 컴파일 방식보다 상대적으로 느릴 수 있습니다. 대표적인 인터프리터 언어로는 Python, JavaScript, Ruby 등이 있습니다.
  2. 컴파일 방식: 컴파일러는 프로그래밍 언어 코드를 컴파일하여 기계어로 변환합니다. 컴파일은 전체 코드를 분석하고 번역하여 실행 파일 또는 라이브러리 형태로 생성합니다. 실행 파일은 기계어로 직접 실행되기 때문에 실행 속도가 인터프리터 방식에 비해 빠릅니다. 컴파일러는 코드를 한 번 번역하므로 실행 시간에 번역 과정이 필요하지 않습니다. 그러나 코드의 변화가 있을 때마다 재컴파일해야 하고, 특정 플랫폼에 종속적일 수 있습니다. 대표적인 컴파일 언어로는 C, C++, Java 등이 있습니다.

또한, 인터프리터와 컴파일러의 개념은 단일 접근 방식으로 제한되지 않습니다. 현대의 많은 프로그래밍 언어는 인터프리터와 컴파일러를 혼합한 형태로 사용될 수 있습니다. 예를 들어, 일부 언어는 소스 코드를 중간 표현 형태로 변환하고, 이를 인터프리터나 JIT(Just-In-Time) 컴파일러를 통해 실행합니다. 이러한 접근 방식은 실행 속도와 개발 편의성을 모두 고려할 수 있는 장점을 가집니다.

프로세스와 스레드의 차이점을 서술해 주세요.

프로세스는 운영 체제에서 실행 중인 프로그램 인스턴스이고 스레드는 하나의 프로세스 내에서 실행되는 독립적인 작업 단위로, 프로세스의 자원을 공유하면서 실행됩니다.

프로세스(Process)와 스레드(Thread)는 컴퓨팅 환경에서 동시에 실행되는 작업 단위입니다. 이 두 용어는 다음과 같은 차이점을 가지고 있습니다:

  1. 정의:
    • 프로세스: 운영 체제에서 실행 중인 프로그램 인스턴스로, 자체적인 메모리 공간, 실행 상태, 자원 및 스레드를 가지고 있습니다.
    • 스레드: 프로세스 내에서 실행되는 독립적인 작업 단위로, 프로세스의 자원을 공유하면서 실행됩니다.
  2. 자원 공유:
    • 프로세스: 각 프로세스는 독립적인 메모리 공간을 가지고 있어 자원 공유를 위해서는 명시적인 IPC(Inter-Process Communication) 기법을 사용해야 합니다.
    • 스레드: 하나의 프로세스 내에서 스레드는 공유된 메모리 공간과 자원에 직접 접근하여 데이터를 공유할 수 있습니다.
  3. 실행 환경:
    • 프로세스: 각 프로세스는 독립적인 실행 환경을 가지며, 각각의 프로세스는 독립적으로 실행될 수 있습니다.
    • 스레드: 스레드는 하나의 프로세스 내에서 실행되기 때문에 같은 프로세스 내의 다른 스레드와 상호작용하면서 실행됩니다.
  4. 생성 및 소멸 비용:
    • 프로세스: 프로세스는 운영 체제에 의해 독립적으로 생성되고 관리되며, 프로세스의 생성 및 소멸은 상대적으로 많은 시간과 자원이 소요됩니다.
    • 스레드: 스레드는 프로세스 내에서 생성되고 소멸되기 때문에 비교적 적은 시간과 자원이 소요됩니다.
  5. 동작 방식:
    • 프로세스: 각 프로세스는 독립적으로 실행되며, 각각이 별도의 주소 공간을 가지고 있으므로 하나의 프로세스에 문제가 발생해도 다른 프로세스는 영향을 받지 않습니다.
    • 스레드: 스레드는 하나의 프로세스 내에서 실행되므로, 스레드 중 하나가 문제를 일으키면 전체 프로세스가 영향을 받을 수 있습니다.

JVM의 정의와 메모리 구조를 아는 대로 서술해 주세요.

JVM은 자바 프로그램을 실행하기 위한 가상 머신입니다. Method Area, Heap, Stack으로 이루어져 있습니다.

JVM은 자바 소스 코드를 컴파일하여 생성된 바이트 코드를 실행하고, 운영 체제와의 상호 작용을 관리합니다. JVM은 플랫폼에 독립적이며, 자바 프로그램을 다양한 운영 체제에서 실행할 수 있도록 합니다.

JVM의 메모리 구조는 크게 다음과 같은 세 가지 영역으로 나뉩니다:

  1. 메서드 영역(Method Area):
    • JVM이 로드한 클래스의 정보, 상수, 메서드 코드 등을 저장하는 영역입니다.
    • 클래스 로더에 의해 로드된 클래스들의 메타데이터가 저장됩니다.
    • JVM 시작 시 생성되며, 모든 스레드가 공유합니다.
  2. 힙(Heap):
    • 동적으로 생성된 객체와 배열이 할당되는 영역입니다.
    • 프로그램 실행 중에 생성된 객체와 배열은 힙 영역에서 관리됩니다.
    • 가비지 컬렉션(Garbage Collection)에 의해 사용하지 않는 객체가 제거됩니다.
    • JVM 시작 시 생성되며, 모든 스레드가 공유합니다.
  3. 스택(Stack):
    • 각 스레드마다 개별적으로 생성되는 영역입니다.
    • 메서드 호출 시 지역 변수, 매개 변수, 메서드 실행 정보 등을 저장합니다.
    • 스택 프레임(Stack Frame)이라는 작은 단위로 관리됩니다.
    • 메서드가 호출되면 해당 메서드에 대한 스택 프레임이 생성되고, 메서드가 종료되면 해당 스택 프레임이 제거됩니다.

JVM은 이외에도 네이티브 메서드 스택, PC(Program Counter) 레지스터 등의 추가적인 메모리 영역을 가지고 있습니다. 또한, JVM은 가비지 컬렉션을 통해 더 이상 사용되지 않는 객체를 자동으로 제거하여 메모리를 관리합니다.

JVM은 자바 프로그램의 실행 환경을 추상화하고, 자바 언어의 특징인 플랫폼 독립성과 메모리 관리를 지원합니다. JVM은 자바 프로그램의 실행 속도와 성능을 최적화하기 위해 다양한 기술과 최적화 방법을 사용하며, 자바 개발자들에게 안정적이고 일관된 실행 환경을 제공합니다.

Java의 GC 알고리즘 중 하나만 선택해 아는 대로 서술해 주세요.

GC(Garbage Collection) 알고리즘은 프로그래밍 언어에서 자동 메모리 관리를 위해 사용되는 기술입니다. GC 알고리즘은 동적으로 할당된 메모리 중에서 더 이상 사용되지 않는 객체(가비지)를 식별하고 해제하는 작업을 수행합니다.

GC 알고리즘은 주로 다음과 같은 단계로 작동합니다:

  1. Reachability Analysis (도달 가능성 분석): GC 알고리즘은 루트(root) 객체(주로 전역 변수, 스택 등에 저장된 객체)를 식별합니다. 루트 객체는 다른 객체를 참조하거나 접근할 수 있는 시작점입니다. GC는 이러한 루트 객체를 기반으로 도달 가능한(reachable) 객체들을 식별합니다.
  2. Marking (표시): 도달 가능한 객체들을 표시(mark)합니다. 이 과정에서 GC는 객체의 헤더 정보 등을 이용하여 메모리에 있는 객체들을 탐색하고, 표시 비트 등의 플래그를 설정하여 도달 가능한 객체를 식별합니다.
  3. Sweep and Free (쓸어내기 및 해제): 표시되지 않은 객체들은 도달 가능한 객체가 아니므로 가비지로 간주됩니다. GC는 이러한 가비지 객체들을 메모리에서 제거하고, 해당 메모리를 해제하여 재사용 가능한 상태로 만듭니다.

GC 알고리즘은 다양한 방식으로 구현될 수 있으며, 가장 일반적으로 사용되는 알고리즘에는 "Mark and Sweep" 알고리즘이 있습니다. 이 알고리즘은 위에서 설명한 세 단계를 따릅니다. 다른 알고리즘으로는 "Copying", "Reference Counting", "Generational GC" 등이 있습니다. 각각의 알고리즘은 특정한 상황에 적합하며, 성능, 메모리 사용량, 일시 중지 시간 등을 고려하여 선택될 수 있습니다.

GC 알고리즘은 개발자가 명시적으로 메모리를 할당하고 해제하는 작업을 수행하지 않아도 되므로 메모리 관리를 단순화시키고, 메모리 누수와 관련된 문제를 방지할 수 있는 장점이 있습니다. 그러나 GC 알고리즘은 메모리 관리를 위한 추가적인 연산이 필요하며, 일시적으로 프로그램 실행을 중지시킬 수 있어 실시간 시스템이나 성능에 민감한 애플리케이션

세마포어에 대해서 아는 대로 서술해 주세요.

세마포어(Semaphore)는 동기화 기법 중 하나로, 여러 프로세스 또는 스레드가 공유 자원에 접근하는 것을 조절하기 위해 사용됩니다. 세마포어는 정수 변수와 두 가지 주요한 연산으로 구성됩니다: P(Proberen)와 V(Verhogen)입니다.

  1. P(Proberen): 세마포어 값을 감소시킵니다. 만약 세마포어 값이 0보다 크면 값을 1 감소시키고, 작거나 같으면 프로세스 또는 스레드는 대기 상태로 들어갑니다. 이 연산은 임계 구역(critical section)에 진입하는 진입 제어 메커니즘으로 사용될 수 있습니다.
  2. V(Verhogen): 세마포어 값을 증가시킵니다. 만약 세마포어 값이 0이상이면 값을 1 증가시키고, 그렇지 않으면 대기 중인 프로세스 또는 스레드 중 하나를 깨워 실행 가능한 상태로 만듭니다. 이 연산은 임계 구역에서 빠져나가는 퇴출 제어 메커니즘으로 사용될 수 있습니다.

세마포어는 공유 자원에 대한 동시 접근을 제어하거나 생산자-소비자 문제와 같은 동기화 문제를 해결하는 데 사용됩니다. 세마포어의 값은 초기에 설정되며, 해당 값에 따라 접근 가능한 프로세스 또는 스레드의 수가 제한될 수 있습니다.

세마포어는 이진 세마포어(Binary Semaphore)와 일반적인 세마포어(Counting Semaphore)로 구분됩니다. 이진 세마포어는 값이 0 또는 1만을 가지며, 상호 배제(mutual exclusion)를 위해 사용됩니다. 일반적인 세마포어는 값이 음수가 될 수 있으며, 동시에 접근할 수 있는 프로세스 또는 스레드의 수를 제어하는 데 사용됩니다.

세마포어는 상호 배제와 동기화를 위해 널리 사용되는 동기화 도구 중 하나이며, 교착상태(deadlock)와 같은 문제를 방지하고 프로세스 간의 조율을 가능하게 합니다. 그러나 세마포어를 잘못 사용하거나 잘못된 방식으로 동기화를 구현하면 경쟁 상태(race condition)나

Java의 synchronized에 대해서 아는 대로 서술해 주세요.

Java에서 synchronized 키워드는 멀티스레드 환경에서 공유된 자원에 대한 동기화를 달성하기 위해 사용됩니다. synchronized 키워드를 사용하면 특정 코드 블록 또는 메서드에 대해 동시에 하나의 스레드만 실행할 수 있도록 보장됩니다.

**synchronized**를 사용하는 방법은 두 가지입니다:

  1. 인스턴스 메서드에 synchronized 사용:
    • 위의 예시에서 **someMethod()**는 인스턴스 메서드입니다.
    • synchronized 키워드는 해당 메서드를 호출하는 스레드가 자동으로 해당 인스턴스의 모니터 락을 얻게 합니다.
    • 다른 스레드가 동일한 인스턴스의 synchronized 메서드를 호출하면, 해당 스레드는 대기 상태로 들어갑니다.
    • 하나의 스레드가 실행을 완료하면 모니터 락이 해제되고, 대기 중인 스레드 중 하나가 모니터 락을 획득하여 실행됩니다.
  2. javaCopy code public synchronized void someMethod() { // 동기화가 필요한 코드 }
  3. 코드 블록에 synchronized 사용:
    • 위의 예시에서 synchronized 키워드는 특정 객체를 락으로 사용합니다. 이 객체는 **lockObject**로 표시되어 있습니다.
    • synchronized 블록 내부의 코드는 해당 객체의 모니터 락을 획득해야 실행될 수 있습니다.
    • 다른 스레드가 동일한 객체의 synchronized 블록에 진입하려고 하면, 해당 스레드는 대기 상태로 들어갑니다.
    • 블록 내부의 코드가 실행을 완료하고 나면 모니터 락이 해제되고, 대기 중인 스레드 중 하나가 모니터 락을 획득하여 실행됩니다.
  4. javaCopy code public void someMethod() { // 비동기적으로 실행되는 코드 synchronized (lockObject) { // 동기화가 필요한 코드 } // 비동기적으로 실행되는 코드 }

synchronized 키워드를 사용하면 공유된 자원에 대한 동시 접근을 제어할 수 있으며, 경쟁 조건(race condition)이나 잘못된 상태(inconsistent state)를 방지할 수 있습니다. 그러나 **synchronized**는 상호 배제(mutual exclusion)를 위해 사용되므로, 과도한 사용은 성능 저하를 일으킬 수 있으므로 적절한 상황에서 사용해야 합니다.

'JAVA' 카테고리의 다른 글

[기술면접] 리플렉션이란?  (0) 2023.07.06
[Clean Code] 13장 동시성  (0) 2023.06.03
[Clean Code] 10장 클래스  (1) 2023.06.03
CSRF 토큰 오류  (0) 2023.05.26
[기술면접] dto와 pojo  (0) 2023.05.26