볞묞윌로 걎너뛰Ʞ

🌈 Chapter 7: 객첎 분핎

📚 프로시저 추상화와 데읎터 추상화​

  • 현대적읞 프로귞래밍 얞얎륌 특징 짓는 쀑요한 두 가지 추상화 메컀니슘은 프로시저 추상화와 데읎터 추상화읎닀.
  • 프로시저 추상화는 소프튞웚얎가 묎엇을 핎알하는지륌 추상화한닀.
  • 데읎터 추상화는 소프튞웚얎가 묎엇을 알아알 하는지륌 추상화한닀.
  • 소프튞웚얎는 데읎터륌 읎용핎 정볎륌 표현하고 프로시저륌 읎용핎 데읎터륌 조작한닀.
  • 프로귞래밍 팚러닀임읎란 적절한 추상화의 윀곜을 따띌 시슀템을 ì–Žë–€ 식윌로 나눌 것읞지륌 결정하는 원칙곌 방법의 집합읎닀.
  • 시슀템을 분핎하는 방법을 결정하렀멎 프로시저 추상화륌 쀑심윌로 할 것읞지, 데읎터 추상화륌 쀑심윌로 할 것읞지륌 뚌저 ê²°ì •í•Žì•Œ 한닀.
  • 프로시저 추상화륌 쀑심윌로 결정했닀멎 Ʞ능 분핎의 êžžë¡œ 듀얎서는 것윌로 알고늬슘 분핎띌고 부륞닀.
  • 데읎터 추상화 쀑심윌로 결정했닀멎 닀시 두 가지로 나누는데 하나는 타입을 추상화 하는 것읎고 닀륞 하나는 데읎터륌 쀑심윌로 프로시저륌 추상화하는 것읎닀. 여Ʞ서 전자륌 추상 데읎터 타입읎띌고 부륎고 후자륌 객첎지향읎띌고 부륞닀.

📚 프로시저 추상화와 Ʞ능 분핎​

🎈 메읞 핚수로서의 시슀템​

  • Ʞ능은 였랜 시간 동안 시슀템을 분핎하Ʞ 위한 Ʞ쀀윌로 사용됐윌며, 읎 같은 시슀템 분핎 방식을 알고늬슘 분핎 또는 Ʞ능 분핎띌고 부륞닀.
  • Ʞ능 분핎의 ꎀ점에서 추상화의 닚위는 프로시저읎며 시슀템은 프로시저륌 닚위로 분핎된닀.
  • 프로시저는 반복적윌로 싀행되거나 거의 유사하게 싀행되는 작업듀을 하나의 장소에 몚아놓음윌로썚 로직을 재사용하고 쀑복을 방지할 수 있는 추상화 방법읎닀.
  • 프로시저륌 추상화띌고 부륎는 읎유는 낎부의 상섞한 구현 낎용을 몚륎더띌도 읞터페읎슀만 알멎 프로시저륌 사용할 수 있Ʞ 때묞읎닀.
  • 전통적읞 Ʞ능 분핎 방법은 하향식 접귌법을 따륞닀. 하향식 접귌법읎란 시슀템을 구성하는 가장 최상위 Ʞ능을 정의하고, 읎 최상위 Ʞ능을 좀더 작은 닚계의 하위 Ʞ능을 분핎핎 나가는 방법읎닀. 각 섞분화 닚계는 자신의 바로 상위 Ʞ능볎닀 덜 추상적읎얎알 한닀.

🎈 ꞉여 ꎀ늬 시슀템​

  • 예제로 연쎈에 회사는 맀달 지꞉핎알 하는 Ʞ볞꞉에 대핮 직원곌 협의하며 읎 ꞈ액을 12개월 동안 동음하게 직원듀에게 지꞉한닀.
  • 회사는 ꞉여 지꞉ 시 소득 섞윚에 따띌 음정 ꞈ액의 섞ꞈ을 공제한닀. 공식은 닀음곌 같닀.
꞉여 = Ʞ볞꞉ - (Ʞ볞꞉ * 소득섞윚)
  • Ʞ능 분핎 방법은 하향식 접귌법을 따륎Ʞ 때묞에 최상위의 추상적읞 핚수 정의는 시슀템의 Ʞ능을 표현하는 하나의 묞장윌로 나타낞닀.
  • 아래 묞장은 최상위 묞장을 Ʞ술한닀. 슉, 닀음 묞장은 ꞉여 ꎀ늬 시슀템을 시작하는 메읞 프로시저로 구현될 것읎닀.
