1. 객체 지향 (Object-Oriented)
객체 지향
- 책임과 권한을 가진 객체들이 서로 메시지를 주고받으며 협력해서 필요한 기능을 수행하도록 시스템을 개발하는 것을 객체 지향이라고 합니다.
- 크고 복잡한 시스템을 효과적으로 분해하고 구성할 수 있고, 손쉽게 이해하고 효율적으로 다룰 수 있게 도와주는 방법으로 인정받아 많은 프로그래밍 언어에 적용되어 왔고 지금은 가장 인기 있는 프로그래밍 패러다임으로 자리 잡습니다.
캡슐화(Encapsulation)
- 정보은닉은 객체에 대한 중요한 정보를 외부로 노출시키지 않도록 하기 위한 기법입니다.
캡슐화의 목적은 변경하기 쉬운 객체를 만드는 것입니다. 캡슐화를 통해 객체 내부의 접근을 제한하면 객체와 객체 사이의 결합도를 낮출 수 있기 때문에 설계를 좀 더 쉽게 변경할 수 있게 됩니다.
상속(Inheritance)
- 개별 클래스를 상속 관계로 묶음으로써 클래스 간의 체계화된 구조를 파악하기 쉬워집니다.
- 데이터와 메소드를 변경할 때 상위에 있는 것만 수정하여 전체적으로 일관성을 유지할 수 있습니다.
기존에 작성된 클래스를 물려 받아 재활용하여 사용하므로 객체지향 프로그래밍의 중요한 기능 중 하나입니다!
추상화 (Abstraction)
- 추상화는 객체들의 공통적인 특성을 파악하여 필요 없는 특성을 제거하는 과정입니다.
- 시스템을 구축하기 전에 시스템 구조 및 구성을 가시적으로 볼 수 있고, 해당 시스템과 유사한 모델을 만들어 여러가지 테스트를 할 수 있습니다.
- 복잡한 내부 구현에 신경쓰지 않고, 외부에 노출되어 있는 인터페이스만을 이용하여 코드를 작성할 수 있습니다.
클래스를 설계할 때 공통적으로 묶일 수 있는 기능을 추상화 → 추상 클래스 → 인터페이스로 모델링해서 향후 다형성(Polymorphism)으로 확장할 수 있도록 설계합니다.
다형성 (Polymorphism)
다형성을 통해 역할(인터페이스)과 구현을 분리해서 오버라이딩(Overriding)을 통해 서비스의 구현기능을 유연하게 변경, 확장이 가능합니다.
의존성 (Dependency)
- 의존성이라는 말속에는 어떤 객체가 변경될 때 그 객체에 의존하는 다른 객체도 함께 변경될 수 있다는 사실이 내포되어 있습니다.
- 만약 하나의 객체가 변경될 경우 의존하고 있는 다른 객체 또한 변경이 이루어지게 됩니다.
결합도 (Coupling)
- 객체 사이의 의존성이 과한 경우를 가리켜 결합도가 높다고 말한다.
- 객체들이 합리적인 수준으로 의존할 경우에는 결합도가 낮다고 말한다.
- 두 객체 사이의 결합도가 높으면 높을수록 함께 변경될 확률도 높아지기 때문에 변경하기 어려워진다.
- 따라서 설계의 목표는 객체 사이의 결합도를 낮춰 변경이 용이한 설계를 만드는 것이어야 한다.
응집도 (Cohesion)
- 밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에 위임하는 객체를 가리켜 응집도가 높다고 말한다.
- 1개의 메소드가 내부에서 변수를 많이 사용할 수록 해당 메소드와 클래스는 응집도가 높아지게됩니다.
- 자신의 데이터를 스스로 처리하는 자율적인 객체를 만들면 결합도를 낮출 수 있을뿐더러 응집도를 높일 수 있다.
- 객체의 응집도를 높이기 위해서는 객체는 스스로 자신의 데이터를 책임져야 합니다.
2. 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)
프로그래밍 패러다임에는 대표적으로 3가지가 존재합니다.
1. 구조적 프로그래밍 (Structured Programming)
2. 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)
3. 함수형 프로그래밍 (Functional Programming)
구조적 프로그래밍은 제어 흐름의 직접적인 전환에 대한 규칙을 제시합니다.
- 구조적 프로그래밍은 기능을 중심적으로 개발을 진행합니다.
- 구조적 프로그래밍은 프로그래밍이라는 기술이 시작되면서 가장 처음으로 적용된 패러다임입니다.
객체 지향 프로그래밍은 제어흐름의 간접적인 전환에 대한 규칙을 제시합니다.
- 객체 지향 프로그래밍은 프로그램의 처리단위가 객체인 프로그래밍 방법입니다.
- 객체 지향 프로그래밍은 “현실 세계를 모델링”하는 대표적인 프로그래밍 패러다임입니다.
함수형 프로그래밍은 할당문에 대한 규칙을 제시합니다.
- 함수형 프로그래밍은 함수를 중심적으로 개발을 진행합니다.
- 함수형 프로그래밍은 3가지의 패러다임 중 가장 처음 만들어졌지만 최근들어 겨우 도입되기 시작하는 패러다임 입니다.
2) 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)
- 객체 지향 프로그래밍은 코드를 추상화해 직관적으로 사고할 수 있기 때문에, 대표적인 프로그래밍 방법론으로 적용되고 있습니다.
- 객체 지향 프로그래밍에서는 자동차, 동물, 사람 등과 같은 현실 세계의 객체를 유연하게 표현할 수 있습니다.
- 객체는 어떠한 특성을 가지고 있으며 특정 기능을 수행할 수 있습니다.
- 자동차는 객체이고 출발, 정지, 운행 및 제동과 같은 기능을 수행할 수 있습니다.
3) 왜 객체 지향 프로그래밍을 사용해야할까요?
만약 API를 만들 때 마다 복사 → 붙여넣기 방식으로 동일한 코드를 여러군데 분산을 시켜놓았을 때, 해당 로직을 수행하는 코드를 수정해야할 때 복사한 모든 코드를 일일히 찾아가며 수정을 해야하는 상황이 발생합니다.
우리는 프로그래밍을 하면서 효율적으로 시간을 관리할 수 있어야합니다. 그렇게 하기 위해선 코드를 얼마나 깔끔하게 짜느냐도 중요하지만, 코드 변경점이 발생하더라도 최대한 코드를 적게 수정하여 더욱 많은 시간을 만들 수 있어야합니다.
발생한 문제 상황을 빠르게 인지하고, 어떤 코드에서 오류가 발생했는지 빠르게 찾아보며, 오류 사항을 빠르게 고쳐 개발에 사용하는 시간을 최대한으로 줄이는것을 목표로 삼아야합니다.
객체지향 프로그래밍은 데이터와 프로세스를 하나의 단위로 처리하는 특성을 가지고 있기 때문에 코드를 수정해야할 때 어떤 코드에서 문제가 발생했는지 개발자들이 직관적으로 인지할 수 있으며 여러곳에 분산된 모든 코드를 수정해야하는 것이 아닌 해당 로직을 수행하는 코드만 수정하더라도 문제가 해결될 수 있습니다. 🙂
4) 객체지향 프로그래밍의 장점
- 객체지향 프로그래밍은 의존성을 효율적으로 통제할 수 있는 다양한 방법을 제공함으로써 요구사항 변경에 좀 더 수월하게 대응할 수 있는 가능성을 높여줍니다.
- 동작을 기준으로 프로그래밍을 진행하는 것보다 데이터를 중심으로 프로그래밍을 하게되면 코드의 덩치가 커지더라도 일관성을 유지하기 좋습니다.
- 객체지향 코드는 자신의 문제를 스스로 처리해야 한다는 우리의 예상을 만족시켜주기 때문에 이해하기 쉽고, 객체 내부의 변경이 객체 외부에 파급되지 않도록 제어할 수 있기 때문에 변경하기 수월합니다.
- 흔히 데이터와 프로세스를 하나의 단위로 통합해 놓는 방식으로 표현하기도 합니다.
- 데이터와 데이터를 사용하는 프로세스가 동일한 객체 안에 위치한다면 객체지향 프로그래밍 방식을 따르고 있을 확률이 높습니다.
5) 객체 지향 설계
- 좋은 설계란 요구하는 기능을 온전히 수행하면서 추후의 변경을 매끄럽게 수용할 수 있는 설계입니다.
- 변경 가능한 코드란 이해하기 쉬운 코드입니다. 만약 코드를 변경해야 하는데 그 코드를 이해할 수 없다면 변경에 유용하더라도 코드를 수정하겠다는 마음이 선뜻 들지는 않을 것입니다.
- 변경하기 쉬운 설계는 한 번에 하나의 클래스만 변경할 수 있는 설계입니다.
- 훌륭한 객체지향 설계의 핵심은 캡슐화를 이용해 의존성을 적절히 관리함으로써 객체 사이의 결합도를 낮추는 것이다.
'코딩캠프 > 내일배움캠프' 카테고리의 다른 글
[ TIL ] 12.30(금) 35일차 (0) | 2022.12.30 |
---|---|
[ TIL ] 12.29(목) 34일차 (0) | 2022.12.29 |
[ TIL ] 12.27(화) 32일차 (0) | 2022.12.28 |
[ TIL ] 12.26(월) 31일차 (0) | 2022.12.28 |
[ WIL ] 12.19~23 6주차 (0) | 2022.12.25 |