개발일기/CS(면접)

DI와 IoC이란? // 객체지향 프로그램밍이란 ?

w.llama 2024. 7. 25. 21:43

DI와 IoC이란?

  • DI(Dependency Injection)생성자 주입 (Constructor Injection)
    • 설명: 생성자를 통해 의존 관계를 주입하는 방법으로, 객체 생성 시 딱 한 번만 호출됩니다.
    • 장점: 불변성을 보장하며, 주입받는 필드에 final 키워드를 사용할 수 있습니다.
    • 사용 방법: 스프링 3.4 버전 이전에서는 @Autowired를 생략할 수 있습니다.
  • 수정자 주입 (Setter Injection)
    • 설명: Setter 메서드를 통해 의존 관계를 주입하는 방법입니다. 주입된 의존성을 나중에 변경할 수 있는 유연성을 제공합니다.
    • 장점: 필요한 경우 주입된 의존성을 변경할 수 있습니다.
    • 단점: final 키워드를 사용할 수 없습니다.
    • 사용 방법: Setter 메서드에 @Autowired를 붙여 사용합니다.
  • 필드 주입 (Field Injection)
    • 설명: 필드에 직접 의존 관계를 주입하는 방법입니다.
    • 장점: 코드가 간결해집니다.
    • 단점: 외부에서 변경이 불가능하고, 테스트 코드 작성이 어렵습니다. 의존 관계를 명확히 파악하기 힘듭니다.
    • 사용 방법: 필드에 @Autowired를 붙여 사용합니다. 하지만 최근에는 잘 사용하지 않는 것이 권장됩니다.
  • IoC (Inversion of Control)IoC 컨테이너
    • 설명: 스프링에서 IoC를 구현하는 컨테이너를 제공합니다. 이 컨테이너는 빈 팩토리, DI 컨테이너, 애플리케이션 컨텍스트 등으로 불립니다.
    • 역할: 빈의 생성, 설정, 의존 관계 주입을 담당합니다.
    • 설정 방법: XML, 자바 코드, 어노테이션 등 다양한 방식으로 설정할 수 있습니다.
  • DI의 장점
    • 결합도 감소: 객체 간의 결합도를 낮춰 코드의 유연성과 유지보수성을 높입니다.
    • 테스트 용이성: Mock 객체를 쉽게 주입할 수 있어 단위 테스트 작성이 용이합니다.
    • 코드 재사용성 증가: 다양한 환경에서 재사용 가능한 코드를 작성할 수 있습니다.
  • IoC의 장점
    • 모듈화: 객체의 생명 주기와 의존성을 중앙에서 관리하여 모듈화를 용이하게 합니다.
    • 유지보수성: 코드의 가독성과 유지보수성을 높입니다.
    • 유연성: 변경에 유연하게 대처할 수 있으며, 구성 파일을 통해 다양한 설정이 가능합니다

객체지향 프로그램밍이란 무엇이고  어떻게 활용하는가?

  • 프로그램을 객체 단위로 나누어 작업하는 방식으로,객체들의 상호작용을 통해 프로그램을 설계하고 개발하는 프로그래밍 패러다임이다. 그 특징으로 추상화, 상속, 다형성, 캡슐화가 있다.
    • 추상화(Abstraction)
      - 객체의 공통적인 특징을 추출하여 정의하는 과정이다. 이를통해 복잡한 시스템을 단순화 하고 중요한 부분에 집중할 수 있다.
    • 상속(Inheritance)
      - 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받아 재사용하는 기능이다. 이를통해 코드의 재사용성을 높이고, 유지보수를 용이하게 한다.
    • 다형성(Polymorphism)
      - 동일한 메서드나 연산자가 상황에 따라 다르게 동작할 수 있는 능력. 코드의 유연성과 확장성을 높이는 데 기여한다.
    • 캡슐화(Encapsulaion)
      -객체의 상태를 외부에서 직접 접근하지 못하도록 하고, 메서드를 통해서만 접근할 수 있도록 하는 방법이다. 이를통해 데이터의 무결성을 유지하고, 코드의 모듈화를 촉진한다.
  • 객체지향 프로그래밍의 장점
    • 유지보수 용이
      - 코드가 모듈화 되어 있어 특정 부분만 수정하면 되므로 유지보수가 쉽다.
    • 코드 재사용성
      - 상속과 다형성을 통해 기존 코드를 재사용할 수 있어 개발의 효율성을 높인다.
    • 대형 프로젝트에 적합
      - 클래스 단위로 모듈화 하여 여러 명이 협업하기 용이하다.
    • 직관적 설계
      - 실제 세계를 모델링하여 직관적이고 이해하기 쉬운 코드를 작성할수 있다.
  • 객체지향 프로그래밍의 단점
    • 처리 속도 저하
      - 절차적 프로그래밍에 비해 처리속도가 느릴수 있다.
    • 메모리 사용 증가
      - 객체가 많아지면 메모리 사용량이 증가될 수 있다.
    • 복잡한 설계
      - 초기 설계 단계에서 많은 시간과 노력이 필요하다.
  • 객체지향 프로그래밍의 활용
    • java,python.c#등 다양한 언어에서 활용하며 소프트웨어 개발의 유연성, 유지보수성, 재사용성을 높이는데 사용된다.