라이브러리와 프레임워크 차이는?
공통점: 여러 프로젝트나 시스템에서 공통으로 사용되는 특정한 기능을 모듈화한 것으로 이를 통해 코드의 재사용성을 높이고 유지 보수를 용이하게 한다.
라이브러리
라이브러리는 특정 작업을 수행하는 코드의 집합이다. 개발자는 필요에 따라 라이브러리의 함수를 호출하여 사용한다. 라이브러리는 프레임워크에 비해 제약이 적고 자유롭게 사용할 수 있다.
프레임워크
프레임워크는 소프트웨어의 특정 문제를 해결하기 위한 일련의 규칙, 함수, 클래스 등을 제공하는 뼈대나 구조이다.
프레임워크는 제약과 규칙이 있어 개발자가 특정 패턴과 구조를 따르도록 유도한다. 이는 코드의 일관성을 유지하고, 팀원 간의 협업을 용이하게 하며, 더 빠르고 효율적인 개발을 가능하게 한다. 그러나 이러한 제약과 규칙은 때때로 유연성을 제한할 수 있다.
프레임워크와 라이브러리의 주요 차이점은 "제어의 역전"이다. 라이브러리를 사용하는 코드가 실행 흐름을 제어하고, 필요할 때 라이브러리를 사용한다. 반면에 프레임워크는 전체적인 실행 흐름을 제어하며, 개발자가 작성한 코드를 적절한 시점에 호출한다. 이를 통해 개발자는 프로그램의 특정 부분에만 집중할 수 있다. 이러한 특성 때문에 프레임워크는 복잡한 문제를 해결하는 데 더 유용할 수 있다. 하지만 프레임워크를 사용하면 그 프레임워크의 규칙과 제약을 따라야 하므로, 라이브러리에 비해 유연성이 떨어질 수 있다. 이러한 이유로, 프레임워크와 라이브러리 중 어떤 것을 사용할지 결정할 때는 개발하려는 애플리케이션의 요구사항과 목표를 충분히 고려해야 한다.
ex) 라이브러리 : jQuery, Log4j 프레임워크 : spring boot
디자인 패턴이란 ? (물어봄)
프로그램을 설계할 때 발생하는 문제점을 해결할 수 있도록 하나의 규약 형태로 만들어 놓은 것
- 싱글톤 패턴: 하나의 인스턴스만 생성하고, 그 인스턴스를 전역에서 접근할 수 있도록 하는 패턴
- 장점 : 인스턴스 생성 비용을 아낄 수 있다, 자원을 공유할 수 있다.
- 팩토리 패턴: 객체 생성 로직을 캡슐화하여, 클라이언트가 직접 객체를 생성하지 않고, 팩토리 클래스를 통해 객체를 생성하는 패턴
- 전략 패턴: 알고리즘을 정의하고, 각각을 캡슐화하여 교환해서 사용할 수 있도록 하는 패턴입니다. 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경하는 패턴
- 옵저버 패턴: 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여, 상태 변화가 있을 때마다 메서드 등을 통해 옵저버들에게 알려주는 패턴
- 프록시 패턴: 다른 객체에 대한 인터페이스를 제공하여 그 객체에 대한 접근을 제어하는 패턴입니다. 원격 객체, 복잡한 객체, 요구되는 리소스가 많은 객체 등을 제어할 때 사용하는 패턴
- MVC 패턴: 애플리케이션을 모델(Model), 뷰(View), 컨트롤러(Controller)의 세 부분으로 나누는 패턴입니다. 이를 통해 사용자 인터페이스와 비즈니스 로직을 분리하여 관리하는 패턴
- MVVM 패턴: 모델(Model), 뷰(View), 뷰 모델(ViewModel)의 세 부분으로 나누는 패턴입니다. 뷰 모델은 뷰를 위한 데이터를 가공하며, 뷰와 모델 사이의 의존성을 줄여주는 패턴
프로그래밍 설계원칙은 ?
S: Single Responsibility Principle (SRP) - 단일 책임 원칙: 클래스는 하나의 책임만 가져야 한다. 즉, 클래스가 변경되어야 하는 이유는 하나뿐이어야 한다.
O: Open-Closed Principle (OCP) - 개방-폐쇄 원칙: 소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.
L: Liskov Substitution Principle (LSP) - 리스코프 치환 원칙: 프로그램에서 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 대체해도 프로그램의 의미는 변하지 않아야 한다.
I: Interface Segregation Principle (ISP) - 인터페이스 분리 원칙: 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하면 안 된다. 즉, 하나의 일반적인 인터페이스보다는 여러 개의 구체적인 인터페이스가 낫다.
D: Dependency Inversion Principle (DIP) - 의존성 역전 원칙: 상위 모듈은 하위 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다. 이 원칙은 구체적인 세부 사항에 의존하는 대신 추상화에 의존해야 함을 의미한다.
Java 컴파일 과정을 설명해라
- 소스 코드 작성: 개발자는 .java 확장자를 가진 소스 파일을 작성한다.
- 컴파일: Java 컴파일러(javac)는 .java 파일을 읽어들여 Java 바이트코드(.class 파일)로 변환한다. 이 과정에서 문법 오류나 타입 오류 등을 검사한다.
- 로드: 클래스 로더는 .class 파일을 메모리에 로드한다.
- 검증: 바이트코드 검증기는 .class 파일이 적절하게 포맷되고 안전한지 검사한다.
- 실행: JVM(Java Virtual Machine)은 .class 파일을 실행한다. 이때, JVM은 바이트코드를 기계어로 해석하고 실행한다.
JVM 메모리 구조는?
스택(Stack): 메서드의 매개변수, 지역 변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장
힙(Heap): new 키워드로 생성된 객체와 배열이 이 영역에 할당되며, 가비지 컬렉터의 주 대상이 된다.
메서드(Method Area): 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관
PC 레지스터(PC Register): PC 레지스터는 현재 수행중인 JVM 명령의 주소를 보관
네이티브 메소드 스택(Native Method Stack): 자바 외 언어로 작성된 네이티브 코드를 보관
배열과 리스트의 차이점은 ?
배열(Array): 배열은 객체 생성 시 크기를 할당하며, 그 이후에는 크기 변경이 불가능하다. 배열은 메모리에서 연속적인 공간을 차지하며, 인덱스를 통해 빠른 접근이 가능하다.
리스트(List): 리스트는 동적으로 크기가 변경될 수 있다. 즉, 요소를 추가하거나 제거함에 따라 크기가 자동으로 조절됩니다. 리스트는 배열에 비해 유연하지만, 일반적으로 인덱스를 통한 접근이 느릴 수 있다.
ArrayList와 LinkedList의 차이점은?
ArrayList: 내부적으로 배열을 사용하여 데이터를 저장한다. 따라서 인덱스를 통한 요소 접근이 빠르지만, 요소를 추가하거나 제거할 때는 모든 요소를 이동시켜야 하므로 시간이 더 걸린다.
LinkedList: 각 요소가 이전 요소와 다음 요소의 참조를 가지는 노드 형태(포인터)로 데이터를 저장한다. 따라서 요소를 추가하거나 제거하는 것이 빠르지만, 인덱스를 통한 접근은 처음부터 노드를 순회해야 하므로 느릴 수 있다.
MVC 패턴이란 ?
애플리케이셔의 구성요소를 Model, View , Controller 세가지로 분리한 디자인 패턴
- M(Model): 모델은 애플리케이션의 데이터와 비즈니스 로직을 담당한다. 데이터베이스와의 상호작용, 데이터 처리 등을 수행
- V(View): 뷰는 사용자에게 보여지는 부분으로, 사용자 인터페이스(UI)를 담당한다. 사용자의 입력을 받아 컨트롤러에 전달하고, 모델의 데이터를 사용자에게 표시
- C(Controller): 컨트롤러는 사용자의 입력을 처리하고, 모델과 뷰 사이의 연결 역할을 한다. 사용자의 요청에 따라 모델을 업데이트하고, 뷰에 표시할 데이터를 선택
MVC Model 1: 이 모델에서는 컨트롤러의 역할을 JSP(JavaServer Pages)가 담당한다. 사용자의 요청이 JSP 페이지로 직접 전달되며, JSP 페이지에서 비즈니스 로직을 처리하고 결과를 표시
MVC Model 2: 이 모델에서는 서블릿이 컨트롤러의 역할을 담당한다. 사용자의 요청이 먼저 서블릿에 도달하고, 서블릿은 요청을 처리한 후 결과를 JSP 페이지에 전달하여 표시한다. 이 모델은 Model 1에 비해 뷰와 모델의 분리가 더 잘 이루어져 있어 복잡한 애플리케이션에 더 적합
Spring MVC는 어떻게 동작되는 지?
- HTTP 요청: 사용자(클라이언트)가 웹 브라우저를 통해 HTTP 요청
- 디스패처 서블릿: Spring MVC의 핵심 컴포넌트인 디스패처 서블릿(DispatcherServlet)이 요청을 받는다.
- 핸들러 매핑: 디스패처 서블릿은 요청된 URL을 HandlerMapping 객체에 넘기고, 호출해야 할 Controller 메소드(핸들러) 정보를 얻는다.
- 핸들러 어댑터: 디스패처 서블릿은 HandlerAdapter 객체를 가져온다. 핸들러 어댑터는 요청을 처리하고, 적절한 모델 데이터를 생성하며, 처리 결과를 나타내는 뷰 이름을 반환한다.
- 뷰 리졸버: 디스패처 서블릿은 뷰 리졸버(ViewResolver)에게 뷰 이름을 전달한다. 뷰 리졸버는 뷰 이름을 기반으로 실제 뷰를 찾아서 반환한다.
- 뷰: 반환된 뷰는 모델 데이터를 사용하여 사용자에게 보여줄 최종 결과를 생성한다.
- HTTP 응답: 생성된 결과는 HTTP 응답으로 사용자에게 전달된다.
GET 과 POST의 차이점?
GET: GET 요청은 서버로부터 정보를 조회할 때 사용, 요청 파라미터들이 URL에 포함되어 전송되며, 이는 URL 주소 뒤에 key-value 쌍으로 결합된 쿼리 스트링 형태로 서버에 전달된다. GET 요청은 캐시될 수 있으며, 브라우저 기록에 남고, 북마크 될 수 있다.
POST: POST 요청은 서버의 리소스를 생성하거나 변경할 때 사용, 요청 파라미터들이 HTTP 메시지 바디에 담겨져 서버에 전달된다. 이 방식은 URL에 데이터가 노출되지 않으므로, GET 방식보다 보안적인 면에서 우수하며, 대용량 데이터를 전송할 수 있다.
Ajax 란?
AJAX(Asynchronous JavaScript and XML)는 전체 페이지 로딩을 하지 않고 페이지의 일부분을 로딩하는 데이터 로딩 기법
장점 : 페이지 이동없이 데이터 송수신 처리가 가능하며 비동기 요청이 가능하다.
단점 : 클라이언트에서 요청을 하기 때문에 보안을 신경써야 하며 서버 과부화를 조심해야 한다.
RESTful API 란?
RESTful API는 'Representational State Transfer’의 약자로, 두 컴퓨터 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위해 사용하고, 웹의 장점을 최대한 활용할 수 있는 서비스 아키텍처를 의미한다.
HTTP 메서드와 URL를 조합하여 다양한 서비스에 접근한다.
쿠키와 세션의 공통점과 차이점은 ?
공통점 : 웹 브라우저와 서버간의 상태를 저장하고 유지하기 위해 사용되는 기술
차이점
- 저장 위치 및 보안 : 쿠키는 클라이언트에 저장, 세션은 서버에 저장된다.
- 생명 주기 : 쿠키는 설정 만료 날짜까지 브라우저에 남아있지만 세션은 브라우저를 닫거나 로그아웃하면 없어진다.
쿠키: 클라이언트 측에 저장되는 데이터 조각으로, 사용자의 브라우저에 직접 저장된다.
세션: 서버 측에 저장되는 데이터 조각으로, 클라이언트가 서버에 접속하면 서버는 클라이언트에 대한 세션 객체를 생성하고 세션 ID를 발급한다. 클라이언트는 이 세션 ID를 세션 쿠키에 저장하고, 이후 요청 시 해당 세션 ID를 함께 보낸다. 서버는 해당 세션 ID를 통해 세션 저장소의 세션 데이터를 조회하고, 이를 바탕으로 적절한 응답을 생성하여 클라이언트에게 전송한다.
Spring DI 란?
DI는 의존성 주입으로 클래스간의 의존성을 외부에서 주입하는 방법이다.
스프링 컨테이너를 통해 객체의 생성과 생명주기 관리 및 객체 간의 의존성을 주입해주는 역할을 한다. 이를 통해 개발자는 객체 생성과 의존성 관리에 대한 부담을 덜고, 비즈니스 로직에 집중할 수 있다. 이러한 과정을 통해 코드의 유연성과 재사용성이 향상된다.
CHAR 와 VARCHAR의 차이는 ?
CHAR은 고정 길이를 가지며 VARCHAR은 가변 길이를 가진다.
정규화는 ?
릴레이션 간의 잘못된 종속 관계로 인해 DB 이상 현상이 일어나서 이를 해결하기 위해 릴레이션을 여러가지로 분리하는 과정
- 정규화 : 테이블 내의 속성값은 원자값을 가지고 있어야 한다. (반복 집합 제거)
- 정규화 : 모든 컬럼이 완전 함수 종속을 만족해야 한다. (부분 함수 종속 제거)
- 정규화 : 기본키를 제외한 속성들간의 이행 종속성이 없어야 한다. (이행 함수 종속 제거)
- 보이스 - 코드 정규화 : 모든 결정자가 후보키 집합에 속해야 한다. (결정자가 후보키가 아닌 함수 종속을 제거)
트랜잭션이란 ?
트랜잭션 : DB에서 하나의 논리적인 기능을 수행하기 위한 작업 단위로 데이터의 일관성과 무결성을 유지하는 데 필수적인 요소
- 원자성(Atomicity): 트랜잭션이 데이터베이스에 모두 반영되거나 전혀 반영되지 않아야 한다.
- 일관성(Consistency): 트랜잭션이 실행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 한다.
- 독립성(Isolation): 동시에 실행되는 트랜잭션이 서로 영향을 주지 않아야 한다.
- 지속성(Durability): 성공적으로 완료된 트랜잭션의 결과가 영구적으로 반영되어야 한다.
DB JOIN 손코딩 (물어봄)
정렬 알고리즘 (물어봄)
교환 메서드
public static void swap(int [] arr, int idx1, int idx2){
int temp=arr[idx1];
arr[idx1]=arr[idx2];
arr[idx2]=temp;
}
버블 정렬
O(n^2)
public static void bubbleSort(int [] arr){
for(int i =0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
}
선택 정렬
O(n^2)
public static void selectSort(int [] arr){
for(int i=0;i<arr.length;i++){
int min=i;
for(int j=i+1;j<arr.length;j++){
if(arr[min]>arr[j]){
min=j;
}
}
swap(arr,i,min);
}
}
삽입 정렬
O(n^2)
public static void insertionSort(int [] arr){
for(int i=1;i<arr.length;i++){
int j=i-1;
int number=arr[i];
while (j>=0 && number<arr[j]){
arr[j+1]=arr[j];
j--;
}
arr[j+1]=number;
}
}
퀵 정렬
평균 : O(nlogn) / 최악 : O(n^2)
public static void quickSort(int [] arr){
quick(arr,0,arr.length-1);
}
public static void quick(int [] arr,int left, int right){
int part= partition(arr,left,right);
if(part-1>left){
quick(arr,left,part-1);
}
if(part<right){
quick(arr,part,right);
}
}
public static int partition(int [] arr,int left, int right){
int pivot=arr[(left+right)/2];
while (left<=right){
while (pivot>arr[left]) left++;
while (pivot<arr[right]) right--;
if(right>=left){
swap(arr,left,right);
left++;
right--;
}
}
return left;
}
'JAVA > 기본 문법 내용 정리' 카테고리의 다른 글
Exception 종류 (0) | 2024.05.30 |
---|---|
JAVA - 헷갈리는 문법 or 중요한 개념 정리 (0) | 2024.05.27 |
다형성 (0) | 2022.12.29 |
정규표현식 (0) | 2021.11.18 |
GUI 이벤트 처리 (0) | 2021.11.05 |