들어가면서
- 여러회사들의 인터뷰를 보면서 대표 질문들을 정리하여 개념을 상기시키고자 작성하였음.
- 면접대비 목적과 공부한 내용을 복기하는 것.
OOP
- 객체지향프로그래밍, 인간 중심적 프로그래밍 패러다임이다.
- 현실 세계를 프로그래밍으로 옮겨와 프로그래밍을 하는 것을 말한다.
- 현실 세계의 사물을 객체로 표현하고 그것을 통해 개발하고자 하는 애플리케이션에 필요한 특징을 추출하여 프로그래밍하는 것을 말한다.
- 대표적인 특징인 ‘추상화‘, ‘상속‘, ‘캡슐화‘, ‘다형성‘이 있다.
- 예를 들어 자동차를 만든다면, 자동차는 하나의 객체이며 ‘배기량’, ‘차종’, ‘색상’ 등등 특징이 있고 ‘전진’, ‘후진’, ‘경적’ 등의 기능도 포함된다.
객체 지향적 설계 원칙의 종류
- 단일 책임 원칙: 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 한다.
- 객체 간의 관계를 명확히 하여 확장성과 재사용성을 높인다.
- 개방-폐쇄 원칙: 확장이 가능(개방)해야 하며 변경에는 불가능(폐쇄)해야 한다.
- 새로운 기능을 추가할 때 기존 코드는 수정하지 않고 다형성을 이용하여 확장할 수 있도록 한다.
- 리스코프 치환 원칙: 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
- 인터페이스 분리 원칙: 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
- 사용자에게 꼭 필요한 메서드로만 구성하고 불필요한 의존성을 제거한다.
- 의존 역전 원칙: 고수준의 모듈은 저수준의 모듈에 의존하면 안된다.
JVM(Java Virtual Machine)
- Method Area(메소드 영역): 클래스 로딩 시 클래스 바이트코드 정보, static 변수, final 상수, 메서드 코드, 클래스 메타데이터 저장
- Heap(힙 영역): new 생성자 객체 인스턴스, 배열 등 동적 생성 데이터 저장, GC 대상
- Stack(스택 영역): 스레드별 개별 존재, 메서드 호출 시 생성되는 프레임 저장, 지역 변수, 매개 변수, 리턴 값, 연산 결과 포함.
- etc(참고)
직렬화(Serialization)
- 자바에서는 입출력 시 스트림(stream)이라는 통로를 이용하여 데이터가 이동한다.
- 그러나 객체는 스트림을 통해 파일에 저장되거나 네트워크로 전송될 수 없다.
- 객체를 스트림을 통해 입출력하려면 치환 작업이 필요하고 이를 ‘직렬화’라고 한다.
- 반대로 스트림을 통해 직렬화된 객체를 되돌리는 작업을 ‘역직렬화’라고 한다.
접근제어자
- public, 언제 어디서나 접근이 가능하도록
- protected, 패키지 내에서 혹은 상속받은 클래스(자식)에서 접근이 가능하도록
- default, 패키지 내에서 접근이 가능하도록
- private, 해당 클래스에서만 접근이 가능하도록
인터페이스와 추상
- 인터페이스, 다중 상속이 가능하며 생성자와 일반 변수를 가질 수 없음. 팀원 간 협업 시 결과를 예측하고 작업이 가능해짐.(구현 객체의 동일성을 보장하기 때문에)
- 추상클래스, 다중 상속이 불가능하고 추상 메서드 1개 이상 필수로 존재해야 하며 일반 변수와 일반 메서드를 사용할 수 있음. 메서드의 부분 구현이 가능함.
1 | abstract class Animal { |
try-with-resources
- 자동으로 자원을 해제해주는 기능(JDK 7 after)
- AutoCloseable 구현하였다면 try 구문이 종료될 때 close() 메서드를 자동으로 호출한다.
Synchronized
- 함수, 블록을 만들어 사용함.
Collection Framework
- 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합이다.
- 데이터를 저장하는 자료구조에 따라 주요 인터페이스를 정의하고 있음.
인터페이스 | 설명 | 구현 클래스 |
---|---|---|
List | 순서가 있는 데이터의 집합, 데이터의 중복을 허용 | Vector, ArrayList, LinkedList, Stack, Queue |
Set | 순서가 없는 데이터의 집합, 데이터의 중복을 허용하지 않음 | HashSet, TreeSet |
Map<K,V> | 키와 값의 한 쌍의 데이터의 집합, 키는 중복을 허용하지 않음, 값은 중복을 허용 | HashMap, TreeMap, Hashtable, Properties |
Vector vs ArrayList
- 벡터는 동기화가 된 상태(Thread safe)
- 상대적으로 속도가 느리다.
- 어레이리스트는 동기화가 안된 상태
- 상대적으로 속도가 빠르다.
- 멀티스레드 환경이 아닐 경우 사용 권장.
ArrayList vs LinkedList
- 어레이리스트는 내부적으로 데이터를 배열로 관리함.
- 데이터 추가/삭제 시 임시 배열을 생성해 데이터를 복사함.
- 데이터별 인덱스가 존재해 검색에 유리함.
- 임시 배열을 사용하므로 데이터 추가/삭제 시 속도가 굉장히 느림.
- 링크드리스트는 노드 단위로 데이터를 관리함.
- 인덱스가 따로 없기에 검색 시 전 노드를 순회해야해서 속도가 느림.
- 데이터 추가/삭제 시 불필요한 데이터 복사가 없으므로 속도가 빠름.
Generic
- 자바에서 안정성을 맡고 있음.
- 객체의 타입을 컴파일 시 체크함.
- 객체의 타입 안정성을 높이고 형변환의 번거로움을 덜어주며 자연스럽게 코드가 간결해짐.
Overloading or Overriding
- 오버로딩: 상위 클래스의 메소드와 이름, 리턴 값은 동일하지만 매개변수만 다른 메서드를 만드는 것.
- 다양한 상황에서 메서드가 호출될 수 있도록 함.
- 오버라이딩: 상위 클래스에 존재하는 메서드를 하위 클래스에서 필요에 맞게 재정의 함.
Checked Exception vs UnChecked Exception
- ✅ Checked 반드시 예외를 처리, 컴파일 단계에서, 롤백을 하지 않음, 런타임 익셉션을 제외한 모든 예외
- ❎ Unchecked 예외 처리 강제 X, 런타임 단계에서, 롤백을 함, 런타임 익셉션의 하위 예외
final class, final method, final variable
- 다른 클래스에서 상속을 하지 못하게 함.
- 다른 메서드에서 오버라이딩을 하지 못하게 함.
- 상수값이 되어 값을 할당할 수 없는 변수가 됨.
finalize
- GC에 의해 호출되는 함수
POJO
- Plain Old Java Object
- 평범한 자바 객체
- 제약조건이 없는 객체 (상속X, 인터페이스 구현X, 어노테이션X)
JPA
- ORM 기술에 대한 API
- 관계형 데이터베이스를 자동으로 연결
⭐️JPA 영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
- 엔티티 매니저를 생성하면 자동으로 영속성 컨텍스트가 생성
- 엔티티 관리 혹은 보관할 수 있음.
영속성 컨텍스트 속성
- 비영속: 전혀 무관한 상태, 순수한 객체의 상태
- 영속 컨텍스트에 저장된 상태
- 준영속: 영속성 컨텍스트에서 관리하다 영속성 컨텍스트에서 분리된 상태 @id 값을 가지고 있음
- 삭제
영속성 컨텍스트 특징
- 1차 캐시: @id를 가지고 있는 Map 존재, DB에 접근하는 것이 아니고 1차 캐시를 먼저 조회
- 동일성 보장: 식별자가 동일한 엔티티의 경우 동일성(객체를 참조한다는 의미) 보장
- 쓰기 지연: 트랜잭션이 커밋될 때 쓰기 지연 SQL 저장소에 모아둔 쿼리들을 한번에 저장
- 변경 감지: 트랜잭션 커밋 -> flush 호출 -> 엔티티 & 스냅샷 비교 -> 변경된 엔티티 찾음 -> 쿼리 생성 쓰기 지연 SQL 저장소 저장 -> flush -> commit
즉시 로딩, 지연 로딩
- 즉시: 엔티티 조회 시 연관된 엔티티 함께 조회
- 지연: 연관된 엔티티를 실제 사용할 때 조회