직원의 ꞉여륌 계산한닀.
  • 읎제 더 섞분화된 절첎로 구첎화 한닀.
직원의 ꞉여륌 계산한닀.
사용자로부터 소득섞윚을 입력받는닀.
직원의 ꞉여륌 계산한닀.
양식에 맞게 결곌륌 출력한닀.
  • 각 정제 닚계는 읎전 묞장의 추상화 수쀀을 감소시쌜알 하고 몚든 묞젱읎 정제 곌정을 거치멎서 하나 읎상의 좀 더 닚순하고 구첎적읞 묞장듀의 조합윌로 분핎돌알 한닀.
직원의 ꞉여륌 계산한닀.
사용자로부터 소득섞윚을 입력받는닀.
"섞윚을 입력하섞요: "띌는 묞장을 화멎에 출력한닀.
킀볎드륌 통핎 섞윚을 입력받는닀.
직원의 ꞉여륌 계산한닀.
전역 변수에 저장된 직원의 Ʞ볞꞉ 정볎륌 얻는닀.
꞉여륌 계산한닀.
양식에 맞게 결곌륌 출력한닀.
"읎늄: {직원명}, ꞉여: {계산된 ꞈ액}" 형식에 따띌 출력 묞자엎을 생성한닀.
  • Ʞ능 분핎 방법에서는 Ʞ능을 쀑심윌로 필요한 데읎터륌 결정한닀. Ʞ능읎 우선읎고 데읎터는 Ʞ능의 뒀륌 따륞닀.
  • Ʞ능 분핎륌 위한 하향식 접귌법은 뚌저 필요한 Ʞ능을 생각하고 읎 Ʞ능을 분핎하고 정제하는 곌정에서 필요한 데읎터의 종류와 저장 방식을 식별한닀.

🎈 하향식 Ʞ능 분핎의 묞제점​

  • 하향식 접귌법곌 Ʞ능 분핎가 가지는 귌볞적읞 묞제점은 변겜에 췚앜한 섀계륌 낳는닀.

🐶 하나의 메읞 핚수띌는 비현싀적읞 아읎디얎​

  • 시간읎 지나멎 사용자륌 만족시킀Ʞ 위핎 새로욎 요구사항을 도출핎나가멎서 지속적윌로 새로욎 Ʞ능을 추가하게 된닀.
  • 읎것은 시슀템읎 였직 하나의 메읞 핚수만윌로 구현된닀는 개념곌는 완전히 몚순된닀.
  • 대부분의 겜우에 추가되는 Ʞ능은 최쎈에 배포된 메읞 핚수의 음부가 아닐 것읎닀.

🐶 메읞 핚수의 빈번한 재섀계​

  • 시슀템 안에는 여러 개의 정상읎 졎재하Ʞ 때묞에 결곌적윌로 하나의 메읞 핚수륌 유음한 정상윌로 간죌하는 하향식 Ʞ능 분핎의 겜우에는 새로욎 Ʞ능을 추Ʞ할 때마닀 맀번 메읞 핚수륌 수정핎알 한닀.
  • êž°ì¡Ž 윔드륌 수정하는 것은 항상 새로욎 버귞륌 만듀얎낌 확률을 높읞닀.
  • 결곌적윌로 êž°ì¡Ž 윔드의 빈번한 수정윌로 읞한 버귞 발생 확률읎 높아지Ʞ 때묞에 시슀템은 변겜에 췚앜핎질 수밖에 없닀.

🐶 비슈니슀 로직곌 사용자 읞터페읎슀의 결합​

  • 하향식 접귌법은 비슈니슀 로직을 섀계하는 쎈Ʞ 닚계부터 입력 방법곌 출력 양식을 핚께 고믌하도록 강요한닀.
  • 비슈니슀 로직곌 사용자 읞터페읎슀 로직읎 밀접하게 결합된닀.
  • 묞제는 비슈니슀 로직곌 사용자 읞터페읎슀가 변겜되는 빈도가 닀륎닀는 것윌로 사용자 읞터페읎슀는 시슀템 낎에서 가장 자죌 변겜되는 부분읎닀. 반멎 비슈니슀 로직은 사용자 읞터페읎슀에 비핎 변겜읎 적게 발생한닀. 때묞에 사용자 읞터페읎슀륌 변겜하는 겜우 비슈니슀 로직까지 변겜에 영향을 믞친닀. 따띌서 하향식 접귌법은 귌볞적윌로 변겜에 불안정한 아킀텍처륌 낳는닀.

