애정코딩 💻

BASIC 2021.05.10 댓글 0 Joana

03. 객체 지향 프로그래밍 입문 - 상속, 의존

상속

 

상속을 통한 기능 재사용시 발생할 수 있는 단점 

1. 상위 클래스 변경이 어려움

 - 상위 클래스를 조금만 잘못 변경해도 그 하위 클래스들이 비정상적으로 작동될 수 있음. ( 계층도를 따라 전파됨 )

2. 새로운 조합이 생길 때 마다 하위 클래스가 증가된다. 어떤 클래스를 상속받는지도 애매

3. 상속을 오용할 수 있다. 

 

이와 같은 단점 해결 방법이 있을까?

- 여러 객체를 묶어서 더 복잡한 기능을 제공

- 보통 필드로 다른 객체를 참조하는 방식으로 조립, 객체를 필요 시점에 생성/구함

 

상속하기에 앞서 조립으로 풀 수 없는지 검토하고 진짜 하위 타입인 경우에만 상속을 이용합니다! (기능 재사용 시 쓰지 않도록 주의!)

조건 분기일 경우 추상화, 상속이 좋습니다. -> 의도가 잘 드러나는 이름 사용

 

 

의존

기능 구현을 위해 다른 구성 요소를 사용하는 것 예) 객체 생성, 메서드 호출, 데이터 사용

의존은 변경이 전파될 가능성을 의미한다. 의존하는 대상이 바뀌만 기능이 바뀔 가능성이 높아진다.

 

순환의존 -> 변경 연쇄 전파 가능성 -> 클래스, 패키지 모듈 등 모든 수준에서 순환오류가 발생하지 않도록 해야함.

의존하는 대상은 적을수록 좋다. 

조립

 - 한 클래스에서 많은 기능이 존재 할 경우 기능별로 클래스를 분리하면 의존이 줄어든다.

   (한 기능을 수정할 때 다른 기능을 수정하지 않아도 된다)

 - 몇 가지 의존 대상을 단일 기능으로 묶어서 의존 대상을 줄일 수 있는지 확인한다.

 

하지만 의존 대상 객체를 직접 생성한다면 생성 클래스가 바뀌어 의존하는 코드도 바뀐다. 

 

그렇다면 의존 대상 객체를 직접 생성하지 않는 방법은 뭘까?

- 팩토리, 빌더

- 의존 주입(Dependency Injection)

   - 외부에서 의존 객체를 주입한다. 생성자나 메서드를 이용해서 주입.

      예) SheduleService schSvc = new SheduleService(userRepo);

- 서비스 로케이터

 

의존 주입이 정확히 뭐지?

Assembler - 조립기가 객체 생성, 의존 주입을 처리 -> 예를 들어 스프링 프레임워크

1. 객체를 생성하고 의존 대상을 주입하는 코드를 설정으로 작성한다.

2. 그 설정코드를 이용하여 applicationContext 라는 조립기를 생성한다.

3. 조립기를 초기화할 때 설정파일을 실행해 객체를 만들어 의존주입을 발생한다. 

 

- 상위 타입을 사용할 경우 의존 대상이 바뀌면 조립기(설정) 만 변경하면 됨.

- 의존하는 객체 없이 대역 객체를 사용해서 테스트 가능

 

 

반응형