강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của ksh79533954
ksh79533954

câu hỏi đã được viết

Giới thiệu về lập trình hướng đối tượng

Sự phụ thuộc và DI

의존 대상 객체를 직접 생성했을 때 문제에 대해 질문드립니다.

Đã giải quyết

Viết

·

408

0

안녕하세요. 강사님.

영상 4:40초쯤 생성 클래스가 바뀌면 의존하는 코드도 바뀐다고 하셨는데 이게 어떤 경우인지 예시가 잘 안 그려집니다.

추상화 파트를 다시 봐도 이해가 잘 안 가서 그러는데 예시나 추상화 강의에서 나왔던 부분 좀 언급하셨던 곳 좀 알려주실 수 있을까요?

객체지향

Câu trả lời 2

0

ksh79533954님의 프로필 이미지
ksh79533954
Người đặt câu hỏi

감사합니다.

그런데 의존하는 대상이 바뀌어도 기존 코드에 영향이 없으려면 추상클래스를 의존하고 있어야 의미가 있을 것 같은데 맞을까요?

아래의 코드처럼 MessageSender라는 추상클래스에 의존하도록 하고 생성자나 메소드로 SmsSender나 AlimtalkSender를 인자를 받도록 해야 의존하는 대상이 변경되어도 코드 수정이 없을 것 같아서요.

처음 예시에서 SomeService가 SmsSender를 가지고 있고 의존 주입으로 생성자나 메소드로 SmsSender를 초기화한다 하면 요구사항이 변경되어 AlimtalkSender로 변경됬을 때 결국 코드가 수정되어야 하니까요..

제가 이해하고 있는게 맞나요?

class SomeService {
    //private AlimtalkSender sender = new AlimtalkSender(); // <-- 코드 바뀜
private:
    MessageSender *sender;
public: 
    void setMessageSender(MessageSender *sender) {
        this->sender = sender;
    }
    void doSome() {
        ... // DB 연동 등 작업
        sender.send(to, msg);
    }
} 
madvirus0123님의 프로필 이미지
madvirus0123
Người chia sẻ kiến thức

말씀하신 것처럼 추상 타입에 의존해야 내가 의존하는 구현체가 변경되어도 나는 변경할 필요가 없게 되죠.

0

madvirus0123님의 프로필 이미지
madvirus0123
Người chia sẻ kiến thức

안녕하세요. 아래 코드를 보죠.

public class SomeService {
    private SmsSender sender = new SmsSender();

    public void doSome() {
        ... // DB 연동 등 작업
        sender.send(to, msg);
    }
}

이 코드에서 SomeService는 SmsSender를 new로 생성해서 사용하고 있습니다. 즉 SomeService가 SmsSender를 의존하고 있죠.

SMS가 아니라 알림톡으로 메시지를 보내라고 요구사항이 변경되고 알림톡 발송 기능은 AlimtalkSender에 구현되어 있다고 가정하면, SmsSender 대신에 AlimtalkSender를 사용하도록 기존 코드를 변경해야 할 겁니다.

public class SomeService {
    private AlimtalkSender sender = new AlimtalkSender(); // <-- 코드 바뀜

    public void doSome() {
        ... // DB 연동 등 작업
        sender.send(to, msg);
    }
}

즉 위 코드처럼 SmsSender를 new로 생성해서 사용(의존)하는 SomeService 코드가 AlimtalkSender를 생성하도록 바뀌는 거죠.

Hình ảnh hồ sơ của ksh79533954
ksh79533954

câu hỏi đã được viết

Đặt câu hỏi