JAVA

기술면접 질문 리스트

chojdsj 2023. 12. 11. 00:39
728x90

 

Java의 특징

 

 

- Java는 JVM에서 실행되기 때문에 어떤 운영체제에서든지 독립적으로 Java 언어를 사용할 수 있다.

 

- Java는 객체 지향 프로그래밍을 지원하며, 클래스와 객체를 사용하여 모듈화와 재사용성을 강화합니다.

 

- Java는 멀티스레드를 지원하여 동시에 여러 작업을 수행할 수 있습니다.

 

- Java는 동적 메모리 할당을 지원하며, 가비지 컬렉션 기능을 통해 메모리 누수를 방지합니다.

 

- Java는 컴파일 언어이면서 인터프리터 언어입니다.

* 인터프리터는 소스 코드를 읽고, 이를 바로 실행하는 프로그램이나 환경을 가리킵니다

* 컴파일은 소스 코드를 기계어 또는 중간 언어로 변환하는 과정을 말합니다

 

 

 

JVM이란?

 

- Java Virtual Machine의 약자로 Java 프로그램이 실행되는 가상 환경을 제공하는 소프트웨어입니다.

JVM은 자바 언어로 작성된 프로그램이 여러 운영체제 및 하드웨어 환경에서 동일하게 실행될 수 있도록 합니다.

 

 

 

 

Java의 실행과정(컴파일 과정)

 

 

1) 개발자가 자바 소스 코드(.java)를 작성한다.

 

2) 컴파일러가 자바 소스 코드(.java) 파일을 읽어서 바이트코드(.class)로 컴파일한다.

 

3) 컴파일된 바이트코드를 JVM내의 class loader에게 전달한다.

 

4) class loader는 동적 로딩을 통해 필요한 클래스들을 로딩하여 런타임 데이터 영역, 즉 JVM의 메모리에 올립니다.

 

5) 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 실행합니다. 이때, 인터프리터를 사용하거나 바이트 코드를 네이티브 코드로 변환하여 실행할 수 있는 JIT(Just-In-Time) 컴파일러를 사용할 수 있습니다.

* 인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점을 가집니다.

* JIT(Just-In-Time) :  프로그램을 실행하는 동안 바이트 코드를 네이티브 코드로 변환하는 컴파일러입니다. 런타임 중에 코드를 최적화하여 실행 속도를 향상시킵니다.

 

 

 

 

Java의 메모리 구조

 

 

- 자바의 메모리 구조는 크게 5가지 영역으로 구분됩니다. 우선 스레드마다 PC Register, JVM Stack 그리고 Native Method Stack이 있고 스레드 공통으로는 Heap과 Method Area가 있습니다.

 

PC Register현재 수행중인 JVM 명령어가 있고 JVM Stack호출된 메소드의 매개변수, 지역변수, 리턴정보들이 저장됩니다. Native Method Stack은 자바 외의 언어인 C나 C++같은 것들을 수행하기 위한 영역입니다. Method Area는 클래스별로 전역변수, 정적변수, 메소드 정보들이 저장되게 됩니다. Heap영역은 런타임중 생성되는 객체들이 동적으로 할당되는 곳 입니다.

 

 

 

 

Heap과 Stack

 

 

- Heap : 사용자가 직접 관리하는 영역으로 데이터가 동적으로 할당되는 공간입니다. 객체 인스턴스 및 배열이 생성되는 메모리입니다.

 

- Stack : 함수의 호출정보, 지역변수, 매개변수들이 저장되는 곳입니다.

 

 

 

 

 

 

가비지 컬렉션(Garbage Collection)

 

 

- 가비지 컬렉션은 JVM에서 메모리를 관리해주는모듈입니다. Heap 메모리를 재활용하기 위해서 더 이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈입니다.

 

 

가비지 컬렉션의 동작 원리

 

 

1) stop the world : 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈춘다.

 

2) Mark and Sweep : Mark는 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업이고, Sweep은 Mark 단계에서 사용되지 않음으로 식별된 메모리를 제거하는 작업입니다.

 

 

 

 

객체지향 프로그래밍에 대해 설명

 

 

- 객체지향이란 프로그램을 다수의 객체로 만들고, 이들끼리 서로 상호작용하도록 만드는 프로그래밍 언어입니다.

 

