Java CS

최강일·2024년 11월 30일

default 메서드 관련

Q. 인터페이스에 새로운 기능(method)가 추가된다면?

  • 그러면 모든 구현체에서는 컴파일 에러가 날것이다.
  • 해당 메서드를 구현하기 전까지 컴파일을 할 수 없게된다.
  • ex. 자바8에서 stream api를 도입할때, default 메서드가 없었다면 Collection을 구현하는 모든 클래스들이 새로운 메서드를 구현해야한다.이는 이미 개발되어 배포된 lib,애플리케이션의 호환성을 깨뜨릴 수 있다.

default 메서드란

  • 자바8에 추가된 새로운 메서드 선언 타입으로, 인터페이스에 기본적으로 구현이 제공되는 메소드다.
  • 인터페이스를 구현하는 클래스에서 구현하지 않아도 되며, 기본 구현을 사용할 수 있다.
  • ex. Collection 인터페이스의 stream(), List 인터페이스의 sort()가 대표적인 예

즉, 기존의 인터페이스를 확장하고 변경하기 위함이다.

기타 Q

  • default 메서드의 단점은?
    • 다중 상속 시 모호성이 발생하여 설계가 복잡해진다.
    • 구현 클래스에서 디폴트 메서드의 존재를 모를 수 있어 예상치 못한 동작이 발생할 수 있다.
  • 동일한 시그니처의 default 메서드를 가진 두 인터페이스를 구현하면 어떻게되는가?
    • 컴파일 에러가 발생
    • 해결방법은 구현 클래스에서 명시적으로 해당 메서드를 오버라이드해야 된다.
    • ex. A.super.hello();
  • 실제 default 메서드 사용경험?
  • default 메서드와 추상 클래스의 차이점은?
    • default 메서드는 인터페이스에서만 사용할 수 있으며, 다중 구현이 가능합니다.
    • 추상 클래스는 단일 상속만 가능하고, 상태(필드)를 가질 수 있습니다.
    • default 메서드는 기존 인터페이스의 하위 호환성을 위해 도입되었고, 추상 클래스는 공통 기능의 재사용을 위한 목적입니다. 애초에 목적이 다르다.

JVM은 32g 이하로 설정

아래는 java8 기반의 내용이긴하다.

자바에서는 모든 객체가 힙 영역에 생성되고 생성된 객체는 모두 포인터(Pointer)를 가지고 있고 이 포인터를 이용해 객체에 접근한다.
(OOP(Ordinary Object Pointer)는 객체의 메모리 번지를 표현하는 주솟값이다.)

OOP는 32bit인지 64bit인지에 따라 Object를 참조하는 범위가 달라진다.

예를 들어, OOP가 32bit인 경우 2의 32제곱까지 표현이 가능하다.
2^32 = 약 4GB 까지의 주소 공간을 가리킬 수 있다.

반면 64bit는 2^64 = 16EB까지 주소공간을 가리킬 수 있는데, 터무니 없이 큰 주소공간이다.
주소 공간이 클수록 Object가 어디있는지 확인해야하는 범위도 커지기 때문에 성능이 떨어 질 수 있다.

Compressed Ordinary Object Pointer

Compressed OOP는 포인터의 공간 낭비를 줄이고 좀 더 빠른 연산을 위해 포인터를 압축해서 표현하는 일종의 트릭이라고 할 수 있다.

Compressed OOP를 이용해 포인터가 객체를 가리키게 한다면 32비트만을 이용해도 포인터가 최대 32GB까지의 힙 메모리 공간을 가리키는 것이 가능해진다.

하지만 32g를 넘기면 이 트릭을 사용할 수 없다. 넘기면 Compressed OOP를 일반적인 64비트 OOP로 자동으로 변환한다.

lts별 특징

  • java 8(2014년, 가장 대중적인 LTS)
    • 람다 표현식
    • Stream API(함수형 프로그래밍)
    • default 메서드
    • Optional 클래스로 null 처리 개선
    • 2026년까지 상용 지원 예정
  • java 11(2018년)
    • var 키워드: 자료형을 미리 선언하지 않고 초기화된 형태를 보고 java에서 판단
    • g1 gc
    • HTTP Client API : 기존에는 Apache HttpClient나 OkHttp 같은 라이브러리를 따로 써야했는데, 표준 API로 제공
  • java 17(2021년)
    • Sealed Classes: 상속 가능한 클래스를 명시적으로 제한
      • public sealed class Shape permits Circle, Rectangle, Square{}
    • 텍스트 블록 사용 가능 (“””)
    • stream의 immutable 반환 메소드(.toList())
    • switch문 함수형 선언
    • record 키워드(불변 통신 객체)
    • spring boot 3.x부터는 최소 스펙이 jdk17

