들어가면서

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

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

  • 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합이다.
  • 데이터를 저장하는 자료구조에 따라 주요 인터페이스를 정의하고 있음.