면접대비

개발자 기술 면접 대비 [Java] ep.02

seoeunpapa 2025. 1. 2. 17:23
728x90

자바 기술 면접 대비 두 번째 정리본입니다. 수정해야할 사항이 있다면 댓글 남겨주세요!



Q. 자바에서 SOLID 원칙이란 무엇이며, 각 원칙을 간단히 설명해주세요.

SOLID 원칙은 객체지향 설계에서 유지보수성과 확장성을 높이기 위한 5가지 원칙입니다.
SRP (단일책임원칙) : 객체는 단 하나의 책임만 가져야 하며, 변경 사유가 하나여야 합니다.
OCP (개방폐쇄원칙) : 확장에는 열려 있고, 변경에는 닫혀 있어야 합니다.
LSP (리스코프치환원칙) : 자식 클래스는 부모 클래스의 기능을 대체할 수 있어야 합니다.
ISP (인터페이스분리원칙) : 클라이언트에 필요한 기능만을 인터페이스로 제공해야 합니다.
DIP (의존관계역전원칙) : 의존관계는 구체적인 구현이 아닌 추상화(인터페이스)에 의존해야 합니다.


Q. SRP - 단일책임원칙에 대해 좀 더 자세히 설명해주세요.

변경 사유가 하나여야 한다는 원칙인데요. 예를 들어, 사용자 관리와 로그 출력의 두 책임을 하나의 클래스에 넣으면 SRP를 위반하게 됩니다. 이 경우, UserService 클래스는 사용자 관리 기능만 담당하고, Logger 클래스는 로그 출력 기능만 담당하도록 나누는 것이 좋습니다. 이렇게 하면 기능이 분리되어 유지보수 및 테스트가 용이해지고, 각 클래스의 변경 범위도 줄어듭니다.


Q. OCP - 개방폐쇄원칙에 대해 좀 더 자세히 설명해주세요.

확장에는 열려있고, 변경에는 닫혀있어야 한다는 원칙입니다. 즉, 새로운 기능이 필요할 때 기존 코드를 수정하지 않고 확장만으로 대응할 수 있어야 합니다. 예를 들어, Shape이라는 인터페이스를 만들고 Circle, Rectangle 같은 구체 클래스를 구현하면, 새로운 도형을 추가할 때 기존 클래스를 수정할 필요가 없습니다. 이렇게 하면 기존 코드가 보호되고, 유지보수가 쉬워집니다. (디자인패턴 중 템플릿메서드패턴을 활용)


Q. LSP - 리스코프치환원칙에 대해 좀 더 자세히 설명해주세요.

자식 클래스는 언제나 부모 클래스를 대체할 수 있어야 한다는 원칙입니다. 즉, 부모 클래스의 객체가 사용되는 곳에 자식 클래스의 객체를 사용해도 프로그램이 정상적으로 동작해야 합니다. 예를 들어, Bird 클래스에 fly() 메서드가 있다고 가정했을 때, 펭귄은 날지 못하므로 LSP를 위반하게 됩니다. 이 문제를 해결하기 위해 Flyable 인터페이스를 도입하고, 날 수 있는 새들만 Flyable을 구현하도록 설계하는 것이 좋습니다.


Q. ISP - 인터페이스분리원칙에 대해 좀 더 자세히 설명해주세요.

클라이언트가 자신이 사용하지 않는 인터페이스에 의존하지 않아야 한다는 원칙입니다. 즉, 하나의 거대한 인터페이스 대신 더 작고 구체적인 인터페이스를 여러 개 제공해야 합니다. 예를 들어, Worker라는 인터페이스에 work() 와 eat() 메서드가 모두 있다면, 로봇 클래스는 eat()을 구현할 필요가 없습니다. 이를 Workable 과 Eatable로 분리하면 각 클래스가 필요한 기능만 구현하도록 설계할 수 있습니다.


Q. DIP - 의존관계역전원칙에 대해 좀 더 자세히 설명해주세요.

구체적인 구현 클래스에 의존하지 않고, 인터페이스나 추상 클래스에 의존해야 합니다. 예를 들어, NotificationService가 EmailSender에 직접 의존하면 다른 알림 수단을 추가하기 어렵습니다. 대신 MessageSender라는 인터페이스를 만들고 EmailSender나 SMSSender가 이를 구현하면 유연한 설계가 가능해집니다. (NotificationService는 MessageSender에 의존)


Q. 자바의 final, finally, finalize의 차이점을 설명해주세요.

final은 변수, 메서드, 클래스에 적용되어 불변성을 보장합니다.
finally는 예외 처리 블록에서 마지막 부분으로 반드시 실행되는 코드를 정의합니다.
finalize는 객체가 GC에 의해 제거되기 전 호출되는 메서드로 자주 사용 되지는 않습니다.


Q. 자바에서 volatile 키워드는 어떤 역할을 하나요?

volatile 키워드는 변수의 값이 여러 스레드에서 정확하게 읽히고 쓰일 수 있도록 보장합니다. 자바의 메모리 모델에서 스레드 간 캐시 동기화 문제를 해결하는데 사용됩니다.


Q. equals() vs compareTo()

equals()는 객체가 논리적으로 동일한지 확인하고 싶을 때 사용하며, compareTo()는 객체 간의 순서를 비교하거나 정렬을 수행할 때 사용합니다.


Q. HashMap과 ConcurrentHashMap의 차이점은 무엇인가요? (HashMap vs HashTable이랑 차이점을 묻는 것과 동일)

해쉬맵은 멀티스레드 환경에서 안전하지 않지만, 단일 스레드 환경에서는 빠른 성능을 제공합니다. (null 허용)
컨커런트해쉬맵은 멀티스레드 환경에서 안전하며, 동시성을 최적화합니다. (null 미허용)
따라서 다중 스레드에서 데이터 동기화가 필요한 경우 컨커런트해쉬맵을 사용하는 것이 적합하고, 반대로 동기화가 필요 없는 경우는 해쉬맵이 더 효율적입니다.


Q. 자바 컬렉션 프레임워크에서 최상위 오브젝트 클래스에서 어떤 메서드들을 오버라이드해서 써야 되고 각각 어떤 역할을 하는지?

equals() : 두 객체의 값이 동일한지 비교하는데 사용합니다.
hashCode() : 객체의 해시코드 값(정수 값)을 반환합니다.
* equals 메서드를 오버라이드 한 경우, hashCode도 반드시 오버라이드 해야합니다.
(동일한 객체는 동일한 해시코드를 가져하 하므로)
toString() : 객체의 문자열 표현을 반환합니다.

728x90