질문 1: 자바의 제네릭이란 무엇이며 어떻게 사용되나요?
제네릭은 컴파일 시간에 타입 안정성을 확보하기 위해 사용되는 자바의 기능입니다. 제네릭은 클래스나 인터페이스, 메소드의 매개변수, 반환값 등에 사용될 수 있습니다. 제네릭을 사용하면 타입 안전성을 보장하면서 코드의 재사용성과 가독성을 높일 수 있습니다.
제네릭을 사용하는 방법은 클래스나 인터페이스 선언 시에 타입 매개변수(parameter)를 추가하고, 이를 해당 클래스나 인터페이스 내부의 필드, 메소드에서 사용하는 형태입니다. 그리고 객체를 생성할 때는 실제 타입을 지정하여 매개변수화한(generic) 객체를 생성합니다.
예를 들어, ArrayList 클래스는 제네릭을 사용하여 타입 매개변수인 E를 가지고 있습니다. ArrayList<String> list = new ArrayList<>()와 같이 ArrayList 객체를 생성하고, 이를 통해 String 타입의 요소를 다룰 수 있습니다.
제네릭은 컴파일 시에 타입 체크를 하기 때문에, 잘못된 타입 사용으로 인한 런타임 오류를 방지할 수 있고, 타입 변환을 줄여주며 코드의 가독성을 향상시킵니다.
질문 2: 자바의 예외 처리 방식에는 어떤 것들이 있나요? 각각의 차이점은 무엇인가요?
자바에서 예외(Exception)는 실행 중에 발생할 수 있는 오류나 예기치 못한 상황을 나타냅니다. 자바의 예외 처리 방식은 크게 2가지로 나뉩니다: 일반 예외와 실행 예외입니다.
일반 예외(checked exception)은 컴파일러가 체크해주기 때문에 반드시 예외 처리가 필요합니다. 일반 예외는 Exception 클래스를 상속받는 클래스들이며, 주로 외부 자원에 대한 입출력이나 네트워크 통신 시 발생할 수 있습니다. 일반 예외는 try-catch 블록을 사용하여 예외를 처리하거나, 메소드에 throws 키워드를 이용하여 예외를 호출자에게 던질 수 있습니다.
실행 예외(unchecked exception)는 컴파일러가 체크하지 않기 때문에 반드시 예외 처리가 필요하지 않습니다. 실행 예외는 RuntimeException 클래스를 상속받는 클래스들이며, 배열 인덱스 범위 초과나 널 포인터 참조 등, 프로그래머의 실수로 인한 예외를 나타냅니다. 실행 예외는 예외 처리를 강제하지 않기 때문에 주로 예외 처리 기능을 제공하지 않는 메인 메소드에서 사용됩니다.
일반 예외와 실행 예외의 차이점은 예외 처리 여부와 일반 예외는 컴파일러가 체크해주고 실행 예외는 체크하지 않는다는 점입니다. 따라서 일반 예외는 반드시 예외 처리가 필요한 상황에서 사용되고, 실행 예외는 예외 처리를 강제하지 않는 상황에서 사용됩니다.
질문 3: 자바의 스레드(Thread)와 프로세스(Process)는 무엇인가요? 비교해볼 수 있나요?
자바에서 스레드(Thread)는 프로그램의 실행 흐름(flow of execution)을 나타내는 단위입니다. 스레드는 프로세스가 할당받은 자원(프로세서, 메모리 등)을 기반으로 독립적으로 실행됩니다. 자바에서 스레드는 Thread 클래스나 Runnable 인터페이스를 구현하여 생성할 수 있습니다.
프로세스(Process)는 운영체제에서 실행 중인 프로그램을 나타내는 단위입니다. 프로세스는 코드, 데이터, 스택 등의 자원을 할당받고, 해당 자원을 기반으로 스레드를 생성하여 실행할 수 있습니다.
스레드와 프로세스의 가장 큰 차이점은 자원의 할당 방식입니다. 프로세스는 자신만의 독립적인 자원(주소 공간, 파일 핸들 등)을 할당받지만, 스레드는 프로세스의 자원을 공유하여 사용합니다. 프로세스는 독립적으로 실행되고 통신을 위해 IPC(Inter-Process Communication) 메커니즘을 사용해야 하지만, 스레드는 프로세스에 속해있기 때문에 간편하게 데이터를 공유하고 통신할 수 있습니다.
또한, 프로세스는 독립적으로 동작하기 때문에 하나의 프로세스가 비정상적으로 종료되더라도 다른 프로세스에 영향을 주지 않지만, 스레드는 프로세스의 일부분이기 때문에 하나의 스레드가 예외를 발생시키면 다른 스레드에도 영향을 줄 수 있습니다.
질문 4: 자바에서 직렬화(Serialization)란 무엇인가요? 왜 사용하나요?
직렬화(Serialization)는 자바에서 객체를 바이트 형태로 변환하는 과정입니다. 직렬화를 통해 객체를 파일에 저장하거나 네트워크를 통해 전송할 수 있습니다. 직렬화된 객체는 나중에 역직렬화를 통해 원래의 객체로 복원할 수 있습니다.
자바에서 직렬화는 Serializable 인터페이스를 구현하여 객체를 직렬화할 수 있습니다. Serializable 인터페이스는 메소드 없이 마커(marker) 인터페이스로 사용됩니다. 직렬화를 허용하고 싶은 클래스는 implements Serializable 구문을 추가하여 표시합니다.
직렬화는 객체를 파일 형태로 저장하거나 네트워크를 통해 전송할 수 있는 장점이 있습니다. 예를 들어, 객체를 파일로 저장하면 프로그램을 종료하고 다시 실행해도 이전에 저장된 객체를 복원하여 사용할 수 있습니다. 또한, 분산 환경에서 객체를 직렬화하여 전송하면 다른 JVM에서도 동일한 객체를 사용할 수 있습니다.
그러나 직렬화는 보안상의 이유로 위험할 수 있습니다. 직렬화된 객체는 프로그램이 종료되거나 저장된 데이터를 제거하지 않는 한 오랫동안 유지될 수 있기 때문에 악용될 수 있습니다. 직렬화를 사용할 때는 보안을 고려하여 중요한 데이터는 직렬화하지 않거나 암호화하여 사용해야 합니다.
질문 5: 자바에서 동기화(Synchronization)는 어떤 용도로 사용되나요? 어떻게 구현하나요?
자바에서 동기화(Synchronization)는 여러 스레드가 공유 자원에 동시에 접근할 때 발생하는 문제(ex. 경쟁 상태, 스레드 간의 상호작용)를 해결하기 위해 사용됩니다. 동기화는 한 스레드가 공유 자원에 대한 잠금(lock)을 획득한 후에만 다른 스레드가 해당 자원에 접근할 수 있는 방식입니다.
동기화는 synchronized 키워드를 사용하여 구현할 수 있습니다. synchronized 키워드는 메소드나 블록 전체에 붙여서 사용할 수 있습니다. synchronized 키워드가 붙은 메소드 또는 블록은 동기화된 상태로, 해당 메소드나 블록이 호출될 때에는 잠금을 얻어 다른 스레드가 해당 메소드나 블록에 접근할 수 없
'job interview FAQ' 카테고리의 다른 글
UX 디자이너 직군 인터뷰 예상 질문 (0) | 2023.08.24 |
---|---|
파이썬 개발자 면접 질문 이렇게 준비하자 (0) | 2023.08.24 |
UI 디자이너 면접에 나올 수 있는 질문들 (0) | 2023.08.24 |
상품기획자(BM) 면접 예상 질문 및 답변 모음 (0) | 2023.08.23 |
현직자가 말하는 서버 개발자 신입 면접 질문 (0) | 2023.08.23 |