본문 바로가기
TIL

TIL - 23.12.26

by JHBang 2023. 12. 26.

오늘은 챌린지반 1주차 강의를 들었다.

 

강의 내용은 변경에 유연한 프로그램 만들기였다.

 

아래는 강의 내용을 내 나름대로 정리한 것이다.

 

1.객체 지향 프로그래밍(OOP)

 

 객체지향 프로그래밍이란? 목표 완수를 위해 여러 객체들이 서로 "협력" 하는 방식으로 프로그래밍하는 패러다임

 

 소프트웨어의 중요한 가치 중 하나는 변경에 유연해야 한다는 것

 

 OOP는 변경에 유용한 프로그래밍을 할 수 있게 해 줌

 

 

2. 의존성과 변경의 전파

 

 A객체가 B객체를 의존한다?

  -> 의존한다는 건 협력을 요청한다는 뜻

 즉 A는 B에게 협력을 요청하여 작업을 수행한다.

 

그런데 B에 뭔가 변화가 생기면? B의 협력을 받는 A가 하는 작업 또한 변화가 생긴다.

 

즉 변경을 전파한다. 만약 A,B,C이렇게 여러 객체가 서로 의존하고 있으면 더더욱 변경이 전파될 거다.

 

OOP는 객체끼리 협력하여 목표에 도달하는게 원칙인데 협력을 위해서는 의존성이 필수다.

 

변경에 유연해야 하는데 의존성이 필수라면 어떻게 해야하는가? 

  -> 변경 전파를 최소화하는 방향으로 가자 -> 변경에 유연한 프로그램

 

 

3. 객체 지향 프로그래밍의 캡슐화

 

OOP의 4대 특징: 상속, 캡슐화, 다형성, 추상화

 

이 중 핵심은 캡슐화이다.

 

캡슐화란? 클라이어트 객체가 구체적인 것을 의존하지 못하도록 숨기고 추상적인 것만 의존하도록 만드는것

 

구체적인것? 변경 가능성이 높은 것

추상적인것? 변경 가능성이 낮은 것

 

즉 캡슐화를 통해 변경될 가능성이 낮은 것만 의존하도록 해서 변경 전파를 최소화 하는 것

 

 

4. 추상화 타입

 

추상화 타입은 Abstract class/ interface 이런거
근데 일반 클래스도 상관 x

 

타입 계층에서 추상화 타입은 클라이언트 객체가 추상적인 것만 의존하도록 만드는 것

 

객체 자체를 구체적인 것으로 보고 추상화 상위타입을 만들어 그 상위타임을 클라이언트 객체가 의존하도록 함

추상화 타입을 이용해 타입계층을 만드는것이 다형성 구현하는 문법적 근간

O는 클라이언트 객체, ㅁ는 추상화 타입, △는 구체적인 객체

 

 

5. 다형성이란?

 

컴파일 의존성 vs 런타임 의존성

컴파일 의존성: 정확하게는 코드로 존재하는 시점에 어떤 타입을 의존하고 있는가
런타임 의존성: 실제 어플리케이션이 실행되는 시점에 의존하게 되는 객체에 대한것

 

코드 상 O는 ㅁ에 컴파일 의존성을 가지고 있다. 하지만 런타임에서 실제 코드는 △객체가 하는 일을 의존하므로 런타임 의존성은 △에 있다고 볼 수 있다.

 

이 컴파일 시점의 의존성과 런타임 시점의 의존성이 달라질 수 있음이 다형성을 만들 수 있는 기반이 된다.

 

즉 O가 컴파일 시점에 의존하고 있는 ㅁ는 런타임 때 △1 △2 △3이 될 수 있다는 게 곧 다형성이다.

 

이러한 다형성이 어떻게 변경의 유연성을 만들까?

 

O는 사람, ㅁ는 자동차, △는 자동차의 차종 (ex:소나타, 벤츠, 포르쉐 등) 이라고 하자.

 

사람이 운전하는 자동차의 종류가 바뀐다고 자동차를 운전하는 방법이 바뀌지 않는다.(drive(), brake())

 

또한 사람은 drive()가 어떻게 동작하는지 알지 못하고, 알 필요도 없다.

 

즉 소나타라는 차가 drive의 매커니즘을 바꿨다 하더라도 사람은 그걸 알 필요가 전혀 없다는 뜻이다.

 

여기서 OCP원칙을 찾을 수 있다.

 

*OCP원칙: 소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계가 되어야 한다는 원칙을 말한다.

 

사람은 소나타가 어떻게 drive, brake를 처리하는지 모르고, 이 때문에 소나타는 언제든지 구체적인 것을 변경할 수 있는 자율적인 객체로 행동할 수 있다.

 

 

6. DI는 선택이 아니라 필수다

 

A객체가 B객체를 의존하는 방법은 직접 B객체를 생성하거나 외부로부터 의존성을 주입받는 DI가 있다.

 

직접 객체를 생성하는 방식은 추상화 타입을 사용하지 않는다는 말이다.

  -> O가 바로 △를 객체화한다는 것

 

즉 추상화 타입을 의존하면서 다형성을 구현하고 싶으면 DI는 필수적으로 사용해야 한다.

 

DI는 생성자 주입방식, Setter주입방식, 메소드 인자 주입방식이 있다.

 

 

 

 

 

 

 

 

 

'TIL' 카테고리의 다른 글

TIL - 24.01.08  (1) 2024.01.08
TIL - 23.12.28  (0) 2023.12.28
TIL - 23.12.20  (1) 2023.12.20
TIL - 23.12.19  (1) 2023.12.19
TIL - 23.12.18  (0) 2023.12.18