- 객체란 속성과 기능을 가지는 프로그램의 단위로서, 클래스의 인스턴스나 배열을 말합니다.

 

- 객체지향 프로그래밍은 총 4가지 특징이 있는데, 캡슐화, 추상화, 상속성, 다형성 입니다.

 

 

 

객체지향 vs 절차지향

 

 

- 객체지향은 객체를 중심으로 설계되고 데이터와 함수가 객체 내부에 존재하며 캡슐화가 용이합니다. 그리고 상속과 다형성의 개념이 존재합니다. 주로 Java, C++, Python등이 객체지향 프로그래밍 언어입니다.

 

- 절차지향은 기능 중심으로 설계되고, 캡슐화가 어렵고 상속과 다형성의 개념이 존재하지 않습니다. C언어가 대표적인 절차지향 프로그래밍 언어입니다.

 

 

 

 

OOP 4가지 특징

 

 

- 캡슐화 : 객체의 상태와 메서드를 하나로 묶고, 그 내부의 세부 구현을 외부에 감추는 것.

 

- 추상화 : 공통의 속성이나 기능을 묶어 이름을 붙이는 것.

 

- 상속성 : 상위 개념의 특징을 하위 개념이 물려받는 것.

 

- 다형성 : 같은 모양의 코드가 다른 행위를 하는것으로 대표적으로 오버로딩과 오버라이딩이 있습니다.

 

 

 

오버로딩 vs 오버라이딩

 

 

- 오버로딩 : 같은 이름의 메서드나 생성자를 여러개 정의하는 것을 의미한다. 메서드나 생성자의 이름은 같지만 매개변수의 타입, 개수, 순서가 서로 다른 경우에만 사용할 수 있다.

 

- 오버라이딩 : 부모클래스에서 이미 정의된 메서드를 자식클래스에서 재정의 하는 것. 상속 관계가 필수이다.

 

 

 

 

 

 

캡슐화 vs 은닉화

 

 

- 캡슐화는 외부에서의 접근을 제어한다면, 은닉화는 내부의 세부구현을 외부로부터 감추어 정보 은닉을 강조

 

 

 

 

OOP의 5대 원칙(SOLID)

 

 

- SRP(단일 책임 원칙) : 클래스는 단일 책임만 가져야 하며, 하나의 변경 원인에 대해서만 변경되어야 합니다.

 

- OCP(개방 폐쇄 원칙) : 새로운 기능이 추가되거나 요구사항이 변경될 때, 기존의 코드를 수정하지 않고 확장을 통해 새로운 기능을 추가할 수 있어야 합니다.

 

- LSP(리스코프 치환 원칙) : 서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 합니다.

 

- ISP(인터페이스 분리 원칙) : 클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 됩니다.

 

- DIP(의존 역전 원칙) : 추상화된 것은 세부 사항에 의존하면 안 되며, 세부 사항이 추상화에 의존해야 합니다.

 

 

 

 

 

추상클래스 vs 인터페이스

 

 

- 추상클래스는 abstract 지시자로 정의되어서 추상메소드가 하나 이상 포함되는 클래스입니다. 인터페이스는 interface 지시자로 정의되어서 모든 메소드가 추상메소드로 정의되게 됩니다.

 

 이 둘의 차이는 그 존재의 목적에 있습니다. 추상클래스상속받아서 기능을 재활용하고 확장시키는데 목적이 있고, 인터페이스는 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는 것을 보장하는 것에 목적이 있습니다.

 

 

 

 

String vs StringBuilder vs StringBuffer

 

 

- String : String은 객체 불변이기 때문에 변하지 않는 문자열은 String 사용

 

- StringBuilder : 비동기 방식으로 싱글스레드에서의 성능이 뛰어납니다.

 

- StringBuffer : 동기 방식으로 멀티스레드에서의 성능이 뛰어납니다.

 

- Builder와 Buffer는 모두 내부 Buffer에 문자열을 저장하고 그 안에서 추가, 수정, 삭제 작업을 할 수 있다.

 

 

 

 

String이 불변인 이유

 

 

- 불변한 문자열은  String Pool에서 중복된 문자열을 공유할 수 있습니다. 동일한 문자열 리터럴이 여러 곳에서 사용되더라도 메모리를 효율적으로 관리할 수 있습니다.

 

- 보안상의 이유

 

