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 메서드는 기존 인터페이스의 하위 호환성을 위해 도입되었고, 추상 클래스는 공통 기능의 재사용을 위한 목적입니다. 애초에 목적이 다르다.
아래는 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로 자동으로 변환한다.
public sealed class Shape permits Circle, Rectangle, Square{}향상된 switch문
String result = switch (status) { case "PENDING" -> "대기중"; case "PROCESSING" -> "처리중"; case "COMPLETED" -> "완료"; default -> "알 수 없음"; };
기타 Q
- 단순 for문과 stream의 성능 차이는?
- 단순 반복 작업은 for문 성능이 더 좋다.
- 하지만 stream은 가독성이 좋고, 병렬 처리가 가능하다.
- https://dev-coco.tistory.com/183
- record와 Lombok의 @Data의 차이는?
- record는 불변(immutable) 객체를 생성하지만, @Data는 가변 객체를 생성
- record는 자바 표준 스펙이라 별도 의존성이 필요 없지만, Lombok은 외부 라이브러리
- 실무에서는 DTO나 Value Object에는 record를, 엔티티 같은 도메인 객체에는 Lombok을 주로 사용
구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API.
사용되는 경우
- 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 사용
- 프레임워크나 IDE에서 이런 동적인 바인딩을 이용한 기능을 제공한다. intelliJ의 자동완성 기능, 스프링의 어노테이션이 리플렉션을 이용한 기능이라 할 수 있다.
https://whybk.tistory.com/162
@FunctionalInterface 어노테이션을 선언하면 인터페이스에는 추상 메소드 하나만 정의할 수 있다.

괄호안이 복잡해지면 위에서 선언 가능
int a = 10_000_000
https://mangkyu.tistory.com/336
원격 서버의 애플리케이션도 로컬 프로파일링툴을 이용해 모니터링 가능하다.