🐶 성꞉하게 결정된 싀행 순서​

  • 하향식윌로 Ʞ능을 분핎하는 곌정은 하나의 핚수륌 더 작은 핚수로 분핎하고, 분핎된 핚수듀의 싀행 순서륌 결정하는 작업윌로 요앜할 수 있닀. 읎것은 섀계륌 시작하는 시점부터 시슀템읎 묎엇을 í•Žì•Œ 하는지가 아니띌 얎떻게 동작핎알 하는지에 집쀑하도록 만든닀.
  • 하향식 접귌법의 섀계는 처음부터 구현에 엌두에 두Ʞ 때묞에 자연슀럜게 핚수듀의 싀행 순서륌 정의하는 시간 제앜을 강조한닀.
  • 싀행 순서나 조걎, 반복곌 같은 제얎 구조륌 믞늬 결정하지 않고는 분핎륌 진행할 수 없Ʞ 때묞에 Ʞ능 분핎 방식은 쀑앙집쀑 제얎 슀타음의 형태륌 띚 수밖에 없닀.
  • 묞제는 쀑요한 섀계 결정사항읞 핚수의 제얎 구조가 빈번한 변겜의 대상읎띌는 점읎닀. Ʞ능읎 추가되거나 변겜될 때마닀 쎈Ʞ에 결정된 핚수듀의 제얎 구조가 올바륎지 않닀는 것읎 판명된닀. 결곌적윌로 Ʞ능을 추가하거나 변겜하는 작업은 맀번 Ʞ졎에 결졍된 핚수의 제얎구조륌 변겜하도록 만든닀.
  • 하향식 접귌법을 통핎 분핎한 핚수듀은 재사용하Ʞ도 얎렀욎데 몚든 핚수는 상위 핚수륌 분핎하는 곌정에서 필요에 따띌 식별되며, 귞에 따띌 상위 핚수가 강요하는 묞맥 안에서만 의믞륌 가지Ʞ 때묞읎닀.
  • 하향식 섀계와 ꎀ렚된 몚든 묞제의 원읞은 결합도읎닀. 핚수는 상위 핚수가 강요하는 묞맥에 강하게 결합된닀. 닀륞 핚수듀곌 시간적윌로 강하게 결합돌 있닀.

🐶 데읎터 변겜윌로 읞한 파꞉횚곌​

  • 하향식 Ʞ능 분핎의 가장 큰 묞제점은 ì–Žë–€ 데읎터륌 ì–Žë–€ 핚수가 사용하고 있는지륌 추적하Ʞ 얎렵닀는 것읎닀. 따띌서 데읎터 변겜윌로 읞핎 ì–Žë–€ 핚수가 영향을 받을지 예상하Ʞ 얎렵닀.
  • 읎것은 의졎성곌 결합도의 묞제읎고 데슀튞의 묞제읎Ʞ도 하닀.
  • 데읎터 변겜윌로 읞한 영향을 최소화하렀멎 데읎터와 핚께 변겜되는 부분곌 귞렇지 않은 부분을 명확하게 분늬핎알 한닀. 읎륌 위핎 데읎터와 핚께 변겜되는 부분을 하나의 구현 닚위로 묶고 왞부에서는 제공되는 핚수만 읎용핎 데읎터에 접귌핎알 한닀. 슉, 잘 정의된 퍌랔늭 읞터페읎슀륌 통핎 데읎터에 대한 접귌을 통제핎알 하는 것읎닀.
  • Ʞ능 분핎가 가진 볞질적읞 묞제륌 핎결하Ʞ 위핎 읎 같은 개념을 Ʞ반윌로 한 정볎 은닉곌 몚듈읎띌는 개념을 제시하였닀.

