객체지향이란?
- 소프트웨어의 핵심을 기능이 아닌 객체에 맞추고 각각의 역할을 정의하는 것에 초점을 맞춘다.
- 책임과 권한을 가진 객체들이 서로 협력해서 필요한 기능을 수행하도록 한다.
- 크고 복잡한 시스템을 효과적으로 분해 및 구성한다.
- 이해가 쉽고 효율적으로 다룰 수 있게 해주는 가장 보편적인 프로그래밍 패러다임이다.
객체지향의 특징
- 캡슐화 (Encapsulation)
개념적, 물리적으로 객체 내부의 세부 정보를 감추는 것이다.
캡슐화를 사용하는 가장 큰 이유는 정보은닉을 통한 객체 사이의 결합도 감소를 추구하고
이로 인해 코드의 안정성과 보안성을 높이는데 있다. - 상속 (Inheritance)
부모 클래스에서 정의한 속성과 메서드를 자식 클래스에서 그대로 물려받아 사용하는 것을 말한다.
이는 코드의 재사용성을 높이고, 유지보수를 용이하게 하는데 도움이 된다. - 추상화 (Abstraction)
객체에서 불필요한 부분을 생략하고 복잡성을 감소시키는 것이다. - 다형성 (Polymorphism)
동일한 메서드를 각기 다른 객체(클래스)에서 다르게 구현하여 다양한 결과를 얻을 수 있도록 하는 것이다. - 의존성 (Dependancy)
특정 객체(모듈 또는 클래스 포함)가 다른 객체를 의존하는 정도를 말한다.
다수의 객체가 서로 연관되어 있을 때 하나가 변경되면 나머지 객체들도 변경될 수 있다.
즉, 서로 의존 관계에 있는 다수의 객체가 있을 때 특정 객체가 수정되면 오류를 피하기 위해 나머지 객체들도 수정해줘야할 가능성이 높아진다. - 결합도 (Coupling)
의존성과 비슷한 개념이다.
객체 사이의 의존성이 높으면 결합도도 높아진다.
객체 사이의 결합도가 높을 수록 수정하기가 어려워 진다.
따라서 설계 단계에서 부터 코드의 유지보수를 용이하게 하기 위해 객체들의 결합도를 낮출 필요가 있다. - 응집도 (Cohension)
하나의 객체에서 밀접하게 연관된 작업들만 처리하고 연관성이 없는 작업은 다른 객체에 위임하는 것을 응집도가 높다고 한다.
결합도가 낮고 응집도가 높으면 효율적인 작업이 가능하다.
객체지향 설계 5원칙 (SOLID)
- 단일 책임의 원칙 (Single Responsibility Principle, SRP)
하나의 클래스는 하나의 책임만 가져야 한다는 것을 의미한다.
즉 특정 클래스가 여러 가지 역할을 할 수록 코드의 복잡도가 높아져 유지보수가 어렵게 된다. - 개방 - 폐쇄 원칙 (Open - Closed Principle, OCP)
확장에는 열려있어야 하고, 변경에는 닫혀 있어야 한다는 것을 의미한다.
기존의 코드를 수정하지 않고 새로운 기능을 추가할 수 있어야한다. - 리스코프 치환 원칙 (Liskov Substitution Principle, LSP)
자식 클래스는 언제나 부모 클래스를 대체할 수 있어야 한다.
따라서 자식 클래스는 부모 클래스의 모든 특성을 지켜야하며,
부모 클래스의 기능을 대체하거나 확장할 수 있어야 한다. - 인터페이스 분리 원칙 (Interface Segregation Principle, ISP)
클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다는 것을 의미한다.
따라서 인터페이스는 작고 응집도가 높게 만들어져야 하며, 클라이언트가 필요한 메서드만 사용할 수 있도록 분리되어야 한다. - 의존성 역전 원칙 (Dependency Inversion Principle, DIP)
상위 수준의 모듈은 하위 수준 모듈에 의존해서는 안된다는 것이다.
추상화와 인터페이스를 이용해 의존성을 역전시켜야 한다는 것을 말한다.
구체적인 클래스에 의존하지 않고 추상화된 인터페이스에 의존해야한다.
객체지향 프로그래밍(OOP)의 특징과 SOLID는 프로그램의 유지보수와 확장성, 재사용성 향상에 초점이 맞춰져 있다.
결국은 개발에 들어가는 리소스와 코스트를 줄이기 위한 것이다.
물론 모든 프로그래밍 설계 패러다임들이 그렇겠지만 아직 다른 것은 찍먹도 못해봤기에.....
어쨌든 어려운 객체지향의 기본 개념을 어느 정도 알았으니 설계 패턴에 대한 학습과 실제 적용을 병행해야겠다.
계산서는 반드시 청구된다!!!!
'Development > TIL' 카테고리의 다른 글
Access와 Refresh Token (0) | 2023.05.07 |
---|---|
git으로 commit하고 push하자 (0) | 2023.05.06 |
트랜잭션의 동시성과 격리수준 (0) | 2023.05.02 |
Transaction과 ACID (1) | 2023.04.29 |
Thunder Client (0) | 2023.04.28 |