들어가면서

  • 여러회사들의 인터뷰를 보면서 대표 질문들을 정리하여 개념을 상기시키고자 작성하였음.
  • 면접대비 목적과 공부한 내용을 복기하는 것.

OOP

  • 객체지향프로그래밍, 인간 중심적 프로그래밍 패러다임이다.
  • 현실 세계를 프로그래밍으로 옮겨와 프로그래밍을 하는 것을 말한다.
  • 현실 세계의 사물을 객체로 표현하고 그것을 통해 개발하고자 하는 애플리케이션에 필요한 특징을 추출하여 프로그래밍하는 것을 말한다.
  • 대표적인 특징인 ‘추상화‘, ‘상속‘, ‘캡슐화‘, ‘다형성‘이 있다.
  • 예를 들어 자동차를 만든다면, 자동차는 하나의 객체이며 ‘배기량’, ‘차종’, ‘색상’ 등등 특징이 있고 ‘전진’, ‘후진’, ‘경적’ 등의 기능도 포함된다.

객체 지향적 설계 원칙의 종류

  • 단일 책임 원칙: 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 한다.
    • 객체 간의 관계를 명확히 하여 확장성과 재사용성을 높인다.
  • 개방-폐쇄 원칙: 확장이 가능(개방)해야 하며 변경에는 불가능(폐쇄)해야 한다.
    • 새로운 기능을 추가할 때 기존 코드는 수정하지 않고 다형성을 이용하여 확장할 수 있도록 한다.
  • 리스코프 치환 원칙: 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
  • 인터페이스 분리 원칙: 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
    • 사용자에게 꼭 필요한 메서드로만 구성하고 불필요한 의존성을 제거한다.
  • 의존 역전 원칙: 고수준의 모듈은 저수준의 모듈에 의존하면 안된다.

JVM(Java Virtual Machine)

  • Method Area(메소드 영역): 클래스 로딩 시 클래스 바이트코드 정보, static 변수, final 상수, 메서드 코드, 클래스 메타데이터 저장
  • Heap(힙 영역): new 생성자 객체 인스턴스, 배열 등 동적 생성 데이터 저장, GC 대상
  • Stack(스택 영역): 스레드별 개별 존재, 메서드 호출 시 생성되는 프레임 저장, 지역 변수, 매개 변수, 리턴 값, 연산 결과 포함.
  • etc(참고)

직렬화(Serialization)

  • 자바에서는 입출력 시 스트림(stream)이라는 통로를 이용하여 데이터가 이동한다.
  • 그러나 객체는 스트림을 통해 파일에 저장되거나 네트워크로 전송될 수 없다.
  • 객체를 스트림을 통해 입출력하려면 치환 작업이 필요하고 이를 ‘직렬화’라고 한다.
  • 반대로 스트림을 통해 직렬화된 객체를 되돌리는 작업을 ‘역직렬화’라고 한다.

접근제어자

  • public, 언제 어디서나 접근이 가능하도록
  • protected, 패키지 내에서 혹은 상속받은 클래스(자식)에서 접근이 가능하도록
  • default, 패키지 내에서 접근이 가능하도록
  • private, 해당 클래스에서만 접근이 가능하도록

인터페이스와 추상

  • 인터페이스, 다중 상속이 가능하며 생성자와 일반 변수를 가질 수 없음. 팀원 간 협업 시 결과를 예측하고 작업이 가능해짐.(구현 객체의 동일성을 보장하기 때문에)
  • 추상클래스, 다중 상속이 불가능하고 추상 메서드 1개 이상 필수로 존재해야 하며 일반 변수와 일반 메서드를 사용할 수 있음. 메서드의 부분 구현이 가능함.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
abstract class Animal {

abstract void cry();

void sleep() {
System.out.println("잔다.");
}
}

class Cat extends Animal {
private final String name = "치즈냥";
private final int age = 14;

@Override
void cry() {
StringBuilder sb = new StringBuilder();
sb.append(age).append("살").append("\t").append(name).append("야옹");
System.out.print(sb.toString());
}
}

class Dog extends Animal {
private final String name = "댕댕이";
private final int age = 10;

@Override
void cry() {
StringBuilder sb = new StringBuilder();
sb.append(age).append("살").append("\t").append(name).append("멍멍");
System.out.print(sb.toString());
}
}


public class Main {

public static void main(String[] args) {
Animal[] animals = { new Cat(), new Dog() };

for (Animal animal : animals) {
animal.cry(); //XXX 다형성에 따라 각자의 cry()가 호출됨
animal.sleep(); //XXX 공통 메서드
}
}

}

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

즉시 로딩, 지연 로딩

  • 즉시: 엔티티 조회 시 연관된 엔티티 함께 조회
  • 지연: 연관된 엔티티를 실제 사용할 때 조회