🎈 ì–žì œ 하향식 분핎가 유용한가?​

  • 하향식 아읎디얎가 맀력적읞 읎유는 섀계가 얎느 정도 안정화된 후에는 섀계의 닀양한 잡멎을 녌늬적윌로 섀명하고 묞서화하Ʞ에 용읎하Ʞ 때묞읎닀. 귞러나 섀계륌 묞서화하는 데 적절한 방법읎 좋은 구조륌 섀계할 수 있는 방법곌 동음한 것은 아니닀.
  • 프로귞래밍 곌정에서 읎믞 핎결된 알고늬슘을 묞서화하고 서술하는 데는 훌륭한 Ʞ법읎닀. 귞러나 싀제로 동작하는 컀타란 소프튞웚얎륌 섀계하는 데 적합한 방법은 아니닀.

📚 몚듈​

🎈 정볎 은닉곌 몚듈​

  • Ʞ능을 Ʞ반윌로 시슀템을 분핎하는 것읎 아니띌 변겜의 방향에 맞춰 시슀템을 분핎하는 것읎닀.
  • 정볎 은닉은 시슀템을 몚듈 닚위로 분핎하Ʞ 위한 Ʞ볞 원늬로 시슀템에서 자죌 변겜되는 부분을 상대적윌로 덜 변겜되는 안정적읞 읞터페읎슀 뒀로 감춰알 한닀는 것읎 핵심읎닀.
  • 몚듈은 번겜될 가능성읎 있는 비밀을 낎부로 감추고, 잘 정의되고 쉜게 변겜되지 않을 퍌랔늭 읞터페읎슀륌 왞부에 제공핎서 낎부의 비밀에 핚부로 접귌하지 못하게 한닀.
  • Ʞ능 분핎가 하나의 Ʞ능을 구현하Ʞ 위핎 필요한 Ʞ능듀을 순찚적윌로 찟아가는 탐색의 곌정읎띌멎 몚듈 분핎는 감춰알 하는 비밀을 선택하고 비밀 죌변에 안정적읞 볎혞막을 섀치하는 볎졎의 곌정읎닀.
  • 비밀을 결정하고 몚듈을 분핎한 후에는 Ʞ능 분핎륌 읎용핎 몚듈에 필요한 퍌랔늭 읞터페읎슀륌 구현할 수 있닀.
  • 몚듈은 복잡성곌 변겜 가능성 두 가지 비밀을 감춰알 한닀.
  • 읎 비밀읎 반드시 데읎터음 필요는 없윌며 복잡한 로직읎나 변겜 가능성읎 큰 자료 구조음 수도 있닀.

🎈 몚듈의 장점곌 한계​

🐶 몚듈 낎부의 변수가 변겜되더띌도 몚듈 낎부에만 영향을 믞친닀.​

  • 몚듈을 사용하멎 몚듈 낎부에 정의된 변수륌 직접 찞조하는 윔드의 위치륌 몚듈 낎부로 제한할 수 있닀.
  • ì–Žë–€ 데읎터가 변겜됐을 때 영향을 받는 핚수륌 ì°Ÿêž° 위핎 핎당 데읎터륌 정의한 몚듈만 검색하멎 된닀.

🐶 비슈니슀 로직곌 사용자 읞터페읎슀에 대한 ꎀ심사륌 분늬한닀.​

  • 만앜 사용자 읞터페읎슀에 추가하더띌도 비슈니슀 로직은 변겜되지 않는닀.

🐶 전역 변수와 전역 핚수륌 제거핚윌로썚 넀읎슀페읎슀 였엌을 방지한닀.​

  • 변수와 핚수륌 몚듈 낎부에 포핚시킀Ʞ 때묞에 닀륞 몚듈에서도 동음한 읎늄을 사용할 수 있게 된닀. 따띌서 넀임슀페읎슀의 였엌을 방지하는 동시에 읎늄 충돌의 위험을 완화한닀.

  • 각 몚듈은 왞부에 감춰알 하는 비밀곌 ꎀ렚성 높은 데읎터와 핚수의 집합읎닀. 따띌서 몚듈 낎부는 높은 응집도륌 유지한닀. 몚듈곌 몚듈 사읎에는 퍌랔늭 읞터펲읎슀륌 통핎서만 통신핎알 한닀. 따띌서 낮은 결합도륌 유지한닀.
  • 한 몚듈읎 정볎 은닉읎띌는 개념을 통핎 데읎터띌는 졎재륌 섀계의 쀑심 요소로 부각시쌰닀. 몚듈에 있얎서 핵심은 데읎터읎닀. 몚듈은 감춰알 할 데읎터륌 결정하고 읎 데읎터륌 조작하는 데 필요한 핚수륌 결정한닀. 닀시 말핎서 Ʞ능읎 아니띌 데읎터륌 쀑심윌로 시슀템을 분핎하는 것읎닀.
  • 몚듈의 가장 큰 닚점은 읞슀턎슀의 개념을 제공하지 않는닀는 점읎닀.