- 성능측면에서 유리

 

 

 

Java의 접근제어자의 종류와 특징

 

 

- private : private이 붙은 변수, 메서드는 해당 클래스에서만 접근 가능

 

- default : 접근제어자를 별도로 설정하지 않으면 default로 설정되고 동일 패키지 내에서만 접근 가능

 

- protected : 동일 패키지내의 클래스 또는 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근 가능

 

- public : 어떤 클래스에서든 접근 가능

 

 

 

 

클래스 vs 객체 vs 인스턴스

 

 

- 클래스 : 객체를 만들어 내기 위한 설계도 혹은 틀. 변수와 메서드의 집합

 

- 객체 : 클래스의 인스턴스나 배열을 말합니다. 식별 가능한 개체 또는 사물

 

- 인스턴스 : 객체를 실체화 하면 그것을 인스턴스라고 부른다. 실체화된 인스턴스는 메모리에 할당된다.

 

 

클래스 vs 객체

- 클래스는 설계도, 객체는 설계도로 구현한 모든 대상을 의미

 

객체 vs 인스턴스

- 클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될때 인스턴스라고 부른다.

 

 

 

 

생성자

 

 

- 생성자는 클래스와 같은 이름의 메서드로 객체가 생성될때 호출되는 메서드이다. 생성자를 만들지 않아도 default로 생성되며 파라미터를 다르게 하여 오버로딩 할 수 있습니다.

 

 

 

 

Static

 

 

- Static 키워드를 사용한 변수나 메서드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용할 수 있다. 즉, 인스턴스 생성 없이 바로 사용 가능합니다. 프로그램 종료 시 까지 메모리에 유지되고 주로 공통으로 사용되는 데이터들을 관리하는데 사용합니다.

 

 

 

 

 

지역변수 vs 클래스변수 vs 인스턴스 변수

 

 

- 지역변수 : 메서드, 생성자, 블록 내에서 생성되는 변수로서 스택 메모리에 할당됩니다.  메서드나 블록이 실행될 때 생성되고 실행이 끝나면 소멸하므로 메모리 사용에 효과적입니다.

 

- 클래스 변수 : 클래스 변수는 static 키워드로 선언되며 해당클래스의 모든 인스턴스에서 공유됩니다. 클래스가 로드될 때 생성되고 프로그램 종료시까지 유지됩니다.

 

- 인스턴스 변수 : 인스턴스 변수는 클래스 내에서 선언되지만 인스턴스가 생성될때 마다 새로운 복사본이 생성됩니다. 객체의 상태를 나타내며 객체가 소멸할때 까지 유지됩니다.

 

 

 

 

 

 

List vs Set vs Map

 

 

- List : 데이터를 순차적으로 저장하고 중복과 null을 허용합니다.

 

- Set : 데이터를 저장하는데 순서가 없고, 중복과 null을 허용하지 않습니다.

 

- Map : 순서없이 key,value 형태로 데이터를 저장하고 value는 중복이 허용되지만 key는 중복과 null이 허용되지 않습니다. 

 

 

 

 

 

 

 

Checked Exception과 Unchecked Exception

 

 

- CheckedException : Runtime Exception을 상속받지 않으며 예외처리가 필수이다.

 

- Unchecked Exception : Runtime Exception을 상속받고 예외처리를 안해도 된다.

 

 

 

Call by Reference와 Call by Value

 

 

- Call by Reference : 참조에 의한 호출로 주로 C++에서 사용한다.

 

- Call by Value : 값에 의한 호출로 주로 Java에서 사용한다.

 

C언어에서는 포인터를 이용하여 매개변수의 주소값을 넘겨 참조하지만, Java에서는 포인트가 따로 없으며 기본적인 매개변수는 Call by Value이다.

 

 

 

 

 

 

프로세스와 스레드

 

 

- 프로세스 : 실행중인 프로그램을 나타내는 단위로서 독립적으로 메모리를 가집니다.

 

- 스레드 : 스레드란 프로세스 내에서 실제로 작업을 수행하는 주체입니다.

 

 

 

 

 

멀티스레드 vs 멀티프로세스

 

 

- 멀티스레드 : 멀티프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠른 장점이 있지만, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료 될 위험이 있다.

 

