1. OOP에 대해 설명해보세요.
- 객체지향 프로그래밍이란 인간 중심적 프로그래밍 패러다임이라고 할 수 있습니다. 즉, 현실 세계를 프로그래밍으로 옮겨와 프로그래밍하는 것을 말합니다. 현실 세계의 사물들을 객체라고 보고 그 객체로부터 개발하고자 하는 애플리케이션에 필요한 특징들을 뽑아와 프로그래밍하는 것입니다. 대표적인 특징으로 추상화, 상속, 캡슐화, 다형성이 있습니다.
2. JVM의 구조에 대해 설명해보세요.
- 프로그램이 실행되면 OS로부터 프로그램이 필요로 하는 메모리를 먼저 할당받습니다.
- 그리고 자바 컴파일러를 통해 개발자가 작성한 코드(. java)를 바이트 코드(. class)로 변환합니다.
- 다음 Class Loader에서 바이트 코드를 JVM에 로딩시킵니다.
- 로딩된 바이트 코드를 execution engine을 통해 기계어로 해석됩니다.
- 해석된 바이트 코드들은 runtime data areas에 배치되어 실질적인 수행이 이루어집니다.
3. 인터페이스(interface)와 추상 클래스(abstract)의 차이점에 대해 말해보세요.
- interface(인터페이스)
- 다중 상속
- 추상 메서드, 상수만 선언 가능
- 생성자, 일반 변수를 가질 수 없음
- 팀별 협업 시 추상 메서드를 통해 결과를 예측하고 작업이 가능함(구현 객체의 동일성 보장)
- abstract(추상 클래스)
- 다중 상속 불가
- 추상 메서드 1개 이상, 일반 변수, 일반 메서드 선언 가능
- 생성자, 일반 변수 가질 수 있음
- 메서드의 부분 구현이 가능(부분 구현된 메서드를 상속받아 확장시키기 위함)
4. CORS에 대해 설명해보세요.
- CORS(Cross-Origin-Resource-Sharing)란 도메인이 다른 2개의 사이트가 데이터를 주고받을 때 발생하는 문제입니다. 예를 들어 mangkyu.com에서 mang.com으로 데이터를 요청한다고 하면, 따로 설정을 해주지 않는 한 CORS 에러를 만나게 됩니다.
- CORS가 생기게 된 이유는 서버 내에서 요청이 허락된 도메인에만 데이터를 주기 위해서인데, 요청을 허락하기 위해서는 Access-Control-Alow-Origin: {도메인}과 같은 내용을 Response의 헤더에 추가해주어야 합니다. 만약 도메인을 *으로 설정하면 모든 도메인에 대해 요청을 허락할 수 있습니다. 그 외에도 Access-Control-Allow-Methods, Access-Control-Max-Age 등을 설정해줄 수 있습니다.
- Access-Control-Allow-origin : 요청을 보내는 페이지의 출처 [ *, 도메인 ]
- Access-Control-Allow-Methods : 요청을 허용하는 메서드. Default : GET, POST
- Access-Control-Max-Age : 클라이언트에서 preflight 요청 (서버의 응답 가능 여부에 대한 확인) 결과를 저장할 시간
- Access-Control-Allow-Headers : 요청을 허용하는 헤더
5. 아파치는 멀티 프로세스인가 멀티 스레드인가?
- 아파치는 기본적으로 멀티 프로세스로 구현되어 있다. 하지만 설정에 따라 멀티 스레드를 같이 운용할 수 있다.
6. VO, DTO, BO, BO, DAO의 차이점에 대해 말해보세요.
- DAO(Data Access Object): DB에 접근하여 실제 데이터를 조회 또는 조작하는 클래스, Repository 또는 Mapper에 해당합니다.
- BO(Business Object): 여러 DAO를 활용해 비즈니스 로직을 처리하는 클래스, Service에 해당합니다.
- DTO(Data Transfer Object): 데이터를 주고받기 위해 사용하는 클래스입니다.
- VO(Value Object): 실제 데이터만을 저장하는 클래스입니다.
7. Spring MVC란 무엇인가요?
- Spring MVC란 웹 애플리케이션 개발을 위한 MVC 패턴 기반의 웹 프레임워크입니다. Spring MVC는 애플리케이션의 구성요소를 Model, View, Controller로 분리합니다. 또한 Spring MVC는 아래와 같은 컴포넌트들로 구성됩니다.
- Dispatcher Servlet: 클라이언트의 요청을 먼저 받아들이는 서블릿으로, 요청에 맞는 컨트롤러에게 요청을 전달합니다.
- Handler Mapping: 해당 요청이 어떤 컨트롤러에게 온 요청인지 검사합니다.
- Controller: 클라이언트의 요청을 받아 처리하여 결과를 디스패처 서블릿에게 전달합니다.
- ViewResolver: View의 이름을 통해 알맞은 View를 찾습니다.
- View: 사용자에게 보일 UI 화면입니다.
8. String, StringBuffer, StringBuilder의 각 차이점에 대해 말해보세요.
- String
- immutable(불변)
- 객체를 한 번 할당할 시메 모리 공간에 변동이 없습니다.(할당 시 Heap String Pool영역에 생성되어 그 값을 계속 사용합니다.)
- 동기화를 신경 쓰지 않아도 됩니다.
- 엄청나게 많은 문자열을 선언 및 연산할 시 성능 저하를 고려해야 합니다.
- StringBuffer
- mutable(가변)
- 각 메서드 별로 Synchronized Keyword가 존재합니다.
- 멀티스레드 환경에서도 동기화를 지원합니다.(thread-safe)
- StringBuilder
- mutable(가변)
- 동기화를 지원하지 않습니다.
9. Synchronized(동기화)란?
- 동기화는 여러 개의 스레드가 하나의 자원에 접근하려 할 때 주어진 순간에는 단 하나의 스레드만이 접근 가능하도록 하는 것입니다.
둘 이상의 스레드가 공동의 자원(파일이나 메모리 블록)을 공유하는 경우, 순서를 잘 맞추어 다른 스레드가 자원을 사용하고 있는 동안 한 스레드가 절대 자원을 변경할 수 없도록 해야 합니다. 만약 한 스레드가 파일에서 레코드를 수정하는데, 다른 스레드가 동시에 같은 레코드를 수정하면 심각한 문제가 발생할 수 있기 때문입니다. 이런 상황을 처리할 수 있는 한 방법은 관련된 스레드에 대한 동기화(synchronization)를 하는 것입니다.
10. Synchronized(동기화)를 하기 위한 방법
- synchronized 함수(메서드)를 만들어 사용합니다.
- synchronized 블록(block) 사용합니다.
11. 자바의 메모리 영역
- 메서드 영역
- static 변수, 전역 변수, 코드에서 사용되는 Class 정보 등이 할당됩니다.
- 스택(Stack)
- 지역 변수, 함수(메서드) 등이 할당되는 LIFO(Last In First Out) 방식의 메모리입니다.
- 힙(Heap)
- new 연산자를 통한 동작 할당된 객체들이 저장되며, 가비지 컬렉션에 의해 메모리가 관리됩니다.
12. Vector vs ArrayList
- 동적인 배열을 다루는 컬렉션 프레임워크로서 둘의 차이점을 알아보겠습니다.
- Vector
- 동기화된 상태입니다.(Thread safe)
- 상대적으로 속도가 느립니다.(동기화되어있기 때문)
- ArrayList
- 동기화가 안된 상태입니다.
- 상대적으로 속도가 빠릅니다.(동기화가 안되어있기 때문)
- 멀티스레드 환경이 아닐 경우 사용 권장합니다.
- Vector
13. ArrayList와 LinkedList의 차이
- LinkedList와 ArrayList는 모두 Java에서 제공하는 List 인터페이스를 구현한 Collection 구현체입니다.
- ArrayList
- 내부적으로 데이터를 배열로 관리하고 데이터 추가/삭제 시 임시 배열을 생성해 데이터를 복사합니다.
- 데이터별 인덱스가 있어 검색에는 유리
- 임시 배열을 사용하기 때문에 데이터 추가/삭제의 경우에는 불리
- LinkedList
- 내부적으로 노드 단위로 데이터를 관리합니다. 자신의 앞 뒤 노드만 인지하는 상태입니다.
- 인덱스가 따로 없기 때문에 검색 시 전 노드를 순회해야 하여 검색 시 불리
- 데이터 추가/삭제 시 불필요한 데이터 복사가 없어 유리
14. 오버 로딩(Overloading)과 오버 라이딩(Overriding)의 차이
- 오버 로딩(Overloading) : 상위 클래스의 메서드와 이름, return 값은 동일하지만, 매개 변수만 다른 메서드를 만드는 것을 의미합니다. 다양한 상황에서 메서드가 호출될 수 있도록 한다.
- 오버 라이딩(Overriding) : 상위 클래스에 존재하는 메서드를 하위 클래스에서 필요에 맞게 재정의하는 것을 의미합니다.
댓글