
의존성 주입은 객체 간의 의존 관계를 외부에서 결정하고 주입하는 디자인 패턴입니다.
주요 특징:
구현 방법:
1. 생성자 주입
2. 세터(Setter) 주입
3. 인터페이스 주입
예시:
// 의존성 주입 전
class Car {
private Engine engine = new Engine(); // 직접 생성
}
// 의존성 주입 후
class Car {
private Engine engine;
public Car(Engine engine) { // 생성자를 통한 주입
this.engine = engine;
}
}
IoC는 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 의미합니다.
주요 특징:
IoC 컨테이너:
예시:
// IoC 적용 전
public class MyApp {
public static void main(String[] args) {
MyService service = new MyService();
service.doSomething();
}
}
// IoC 적용 후 (Spring 프레임워크 사용 예)
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
public class MyApp {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService service = context.getBean(MyService.class);
service.doSomething();
}
}
DI와 IoC의 관계:
이러한 패턴들은 코드의 모듈성, 재사용성, 테스트 용이성을 높이고, 결합도를 낮추어 유지보수를 용이하게 합니다.
특히 Spring과 같은 프레임워크에서 널리 사용되는 핵심 개념입니다.
객체지향 프로그래밍은 프로그램을 객체들의 모임으로 파악하고, 이들 객체들의 상호작용을 통해 프로그램을 구현하는 프로그래밍 패러다임입니다.
-상속(Inheritance): 기존 클래스의 속성과 메서드를 새로운 클래스가 재사용할 수 있게 합니다. 이를 통해 코드의 재사용성을 높이고 계층적인 관계를 표현할 수 있습니다.
-다형성(Polymorphism): 같은 이름의 메서드가 다른 기능을 수행할 수 있게 합니다. 이는 오버라이딩과 오버로딩을 통해 구현되며, 유연하고 확장 가능한 코드를 작성할 수 있게 합니다.
-추상화(Abstraction): 복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것을 의미합니다. 인터페이스와 추상 클래스를 통해 구현할 수 있습니다.
코드의 재사용성 향상: 상속을 통해 기존 클래스의 기능을 확장하거나 수정할 수 있습니다. 예를 들어, '차량' 클래스를 만들고 이를 상속받아 '승용차', '트럭' 등의 클래스를 만들 수 있습니다.
유지보수성 개선: 캡슐화를 통해 객체 내부 구현을 숨기고 외부에는 인터페이스만 제공함으로써, 내부 로직 변경 시 다른 부분에 미치는 영향을 최소화할 수 있습니다.
확장성 있는 설계: 다형성을 활용하여 새로운 기능을 쉽게 추가할 수 있습니다. 예를 들어, '도형' 인터페이스를 만들고 이를 구현하는 '원', '사각형' 등의 클래스를 만들어 확장할 수 있습니다.
복잡성 관리: 추상화를 통해 시스템의 복잡성을 관리할 수 있습니다. 예를 들어, 데이터베이스 연결을 추상화하여 실제 구현 세부사항을 숨기고 간단한 인터페이스만 제공할 수 있습니다.
객체지향 프로그래밍은 이러한 특징들을 활용하여 더 모듈화되고, 유지보수가 쉬우며, 재사용 가능한 코드를 작성할 수 있게 해줍니다. 이는 특히 대규모 소프트웨어 시스템 개발에서 큰 이점을 제공합니다."