NOTE

OOP는 백엔드 개발에서 매우 중요한 패러다임이므로, 지원자가 클래스, 객체, 상속, 다형성 등 OOP의 기본 원리를 제대로 이해하고, 실제 코딩에 어떻게 적용하는지를 확인하려고 합니다. 또한 디자인 패턴이나 SOLID 원칙을 알고 있으면, 지원자가 유지보수 가능한 코드를 작성할 수 있는 능력을 가진지 판단하는 데 도움이 됩니다.

  1. Class와 Object
  2. Polymorphism
  3. Encapsulation
  4. 상속(Inheritance)
  5. SOLID

1. Class와 Object

Class와 Object에 대해 설명해주세요

Class

  • 객체를 생성하기 위한 설계도
  • 특정 데이터를 정의하고, 그 데이터와 관련된 동작을 함께 묶어서 관리
  • 속성 : 클래스가 가지고 있는 데이터
  • 메서드 : 클래스가 제공하는 동작
  • 추상화 : 객체의 공통적인 속성과 동작을 추상화하여 정의

Object

  • 클래스에서 정의한 설계도에 따라 생성된 실제 인스턴스
  • 상태 : 객체가 가지고 있는 속성 값
  • 행동 : 객체가 수행할 수 있는 동작

NOTE

class와 object의 코드 실행 관점에서의 차이를 설명해주세요

class는 실제로 메모리 공간을 차지하지 않고 템플릿의 역할을 합니다. 컴파일 시점에 정의되고 프로그램 전체에서 한 번만 존재합니다. object는 메모리에 실제 공간을 할당받으며 런타임 시점에 생성됩니다. 각 객체는 고유한 메모리 공간을 가집니다. 필요할때마다 생성되고 사용후에 소멸됩니다.

2. Polymorphism

Polymorphism 개념에 대해 설명하고, 개인/팀 프로젝트에 적용한 사례가 있다면 이야기해주세요

Polymorphism(다형성)

  • 같은 이름의 메서드나 연산자가 다른 클래스에 대해 다른 동작을 하도록 하는 것
  • 같은 자료형에 여러가지 타입의 데이터를 대입하여 다양한 결과를 얻어낼 수 있는 성질
  • 오버로딩, 오버라이딩, 업캐스팅, 다운캐스팅, 인터페이스, 추상메서드, 추상클래스

오버라이딩

  • 부모 클래스를 자식 클래스에서 재정의
  • 부모 클래스의 메서드를 재활용하면서 독자적인 기능 추가 가능

오버로딩

  • 같은 이름의 메서드를 다양한 매개변수 타입과 개수로 오버로딩하여 사용하는 것
  • 메서드 이름은 동일하게 유지하면서 다양한 상황에서 유연하게 대응하는 방법 제공

장점

  • 코드 재사용성
  • 유연성
  • 코드 가독성

단점

  • 복잡성
  • 오버헤드
  • 디버깅 어려움

3. Encapsulation

Encapsulation(캡슐화)란 무엇인가요?

  • 데이터(속성)와 메서드(기능)를 하나의 단위(객체)로 묶는 것
  • 외부에서 접근 가능한 부분과 불가능한 부분을 명확히 구분하여 객체의 정보 은닉 실현

목적

  • 데이터 보호 : 외부에서 객체 내부의 데이터를 변경하지 못하도록 방지
  • 코드 유지보수성 향상 : 내부 구현 방식을 외부에 노출하지 않아 외부 영향 최소화
  • 객체 간 독립성 : 다른 객체와의 상호작용 제한

구현방법

  1. 접근 제한자 사용
    • private : 해당 클래스 내부에서만 접근 가능
    • protected : 같은 패키지나 상속받은 클래스에서만 접근 가능
    • public : 모든 곳에서 접근 가능
    • default : 같은 패키지 내에서만 접근 가능
  2. Getter, Setter
    • private로 숨긴 데이터를 조적하거나 읽기 위해 getter와 setter 메서드 사용

NOTE

캡슐화와 정보 은닉의 차이점은 무엇인가요?

캡슐화는 데이터와 메서드를 객체 내부에 묶는 개념이고 정보 은닉은 외부에서 객체 내부의 데이터에 직접 접근하지 못하도록 제한하는 것을 의미합니다. 캡슐화가 항상 정보은닉을 포함하지 않습니다. 예를 들어 public 필드를 캡슐화 하여도 정보 은닉은 이루어지지 않습니다.

NOTE

캡슐화가 지나치게 강하면 어떤 문제가 있나요?

불필요하게 많은 getter와 setter가 생겨 코드가 복잡해지고 불필요한 반복이 늘어납니다. 객체의 상태를 꼭 보호해야 하는 경우에만 캡슐화를 사용하고 단순 데이터 클래스에서는 필요한 데이터에 제한 없이 접근하도록 허용합니다.

4. 상속(Inheritance)

상속(Inheritance)의 개념을 설명하고, 상속의 장단점을 이야기해주세요

  • 하위 클래스가 상위 클래스의 속성과 메서드를 물려받는 특성
  • 코드의 재사용성이 증가하고 새로운 클래스를 작성할 때 기존 클래스의 기능을 확장하거나 수정할 수 있음
  • is-a 관계
  • 하위 클래스는 상위 클래스의 일종으로 간주

장점

  • 기존에 정의된 코드를 재사용해 중복 코드를 줄일 수 있음
  • 상위 클래스에서 수정한 기능이 하위 클래스에 자동으로 반영되어 일관성있게 유지보수 가능
  • 상속을 통해 하위클래스를 확장하여 새로운 기능 추가 가능

단점

  • 강한 결합도 형성으로 상위 클래스의 구현이 하위클래스에도 영향을 받음
  • 상속 구조가 깊어질수록 구현 복잡도가 올라감

대안점

  • 합성 : 객체가 다른 객체를 포함하고 포함된 객체의 기능을 이용하는 방식

5. SOLID

SOLID 원칙이란 무엇인지, 각 원칙을 설명해주세요

소프트웨어 설계를 개선하고 유지보수성을 농피기 위해 따라야 할 다섯가지 원칙

SRP : 단일 책임 원칙

  • 한 클래스는 하나의 책임만 가져야 한다
  • 클래스가 여러 책임을 가지면 그 클래스가 변경될 때 예상치 못한 사이드 이펙트가 발생할 수 있음

OCP : 개방 폐쇄 원칙

  • 소프트웨어 개체는 확장에 대해서는 열려있어야 하고, 수정에 대해서는 닫혀있어야 한다
  • 새로운 기능을 추가할 때 기존 코드를 수정하지 않고 확장할 수 있어야 함

LSP : 리스코프 치환 원칙

  • 자식 클래스는 언제나 부모 클래스로 대체할 수 있어야 한다
  • 부모 클래스를 사용하던 코드가 자식 클래스를 사용하도록 바뀌었을 때 그 코드의 동작이 바뀌지 않도록 보장

ISP : 인터페이스 분리 원칙

  • 한 인터페이스는 그 인터페이스를 사용하는 클라이언트가 필요한 메서드만 제공해야 한다
  • 클라이언트가 사용하지 않는 메서드에 의존하지 않도록 여러개의 인터페이스를 제공해야 함
  • 하나의 큰 인터페이스를 여러개의 작은 인터페이스로 나누어 필요한 기능만 사용할 수 있도록 해야 함

DIP : 의존 역전 원칙

  • 구체적인 클래스가 아닌 추상 클래스나 인터페이스에 의존하도록 만들어야 함
  • 거의 변화가 없는 개념에 의존해야 함

NOTE

SOLID 원칙을 적용할 때 발생할 수 있는 성능상의 문제점은 무엇이 있을까요?

DIP 적용을 위해 인터페이스를 사용하면 메서드 호출이 간접적으로 이루어져 성능이 저하될 수 있습니다. 시스템 확장을 위해 새로운 클래스를 추가하거나 상속을 사용하면 객체 생성과 관리가 복잡해져 메모리 소비나 처리속도에 영향을 줄 수 있습니다.