inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

PayOption

59

채월야

작성한 질문수 1

0

package poly.ex.pay2;

public class PayOption {

    Pay findPay(String option) {

        //결제 수단 추가시 변경되는 부분.
        if (option.equals("kakao")) {
            return new KakaoPay();
        } else if (option.equals("naver")) {
            return new NaverPay();
        } else if (option.equals("newPay")) {
            return new NewPay();
        } else {
            return new DefaultPay();
        }
    }
}

마지막 강의 실전 문제 중에서 결제 수단 관련 문제입니다.

위와 같이 코드를 작성하게 되면 결제 수단이 추가될 때마다 클래스 내부 코드가 변경이 되는데, OCP를 위반한 것 같은데, 왜 이렇게 작성한 것인지 궁금해서 여쭤봅니다.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

java 객체지향

답변 2

0

y2gcoder

안녕하세요. 채월야님, 공식 서포터즈 y2gcoder입니다.

자바 입문 강의의 목표는 자바가 가진 객체지향언어로서의 특징과 법칙을 학습하기 위함이라기 보단, 자바라는 언어와 친숙해지는 강의라고 생각해주시면 좋을 것 같습니다!

image.png

그런 의미에서 기본적인 반복문, 조건문, 메서드 등을 학습하는 것을 목적으로 했기 때문에 자바 클래스에 대한 내용도 자세히 나오지 않습니다 🙂

그러한 의미에서 해당 문제에서 OCP 개념까지 도입하는 것은 범위를 넘어간 것이기 때문에 본 강의에서는 학습한 내용을 바탕으로 풀 수 있는 문제, 학습한 내용을 바탕으로 이해할 수 있는 답안을 준비했다고 이해해주시면 감사하겠습니다!

 

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 채월야님.

질문해주신 내용은 OCP(Open/Closed Principle)와 관련된 부분으로 보입니다. OCP는 객체지향 디자인 원칙 중 하나로, “확장에는 열려 있으나, 변경에는 닫혀 있어야 한다”는 원칙입니다. 이는 새로운 기능을 추가할 때 기존 코드를 수정하지 않도록 장려합니다.

현재 코드에서는 결제 수단이 추가될 때마다 findPay 메서드가 변경되며, 이는 OCP를 위반한다고 말씀하셨습니다. 이런 경우를 해결하기 위해서는 Factory Pattern 또는 Dependency Injection을 사용하여 코드의 결합도를 낮추고, 유연성을 높일 수 있습니다.

기존 코드 설명:

해당 코드는 findPay 메서드에서 문자열 option에 따라 각 결제 수단의 객체를 반환합니다. 새로운 결제 수단을 추가할 때마다 조건문과 클래스 인스턴스를 추가로 삽입해야 하기 때문에 코드의 변경이 필요하다는 단점이 있습니다.

개선 방법:

  1. 팩토리 패턴 사용:
    팩토리 메서드를 통해 객체 생성을 캡슐화하여, 결제 수단이 추가될 때 코드의 변경 없이 객체 생성을 처리할 수 있습니다.
   public interface PayFactory {
       Pay createPay();
   }

   public class KakaoPayFactory implements PayFactory {
       public Pay createPay() {
           return new KakaoPay();
       }
   }

   // 각 결제 수단에 대해 Factory를 생성
  1. 등록 메커니즘:
    등록을 통해 새로운 결제 수단을 추가 시 등록만 하면 되도록 설계할 수도 있습니다.

질문 내용과 관련된 이전 답변들도 참고하시면 도움이 될 것 같습니다. 아래에 유사한 질문과 답변 링크를 포함합니다:

  1. 이부분이 이해가 안갑니다
  2. 서비스 로직에 대해서 궁금한게 있습니다
  3. 회원 도메인 실행과 테스트 강의 8분 40초 질문입니다

이 링크들은 OCP와 관련된 다양한 사례와 솔루션을 제공합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

문제와 풀이4 문제점

0

58

2

문제풀이 시간마다 방향성

0

54

2

피라미드 문제 풀이

0

75

1

ScannerWhile3 예제 코드 질문

0

62

1

짝수 출력 문제 질문

0

56

1

Array 연습 문제 5번 질문입니다.

0

87

2

단축어가 이상하게 나옵니다

0

138

2

Sql강의

0

97

1

array 문제풀이 2번 질문입니다.

0

59

1

JAVA입문 / 메서드편 문제와 풀이2

0

53

1

인텔리제이 무료버젼이 통합되었다는데 30일 무료버전이면 어떻게 사용하나요

1

842

3

OperationEx3에서 꼭 boolean을 써야 하나요?

0

65

1

for, while문 작성

0

68

1

68강 ArrayEx6 클래스 질문

0

63

1

IO.println(String.format("Hello and welcome!"));

0

156

2

소스코드 실행이 안돼요

0

125

2

메서드 문제와 풀이2에서 마지막 문제 이렇게 풀어도 괜찮은 건가요..?

0

81

1

While과 for 스코프 질문

0

65

1

김영한 java 입문 설치 질문

0

144

2

버퍼문제?

0

56

1

for문 피라미드 찍는거 질문

0

80

1

21버전이 없고, 강의 메뉴얼 확인해보면 된다는 김영한 선생님 답변 확인했습니다.

0

385

1

3번 문제 질문 있습니다.

0

100

2

sout에는 변수가 하나만 들어가야 하나요?

0

137

1