- 인터페이스와 추상클래스
- 추상화
- 다형성
- 의존성 주입
- 디자인패턴 - 싱글톤
1. 인터페이스와 추상클래스
인터페이스와 추상클래스의 차이점은 무엇인가요?
공통점
- 추상 메서드(구현부 없이 선언부만 가지고 있는 메서드)로 이루어짐
- 독립적으로 객체를 생성할 수 없음
- 여러 곳에 사용될 공통된 기능에 대한 구현을 강제하기 위한 기능
추상클래스 = extends 자신의 기능들을 하위로 확장 인터페이스 = implements 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 동일한 기능으로 구현
추상 클래스(Abstract Class)
- 하나 이상의 추상 메서드를 가지는 클래스
- 추상 메서드를 선언하여 상속을 통해 하위클래스에서 반드시 구현하도록 강제
- 객체를 만들 수 없는 클래스
- 상속 키워드로 extends 사용
- 하위 클래스에서 메소드의 구현을 강제해야 함(Override)
- 다중 상속이 불가능함
인터페이스(Interface)
- 추상 메서드와 상수로만 이루어짐
- 인터페이스에 선언되어있는 추상 메서드를 Implements하는 클래스에서 반드시 구현하도록 강제
- 다중 상속 가능 : 모든 메서드가 추상 메서드라 상속 받는 클래스에서 재정의하여 사용하기 때문에 다중 상속의 모호성이 발생하지 않음
NOTE
인터페이스와 추상클래스의 차이점은 무엇인가요?
인터페이스는 추상 메서드와 상수로만 이루어져 있으며 다중 상속을 지원합니다. 추상 크래스는 추상 메서드와 일반 메서드 모두를 가질 수 있으며 다중 상속이 불가능합니다.
NOTE
왜 인터페이스가 다중 상속을 지원해야 한다고 생각하나요?
인터페이스는 메서드의 시그니처만 제공하기 때문에 상속받은 클래스에서 재정의하여 사용하므로 구현시 충돌 문제가 발생하지 않습니다. 추상 클래스는 상태를 가질 수 있기 때문에 다중 상속시 충돌 문제가 발생할 수 있습니다.
NOTE
인터페이스와 추상 클래스 중 어느 것을 선택할지 결정하는 기준은 무엇인가요?
공통된 상태를 공유해야 할 때나 상속 계층 구조가 명확할 땐 추상 클래스를 활용하는 것이 유리하고, 다양한 동작을 구현하거나 다중 상속이 필요할 때는 인터페이스를 사용하는것이 유리합니다.
NOTE
추상클래스와 인터페이스를 함께 사용할 수 있나요?
추상 클래스는 공통 상태와 기본 구현을 제공하고 인터페이스는 역할을 정의하는데 사용할 수 있습니다.
2. 추상화
추상화란 무엇이며, 코드로 어떻게 구현할 수 있는지 설명해주세요
추상화
- 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
- 하위 클래스들의 공통성을 모아 상위클래스를 정의할 수 있는 것
ex)
자동차와 오토바이는 전진과 후진을 할 수 있음
→ 자동차와 오토바이라는 하위 클래스들의 공통적인 기능(전진과 후진)을 추출하여 이동수단이라는 상위클래스에 정의
NOTE
추상화란 무엇이며, 코드로 어떻게 구현할 수 있는지 설명해주세요
추상화는 객체의 공통적인 특성을 추출하여 상위 클래스로 정의하는 것을 의미합니다. 인터페이스나 추상 클래스를 사용하여 구현할 수 있습니다. 예를 들어 자동차와 오토바이 클래스에 각각 전진과 후진 기능이 있다고 가정했을 때 이 기능을 ‘이동수단’이라는 상위 클래스에 정의하여 추상화를 구현할 수 있습니다.
NOTE
추상화를 지나치게 사용하면 어떤 단점이 있을까요?
설계가 복잡해지고 가독성이 떨어질 수 있습니다. 과도한 추상화는 불필요한 오버헤드를 초래합니다.
3. 다형성
다형성을 프로젝트에서 어떻게 활용했는지 예를 들어 설명해주세요
다형성
- 어떤 객체의 속성이나 기능이 맥락에 따라 다른 역할을 수행할 수 있는 객체 지향의 특성
- 메서드 오버라이딩과 메서드 오버로딩
- 같은 이름의 메서드가 상황에 따라 다른 역할을 수행하는 것
공통 모듈에 Base Exception을 구현하고 각 서비스 모듈에서 Exception을 확장하여 하위 예외 클래스들이 다른 동작을 구현하도록 개발함
NOTE
다형성을 프로젝트에서 어떻게 활용했는지 예를 들어 설명해주세요
공통 모듈에 Base Exception을 구현하고 각 서비스 모듈에서 Exception을 확장하여 하위 예외 클래스들이 다른 동작을 구현하도록 개발하였습니다.
NOTE
다형성을 적용하지 않고 구현했을 때 발생할 수 있는 문제점은 무엇인가요?
다형성을 적용하지 않으면 동일한 동작을 하는 코드가 여러곳에 반복되어 코드의 중복이 늘어나 유지보수가 어려워집니다.
4. 의존성 주입
의존성 주입이란 무엇이며, 이를 적용했을 때의 장점을 설명해주세요
의존성 주입
- 객체가 필요로 하는 의존 객체를 외부에서 주입하는 방식
- 생성자 주입, 세터 주입 ,인터페이스 주입
- 생성자 주입 : 객체 생성 시점에 의존성 주입
- 세터 주입 : 객체 생성 후 세터 메서드를 통해 의존성 주입
- 인터페이스 주입 : 의존성 주입을 위한 별도의 인터페이스 사용
장점
- 클래스 간의 결합도를 낮춤
- 코드의 재사용성 증가
- 유지보수성 향상
- 단위 테스트 용이성 증가
NOTE
의존성 주입이란 무엇이며, 이를 적용했을 때의 장점을 설명해주세요
의존성 주입은 객체 간의 의존 관계를 외부에서 주입하는 설계 방식 입니다. 생성자 주입, 세터 주입, 필드 주입으로 구현할 수 있으며, 의존성 주입을 사용하면 클래스 간 결합도를 낮추고 코드의 재 사용성을 증가시키며 유지보수성을 향상시킬 수 있습니다.
NOTE
생성자 주입과 세터 주입의 차이점은 무엇인가요? 각각의 장단점도 설명해주세요.
생성자 주입은 의존성 객체를 클래스의 생성자를 통해 주입하는 방식입니다. 세터 주입은 의존성 객체를 세터 메서드를 통해 주입하는 방식입니다. 생성자 주입은 불변성을 보장하고 필요한 의존성이 명확히 정의되는 장점이 있지만 나중에 의존성 변경이 불가능하다는 단점이 있습니다. 세터 주입은 의존성을 선택적으로 주입할 수 있고 의존성 주입 순서 조절이 가능해 순환 참조 문제를 해결할 수 있지만 불완전한 객체를 생성할 가능성이 높아집니다.
5. 디자인 패턴 - 싱글톤
디자인 패턴 중 싱글톤 패턴을 설명하고, 실제로 구현할 때 고려해야 할 사항을 이야기해주세요
싱글톤 패턴 (Singleton Pattern)
- 특정 클래스가 단 하나만의 인스턴스를 생성하여 사용하기 위한 패턴
- 생성자를 여러번 호출하더라도 인스턴스가 하나만 존재하도록 보장하여 동일 한 객체 인스턴스에 접근하도록 함
- 객체를 필요할 때마다 생성하는것이 아닌 단 한번만 생성하여 전역에서 이를 공유하고 사용할 수 있게 함
- private 생성자를 가져야 함
장점
- 유일한 인스턴스
- 메모리 절약
- 지연 초기화
단점
- 결합도 증가
- 테스트 복잡성
- 상태관리 어려움
- 전역에서 접근 가능 : 무분별한 사용을 막기 힘듦
NOTE
디자인 패턴 중 싱글톤 패턴을 설명하고, 실제로 구현할 때 고려해야 할 사항을 이야기해주세요
싱글톤 패턴은 클래스의 인스턴스를 단 하나만 생성하고 전역적으로 공유하는 디자인 패턴입니다. 주로 데이터베이스 연결이나 로그 기록 등 하나의 객체만 있어야 하는 곳에 사용됩니다. 싱글톤 객체는 애플리케이션이 실행되는 동안 계속 존재하기 때문에 객체 생성 시점을 적절히 관리해야 합니다. 또 전역적으로 공유되는 객체이므로 동시성 문제 없이 관리하는 것이 중요합니다.
NOTE
인터페이스를 여러 개 구현하는 클래스에서 메서드 충돌이 발생하면 어떻게 해결하시겠습니까?
인터페이스를 여러 개 구현할 때 메서드 이름이 동일한 경우, 구현 클래스에서 해당 메서드를 명시적으로 재정의(Override)해야 합니다. 이 방식으로 충돌을 해결할 수 있습니다.
NOTE
싱글톤 패턴이 멀티스레드 환경에서 발생할 수 있는 문제와 해결 방법을 설명하세요.
멀티스레드 환경에서 인스턴스가 동시에 생성될 수 있는 조건 경쟁(Race Condition)이 발생할 수 있습니다. 이는 두 개 이상의 스레드가 동시에 getInstance 메서드를 호출하면 싱글톤 객체가 여러 개 생성될 위험이 있습니다.
- 해결 방법:
- Synchronized 키워드 사용:
getInstance메서드에 동기화를 적용하여 스레드 안전성을 확보할 수 있습니다. 그러나 동기화는 성능 저하를 유발할 수 있습니다. - 이중 검사 락(Double-Checked Locking): 성능을 고려하여 객체를 생성할 때만 동기화하도록 구현합니다.
- 이른 초기화(Eager Initialization): 클래스 로드 시점에서 인스턴스를 미리 생성하여 동시 접근 문제를 방지합니다.
- Enum 싱글톤: Enum을 사용하면 자바에서 기본적으로 스레드 안전성과 직렬화 문제가 해결되므로 가장 간단하고 안전한 방식 중 하나입니다.
- Synchronized 키워드 사용: