2024.07.25.목.TIL 내일배움캠프 70일차 <최종프로젝트Day6>

김기남·2024년 7월 25일
post-thumbnail

안녕하세요, 오늘도 최종프로젝트 진행상황과 기술면접 준비 내용을 정리해보았습니다.

DI, IoC에 대해 설명해주세요.

DI(Dependency Injection)와 IoC(Inversion of Control)는 소프트웨어 디자인 패턴과 원칙으로, 특히 객체 지향 프로그래밍에서 코드의 유연성, 확장성, 테스트 용이성을 높이기 위해 사용됩니다. 이 두 개념은 서로 밀접하게 관련되어 있지만, 각각의 목적과 사용 방식이 다릅니다.

IoC(Inversion of Control)

IoC는 제어의 역전이라고 번역되며, 객체의 생성과 라이프사이클 관리, 의존성 주입 등을 컨테이너 또는 프레임워크에 맡기고, 객체는 자신의 주요 로직에 집중할 수 있도록 하는 개념입니다.

전통적인 절차적 프로그래밍에서는 프로그램의 흐름을 개발자가 직접 제어합니다. 반면에 IoC를 적용하면 프로그램의 흐름을 프레임워크나 컨테이너가 제어하게 됩니다. 이는 코드의 재사용성과 확장성을 높이고, 모듈 간의 결합도를 낮추는 데 유리합니다.

대표적인 IoC의 구현 방식으로는 다음과 같은 것들이 있습니다:

  1. 의존성 주입(Dependency Injection)
  2. 서비스 로케이터 패턴(Service Locator Pattern)
  3. 이벤트 기반의 프로그래밍(Event-based programming)

DI(Dependency Injection)

DI는 의존성 주입이라고 번역되며, 객체가 직접 의존성을 생성하는 것이 아니라 외부에서 주입받는 방식을 의미합니다. 이는 객체의 의존성을 컨테이너나 외부 설정 파일 등을 통해 주입함으로써 객체 간의 결합도를 낮추고, 코드의 테스트 용이성과 유지보수성을 높여줍니다.

DI의 주요 유형에는 다음과 같은 것들이 있습니다:

  1. 생성자 주입(Constructor Injection): 의존성을 생성자의 인자로 전달받는 방식입니다.
public class Car {
    private Engine engine;
    
    public Car(Engine engine) {
        this.engine = engine;
    }
}
  1. 세터 주입(Setter Injection): 의존성을 세터 메서드를 통해 전달받는 방식입니다.
public class Car {
    private Engine engine;
    
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}
  1. 인터페이스 주입(Interface Injection): 의존성을 주입받기 위한 메서드를 정의한 인터페이스를 구현하도록 강제하는 방식입니다.
public interface EngineSetter {
    void setEngine(Engine engine);
}

public class Car implements EngineSetter {
    private Engine engine;
    
    @Override
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}

IoC와 DI의 관계

IoC는 더 넓은 개념으로, DI는 IoC를 구현하는 하나의 방법입니다. IoC가 객체의 제어권을 프레임워크나 컨테이너에 넘기는 큰 그림을 제시한다면, DI는 구체적으로 그 제어권을 의존성 주입을 통해 어떻게 실현할 것인지에 대한 방법론입니다.

예시: Spring Framework

Spring Framework는 Java 기반의 대표적인 IoC 컨테이너이며, DI를 적극적으로 활용합니다. Spring에서는 객체의 생명주기를 관리하고, 필요한 의존성을 주입하는 역할을 IoC 컨테이너가 수행합니다. 이를 통해 개발자는 비즈니스 로직 구현에 집중할 수 있고, 의존성 관리나 객체 생성 등의 반복적인 작업을 최소화할 수 있습니다.

객체지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요?

객체지향 프로그래밍(Object-Oriented Programming, OOP)

객체지향 프로그래밍은 프로그래밍 패러다임 중 하나로, 프로그램을 객체(object)라는 기본 단위로 구성하는 방법론입니다. 객체는 데이터(속성)와 그 데이터에 대한 동작(메서드)을 포함하며, 객체들이 서로 상호작용하여 프로그램을 구성합니다.

객체지향 프로그래밍의 기본 개념

  1. 클래스(Class): 객체를 생성하기 위한 청사진 또는 설계도입니다. 클래스는 객체의 속성과 동작을 정의합니다.
  2. 객체(Object): 클래스의 인스턴스(instance)로, 실제로 존재하는 데이터와 그 데이터에 대한 동작을 가지는 개체입니다.
  3. 속성(Attribute) 또는 필드(Field): 객체의 상태나 데이터를 나타내는 변수입니다.
  4. 메서드(Method): 객체의 동작이나 기능을 정의하는 함수입니다.

객체지향 프로그래밍의 주요 원칙

  1. 캡슐화(Encapsulation): 데이터와 메서드를 하나의 단위로 묶고, 데이터의 접근을 제한하여 객체의 내부 상태를 보호하는 것입니다.
  2. 상속(Inheritance): 기존 클래스(부모 클래스 또는 슈퍼 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스 또는 서브 클래스)가 물려받아 재사용하고, 확장하는 기능입니다.
  3. 다형성(Polymorphism): 동일한 메서드나 연산이 다양한 방식으로 동작할 수 있도록 하는 것입니다. 이는 주로 메서드 오버로딩과 오버라이딩을 통해 구현됩니다.
  4. 추상화(Abstraction): 객체의 중요한 속성과 메서드만을 노출하고, 세부적인 구현은 숨기는 것입니다. 주로 인터페이스(interface)와 추상 클래스(abstract class)를 통해 구현됩니다.

객체지향 프로그래밍의 활용

  1. 모듈화 및 코드 재사용성 향상: 객체지향 프로그래밍은 코드를 모듈화하여 작성할 수 있어, 특정 기능을 가진 객체를 재사용하기 쉽습니다. 이는 유지보수를 간편하게 하고, 코드의 중복을 줄입니다.

  2. 복잡한 시스템의 관리: 객체지향 프로그래밍은 복잡한 시스템을 객체 단위로 나누어 관리하기 쉽게 합니다. 각 객체는 독립적으로 설계되고, 시스템 전체의 구조를 이해하기 쉽게 만듭니다.

  3. 유지보수 및 확장성: 객체지향 설계는 시스템의 일부를 수정하거나 확장할 때 다른 부분에 영향을 주지 않도록 설계할 수 있어 유지보수와 확장이 용이합니다.

  4. 디자인 패턴 적용: 객체지향 프로그래밍은 다양한 디자인 패턴(예: 싱글톤, 팩토리, 옵저버 등)을 적용하기에 적합합니다. 디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위한 일반적인 해결책을 제공합니다.

결론

객체지향 프로그래밍은 소프트웨어 설계와 구현에서 강력한 도구입니다. 이를 통해 복잡한 문제를 더 구조적이고 유연하게 해결할 수 있으며, 유지보수성과 확장성을 높여줍니다. 객체지향의 기본 원칙과 개념을 잘 이해하고 활용하면, 더 나은 품질의 소프트웨어를 개발할 수 있습니다.

최종프로젝트

스코프확장논의
구현한거 합동 테스트
포스트맨팀
리팩토링
추가기능정리
추가기능역할분배
AWS S3연결
일정조율
역할별코딩
튜터님피드백

profile
새로운 시작~!

0개의 댓글