실제 받았던 기술면접 질문들 정리 + 인터넷에서 긁어온 질문들 모음
자바 기술면접 기출
⭐ Java의 특징?
- Java는 객체지향 프로그래밍 언어입니다.
- 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 4대 특성인 캡슐화, 상속, 추상화, 다형성이 잘 적용된 언어입니다.
- 장점
- JVM(자바가상머신) 위에서 동작하기 때문에 운영체제에 독립적이다.
- GabageCollector를 통한 자동적인 메모리 관리가 가능하다.
- 단점
- JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느리다.
- 다중 상속이나 타입에 엄격하며, 제약이 많다.
****⭐ **** OOP의 네가지 특징
- 객체지향의 4대 특성으로, 캡슐화 상속 추상화 다형성이 있습니다.
- 캡슐화 데이터 캡슐화를 통해 필드와 메서드를 하나로 묶고, 접근 지정자를 통해 제어합니다. 은닉화하여 데이터를 보호합니다. 예) Public이 아닌 Private
- 추상화는 인터페이스와 구현을 분리하여 불필요한 부분을 숨기고 핵심적인 코드만 보여줍니다. 굉장히 직관적! (모델링이라고도 함)
- 상속은 자식클래스가 부모클래스를 상속 받아 수정하여 사용하기 때문에 중복코드를 줄이고 코드를 재사용할 수 있게합니다.
- 다형성 오버라이딩, 오버로딩을 통해 객체를 변경하기 용이하게 합니다.
- 데이터 캡슐화 : 필드와 메서드를 하나로 묶는 것
- 은닉화 : 객체의 세부 내용이 외부에 드러나지 않아 외부에서 데이터를 직접 접근하는 것을 방지한다.
****⭐ 오버라이딩 오버로딩의 차이와 특징
공통점 : 자바에서 다형성을 지원하는 방법
'오버로딩(Overloading) / 확장'
같은 이름의 메서드 여러 개를 가지면서 매개변수의 유형과 개수가 다르도록 사용하는 것
• 메소드 이름 1개로 여러 기능으로 재정의하여 사용할 수 있기 때문에 가독성이 좋아집니다.
'오버라이딩(Overriding) / 재정의'
상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것
코드 중복을 줄이고, 기능 확장에 이점이 있습니다.
- 오버라이딩 → 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용
만약 자식클래스가 부모클래스에서 선언된 것과 같은 메소드를 가질 때, 메소드 오버라이딩이라고 한다.
특징:
- 오버라이드 하고자 하는 메소드가 상위 클래스에 존재해야 한다.
- 메소드 이름이 같아야 한다.
- 메소드 파라미터 개수, 파라미터의 자료형이 같아야 한다.
- 메소드 리턴형이 같아야 한다.
- 상위 메소드와 동일하거나 내용이 추가되어야 한다.
- 오버로딩 →상위클래스의 메소드는 그대로 두고, 매개변수가 다른 메소드들을 여러개 정의하는 것
같은 이름의 함수(메서드)를 여러개 정의하고, 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 호출에 응답할 수 있게됩니다
오버로딩은 같은 메소드라도 매개변수만 다르면 얼마든지 정의하고 사용할 수 있다.
특징:
- 메소드 이름이 같아야 한다.
- 리턴형이 같아도 되고 달라도 된다.
- 파라미터 개수가 달라야 한다 .
- 파라미터 개수가 같을 경우, 데이터타입이 달라야 한다.
- 리턴타입은 시그니처에 포함되지 않기 때문에 주의. 컴파일 에러 발생.
****⭐ 클래스변수, 인스턴스 변수, 지역변수 차이
public class varExam {
int instanceVariable; //인스턴스변수
static int classVariable; //클래스변수 (static변수, 공유변수)
void method(){
int localVariable; //지역변수
}
}
클래스 변수(class variable)
- 클래스 영역에 선언하는데 인스턴스 변수 앞에 static을 붙이면 됨
- 모든 인스턴스가 공통된 저장공간을 공유하게 됨
- 인스턴스변수와 달리 인스턴스를 생성하지 않고도 사용이 가능함
인스턴스 변수(instance vairable)
- 클래스 영역에 선언
- 클래스 인스턴스를 '생성할 때' 만들어짐
- 인스턴스는 독립적인 저장공간을 가져 서로 다른 값을 가질 수 없음
지역변수(local variable)
- 메서드 내에 선언되며 해당 메서드 내에서만 사용이 가능
- 메서드가 종료되면 소멸되어 사용 불가
- for, while문의 블럭{ } 내에 선언된 지역변수는 블럭을 벗어나면 사용이 불가
****⭐ 클래스와 인스턴스 차이
- 클래스 : 객체를 만들어 내기 위한 설계도 혹은 틀
- 인스턴스 : 설계도를 바탕으로 소프트웨어 세계에 구현된 모든 대상
클래스
Java 프로그램에서 객체를 생성하기 위한 일종의 설계도이다. 필드와 메서드로 이루어져 있습니다.
필드
: 객체의 데이터가 저장되는 곳이다.
생성자
: 객체가 실제로 생성될 때 초기화 역할을 담당한다.
메소드
: 객체의 동작에 해당하는 실행 블록이다.
public class Person{
//필드(field)
String name;
//생성자(Constructor)
Person(String name){
this.name = name;
}
//메소드(method)
void eat(){
System.out.println("냠냠..");
}
}
****⭐ Static의 장점과 단점
장점
- new 키워드 없이, 객체 생성없이 호출할 수 있어 코드를 간결하게 할 수 있으며 어디서든 어느 클래스든 static으로 선언된 변수나 메서드를 불러와 사용할 수 있습니다.
- **GC 오버헤드를 줄여줄 수 있습니다.**만약 공통으로 사용해야하는 메서드를 10,000번 호출한다고 가정하겠습니다. new 키워드를 통해 객체를 생성 후 동작하도록 작성하였다면, 반복되는 동안 객체를 Heap영역에 생성하고 사용이 끝나면 메모리를 해제해야합니다. 그러나 이러한 동작을 10,000번 하게 되면 GC에 오버헤드가 발생됩니다. Static은 Heap영역에 생성 및 해제를 할 필요없이 사용가능합니다.
단점
- 무분별한 Static의 사용은 Memory Leak의 원인이 됩니다. 메모리에 올라가는 것이기 때문에, 남용하 메모리를 낭비할 수 있습니다. Static으로 선언된 모든 것들은 프로그램이 시작될 때 메모리를 할당받습니다. 메모리를 해제하기 위해선 프로그램을 종료해야하는데, 만약 무분별하게 Static을 사용하게 된다면 GC가 메모리 해제를 하지 못해 메모리 부족현상이 발생될 수 있습니다.
- **객체지향적이지 않습니다.**많은 개발자들이 static을 악으로 규정하고 있는 이유 중 하나입니다. 객체지향개발요소 중 하나인 캡슐화가 존재합니다. 캡슐화란 한 객체가 가지고 있는 데이터들은 외부에서 함부로 접근하여 수정할 수 없도록 하는 원칙입니다. 그러나 Static을 사용할 경우 어디서든 접근이 가능하기 때문에 캡슐화의 원칙을 위배하게 됩니다.
- **Static은 재사용성이 떨어집니다.**Static으로 선언된 메소드는 Interface를 구현하는데 사용될 수 없습니다. 따라서, 객체지향개발 특징 중 한가지인 재사용성을 살리지 못하기 때문에 객체지향개발에 방해가 됩니다.
- **Static은 Thread-safe하지 않습니다.**Static은 Thread-safe하지 않기 때문에 멀티 스레드 동작에서 충돌이 발생될 수 있습니다.
****⭐ Static은 어느상황에 사용해야할까?
- 클래스 설계 시, 공통적으로 사용되고, 변하지 않으며 자주 사용되는 변수나 메서드는 static을 붙여 객체 생성 비용을 줄일 수 있습니다.
- static메서드 생성을 고려할 때, 인스턴스 변수를 사용하는지 확인하고 사용하지 않을때 static메서드를 생성합니다. 메서드 작업 내용중에 인스턴스 변수를 필요로한다면 static을 붙일 수 없습니다. 그런게 아니라면 가능한 static을 붙여 메서드 호출시간을 짧아지게 할 수 있다.
Static 메서드는 인스턴스 생성없이 호출이 가능 합니다. 그러나 인스턴스 변수는 인스턴스를 생성해야만 값이 존재합니다. 만약 Static 메서드를 호출할 때 생성되지 않은 인스턴스 변수를 사용하면 NullPointer문제가 발생되겠죠? 따라서 Static 메소드에선 인스턴스변수의 사용을 허용하지 않습니다.
****⭐ 접근제어자에 대해서 설명해주세요
JAVA 접근제어자
제약이 강한순서대로 private -> protected -> public 이 있으며 defualt 는 클래스 내부와 동일 패키지에서 접근할 수 있습니다.
자바 접근제어자는 클래스, 인터페이스, 멤버변수, 함수 등의 접근을 제어하는 지시어를 말합니다.
접근제어자를 사용함으로써, 외부 객체의 무분별한 접근으로부터 내부 데이터를 보호할 수 있습니다(데이터 무결성).
접근제어자 같은 클래스 멤버 같은 패지지 멤버 자식 클래스 멤버 그 외
Public | O | O | O | O |
Protected | O | O | O | X |
Default | O | O | X | X |
Private | O | X | X | X |
- public : 모든 패키지, 모든 클래스의 접근 허용
- protected : 같은 패키지, 모든 클래스의 접근 허용 (단, 다른 패키지인 경우 자식 클래스의 접근 허용)
- default : 같은 패키지 내 클래스만 접근 허용
- private : 같은 클래스 내 접근만 허용
접근 제어자를 사용하는 이유는 다음과 같습니다.
- 객체지향 프로그래밍은 객체들 간의 상호작용을 코드로 표현하는데 이때 객체들간의 관계에 따라서 접근 할 수 있는 것과 아닌 것, 권한을 구분할 필요가 생깁니다.
- 클래스 내부에 선언된 데이터의 부적절한 사용으로부터 보호하기 위해서 접근 제어자를 사용합니다.
JAVA final 키워드란
final이란, 변수나 메소드 또는 클래스가 '변경 불가능' 하도록 만드는 자바 키워드 입니다.
final로 선언 시, 무조건 초기화를 해야하며, 초기화 프로그램 실행 도중 값 수정이 불가능합니다.
final을 사용하는 이유
클래스, 메서드, 변수가 변하지 않도록 하기 위해 사용합니다.
final을 선언하면, 절대 변하지 않는 값, 상수라는 개념을 가지게 됩니다.
데이터를 ReadOnly로 만들어, 객체 내부에서 값의 변환이나 가공을 하지 않겠다고 선언하여 데이터를 지킬 때 사용됩니다.
****⭐ Java의 main 메서드가 static인 이유
메모리가 초기화 된 순간 객체는 하나도 존재하지 않기 때문에 객체 멤버 메서드는 바로 실행 할 수 없습니다.
따라서, 객체의 존재 여부에 관계없이 쓰기 위해 static이어야 합니다. static 멤버는 JVM 구동시 스태틱 영역에 바로 배치되기 때문입니다.
AVA 는 어플리케이션이 실행되면 제일먼저 메인(main)메소드를 실행한다 입니다.
****⭐ JVM의 역할에 대해 설명해주세요.
자바 가상 머신 JVM은 자바 가상 머신으로 스택 기반으로 동작하며, Java Byte Code를 실행할 수 있는 주체입니다. 즉 Java와 OS사이의 해당 운영체제가 이해 할 수 있는 기계어로 바꿔 실행시켜 주는 중개자 역할을 합니다. 가비지컬렉션을 통해 자동적인 메모리 관리를 해줍니다.
JVM의 구조는 Class Loader, Exection engine, Runtime Data Area, JNI, Native Method Library로 이루어져 있습니다.
- 클래스 로더(Class Loader): JVM내로 .class 파일 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
- 실행 엔진(Execution Engine): 바이트 코드를 실행시키는 역할
- 인터프리터: 바이트 코드를 한줄 씩 실행합니다.
- JIT 컴파일러: 인터피르터 효율을 높이기 위한 컴파일러로 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러가 반복되는 코드를 네이티브 코드로 바꿔줍니다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용합니다.
- GC(Garbage Collector): 가비지 컬렉터로 힙 영역에서 사용되지 않는 객체들을 제거하는 작업을 의미합니다.
- Runtime Data Areas: 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간을 말한다.
- PC Register: Thread가 시작될 때 생성되며 현재 수행 중인 JVM 명령의 주소를 갖고 있습니다.
- Stack Area: 지역 변수, 파라미터 등이 생성되는 영역. 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장됩니다.
- Heap Area: 동적으로 생성된 오브젝트와 배열이 저장되는 곳으로 GC의 대상 영역입니다.
- Method Area: 클래스 멤버 변수, 메소드 정보, Type 정보, Constant Pool, static, final 변수 등이 생성됩니다. 상수 풀(Constant Pool)은 모든 Symbolic Reference를 포함하고 있습니다.
- JNI(Java Native Interface): 자바 애플리케이션에서 C, C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공해줍니다. Native 키워드를 사용하여 메서드를 호출합니다. 대표적인 메서드는 Thread의 currentThread()입니다.
- Native Method Library: C, C++로 작성된 라이브러리 입니다.
****⭐ 자바의 컴파일 과정
자바의 컴파일 과정
- 자바의 프로그램이 실행되면 JVM 은 OS로 부터 이 프로그램이 필요로 하는 메모리를 요청하여 할당받습니다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리합니다.
- 자바 컴파일러가(javac) 자바 소스코드를(.java) 를 읽어들여 바이트코드(.class) 로 변환(아직 컴퓨터가 이해할 수 없는 상태입니다. 바이트 코드는 인간이 보기 편한 형태입니다.)시킵니다.
- Class Loader 를 통해 class 파일들을 JVM 내부로 로딩합니다.
- 로딩된 class 파일들은 실행 엔진(Execute Engine)을 통해 기계어(컴퓨터가 알아들을 수 있는 언어)로 해석됩니다.
- 해석된 바이트 코드는 메모리 상(Runtime Data Area)에 배치되어 실질적인 수행을 하게됩니다.
- 이런 실행과정 중에 JVM은 Thread Synchronization 이나 GC(Garbage Collection) 같은 작업을 수행하게 됩니다.
****⭐ 메인메소드 public static void main(String[] args){}
JAVA 는 어플리케이션이 실행되면 제일먼저 메인(main)메소드를 실행한다 입니다.
이 메인메소드는 자바 어플리케이션 실행시 제일먼저 동작하며 어느 객체에서든 접근할수 있으며 자바가 컴파일 되는 순간 정의되는 돌려주는 값이없는 함수구나~~~~
public 은 접근제어자로 어느곳에서든 해당 객체를 참조할수있다는 의미입니다.
static 은 이 함수가 정적 함수임을 의미합니다.
static 으로 함수 또는 클래스를 선언했을 경우에 해당 객체는 자바가 컴파일 되는 순간 정의가 됩니다. 그리고 이후 static 이 아닌 객체가 정의가 되죠
따라서 일단 static 객체에서 static 이 아닌 객체를 호출하는것은 불가능합니다.
static 이 먼저 정의가 되기때문에 아직 정의되지 않은 객체는 호출할수 없기때문입니다. 순서를 생각해보면 금방 이해될 내용입니다.
자세한 내용은 나중에 다시한번 설명드리겠습니다.
void 는 리턴되는 값이 없습니다. 단지 해당 함수가 종료된후 호출한 부분으로 이동할뿐입니다.
더쉽게 이해하자면 void 자리에 int 를 넣을경우 어떠한 처리를 실핸한후 정수형 데이터를 돌려보내겠다는 뜻이며 String 이 들어갈경우 문자형 데이터를 돌려보내겠다는 의미입니다.. 이해되셨나요?
args 문자열을 배열로 사용하겠다 라는 의미입니다.
****⭐ 리스트와 배열의 차이
가장 큰 차이는 인덱스의 유무
배열에서는 인덱스를 통해 빠르게 데이터의 조회가 가능하다. 그런데 이 인덱스때문에 원소가 삭제되어옫 인덱스를 유지해야해서 해당 메모리를 유지해야한다는 단점. 그래서 그 크기에 맞는 배열을 선언하지 않으면 메모리 낭비를 초래.
리스트는 이런 메모리의 낭비를 줄이기 위해 인덱스를 포기하고 노드를 연결해 데이터를 적재하는 형태의 선형 자료구조
불연속적인 메모리 공간에 원소와 다음 노드의 주소를 가진 노드가계속해서 이어져 있어 선형의 형태를 유지하는 것이다. 리스트는 주로 원소의 삽입과 삭제가 빈번하거나, 자료의 검색이 빈번하지 않은 경우에 사용한다.
배열 → 인덱스로 바로 접근 가능. 자료구조 크기 크면 더 좋다! But 삽입과 삭제가 어렵고 크기가 가변이 아님.
리스트 → 크기 가변, 색인 불가
참고) 리스트의 다양한 종류
리스트는 링크된 형태에 따라 다음과 같이 종류를 나눌 수 있다.
- 링크드 리스트(Single Linked List)
<Single Linked List>
- 더블 링크드 리스트(Double Linked List)
<Double Linked List>
- 순환 링크드 리스트(Circular Linked List)
<Circular Linked List>
- 순환 더블 링크드 리스트(Doubly Circular Linked List)
⭐ 클래스와 객체 차이
클래스는 필드와 메서드로 구분되어있으며, 객체는 클래스에 선언된 모양그대로 생성된 실체로 클래스의 인스턴스라고도 부릅니다. 즉 클래스는 설계도, 객체는 설계도로 구현한 대상 을 의미한다. (객체 는 인스턴스라고도 부름)
⭐ array는 크기를 정하는데 list는 정하지 않는 이유
⭐ Java에서 제공하는 원시 타입들에 무엇이 있고, 각각 몇 바이트
[정수형]
byte- 1byte
short - 2byte
int- 4byte
long - 8byte
[실수형]
float - 4byte
double - 8byte
[문자]
char - 2byte
[논리형]
boolean - 1byte
⭐ 자바에서 불변객체에 대해 설명해주세요
**불변객체는 재할당은 가능하지만, 한번 할당하면 내부 데이터를 변경할 수 없는 객체
대표적인 예로 String, Integer, Boolean 등이 있습니다.**
값이 변경이 가능한게 아니라 새로운 객체를 만들어 참조
final로도 가능
final 을 선언함으로 인해 상수라는 개념을 가지게되죠→ 절대 가공해서는 안되는 객체일
장점
- 객체에 대한 신뢰도가 높다.
- 멀티스레드 환경에서 동기화 처리 없이 객체를 공유할 수 있다.
단점
- 객체가 가지는 값마다 새로운 객체가 필요해서 메모리 누수와 성능저
⭐ 멀티 쓰레드란?
하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행
[ 데이터 영역, 힙, 스택 ]영역중 스택 영역만 비공유
스택 영역만 비공유하고 데이터 영역과 힙 영역을 공유한다. 멀티쓰레딩 환경에서는 동기화 작업이 필요하다
동기화를 통해 작업 처리 순서를 컨트롤 하고공유 자원에 대한 접근을 컨트롤 하는데 병목현상 주의!!! 과도한 **락(lock)**으로 인한 병목 현상을 줄여야 한다
⭐ 멀티 쓰레드와 멀티 프로세스 차이?
멀티 스레드→ 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것
멀티 프로세스 -> 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행
멀티 프로세스는 각 프로세스가 독립적인 메모리를 가지고 별도로 실행되지만, 멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유한다는 점이 다릅니다.
⭐ 불변객체 원시타입일때 참조타입일 때 어떻게 작업?
• 원시 타입의 경우 final을 이용해 간단하게 불변 객체를 만들 수 있지만, 참조 타입의 경우 다른 작업들이 추가된다. setter를 포함하지 않는 것과 동시에 getter 사용시 방어적 복사를 통해 값을 전달해야 합니다. 또한, 참조 변수 객체 내부 또한 불변 이여야 불변이 성립합니다.
⭐ 추상클래스와 인터페이스의 차이 및 존재 이유
차이점으로는 추상 클래스는 extends 키워드를 사용하여 상속하며, 다중 상속은 불가능합니다. 반면 인터페이스는 implements 키워드를 사용하여 상속하며, 다중 상속이 가능합니다.
또 추상 클래스는 일반 변수, 생성자, 일반 메서드, 추상 메서드를 모두 가질 수 있는 반면 인터페이스는 상수와 추상 메서드만 가질 수 있고, 생성자와 일반 변수는 가질 수 없습니다.
추상클래스는 인터페이스와 다르게 static이나 final이 아닌 필드를 가질 수 있고, public protected, private 접근 제어자를 모두 사용할 수 있습니다. 인터페이스는 추상 클래스보다 추상화 정도가 높으며 선언부만 작성되어있는 추상 클래스와는 다르게 구현부가 있다는 특징이 있습니다.
인터페이스의 모든 메서드는 **'public abstract'**로 선언해야 하며, 컴파일 시 자동으로 생성해주기 때문에 이를 생략할 수 있습니다.
또한 모든 멤버 변수는 '**public static final'**으로 선언해야 하며, 마찬가지로 이를 생략할 수 있습니다.
이 둘의 공통점은 메서드의 선언만 있고, 구현 내용이 없다는 것입니다. (추상 메서드)
new 키워드를 통해 객체를 생성할 수 없으며, 상속받은 클래스가 반드시 선언된 추상 메서드를 구현하도록 한다는 것입니다.
목적
추상클래스는 추상 클래스를 상속받아 기능을 이용하고 확장시키는 데 있고,
인터페이스는 함수의 구현을 강제하기 위해 함수의 껍데기만 있는 것입니다.
클래스는 크게 일반 클래스와 추상 클래스로 나뉘는데 추상 클래스는 클래스 내 '추상 메소드'가 하나 이상 포함되거나 abstract로 정의된 경우를 말합니다.
추상클래스는 IS - A "~이다".
인터페이스는 HAS - A "~을 할 수 있는".
추상클래스란?
선언부만 작성하고 구현부는 작성하지 않은 채로 남겨두는 것이 추상 메서드이며, 상속받는 클래스에 따라서 구현되는 내용이 달라질 수 있습니다
추상클래스는 추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스입니다. 그래서 미완성 설계도라고도 표현합니다. 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없습니다.
→인터페이스와 다르게 static이나 final이 아닌 필드를 가질 수 있고, public protected, private 접근 제어자를 모두 사용할 수 있습니다.
추상 클래스는 상속을 통해서만 사용 가능하며, 하위 클래스의 생성자에서 super()를 사용해서 추상 클래스의 생성자를 부르고 초기화시킵니다.
class 앞에 "abstract" 예약어를 사용하여 상속을 통해서 구현해야한다는 것을 알려주고 선언부만 작성하는 추상메서드를 선언할 수 있습니다.
abstract class 클래스이름 {
...
public abstract void 메서드이름();
}
인터페이스란?
추상클래스가 미완성 설계도라면 인터페이스는 기본 설계도라고 할 수 있습니다. 인터페이스는 상수(static final)와 추상 메서드(abstract method)의 집합입니다. 인터페이스는 추상 클래스보다 추상화 정도가 높으며 추상 클래스와는 다르게 구현부가 있는 일반 메서드, 일반 멤버 변수를 가질 수 없다는 특징이 있습니다.
인터페이스의 모든 메서드는 'public abstract'로 선언해야 하며, 이를 생략할 수 있습니다. 또한 모든 멤버 변수는 'public static final'으로 선언해야 하며, 마찬가지로 이를 생략할 수 있습니다.
(생략할 수 있는 이유는 컴파일 시 자동으로 생성해주기 때문입니다.)
interface 인터페이스이름 {
public static final 상수이름 = 값;
public abstract void 메서드이름();
}
⭐ 형변환(기본타입, 참조형타입) 하는 방법꼬리질문: 기본타입에는 어떤 자료가 들어가고 참조형타입에는 어떤 자료가 들어가는가?
⭐ httpservletrequest, httpservletresponse 클래스는 언제 사용
⭐ dcl, dml, ddl 정의와 명령어
⭐ . init(), destroy(), service()
⭐ 프레임워크 장점
⭐ 트랜잭션이란
⭐ 데이터 무결성을 위한 제약조건
⭐ 💡 try-with-resources에 대해 설명해주세요.
- try-with-resources는 try-catch-finally의 문제점을 보완하기 위해 나온 개념입니다.
- try( ... ) 안에 자원 객체를 전달하면, try블록이 끝나고 자동으로 자원 해제 해주는 기능을 말합니다.
- 따로 finally 구문이나 모든 catch 구문에 종료 처리를 하지 않아도 되는 장점이 있습니다.
- try-with-resources 알아보기
⭐ 💡 싱글톤 패턴에 대해 설명과 예시
글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴입니다.
- 인스턴스가 1개만 존재해야 한다는 것을 보장하고 싶은 경우와
- 동일한 인스턴스를 자주 생성해야 하는 경우에 주로 사용합니다. (메모리 낭비 방지)
⭐
⭐
⭐
⭐
⭐
💡 가비지 컬렉션(Garbage Collection)에 대해 설명해주세요.
- 가비지 컬렉션은 JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법입니다.
💡 가비지 컬렉션 과정에 대해 설명해주세요.
더보기
💡 객체지향의 설계원칙에 대해 설명해주세요.
- SRP - 단일 책임 원칙 : 한 클래스는 하나의 책임만 가져야 한다.
- OCP - 개방-폐쇄 원칙 : 확장에는 열려있고, 수정에는 닫혀있어야 한다.
- LSP - 리스코프 치환 원칙 : 상위 타입은 항상 하위 타입으로 대체할 수 있어야 한다.
- ISP - 인터페이스 분리 원칙 : 인터페이스 내에 메소드는 최소한 일수록 좋다. (하나의 일반적인 인터페이스보다 여러 개의 구체적인 인터페이스가 낫다.)
- SRP와 같은 문제에 대한 두 가지 다른 해결책이다.
- DIP - 의존관계 역전 원칙 : 구체적인 클래스보다 상위 클래스, 인터페이스, 추상클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺어라.
- DIP 원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI)이다.
💡 자바의 메모리 영역에 대해 설명해주세요.
- 자바의 메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고, 데이터 타입에 따라 할당됩니다.
- 메소드(Method) 영역 : 전역변수와 static변수를 저장하며, Method영역은 프로그램의 시작부터 종료까지 메모리에 남아있다.
- 스택(Stack) 영역 : 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다. LIFO(Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.
- 힙(Heap) 영역 : new 키워드로 생성되는 객체(인스턴스), 배열 등이 Heap 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어 진다.
💡 각 메모리 영역이 할당되는 시점은 언제인가요?
더보기
💡 클래스와 객체에 대해 설명해주세요.
클래스는 객체를 만들어내기 위한 설계도 혹은 틀 이라고 할 수 있고, 객체를 생성하는데 사용합니다.
객체는 설계도(클래스)를 기반으로 생성되며, 자신의 고유 이름과 상태, 행동을 갖습니다.
여기서 상태는 필드(fields), 행동은 메소드(Method)라고 표현합니다.
객체에 메모리가 할당되어 실제로 활용되는 실체는 '인스턴스'라고 부릅니다.
💡 생성자(Constructor)에 대해 설명해주세요.
생성자는 클래스와 같은 이름의 메소드로, 객체가 생성될 때 호출되는 메소드입니다.
명시적으로 생성자를 만들지 않아도 default로 만들어지며, 생성자는 파라미터를 다르게하여 오버로딩할 수 있습니다.
💡 Wrapper Class란 무엇이며, Boxing과 UnBoxing은 무엇인지 설명해주세요.
- 기본 자료형(Primitive data type)에 대한 객체 표현을 Wrapper class라고 합니다.
- 기본 자료형 → Wrapper class로 변환하는 것을 Boxing이라 하며,
- Wrapper class → 기본 자료형으로 변환하는 것을 UnBoxing이라 합니다.
- Wrapper클래스란?
💡 Synchronized에 대해 아는 대로 말해주세요.
- 여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념입니다.
- 데이터의 thread-safe를 하기 위해 자바에서 Synchronized 키워드를 제공해 멀티 쓰레드 환경에서 쓰레드간 동기화를 시켜 데이터의 thread-safe를 보장합니다.
- Synchronized는 변수와 메소드에 사용해서 동기화 할 수 있으며, Synchronized 키워드를 남발하게 되면 오히려 프로그램의 성능저하를 일으킬 수 있습니다.
💡 new String()과 리터럴("")의 차이에 대해 설명해주세요.
- new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 메모리 영역에 저장되고,
- ""는 Heap 안에 있는 String Constant Pool 영역에 저장됩니다.
https://www.journaldev.com/797/what-is-java-string-pool
💡 String, StringBuffer, StringBuilder의 차이를 설명해주세요.
- String은 불변의 속성을 가지며, StringBuffer와 StringBuilder는 가변의 속성을 가집니다.
- StringBuffer는 동기화를 지원하여 멀티 쓰레드 환경에서 주로 사용하며,
- StringBuilder는 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용합니다.
- String, StringBuffer, StringBuilder의 차이와 장단점
💡 String 객체가 불변인 이유에 대해 아는대로 설명해주세요.
더보기
💡 접근 제한자(Access Modifier)에 대해 설명해주세요.
- 변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 Java의 예약어를 의미하며, 총 4 가지 종류가 있습니다.
- public - 접근 제한이 없다. (같은 프로젝트 내 어디서든 사용 가능)
- protected - 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다.
- (default) - 해당 패키지 내에서만 접근 가능
- private - 해당 클래스에서만 접근 가능
💡 클래스 멤버 변수 초기화 순서에 대해 설명해주세요.
- static 변수 선언부 : 클래스가 로드 될 때 변수가 제일 먼저 초기화 된다.
- 필드 변수 선언부 : 객체가 생성될 때 생성자 block 보다 앞서 초기화 된다.
- 생성자 block : 객체가 생성될 때 JVM이 내부적으로 locking( thread-safe 영역 )
💡 static에 대해 설명해주세요.
- static 키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용할 수 있습니다. 즉, 인스턴스(객체) 생성 없이 바로 사용 가능합니다.
- 모든 객체가 메모리를 공유한다는 특징이 있고, GC 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게 됩니다.
- static 변수와 static 메소드
💡 static을 사용하는 이유에 대해 설명해주세요.
더보기
💡 Inner Class(내부 클래스)의 장점에 대해 설명해주세요.
- 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있다.
- 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킨다.
- 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있다.
💡 리플렉션(Reflection)이란 무엇인지 설명해주세요.
리플렉션이란 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API 입니다.
💡 리플렉션은 어떤 경우에 사용되는지 설명해주세요.
더보기
💡 Error와 Exception의 차이를 설명해주세요.
- Error는 실행 중 일어날 수 있는 치명적 오류를 말합니다. 컴파일 시점에 체크할 수 없고, 오류가 발생하면 프로그램은 비정상 종료되며 예측 불가능한 UncheckedException에 속합니다.
- 반면,
- Exception은 Error보다 비교적 경미한 오류이며, try-catch를 이용해 프로그램의 비정상 종료를 막을 수 있습니다.
- 예외 처리(Exception) 알아보기
💡 CheckedException과 UnCheckedException의 차이를 설명해주세요.
- CheckedException은 실행하기 전에 예측 가능한 예외를 말하고, 반드시 예외 처리를 해야 합니다.
- 대표적인 Exception - IOException, ClassNotFoundException 등
- UncheckedException은 실행하고 난 후에 알 수 있는 예외를 말하고, 따로 예외처리를 하지 않아도 됩니다.
- 대표적인 Exception - NullPointerException, ArrayIndexOutOfBoundException 등
- RuntimeException은 UncheckedException을 상속한 클래스이고, RuntimeException이 아닌 것은 CheckedException을 상속한 클래스 입니다.
- CheckedException, UnCheckedException
💡 컬렉션 프레임워크에 대해 설명해주세요.
- 다수의 데이터를 쉽고 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다.
- 자바 컬렉션에는 List, Set, Map 인터페이스를 기준으로 여러 구현체가 존재하고, 이에 더해 Stack, Queue 인터페이스도 존재합니다.
- 자바 컬렉션 프레임워크 알아보기
💡 List, Set, Map, Stack, Queue의 특징에 대해 설명해주세요.
더보기
💡 Set과 Map의 타입이 Wrapper Class가 아닌 Object를 받을 때 중복 검사는 어떻게 할건지 설명해주세요.
hashCode() 메소드를 오버라이딩하여 리턴된 해시코드 값이 같은지를 보고 해시코드 값이 다르다면 다른 객체로 판단하고,
해시코드 값이 같으면 equals() 메소드를 오버라이딩하여 다시 비교합니다. 이 두 개가 모두 맞으면 중복 객체입니다.
💡 Vector와 List의 차이를 설명해주세요.
- 벡터는 데이터 삽입시 원소를 밀어내지만 리스트는 노드를 연결만 하기 때문에, 삽입 삭제 부분에서 리스트가 시간복잡도의 우위를 가집니다.
- 벡터는 랜덤부분접근이 가능하지만 리스트는 더블링크드리스트(노드가 양쪽으로 연결)로 되어있기 때문에 랜덤 접근이 되지 않습니다. 검색적인 측면에서는 벡터가 우위에 있습니다.
- 벡터는 리스트와 달리 항상 동기화되는 장점이자 단점을 가지고 있습니다. 멀티 쓰레드 환경에서 안전하게 객체를 추가하고 삭제할 수 있지만, 단일쓰레드 환경 일때도 동기화를 하기 때문에 List보다 성능이 떨어집니다.
💡 제네릭에 대해 설명해주시고, 왜 쓰는지 알려주세요.
- 제네릭은 데이터의 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정한다는 의미입니다.
- 제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있어 에러를 사전에 방지할 수 있습니다.
- 제네릭 알아보기
💡 final / finally / finalize 의 차이를 설명해주세요.
- final은 클래스, 메소드, 변수, 인자를 선언할 때 사용할 수 있으며, 한 번만 할당하고 싶을 때 사용합니다.
- final 변수는 한 번 초기화되면 그 이후에 변경할 수 없습니다.
- final 메소드는 다른 클래스가 이 클래스를 상속할 때 메소드 오버라이딩을 금지합니다.
- final 클래스는 다른 클래스에서 이 클래스를 상속할 수 없습니다.
- finally는 try-catch와 함께 사용되며, try-catch가 종료될 때 finally block이 항상 수행되기 때문에 마무리 해줘야 하는 작업이 존재하는 경우에 해당하는 코드를 작성해주는 코드 블록입니다.
- finalize는 Object 클래스에 정의되어 있는 메소드이며, GC에 의해 호출되는 메소드로 절대 호출해서는 안되는 메소드입니다. GC가 발생하는 시점이 불분명하기 때문에 해당 메소드가 실행된다는 보장이 없고, finalize() 메소드가 오버라이딩 되어 있으면 GC가 이루어질 때 바로 Garbage Collectiong 되지 않습니다. GC가 지연되면서 OOME(Out of Memory Exception)이 발생할 수 있기 때문에 finalize() 메소드를 오버라이딩하여 구현하는 것을 권장하지 않고 있습니다.
💡 직렬화(Serialize)에 대해 설명해주세요.
- 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술이며, 반대로 직렬화된 바이트 형태의 데이터를 다시 객체로 변환하는 과정을 '역직렬화'라고 합니다.
- (간단히) JVM의 메모리에 상주(힙 or 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
💡 SerialVersionUID를 선언해야 하는 이유에 대해 설명해주세요.
- JVM은 직렬화와 역직렬화를 하는 시점의 클래스에 대한 버전 번호를 부여하는데, 만약 그 시점에 클래스의 정의가 바뀌어 있다면 새로운 버전 번호를 할당하게 됩니다. 그래서 직렬화할 때의 버전 번호와 역직렬화를 할 때의 버전 번호가 다르면 역직렬화가 불가능하게 될 수 있기 때문에 이런 문제를 해결하기 위해 SerialVersionUID를 사용합니다.
- 만약 직렬화할 때 사용한 SerialVersionUID의 값과 역직렬화 하기 위해 사용했던 SVUID가 다르다면 InvalidClassException이 발생할 수 있다.
1. OOP가 뭐죠?
데이터를 객체로 취급하여 프로그램에 반영하고, 순차적으로 프로그램이 동작하는 것과는 다르게 객체의 상호작용을 통해 프로그램이 동작하는 것을 말합니다.
객체를 연결시켜 프로그래밍하면 상속, 캡슐화, 다형성을 이용해 코드 재사용을 증가시키고, 유지보수를 감소시켜주는 장점이 있습니다.
2. 자바의 메모리 영역에 대해서 설명해보세요.
- 메서드 영역
static 변수, 전역 변수, 코드에서 사용되는 클래스 정보들이 올라갑니다. 코드에서 사용되는 클래스들을 로더가 읽고 클래스 별로 분류해서 저장합니다.- 스택(Stack)
지역 변수, 메서드 등이 할당되는 LIFO 방식의 메모리입니다.- 힙(Heap)
new 연산자를 통해 동적할당된 객체들이 저장되고, 메모리는 가비지 컬렉션에 의해 관리됩니다.
3. 인터페이스가 뭐죠? 왜 사용하나요?
인터페이스는 모든 메서드가 추상 메서드로 이루어진 클래스입니다. 특징으로는 따로 abstract를 쓰지 않아도 모두 추상 메서드로 정의가 되구요. 선언한 변수는 자동으로 final static 키워드가 붙습니다.
사용하는 이유는 예를 들면.. 인터페이스는 팀 작업을 할 때 개발코드와 객체가 서로 통신하는 접점 역할을 지원합니다. 개발코드에서는 객체의 내부 구조를 모르더라도 인터페이스의 메서드 명만 알면 다른 팀의 작업을 기다리지 않아도 됩니다. 또한 해당 객체가 수정이 되더라도, 개발 코드 부분은 수정하지 않아도 되는 장점도 있습니다. 이처럼 인터페이스를 통해 팀 단위로 큰 프로젝트를 효율적으로 진행할 수 있습니다.
4. 메모리 상수풀 영역에 대해 설명해보세요.
힙 영역에서 생성되고 자바 프로세스 종료까지 계속 유지되는 메모리 영역입니다. 기본적으로 JVM에서 관리하고 있구요. 프로그래머가 작성한 상수에 대해 최우선으로 찾아보고 없으면 상수풀에 추가한 후 그 주소값을 리턴해줍니다. 이로써 메모리 절약 효과를 가져올 수 있습니다.
5. jdbc가 무엇인가요?
자바에서 데이터베이스를 접속할 수 있도록 해주는 자바 API입니다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트 하는 방법들을 제공합니다.
6. 직렬화란 무엇인가요 ?
자바에서 입출력에 사용되는 것은 스트림이라는 데이터 통로를 통해 이동합니다. 하지만 객체는 바이트형이 아니기 때문에 스트림을 통해서 저장하거나 네트워크로 전송하는 것이 불가능합니다. 따라서 객체를 스트림으로 입출력하기 위해서 바이트 배열로 변환하는 것을 직렬화라고 합니다.
반대로 스트림으로 받은 직렬화된 객체를 다시 원래로 돌리는 건 역직렬화라고 말합니다.
7. serialVersionUID를 선언해야 하는 이유는 뭔가요?
JVM은 직렬화나 역직렬화를 하는 시점의 클래스에 대해 version 번호를 부여합니다. 그런데 만약 이 시점에서 클래스의 정의가 바뀌게 되면, version 번호도 새롭게 할당해주는데요. 직렬화와 역직렬화의 version 번호가 서로 다르면 안되기 때문에 serialVersionUID를 선언해서 문제를 해결할 수 있습니다.
즉, 클래스 버전이 맞는지 확인하기 위한 용도로 사용된다고 말씀드릴 수 있습니다.
8. 리플렉션이란 무엇인가요?
리플렉션은 컴파일러를 무시한 채 런타임 상황에서 메모리에 올라간 클래스나 메서드 등의 정의를 동적으로 찾아 조작할 수 있는 행위를 말합니다.
즉, 동적인 언어가 가진 특징이라고 볼 수 있고 프레임워크에서 유연성이 있는 동작을 위해 자주 사용됩니다.
9. 자바의 클래스 멤버 변수 초기화 순서에 대해 설명하세요
static 변수 선언부는 클래스가 로드 될 때 변수가 제일 먼저 초기화 됩니다. 필드 변수 선언부는 객체가 생성될 때 heap 메모리에 올라가고 생성자 block보다 앞서 초기화됩니다. 생성자 block은 객체가 생성 될 때 마찬가지로 heap 메모리에 올라가는데요. 이때 필드 변수가 초기화 될 때까지 JVM에서 내부적으로 로킹해줍니다.
10. Servlet과 JSP를 비교해서 설명하세요
Servlet은 자바 언어로 웹 개발을 하기 위해 만들어진 것으로, 컨테이너가 이해할 수 있도록 순수 자바 코드로만 이루어져 있습니다.
JSP는 html 기반에 자바 코드를 블록화하여 삽입한 것으로 서블릿을 좀 더 쉽게 접근할 수 있도록 만들어진 것입니다.
11. 제너릭이 무엇인가요?
클래스를 선언할 때 타입을 결정하지 않고 객체 생성 시 유동적으로 재사용하기 위한 것을 말합니다. 제너릭을 활용하면 따로 형변환할 필요가 없고, 타입 에러가 발생하지 않기 때문에 유용하게 사용할 수 있습니다.
12. 컬렉션 클래스에서 제너릭을 사용하는 이유를 설명하세요
컬렉션 클래스에서 제너릭을 사용하면, 컴파일러는 특정한 타입만 포함될 수 있도록 컬렉션을 제한합니다. 컬렉션 클래스에 저장되는 인스턴스 타입을 제한하여 런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일 타임에 잡아낼 수 있도록 도와주기 때문에 사용합니다.
13. pojo가 무엇인가요?
오래된 방식의 자바 오브젝트의 줄임말인데요. 특정한 자바 모델이나 기능, 프레임워크 등을 따르지 않는 자바 오브젝트를 뜻합니다.
14. 박싱과 언박싱에 대해 설명하세요
원시형을 Wrapper Class로 변환하는 것이 박싱이고,
Wrapper Class를 원시형으로 변환하는 것이 언박싱입니다.
15. 데드락이 무엇이고, 해결방법에 대해 설명해보세요
데드락이란, 둘 이상의 스레드가 lock을 획득하기 위해 기다리는데, 이 lock을 잡고 있는 스레드도 똑같이 다른 lock을 기다리면서 서로 블락 상태에 놓이는 것을 말합니다. 데드락은 다수의 스레드가 같은 lock을 동시에 다른 명령에 의해 획득하려 할 때 발생할 수 있는데요. 해결방법으로는 우선 순위를 선정해 자원을 선점하도록 하는 것과 공유 불가능한 상호 배제 조건을 제거하는 것이 있습니다.
16. 상속과 컴포지션(합성)의 차이에 대해서 설명해보세요
상속은 is a 관계, 컴포지션은 개체들 간의 has a 관계입니다.
상속은 클래스를 확장해 부모 클래스에서 속성 및 동작을 상속하는 기능이구요. 컴포지션은 클래스가 구성원 데이터로 다른 클래스의 객체를 포함할 수 있는 능력입니다.
17. JVM이 하는 역할이 무엇인가요?
JVM은 자바를 실행하기 위한 가상 기계입니다. 자바의 바이트 코드를 운영체제에 맞게 해석해주는 역할을 하는데요.
자바 컴파일러가 .java 파일을 컴파일 하면, .class라는 자바 바이트 코드로 변환시켜줍니다. 이때 바이트 코드가 기계어가 아니기 때문에 운영체제에서 바로 실행이 되지 않습니다. 이때 운영체제가 이해할 수 있도록 해석해주는 것이 JVM입니다.
18. interface랑 abstract를 비교해서 설명해주세요
인터페이스는 일종의 추상 클래스이며 오직 추상 메서드와 상수만 멤버로 갖습니다. 상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현하여 쓸 수 있습니다.
abstract는 추상 메서드를 하나 이상 가진 클래스이며, 자신의 생성자로 객체 생성이 불가능합니다. 하위 클래스를 참조해 상위 클래스의 객체를 생성하여 하위 클래스를 제어하기 위해 사용합니다.
19. 다형성에 대해서 설명해보세요
다형성이란, 하나의 메소드나 클래스가 있을 때 이들이 다양한 방법으로 동작하는 것을 의미합니다.
20. 스프링과 MVC패턴에 대해 설명하세요
스프링은 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크입니다. 자바 SE로 된 자바 객체 POJO를 자바 EE에 의존적이지 않게 연결해주는 역할을 합니다. 스프링의 특징으로는 크기와 부하 측면에서 경량 시킨 것과, IOC 기술로 애플리케이션의 느슨한 결합을 도모시킨 것이 있습니다.
MVC 패턴은 코드의 재사용에 유용하며, 사용자 인터페이스와 응용 프로그램 개발에 소요되는 시간을 줄여주는 효과적인 설계 방식을 말합니다.
구성요소로는 Model, View, Controller가 있는데요. 모델은 핵심적인 비즈니스 로직을 담당하여 데이터베이스를 관리하는 부분이고, 뷰는 사용자에게 보여주는 화면, 컨트롤러는 모델과 뷰 사이에서 정보 교환을 할 수 있도록 연결시켜주는 역할을 합니다.
21. 스프링에서 AOP가 뭔가요?
AOP는 관점 지향 프로그래밍의 약자인데요. 기존의 OOP에서 기능별로 클래스를 분리했음에도 불구하고, 여전히 로그나 트랜잭션, 자원해제, 성능테스트 메서드처럼 공통적으로 반복되는 중복코드가 발생하는 단점이 생깁니다. 이를 해결할 수 있도록 개발 코드에서는 비즈니스 로직에 집중하고, 실행 시 비즈니스 로직의 앞과 뒤에서 원하는 지점에 해당 공통 관심사를 수행할 수 있게 하면서 중복 코드를 줄일 수 있는 방식이 바로 AOP 방식입니다.
22. 스프링 DI에 대해 아는대로 말씀해주세요
DI는 의존성 주입의 약자로, 객체들 간의 의존성을 줄이기 위해 사용되는 스프링의 IOC 컨테이너의 구체적 구현 방식을 말합니다.
DI는 개발코드 부분에서 객체를 생성하는 것이 아니라, 데이터 주입만 담당하는 별도의 공간에서 객체를 생성하고, 데이터간의 의존성을 주입해 개발코드에서 가져다 쓰면서 의존성을 줄이는 방식입니다. 디자인 패턴 중 팩토리 패턴을 활용하는 것과 같다고 말씀드릴 수 있겠습니다.
23. MVC1이랑 MVC2의 패턴 차이에 대해 설명해주세요
모델1은 JSP페이지 안에서 로직 처리를 위해 자바 코드가 함께 사용됩니다. 요청이 오면, 직접 자바빈이나 클래스를 이용해 작업을 처리하고, 이를 클라이언트에 출력해줍니다. 구조가 단순한 장점이 있지만, JSP 내에서 html 코드와 자바 코드가 같이 사용되면서 복잡해지고 유지보수가 어려운 단점이 있습니다.
모델2는 이와는 다르게 모든 처리를 JSP에서만 담당하는 것이 아니라 서블릿을 만들어 역할 분담을 하는 패턴입니다. 요청 결과를 출력해주는 뷰만 JSP가 담당하고, 흐름을 제어해주고 비즈니스 로직에 해당하는 컨트롤러의 역할을 서블릿이 담당하게 됩니다. 이처럼 역할을 분담하면서 유지보수가 용이해지는 장점이 있지만 습득하기 힘들고 구조가 복잡해지는 단점도 있습니다.
24. 스프링 필터랑 인터셉터의 차이점이 무엇일까요?
필터와 인터셉터는 실행되는 시점에서 차이가 있습니다. 필터는 웹 애플리케이션에 등록을 하고, 인터셉터는 스프링의 context에 등록을 합니다. 따라서 컨트롤러에 들어가기 전 작업을 처리하기 위해 사용하는 공통점이 있지만, 호출되는 시점에서 차이가 존재합니다.
25. IOC가 무엇인가요?
IOC란, 인스턴스의 생성부터 소멸까지 개발자가 아닌 컨테이너가 대신 관리해주는 것을 말합니다. 인스턴스 생성의 제어를 서블릿과 같은 bean을 관리해주는 컨테이너가 관리합니다.
26. 스프링이랑 스프링 부트랑 차이점이 뭔가요?
스프링 부트는 스프링에서 사용하는 프로젝트를 간편하게 셋업할 수 있는 서브 프로젝트입니다. 독립 컨테이너에서 동작할 수 있기 때문에 임베디드 톰켓이 자동으로 실행되구요. 임베디드 컨테이너에서 애플리케이션을 실행시키기에는 다소 불안전해서 큰 프로젝트는 사용하지 않는 것이 좋습니다.
27. 스프링 MVC 구조 흐름에 대해서 과정대로 설명해보세요
우선, 디스패처 서블릿이 클라이언트로부터 요청을 받으면, 이를 요청할 핸들러 이름을 알기 위해 핸들러맵핑에게 물어봅니다.
핸들러맵핑은 요청 url을 보고 핸들러 이름을 디스패처 서블릿에게 알려줍니다. 이때 핸들러를 실행하기 전/후에 처리할 것들을 인터셉터로 만들어 줍니다.
디스패처 서블릿은 해당 핸들러에게 제어권을 넘겨주고, 이 핸들러는 응답에 필요한 서비스를 호출하고 렌더링해야 하는 뷰 이름을 판단하여 디스패처 서블릿에게 전송해줍니다.
디스패처 서블릿은 받은 뷰 이름을 뷰 리졸버에게 전달해 응답에 필요한 뷰를 만들라고 명령합니다.
이때 해당하는 뷰는 디스패처 서블릿에게 받은 모델과 컨트롤러를 활용해 원하는 응답을 생성해서 다시 보내줍니다.
디스패처 서블릿은 뷰로부터 받은 것을 클라이언트에게 응답해줍니다.
28. DAO와 DTO를 설명해주세요
DAO는 데이터베이스의 데이터에 접근하기 위한 객체입니다. 데이터베이스에 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해서 사용되구요. 데이터베이스를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 객체를 말합니다.
DTO는 계층간 데이터 교환을 위한 자바 beans를 말합니다. 여기서 말하는 계층은 컨트롤러, 뷰, business layer, persistent layer를 말합니다. VO도 같은 기능을 하지만 read only 속성을 가진 차이가 있습니다.