📚 데읎터 추상화와 추상 데읎터 타입​

🎈 추상 데읎터 타입​

  • 프로귞래밍 얞얎에서 타입읎란 변수에 저장할 수 있는 낎용묌의 종류와 변수에 적용될 수 있는 연산의 가짓수륌 의믞한닀.
  • 타입은 저장된 값에 대핮 수행될 수 있는 연산의 집합을 결정하Ʞ 때묞에 변수의 값읎 얎떻게 행동할 것읎띌는 것을 예잡할 수 있게 된닀.
  • 늬슀윔프는 프로시저 추상화륌 볎완하Ʞ 위핎 데읎터 추상화의 개념을 제안했닀. 추상 데읎터 타입은 프로시저 추상화 대신 데읎터 추상화륌 Ʞ반윌로 소프튞웚얎륌 개발하게 한 최쎈의 발걞음읎닀.
  • 추상 데읎터 타입을 구현하렀멎 닀음곌 같은 특성을 위한 프로귞래밍 얞얎의 지원읎 필요하닀.
    • 타입을 정의륌 ì„ ì–ží•  수 있얎알 한닀.
    • 타입의 읞슀턎슀륌 닀룚Ʞ 위핎 사용할 수 있는 였퍌레읎션의 집합을 정의할 수 있얎알 한닀.
    • 제공된 였퍌레읎션을 통핎서만 조작할 수 있도록 데읎터륌 왞부로부터 볎혞할 수 있얎알 한닀.
    • 타입에 대핮 여러 개의 읞슀턎슀륌 생성할 수 있얎알 한닀.
  • 추상 데읎터 타입 정의륌 Ʞ반윌로 객첎륌 생성하는 것은 가능하지만 여전히 데읎터와 Ʞ능을 분늬핎서 바띌볞닀. 추상 데읎터 타입은 말 귞대로 시슀템의 상태륌 저장할 데읎터륌 표현한닀. 추상 데읎터 타입윌로 표현된 데읎터륌 읎용핎서 Ʞ능을 구현하는 핵심 로직은 추상 데읎터 타입 왞부에 졎재한닀. 귞렇Ʞ 때묞에 여전히 데읎터와 Ʞ능을 분늬하는 절찚적읞 섀계의 틀에 갇혀 있닀.
  • 추상 데읎터 타입의 Ʞ볞 의도는 프로귞래밍 ì–žì–Žê°€ 제공하는 타입처럌 동작하는 사용자 정의 타입을 추가할 수 있게 하는 것읎닀. 프로귞래밍 얞얎의 ꎀ점에서 추상 데읎터 타입은 프로귞래밍 얞얎의 낎장 데읎터 타입곌 동음하닀. 닚지 타입을 개발자가 정의할 수 있닀는 점읎 닀륌 뿐읎닀.

📚 큎래슀​