향상된 switch문

String result = switch (status) {
    case "PENDING" -> "대기중";
    case "PROCESSING" -> "처리중";
    case "COMPLETED" -> "완료";
    default -> "알 수 없음";
};

기타 Q

  • 단순 for문과 stream의 성능 차이는?
  • record와 Lombok의 @Data의 차이는?
    • record는 불변(immutable) 객체를 생성하지만, @Data는 가변 객체를 생성
    • record는 자바 표준 스펙이라 별도 의존성이 필요 없지만, Lombok은 외부 라이브러리
    • 실무에서는 DTO나 Value Object에는 record를, 엔티티 같은 도메인 객체에는 Lombok을 주로 사용

리플렉션

구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API.

사용되는 경우

  • 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 사용
  • 프레임워크나 IDE에서 이런 동적인 바인딩을 이용한 기능을 제공한다. intelliJ의 자동완성 기능, 스프링의 어노테이션이 리플렉션을 이용한 기능이라 할 수 있다.

오류/예외

  • Error는 실행 중 일어날 수 있는 치명적 오류를 말합니다. 컴파일 시점에 체크할 수 없고, 오류가 발생하면 프로그램은 비정상 종료되며 예측 불가능한 UncheckedException에 속합니다.
  • 반면, Exception은 Error보다 비교적 경미한 오류이며, try-catch를 이용해 프로그램의 비정상 종료를 막을 수 있습니다.
  • 오류
    • 시스템이 종료되어야 할 수준과 같이 수습할수 없는 심각한 문제를 의미
    • 이는 개발자가 미리 예측하여 방지할 수 없다.
    • 종류
    • 컴파일 오류: .class 파일을 컴파일 하는 과정에서 jvm이 던지는 오류 (ex: ClassNotFoundException)
    • 런타임 오류: 컴파일 시에는 정상적으로 컴파일 됐지만 프로그램을 실행하는 과정에서 발생하는 오류 (ex: NullPointerException)
  • 예외
    • 개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생한다 이는 개발자가 미리 예측하여 방지할 수 있기 때문에 상황에 맞는 예외처리를 해야함

함수형 프로그래밍

  • 함수형 프로그래밍은 수학적 함수의 계산을 통해 자료를 처리하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임 중 하나
  • 함수를 일급 시민 취급하여 함수를 변수에 할당하고 다른 함수의 인자로 전달하고 함수로부터 반환
  • 명확한 데이터 흐름 유지 및 간결한 코드와 가독성이 높아짐

함수형 인터페이스란

https://whybk.tistory.com/162
@FunctionalInterface 어노테이션을 선언하면 인터페이스에는 추상 메소드 하나만 정의할 수 있다.

컬렉션 별 특징

기타

try-with-resource


괄호안이 복잡해지면 위에서 선언 가능

날짜관련

  • Date : 날짜 정보를 전달하기 위해
  • Calender : 다양한 시간대별로 날짜와 시간을 얻을 때
  • LocalDateTime : 날짜와 시간을 조작할 때

불변 객체

  • List.of
    • AbstractImmutableList를 구현. 사용 이유는 다른 자료구조로 변환이 용이하기에 사용. 즉, 불변의 장점을 이용.(ex. 쓰레드 안정성)
    • Thread-Safe하여 병렬 프로그래밍에 유용하며, 동기화를 고려하지 않아도 된다.
  • int a = 10_000_000
    • 언더스코어는 자바 7부터 도입된 기능으로, 큰 숫자를 읽기 쉽게 만들어주는 구분자
    • 컴파일러는 이 언더스코어를 무시하므로 1000000과 1_000_000은 완전히 동일한 값

객체 생성 시 동시성 고려

프로파일링

https://mangkyu.tistory.com/336
원격 서버의 애플리케이션도 로컬 프로파일링툴을 이용해 모니터링 가능하다.

Thread

동작 방식과 동시성 처리

Thread와 ThreadPool의 동작 방식

ThreadLocal 동작 원리

synchronized vs volatile vs atomic

CompletableFuture 활용

Spring

Tomcat

default 쓰레드값이 200인 이유

Tomcat vs spring boot 임베딩 톰캣 차이

profile
Search & Backend Engineer

0개의 댓글