[ 절차 지향 VS 객체 지향 ]
이전에는 순서대로 코드를 실행하는 방식인 절차 지향 프로그래밍으로 개발을 했다. 그러나 복잡한 시스템에서는 코드를 관리하고 오류를 추적하는 것이 어려우며, 한 부분에서 문제가 발생하면 이후의 모든 절차에 영향을 줄 수 있다는 단점이 있었다.
이러한 문제를 보완하기 위해 등장한 방식이 객체 지향 프로그래밍이다. 데이터와 함수를 객체 단위로 묶어서 각 객체가 독립적으로 동작할 수 있게 하여 재사용성을 높이고 유지보수가 편리해졌다.
[ 특징 ]
객체 지향 프로그래밍의 가장 큰 특징은 아래 4가지가 있다.
① 추상화: 공통적인 속성과 기능을 추출하여 정의한다
② 상속: 기존 코드를 확장하여 새로운 기능을 만들 수 있다
③ 다형성: 같은 메서드와 클래스를 다른 방식으로 구현할 수 있다
④ 캡슐화: 데이터와 함수를 객체 내에 하나로 묶어 데이터의 접근을 제어한다
[ 의존도, 결합도 ]
다른 클래스와 연결되어 있는 정도가 높으면, A 클래스와 다른 클래스 사이에 '의존도가 높다', '결합도가 높다'라고 표현한다. 하지만 결합도는 높으면 좋지 않다. A 클래스에 문제가 생기면 연결된 다른 클래스에도 영향이 생기기 때문이다. 따라서 결합도를 낮추기 위해서 코드를 옮겨야 한다. 이처럼 결합도는 클래스 간의 연결되어 있는 문제이다.
[ 응집도 ]
응집도는 하나의 클래스 내부의 문제이다. 클래스 내에 서로 연관되어 있는 여러 기능을 만들고 이들끼리 잘 사용되고 있는지를 파악하는 것이다. 코드 1,000줄 중에서 300줄을 사용하고 있다면 응집도가 낮다고 표현한다.
응집도를 높이는 방법은 연관성이 없는 작업은 다른 객체(클래스)에게 위임하는 것이다. 그리고 객체 내부의 상태를 캡슐화하고, 오직 메세지(함수)를 통해서만 상호작용하는 것이다. 이는 변수에 직접 접근하지 않고 함수를 기준으로 접근함을 의미하며, 함수를 기준으로 작성해야 확장성 있는 코드가 된다. 변수가 아닌 함수를 호출하기 때문에 싱글톤과 같은 경우를 제외하고 캡슐화를 위해서 변수는 private로 설정한다.
[ 책임의 이동 ]
응집도를 높이기 위해 기능별로 나뉜 각 클래스들의 책임은 무엇인지 생각하여 리팩토링을 통해서 책임(코드)를 옮겨줄 수 있다. 처음에는 A 클래스에서 관리해야 할 기능인 것 같았는데, 나중에 보니 B 클래스에서 맡아야 할 기능인 것 같아서 이 코드를 관리할 책임을 이동시키는 것이다. 즉 코드를 적절한 클래스로 옮기는 것이다.
[ 결론 ]
- 의존성, 결합도는 낮아야 한다
- 객체의 자율성, 응집도는 높아야 한다
[ 회고 ]
객체 지향 프로그래밍은 수도 없이 들어봤지만, 막상 코드를 짤 때에는 이론이 생각나지 않는다. 사실 코드를 짤 때 이러한 이론을 생각하면서 하지는 않기 때문에 이론을 접목시키지 못한다는 것에는 문제가 없다. 이거는 코드를 계속 직접 짜보면서 나눠보고 리팩토링하는 과정을 수없이 거쳐서 따로 이론을 생각하지 않고도 자연스럽게 할 수 있는 노력이 필요한 것 같다. 튜터님께서 말씀하신 것처럼 나도 이론보다는 실습이 더 중요하다고 생각하기 때문에, 이론은 이 정도가 있다는 것을 알고 실제 코드를 구성할 때에는 어떻게 하면 더 효율적으로 구성할 수 있을지 끊임없이 고민을 해봐야겠다.
'Coding > C#' 카테고리의 다른 글
[내일배움캠프 77일차 TIL] 입력 값 한글, 영어, 특수문자 체크하고 바이트 다르게 계산하기 (0) | 2024.08.02 |
---|---|
[내일배움캠프 16일차 TIL] 제네릭, out, ref, 문자열 빌더 (0) | 2024.05.07 |
[내일배움캠프 15일차 TIL] 로직 설계, 기능별 파일 구분, 폴더 구조 (0) | 2024.05.03 |
[내일배움캠프 14일차 TIL] 추상 클래스, 인터페이스 (0) | 2024.05.02 |
[내일배움캠프 13일차 TIL] 클래스 메모리 구조, 기본값 세팅, 박싱/언박싱 (0) | 2024.05.01 |