기술면접 준비(Java)

내용은 기초적인 부분이지만 막상 면접 전에 한번이라도 정리하지 않으면 용어가 바로바로 안나오는 경우도 많기 때문에 간단하게나마 정리해 보았다.

OOP란

객체지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것 입니다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있으며 대표적인 특징으로 추상화, 상속, 캡슐화, 다형성이 있습니다.

직렬화(serialization)란?

객체 또는 데이터를 스트림을 통해 입출력하려면 바이트(byte)형태로 변환하는 것이 필요한데, 이를 직렬화 라고 합니다. 반대로 스트림을 통해 받은 직렬화된 객체를 원래 모양으로 만드는 과정을 역직렬화라고 합니다.

박싱과 언박싱이란?

기본 자료형(Primitive data type)을 Wrapper class로 바꾸어 주는 것을 박싱, **Wrapper class를 기본 자료형(Primitive data type)**으로 바꿔주는 것을 언박싱 이라고 합니다.

Static에 대해서

  • static 키워드를 쓰면 객체를 생성하지 않아도 static 변수나 static 함수를 사용할 수 있습니다.
  • 인스턴스를 생성하면 각 인스턴스는 서로 독립적이기 때문에 서로 다른 값을 유지합니다.
  • 각 인스턴스들이 공통적으로 같은 값이 유지되어야 하는 경우 static을 붙입니다.
  • static 이 붙은 메서드 에서는 인스턴스 변수를 사용할 수 없습니다.
  • 메서드 내에서 인스턴스 변수를 쓰지 않는다면 가능하면 static을 붙이는게 호출 시간이 짧아지기 때문에 효율이 높아집니다.
  • 클래스 설계시 static 사용 지침
    • 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있으면 static 을 사용합니다.
    • 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드는 static 을 사용하는 것을 고려합니다.

접근 제어자에 대해서

  • public : 어디서든 접근 가능
  • protected : 동일 패키지 혹은 상속받은 외부 패키지 클래스에서 사용
  • (default) : 동일 패키지 내에서만 접근 가능
  • private : 해당 클래스 내에서만 접근 가능

String vs StringBuffer vs StringBuilder

  • String
    • immutable(불변)
    • 객체를 한 번 할당할시 메모리 공간에 변동이 없습니다.
    • 동기화를 신경쓰지 않아도 됩니다.
    • 엄청나게 많은 문자열을 선언 및 연산할 시 성능저하를 고려해야합니다.
  • StringBuffer
    • mutable(가변)
    • 멀티스레드 환경에서도 동기화를 지원(Thread-safe)
  • StringBuilder
    • mutable(가변)
    • 동기화를 지원하지 않습니다.
  • 정리하면 적은 양의 문자열의 선언 후 연산이 필요없다면 String을 사용하고 문자열의 선언이 많이 필요하거나 연산이 필요한데 싱글스레드 환경이라면 StringBuilder를, 멀티스레드 환경이라면 StringBuffer를 사용합니다.

Java8 특징은?

java에 함수형 프로그래밍이 처음으로 도입된 버전으로 새로 도입된 주요 기능으론Lamda 표현식, Stream API, Optional Class 같은 게 있습니다.

  • 람다(Lamda) 표현식

    • 익명함수로 이름과 식별자가 없는 함수를 말합니다. 불필요한 코드를 줄이고 가독성을 향상시키기 위함입니다.
    1
    2
    List<Integer> list = new ArrayList<>();
    list.forEach(num -> System.out.println("number : " + num));
  • StreamAPI

    • 람다식을 적용해서 컬렉션같은 데이터 처리연산을 하기 위한 api로 멀티 스레드를 활용해서 병렬로 연산을 수행할 수 있고, 원본 데이터를 변경하지 않는 특징이 있고 코드가 매우 간단해진다는 것을 알 수 있습니다.
  • Optional Class

    • util 패키지에 속하며 NullPointException을 관리하기 위해 null이 될 수 있는 객체를 감싸고 있는 래퍼 클래스입니다.
    • 명시적으로 해당 변수가 null일 수 있음을 표현하면서 null 체크를 직접하지 않아도 됩니다.
    • 아래는 일반적으로 많이 사용되는 optional 예제코드
    1
    2
    3
    4
    @Repository
    public interface UserRepository extends JpaRepository<UserEntity, Long> {
    Optional<UserEntity> findByName(String Name);
    }
    1
    2
    3
    String name = "jay";
    UserEntity optUserEntity = userRepository.findByName(name)
    .orElseThrow(() -> new EmptyDataException("해당 이름을 가진 유저가 없습니다."));

try-with-resource란?