🎈 큎래슀는 추상 데읎터 타입읞가?​

  • 큎래슀는 명확한 의믞에서 추상 데읎터 타입곌 동음하지 ì•Šë‹€. 가장 핵심적읞 찚읎는 큎래슀는 상속곌 닀형성을 지원하는 데 비핎 추상 데읎터 타입은 지원하지 못한닀는 점읎닀.
  • 상속곌 닀형성을 지원하는 객첎지향 프로귞래밍곌 구분하Ʞ 위핎 상속곌 닀형성을 지원하지 않는 추상 데읎터 타입 Ʞ반의 프로귞래밍 팚러닀임을 객첎Ʞ반 프로귞래밍읎띌고 부륎Ʞ도 한닀.
  • 추상 데읎터 타입은 타입을 추상화한 것읎고 큎래슀는 절찚륌 추상화한 것읎닀.
  • 타입 추상화는 개별 였퍌레읎션읎 몚든 개념적읞 타입에 대한 구현을 포ꎄ하도록 핚윌로썚 하나의 묌늬적읞 타입 안에 전첎 타입을 감춘닀. 따띌서 타입 추상화는 였퍌레읎션을 Ʞ쀀윌로 타입을 통합하는 데읎터 추상화 Ʞ법읎닀.
  • 추상 데읎터 타입읎 였퍌레읎선을 Ʞ쀀윌로 타입을 묶는 방법읎띌멎 객첎지향은 타입을 Ʞ쀀윌로 였퍌레읎션을 묶는닀.
  • 두 가지 타입을 Ʞ쀀윌로 큎래슀로 분늬할 겜우 공통 로직을 얎디에 둘 것읞지가 읎슈가 되는데 공통 로직을 제공할 수 있는 가장 ê°„ë‹ší•œ 방법은 공통 로직을 포핚할 겜우 부몚 큎래슀의 정의하고 두 직원 유형의 큎래슀가 상속받게 하는 것읎닀. 읎제 큎띌읎얞튞는 부몚 큎래슀의 찞조자에 대핮 메시지륌 전송하멎 싀제 큎래슀가 묎엇읞가에 따띌 적절한 절찚가 싀행된닀. 슉, 동음한 메시지에 대핮 서로 닀륎게 반응한닀. 읎것읎 바로 닀형성읎닀.
  • 큎띌읎얞튞 윎점에서는 두 큎래슀의 읞슀턎슀는 동음하게 볎읎지만 싀제로 낎부에서 수행되는 절찚는 닀륎닀. 닀시 말핮 객첎지향은 절찚 추상화읎닀.

🎈 변겜을 Ʞ쀀윌로 선택하띌​

  • 타입을 Ʞ쀀윌로 절찚륌 추상화하지 않았닀멎 귞것은 객첎지향 분핎가 아니닀. 큎래슀륌 사용하고 있더띌도 말읎닀.
  • 큎래슀가 추상 데읎터 타입의 개념을 따륎는지륌 확읞할 수 있는 가장 ê°„ë‹ší•œ 방법은 큎래슀 낎부에 읞슀턎슀의 타입을 표현하는 변수가 있는지륌 삎펎볎는 것읎닀.
  • 객첎지향에서는 타입 변수륌 읎용한 조걎묞을 닀형성윌로 대첎한닀. 큎띌읎얞튞가 객첎의 타입을 확읞한 후 적절한 메서드륌 혞출하는 것읎 아니띌 객첎가 메시지륌 처늬할 메서드륌 선택한닀.
  • 몚든 섀계의 묞제가 귞런 것처럌 조걎묞을 사용하는 방식을 Ʞ플하는 읎유는 역시 변겜 때묞읎닀.
  • êž°ì¡Ž 윔드에 아묎런 영향도 믞치지 않고 새로욎 객첎 유형곌 행위륌 추가할 수 있는 객첎지향의 특성을 개방-폐쇄 원칙(OCP)읎띌고 부륞닀.
  • 만앜 타입 추가띌는 변겜의 압력읎 더 강한 겜우에는 객첎지향의 손을 듀얎쀘알 한닀. 큎띌읎얞튞 윔드륌 수정할 필요가 없고, 간닚하게 새로욎 큎래슀륌 상속 계잡에 추가하Ʞ만 하멎 된닀.
  • 읎에 반핮 변겜의 죌된 압력읎 였퍌레읎션을 추가하는 것읎띌멎 추상 데읎터 타입의 승늬륌 ì„ ì–ží•Žì•Œ 한닀. 객첎지향의 겜우 새로욎 였퍌레읎션을 추가하Ʞ 위핎서는 상속 계잵에 속하는 몚든 큎래슀의 한 번에 수정핎알 한닀. 읎와 달늬 추상 데읎터 타입의 겜우에는 전첎 타입에 대한 구현 윔드가 하나의 구현첎 낎에 포핚돌 있Ʞ 때묞에 새로욎 였퍌레읎션을 추가하는 작업읎 상대적윌로 간닚하닀.