- 멀티프로세스 : 하나의 프로세스가 죽더라도 다른 프로세스의 영향을 주지 않아 안전성이 높지만, 멀티스레드보다 많은 메모리 공간과 cpu시간을 차지하는 단점이 있다.

 

 

 

thread Safe

 

 

- 멀티스레드 프로그래밍에서 어떤 공유자원에 여러 스레드가 동시에 접근해도 프로그램 실행에 문제가 없는 상태

 

 

 

 

 

동기 vs 비동기

 

 

- 동기 : 작업이 순차적으로 실행되고 한 작업이 완료되어야 다른작업을 실행한다. 여러가지 요청을 동시에 처리할 수 없어 효율이 떨어진다.

 

- 비동기 : 작업이 동시에 실행되고 작업이 완료되지 않아도 다음 작업을 실행한다. 작업이 완료되는 시간을 기다릴 필요가 없어 자원을 효율적으로 사용한다. 

 

 

동기는 작업이 완료될 때까지 대기하므로 상대적으로 느린 작업에 적합합니다.
 비동기는 빠른 작업에 적합하며, 특히 I/O 작업이나 네트워크 통신에서 유용합니다.

 

 

 

 

 

 

API란?

 

- Application Programming Interface(애플리케이션 프로그램 인터페이스)의 약자로, 소프트웨어 응용 프로그램에서 다른 소프트웨어 구성 요소 또는 서비스와 상호 작용하기 위한 인터페이스를 제공하는 프로그래밍 기술이다.

 

- 즉, 프로그램들이 서로 상호작용 하는 것을 도와주는 매개체라고 볼 수 있습니다.

 

 

 

 

 

Restful API

 

 

- 웹 아키텍처의 한 스타일로, 자원을 정의하고 자원에 대한 상태 전달을 표현하는 방법을 나타냅니다. Restful API는 자원을 관리하고 상태를 전달하는 API를 구현한 것입니다.

 

 장점으로는 간결하고 가독성이 좋아 쉽게 이해하고 사용가능하며, 분산 시스템에서 확장이 쉽도록 설계되어 있습니다.

 

 

 

 

 

싱글톤 패턴

 

 

- 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴입니다. 대표적 예시로 Spring Bean을 들 수 있습니다. 스프링의 빈 등록 방식은 기본적으로 싱글톤 스코프이고, 스프링 컨테이너는 모든 빈들을 싱글톤으로 관리합니다.

 

 

 

 

 

Redis

 

 

- Redis는 오픈 소스 기반의 인-메모리 데이터 저장소로서, 메모리에 데이터를 저장하고 빠르게 읽고 쓸 수 있는 특징이 있습니다. NoSQL 데이터베이스로 분류되며, 키-값의 형태의 데이터를 저장합니다. 주로 캐싱이나 세션관리, 메시지 브로커, 대기열 처리등에 활용됩니다.

 

 

 

 

스프링 프레임워크란?

 

 

- 자바 기반의 오픈 소스 애플리케이션 프레임워크입니다. 전자정부 표준 프레임워크의 기반 기술입니다.

 

 

 

 

스프링의 특징

 

 

- DI(의존성 주입) : 설정파일이나 어노테이션을 통해서 객체간의 의존관계를 설정하여 개발자가 직접 의존하는 객체를 생성할 필요가 없습니다.

 

- AOP(관점지향프로그래밍) : 여러 모듈, 계층에서 공통으로 필요로 하는 기능의 경우 해당 기능을 분리해 관리할 수 있으며 코드의 모듈화와 재사용성을 향상시킵니다.

 

- IOC(제어의역전) : 컨트롤의 제어권이 개발자가 아닌 프레임워크에 있는것을 말합니다. 객체의 생성부터 모든 생명주기의 관리까지 프레임워크가 주도합니다.

 

- 트랜잭션 관리 : 트랜잭션 어노테이션을 사용하여 간편하게 트랜잭션을 설정할 수 있습니다.

 

 

 

 

 

Spring MVC

 

 

- Model, View, Controller를 뜻합니다.

 

- Model은 애플리케이션의 데이터와 비즈니스 로직을 담당하고 데이터를 관리하고 변경을 통보하여 View와 Controller에게 전달합니다.

 

- View는 사용자에게 정보를 표시하고 입력을 받는 역할을 합니다.

 

