1. 자바의 primitive type
byte,short,int,long,float,double,char,boolean
2. String vs new String("")
"java" 라는 문자열을 String 변수에 삽입하거나 new String("java")을 통해 대입하는 것의 차이점은
String a = "java";
String b = "java";
String a = new String("java");
String b = new String("java");
전자는 jvm이 먼저 상수풀을 찾아서 동일 문자열이 있으면 그 참조 값만 반환을 해주고 없으면 새로운 객체를 만들어서 참조합니다.
후자는 각각 다른 주소값을 가집니다.
3. equals 와 == 의 차이
equals() 는 비교하고자 하는 대상의 내용을 비교를 합니다.
== 는 비교하고자 하는 대상의 주소값을 비교를 합니다.
4. String, StringBuilder, StringBuffer 차이
String은 불변 객체로 +나 concat을 사용시 원본은 그대로 두기 위해서 새로운 인스턴스를 생성합니다.
StringBuilder는 Concat 이나 +를 자주 이용합니다.
StringBuffer는 흔히 쓰레드안전한 StringBuilder로 내부적으로 append 메서드에 Synchronized가 있습니다.
5. Comparable, Comparator 차이
두 개 모두 정렬 용도인 인터페이스입니다.
Comparable은 구현해서 compareTo를 오버라이드 합니다.
Comparator은 직접 구현을 합니다. 즉 정렬 기준을 정할 수 있고 인자로 넘겨주게 됩니다.
// Integer class
public final class Integer extends Number implements Comparable<Integer> { ... }
// String class
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { ... }
- compareTo() 메서드 작성법
현재 객체 < 파라미터로 넘어온 객체: 음수 리턴
현재 객체 == 파라미터로 넘어온 객체: 0 리턴
현재 객체 > 파라미터로 넘어온 객체: 양수 리턴
음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 바뀝니다.
// x좌표가 증가하는 순, x좌표가 같으면 y좌표가 감소하는 순으로 정렬하라.
class Point implements Comparable<Point> {
int x, y;
@Override
public int compareTo(Point p) {
if(this.x > p.x) {
return 1; // x에 대해서는 오름차순
}
else if(this.x == p.x) {
if(this.y < p.y) { // y에 대해서는 내림차순
return 1;
}
}
return -1;
}
}
// main에서 사용법
List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
Collections.sort(pointList);
- compare() 메서드 작성법
첫 번째 파라미터로 넘어온 객체 < 두 번째 파라미터로 넘어온 객체: 음수 리턴
첫 번째 파라미터로 넘어온 객체 == 두 번째 파라미터로 넘어온 객체: 0 리턴
첫 번째 파라미터로 넘어온 객체 > 두 번째 파라미터로 넘어온 객체: 양수 리턴
음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 변경됩니다.
// x좌표가 증가하는 순, x좌표가 같으면 y좌표가 감소하는 순으로 정렬하라.
class MyComparator implements Comparator<Point> {
@Override
public int compare(Point p1, Point p2) {
if (p1.x > p2.x) {
return 1; // x에 대해서는 오름차순
}
else if (p1.x == p2.x) {
if (p1.y < p2.y) { // y에 대해서는 내림차순
return 1;
}
}
return -1;
}
}
// main에서 사용법
List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
MyComparator myComparator = new MyComparator();
Collections.sort(pointList, myComparator);
6. JVM Structure
JRE는 JVM과 Java API로 나뉩니다.
JRE
- JVM: 자바 어플리케이션을 클래스 로더로 읽어오고 바이트 코드를 해석한 후 실행엔진으로 Java API와 함께 실행
- Java Api
.java --(javac) ---> byte code(.class) ----> JVM
JVM 구성(클래스 로더 + 런타임 데이터 영역 + 실행 엔진)
클래스 로더 : 런타임 시 클래스를 참조할 때 로드하고 링크하는 동적 로드를 담당
런타임 데이터 영역: VM이 실행되면서 할당받는 메모리 영역으로 총 6가지의 스레드 별로 나뉨
- PC Register : 스레드가 시작 될 때 생성된다. 수행중인 JVM 명령 주소를 가진다.
- JVM Stack : 스레드 시작시 생성된다. 스택 프레임을 저장한다.
- Stack Frame: 메서드 수행시 생성이 되고 JVM 스택에 추가되어 메서드가 종료되면 제거가 된다. 지역변수 배열, 피연산자 스택, 실행 메서드의 클래스의 런타임 상수 풀에 대한 레퍼런스를 가진다.
- 지역변수 배열: 0부터 시작하고 0은 메서드가 속한 클래스,인스턴스 this 레퍼런스이고 1은 메서드 파라미터들 나머지는 메서드의 지역변수들이다. 크기는 컴파일 시 결정이 된다.
- 피연산자 스택: 메서드의 실제 작업 공간이다. 각 메서드는 지역변수배열과 피연산자 스택 사이 데이터를 교환한다. 다른 메서드 호출 결과를 push, pop을 통해 넣고 뺀다.
- Stack Frame: 메서드 수행시 생성이 되고 JVM 스택에 추가되어 메서드가 종료되면 제거가 된다. 지역변수 배열, 피연산자 스택, 실행 메서드의 클래스의 런타임 상수 풀에 대한 레퍼런스를 가진다.
- Native Stack : 자바 외 언어로 작성된 코드를 위한 스택이다. (JNI) ==> C스택 or C++ 스택이 생성된다.
- Heap Area : 인스턴스 또는 객체를 저장하는 곳으로 가비지 컬렉션의 대상이 되며 성능에 영향을 미친다.
- Method Area: 모든 스레드가 공유를 하며 각 클래스, 인스턴스의 런타임 상수 풀, 필드와 메서드 정보, static, 바이트 코드를 보관한다.
- Runtime Constant Pool : 각 클래스, 인터페이스의 상수 뿐 아니라 메서드, 필드에 대한 모든 레퍼런스를 갖는다. 메서드와 필드 참조시에 실제 메모리 주소를 찾는다.
실행엔진: 이것을 통해서 위에 실리게 되는 바이트 코드를 수행한다.( 명령어 단위)
7. Override VS Overload
Overloading은 함수의 이름이 같고 반환 타입, 인자 개수, 인자의 타입이 다르다.
Overriding 은 부모의 메서드를 자식에서 재정의 한다.(인터페이스) 반환, 매개변수, 인자 모두 동일
8. ArrayList vs LinkedList
ArrayList는 검색(접근)에 유리하고 삭제, 삽입시엔 복사를 하기 때문에 비효율적이다.
LinkedList는 추가, 삭제가 자주이용 될때 유용하다.
9. Abstract vs Interface
abstract는 부모 클래스의 기능을 이용하여 확장하기 위한 용도이다. 추상 내 메서드 내용이 존재하거나 추상메서드가 존재하며 다중상속이 불가능하다. 즉 상속을 통해 기능을 확장시킨다.
interface는 추상의 일종으로 클래스는 아니다. 빈껍데기로 메소드만 정의한 것이다. 다중 상속 가능하며 모두구현을 해야한다. 기능확장이 아닌 객체의 같은 동작을 보장하기 위함이다.
10. 프로세스 vs 스레드
프로세스는 실행중인 프로그램이다.
스레드는 프로세스 내에서 실행되는 여러 개의 경량 프로세스이다. 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 서로 공유한다.
11. 접근 제한자
접근 범위
- public > protected > default > private
제어자 | 같은 class | 같은 package | 자손 class | 전체 class |
public | O | O | O | O |
proteced | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
즉 범위가 public이 제일 큰데 이는 전체에서 사용이 가능하며 점 점 뒤로 갈 수록 범위가 좁아지는 것을 볼 수 있습니다.
쉽게 말해서,
- public: 어디든 사용 가능
- protected: 같은 곳과 자손에선 어디든 사용 가능하지만 전체에선 접근 못함
- default: 같은 곳에선 사용 가능하지만 자손에선 못사용함
- private: 같은 클래스 안에서만 사용이가능하며 거의 철벽수준
12. 가비지 컬렉션
가비지 컬렉션이란 더 이상 사용하지 않는 객체를 찾아서 지운다는 개념입니다.
JVM이 일시적으로 어플리케이션 실행을 멈춥니다. 이를 Stop-the-world라 불립니다.
Weak-generation-hypothesis 라는 가설은 아래와 같습니다
- 대부분 객체는 금방 접근 불가해진다.
- 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
이 가설을 살리기 위해서 young, old 영역이 존재하게 됩니다.
- young: 새로 생성하고 해체된다.(MinorGC) 이는 Eden(살아남은 객체)가 Survivor로 이동하고 Survivor가 가득차면 다른 Survivor로 이동한다.
- old: 접근 불가능 상태가 되지 않은 young에서의 객체가 존재하면 해체한다.(MajorGC)
- MajorGC
- Serial GC
- Parellel GC
- Parellel Old GC
- Concurrent Mark & Sweep GC
- GI GC
- MajorGC
13. Design Pattern
디자인 패턴에는 Single Ton, Strategy, Decorator, Proxy가 존재합니다.
- Single Ton : 클래스의 인스턴스화를 하나의 객체로 제한한다. 즉 스프링 bean factory에서 한 개의 인스턴스를 가지고 사용한다.(최초 처음 생성 된 것)
- Strategy : 객체가 사용하는 메소드는 동일한데 내용이 경우에 따라 다르고 전략이 여러개 존재한다. 이는 인터페이스 활용을 한다. 예를 들어 체스마다 move() 함수의 내용이 다르다.
- Decorator : 주어진 상황 용도에 따라 어떤 객체에 기능을 확장 시킨다. 이는 추상클래스이다.(서브클래스) @Component , 트랜잭션 등등
- Proxy : 타깃의 실제 기능에는 영향을 끼치지 않고 접근을 대리시킨다. 어떤 객체의 변경 없이 대신 수행하고 기능을 제어한다. 스프링의 AOP가 있다.
14. 컬렉션 프레임워크
다수 데이터를 효과적으로 처리하고 표준화된 방법을 제공하는 집합입니다.
이는 인터페이스를 이용해서 구현됩니다.
- List
- Set
- Map
여기서 List와 Set은 컬렉션 인터페이스를 상속받지만 Map은 별도로 정의됩니다.
인터페이스 | 설명 | 구현클래스 |
List<E> | 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용함. | Vector, ArrayList, LinkedList, Stack, Queue |
Set<E> | 순서가 없는 데이터의 집합으로, 데이터의 중복을 허용하지 않음. | HashSet, TreeSet |
Map<K, V> |
키와 값의 한 쌍으로 이루어지는 데이터의 집합으로, 순서가 없음. 이때 키는 중복을 허용하지 않지만, 값은 중복될 수 있음. |
HashMap, TreeMap, Hashtable, Properties |
Vector는 동기화를 지원하고 ArrayList는 동기화를 지원하지 않습니다.
컬렉션 인터페이스를 상속받기 때문에 공통 메소드들이 있습니다 메소드는 아래와 같습니다.
메소드 | 설명 |
boolean add(E e) | 해당 컬렉션(collection)에 전달된 요소를 추가함. (선택적 기능) |
void clear() | 해당 컬렉션의 모든 요소를 제거함. (선택적 기능) |
boolean contains(Object o) | 해당 컬렉션이 전달된 객체를 포함하고 있는지를 확인함. |
boolean equals(Object o) | 해당 컬렉션과 전달된 객체가 같은지를 확인함. |
boolean isEmpty() | 해당 컬렉션이 비어있는지를 확인함. |
Iterator<E> iterator() | 해당 컬렉션의 반복자(iterator)를 반환함. |
boolean remove(Object o) | 해당 컬렉션에서 전달된 객체를 제거함. (선택적 기능) |
int size() | 해당 컬렉션의 요소의 총 개수를 반환함. |
Object[] toArray() | 해당 컬렉션의 모든 요소를 Object 타입의 배열로 반환함. |
15. 스프링 구동 방식
- 요청에 따른 응답
- DispatcherServlet 에서 스프링에 들어온 모든 요청을 받는다.
- 클라이언트 요청에 해당하는 컨트롤러를 탐색한다.
- @Controller와 @RestController에 있는 @GetMapping @PostMapping을 스캔
- 찾으면 HttpServletRequest를 전달
- ViewResolver가 ModelAndView를 리턴
- 만약 @RestController나 @ResponseBody인 경우 MessageConverter가 HttpBody에 적절 내용을 기록해서 응답
- Bean 생성 원리
- @Bean @Service @Component @Repo @Controller가 붙은 클래스들을 Bean 형태로 스프링이 생성하여 빈 팩토리에서 관리
- 빈 생성시 해당 빈 내부에 다른 주입이 필요한 빈이 존재할 경우 재귀적으로 하위 빈 처리후 생성한다.
- AOP 구현
- JDK Dynamic Proxy 생성 ==> 인터페이스 존재할 때 사용한다. => 굳이 사용하고 싶다면 @EnableAspectjAutoProxy(proxyTargetClass=true)
- Cglib 라이브러리 Proxy 생성 ==> 인터페이스 없을 때 사용한다. 디펄트로 변경되면서 요즘 트랜잭션 또는 AOP를 수행
- AspectJ 라이브러리 활용 ==> Compile Time Weaving + Load Time Weaving 사용한다. 성능이 뛰어나지만 @Aspectj 는 1과 2를 기반으로 AspectJ 문법만 사용하는 것이다.
16. Hash , Hash Collision
자바에서 해시를 이용해서 해시맵, 해시테이블 등을 사용합니다.
키에 대한 해시값을 사용하여 저장/조회하고 키/값의 쌍의 개수 증가에 따라 동적으로 크기가 증가하는 Associate Array라고 정의할 수 있습니다.
Hash Function은 임의 길이의 데이터를 고정 길이 데이터(해시값)로 매핑하는 함수로 충돌이 발생할 수 있습니다.
이를 해시충돌(Hash Collision)이라 불립니다.
충돌을 방지하기 위해서 아래와 같은 방법을 사용합니다.
- open addressing: 다른 해시 버킷에 삽입한다. 찾을 때는 Linear Probing, Quadratic Probing을 사용한다.
- seperate chainning : 인덱스가 같은 버킷을 링크드 리스트로 연결해서 사용한다. 인덱스는 리스트의 Head
17. ACID
- A(원자성): 완료되지 않은 트랜잭션의 중간상태를 데이터베이스에 반영해선 안된다.
- C(일관성): 고립된 트렌젝션 수행은 일관성을 보존하여 수행 전과 후가 일치한다.
- I(고립성): 여러 트랜잭션이 수행되더라도 서로 영향을 미치지않고 독립적으로 수행한다.
- D(영속성): 트랜잭션이 성공하면 모든 변경은 장애가 발생하더라도 영구적으로 보존되어야한다.
18. 데이터베이스 인덱스
- Clustered Index : 테이블 당 하나의 PK에 대해서 대상이 되고 저장이 되며 물리적으로 정렬이 되어있다. 검색 속도가 빠르다. (데이터페이지 자체를 리프노드로 사용) 그러나 레코드 저장이나 PK 변경은 느리다. 즉 PK로 레코드가 정렬되는 것을 클러스터드 인덱스라고 한다.
- Non Clustered Index: 원하는 순서로 정렬된 리프노드를 새로 만들어 그것이 데이터페이지를 가리킨다. 물리적으로 정렬이 되어있지 않다.
- MySQL에서 B-Tree 인덱스로 사용된다. InnoDB는 B-Tree를 기반으로 클러스터드 인덱스 구조를 가진다. 리프노드에 모든 Row 데이터를 저장한다. PK or UK가 클러스터드 키 역할을 수행한다.
19. TCP VS UDP
TCP는 전송실패하면 재전송을 하고 연결 시 3 way Handshake를 하기 때문에 데이터 정확성, 신뢰성을 보장하지만 느리다.
UDP는 데이터 손실이 가능하며 속도는 빠르고 동영상 스트리밍이 이에 속한다.
20. OSI
TCP/IP 계층은 4계층으로 어플리케이션(어플리케이션, 프레젠테이션, 세션) + 전송계층 + 인터넷 + 네트워크 인터페이스(물리+링크) 로 구분된다.
송신지 입장
- 송신지 입장에서 어플리케이션 --> 전송 --> 인터넷 --> 네트워크 인터페이스 순으로 접근한다.
- 어플리케이션: 어플리케이션에서 URL을 사용자가 호출하면 서버에 HTTP 요청 메시지를 전달한다 .
- 전송계층: 어플리케이션 계층의 데이터를 받아서 세그먼트를 분할하고 전송한다. 송신지 Port와 수신지 Port가 포함된다.
- 인터넷 계층: IP 패킷의 형태로 만들어지고 송신지 , 수신지 IP주소가 들어가 있다.
- 네트워크 인터페이스: 랜 카드를 통해 패킷을 내보낸다.
수신지 입장
- 반대로 네트워크 인터페이스 --> 인터넷 --> 전송 --> 어플리케이션 순으로 거스른다.
- 네트워크 인터페이스: URL 서버의 이더넷 카드로 TCP/IP 패킷을 전달받는다. 이 패킷을 인터넷 계층으로 올린다.
- 인터넷 계층: 받아서 IP 패킷을 분석한다. 자신이 수신해야된다면 이를 전송 계층으로 올린다.
- 전송 계층: 도달하지 못한 패킷이 있으면 재 전송을 요청한 후 어플리케이션으로 보낸다. 할당된 포트번호를 확인해서 HTTP 요청이면 80번 포트로 전달한다.
- 어플리케이션: 이에 따른 응답을 전송 계층으로 응답한다.
21. HttpRequest/Response Header/methods/status Code
URL이란 HTTP 요청을 보내기 위해 사용한다. URL이란 한마디로 리소스 고유 식별자이다.
protocol://hostname:port/path-and-file name
HTTP Request Header
Request Message Header
- Reqeust Line: 요청/ 프로토콜 버전 / 디렉토리 등
- Request Headers: 컨텐츠 길이 / 인코딩 / 언어 / 다양한 정보들
CRLF: 헤더와 바디를 구분
BODY: Post(내용들)
HTTP Response
Response Message Header
- Status Line: 상태 코드(200: 정상)
- Response Headers: 파일 갱신 날짜, 크기 등
CRLF
Body: HTML 내용들
22. HTTP2
스트림을 쪼개서 여러 리퀘스트를 통해 속도를 높인다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
디자인패턴- Adapter (0) | 2019.08.21 |
---|---|
디자인 패턴- Template Method Pattern (0) | 2019.08.21 |
Java - 람다 (0) | 2019.07.28 |
Java- 열거형 (0) | 2019.07.26 |
Java - 제네릭 (0) | 2019.07.25 |