try-with-resources는 java7 이후 추가되었으며 자동으로 자원을 해제해주는 기능입니다.
try 구문에 AutoCloseable 인터페이스를 구현하는 객체를 리소스로 선언하고 사용이 끝나면 자동으로 close 해주는 기능입니다.

1
2
3
4
5
6
try (Scanner scanner = new Scanner(new File("newFile.txt")))
{
System.out.println(scanner.nextLine());
} catch (FileNotFoundException e) {
e.printStackTrace();
}

오버로딩 오버라이딩 차이점은?

자바에서 다형성을 지원하는 방법으로 오버로딩과 오버라이딩이 있습니다.

(다형성(polymorphism) : 하나의 객체가 여러타입을 가지는 것)

  • 오버로딩(Overloading)은 같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 작성하여 다양한 유형의 호출에 응답하도록 하는 것입니다.
    • 프로그램의 가독성 ⬆
  • 오버라이딩(Overriding)은 상위클래스가 가진 메소드를 자식클래스에서 재정의 하여 사용하는 것을 말합니다.
    • 하나의 코드로 여러 객체를 처리할 수 있는 장점이 있어서 사용
명칭 메소드명 매개변수 리턴타입
오버로딩 같음 다름 같아도되고 달라도됨
오버라이딩 같음 같음 같아야함

HashMap, LinkedHashMap, TreeMap 비교

  1. HashMap
    • 내부적으로 Entry의 array로 되어있고 해당 array에 index는 내부 해쉬 함수를 통해 계산합니다.
    • hashing을 사용하기 때문에 많은 양의 데이터를 검색하는데 뛰어난 성능을 가지고 있지만 내부 해시값에 따라서 키순서가 정해져서 특정 순서나 규칙없이 출력됩니다.
  2. LinkedHashMap
    • 내부적으로 LinkedList 형태로 저장되며 입력된 데이터의 순서를 유지할 수 있습니다.
    • HashMap과 기본적으로 기능은 동일하지만 순서를 유지하는 기능이 추가되면서 메모리 사용량이 더 높습니다.
  3. TreeMap
    • Key값에 따라서 자동으로 Sort가 되는 방식이며 동기화(synchronized) 처리가 되어있어 Thread-safe 합니다.
    • HashMap과 다르게 키값으로 null을 허용하지 않고 내부적으로 red black tree 구조로 데이터를 저장합니다.
      • red black tree 는 기존의 이진트리의 각 노드에 색깔을 저장하는 공간을 추가해서 색깔을 기준으로 균형을 맞추는 트리입니다.
    • 키값에 대한 Compartor(콤퍼레이터) 구현으로 정렬 순서를 변경할 수 있습니다.

정리하자면

  • 특별한 사유가 없다면 검색성능이 가장 좋은 HashMap 사용
  • 순서를 보장하고 싶다면 LinkedHashMap 사용
  • 키값을 일정하게 iterate 하고자한다면 TreeMap 사용

interface vs abstract

  • 공통점

    • 선언만 있고 구현 내용이 없습니다.
    • 스스로 객체를 생성할 수 없지만 추상클래스를 extends 받거나, interface를 implements한 자식들만 객체를 생성할 수 있습니다.
  • interface(인터페이스)

    • 다중 상속 가능
    • 추상 메서드, 상수만 선언 가능(java8부터 default메서드 사용 가능)
    • 생성자, 일반 변수를 가질 수 없음
    • 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우
    • 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 구현되든지 상관없을 때
    • 다중상속을 허용하고 싶을 때
  • abstract(추상 클래스)

    • 다중 상속 불가
    • 추상 메서드 1개 이상, 일반 변수, 일반 메서드 선언 가능
    • 생성자, 일반 변수 가질 수 있음
    • 관련성이 높은 클래스간에 코드를 공유하고 싶은 경우
    • 상속받은 클래스들이 공통적으로 가지는 메서드와 필드가 많거나, public 이외의 접근제어자 사용이 필요한 경우 사용할 수 있습니다.

자바 메모리 구조

  • 메서드(Method) 영역
    클래스 변수의 이름, 타입, 접근 제어자 등과 같은 클래스와 관련된 정보를 저장하며 static 변수, 전역변수 등이 저장된다.
    코드에서 사용되는 클래스들을 로더가 읽고 클래스 별로 분류해서 저장합니다.
  • 스택(Stack) 영역
    메서드가 실행되면 스택 영역에 메소드에 대한 영역이 1개 생기며 여기에 지역변수, 매개변수, 리턴값 등이 저장된다. LIFO(Last In First Out) 방식의 메모리입니다.
  • 힙(Heap) 영역
    new 연산자를 통해 생성된 객체와 배열의 인스턴스를 저장되고, 메모리는 가비지 컬렉터에 의해 관리됩니다.