- Controller는 모델과 뷰 사이의 상호작용을 관리하고 클라이언트의 요청을 처리하고 흐름 제어를 담당합니다.

 

 

 

 

 

Model1과 Model2

 

 

- Model 1 : JSP 페이지에서 사용자의 요청을 직접 처리하고 응답을 생성합니다. 단순하고 직관적이며 별도의 컨트롤러 없이 설정이 간단하고 주로 작은 규모의 애플리케이션에서 사용됩니다.

 

- Model 2 : 서블릿사용자의 요청을 받아 비즈니스 로직을 수행결과를 JSP에 전달하여 표현합니다. 코드의 재사용성이 높아지고 로직과 화면표현이 분리되어 가독성이 좋고 주로 대규모 애플리케이션에 적합합니다.

 

 

 

 

MVC의 흐름

 

 

1) Dispatcher Servlet이 요청을 수락

 

2) Dispatcher Servlet은 Handler Mapping에 어느 Controller를 사용할 것인지 묻는다

 

3) Dispatcher Servlet은 요청을 Controller에게 전달하고 Controller는 요청을 처리 후 결과를 리턴한다.

 

5) Dispatcher Servlet은 리턴받은 View 이름을 View Resolver에게 전달

 

6) View는 클라이언트에게 응답할 JSP 생성

 

 

 

 

 

 

 

제네릭

 

 

- 제네릭이란 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법으로서, 객체의 타입을 지정한다.

 

- 사용 이유 : 컴파일 타임에 타입 검사를 통해 예외 방지, 코드의 재사용성과 유연성

 

- 특징 : 와일드카드를 사용하여 유연한 제네릭 타입을 정의할 수 있습니다, 클래스 또는 메소드에 선언할 수 있습니다, 동시에 여러 타입 선언 가능합니다.

 

 

 

 

 

 

 

TCP와 UDP

 

 

- TCP와 UDP는 TCP/IP의 전송 계층에서 사용되는 프로토콜이다.

 

- TCP : 연결형 프로토콜로서 신뢰성을 보장하지만 UDP보다 속도가 느리다. 서버와 클라이언트가 1:1로 통신한다.

 

- UDP : 비연결형 프로토콜로서 신뢰성이 낮고 TCP보다 속도가 빨라 주로 스트리밍 같은 서비스에 사용됩니다. 1:1, 1:N, N:M 형식으로 통신합니다.

 

 - 프로토콜 : 컴퓨터나 원거리 통신 장비 사이에서 메세지를 주고받는 양식과 규칙의 체계

 

 

 

 

 

HTTP란?

 

 

- 웹 상에서 클라이언트와 서버간 요청과 응답으로 데이터를 주고받을 수 있는 프로토콜

 

 

 

 

HTTP 메서드 종류

 

 

- 대표적으로 많이 사용하는 4가지 메서드에 대해 설명하겠습니다.

 

- GET : 주로 데이터를 요청할 때 사용합니다.

 

- POST : 주로 데이터를 서버에 제출하거나 전송할때 사용합니다.

 

- PUT : 리소스의 업데이트 시에 사용되어집니다.

 

- DELETE : 특정 리소스를 삭제하도록 요청하는 메서드입니다.

 

GET과 POST의 차이점

- GET은 URL 파라미터에 요청하는 데이터를 담아 보내기 때문에 HTTP 메시지에 body가 없다. POST 는 body 에 데이터를 담아 보내기 때문에 당연히 HTTP 메시지에 body가 존재한다.

- GET은 서버에 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아오지만, POST 메서드의 응답은 항상 다를 수 있습니다.

 

 

 

 

쿠키 vs 세션

 

 

- 쿠키 : 사용자의 컴퓨터에 저장하는 기록 정보 파일

 

- 세션 : 서버에 클라이언트의 정보를 저장하는 방법

 

둘의 차이는 쿠키브라우저에 저장되고, 세션서버에 저장한다.
쿠키는 보안에 취약하지만 세션은 안전하다.

 

 

 

 

 

 

 

 

 

 

 

 

'JAVA' 카테고리의 다른 글

Optional 객체  (0) 2023.11.21
▶︎입출력◀︎  (0) 2023.05.16
▶︎컬렉션◀︎  (0) 2023.05.14
▶︎예외◀︎  (0) 2023.05.14
▶︎인터페이스◀︎  (0) 2023.05.10