객체지향

김성윤·2023년 4월 5일
0

객체지향이란?

객체 지향은 주어진 문제 영역을 실세계 안에 존재하는 객체의 집합으로 보고 객체들 사이의 상호작용을 나타낸 것이다.
이는 실세계를 바라보는 관점과 동일하게 컴퓨터 세계로 문제영역을 옮기는 가상화 과정으로 이해되며, 이를 통한 객체의 재사용성을 높이고 참여자의 이해도를 높이는 장점이 있다.

모델링이란 대상 시스템의 성능 또는 동작과정 분석을 위하여 이를 간단히 도식화하거나 그 시스템의 특징을 수학적으로 표현하는 과정. 우리는 실세계를 이해하기 위해 표현해야 하고 모델링은 실세계의 표현을 가능하게 한다.

객체와 클래스

클래스는 객체를 만들기 위한 설계도 또는 틀이다.
객체란 클래스에 선언된 모양 그대로 생성된 것을 말하며 '클래스의 인스턴스'라고 부른다.
인스턴스란 클래스를 통해서 구현해야할 대상(객체)이 실제로 구현된 구체적인 실체를 말한다.
객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.

객체지향의 4가지 특징

캡슐화

정보 은닉을 통한 추상화, 독립성 향상을 얻을 수 있는 방법이며, 속성과 오퍼레이션을 함께 묶어 보호하는 방법이다. 객체지향 언어들은 캡슐화를 지원하는 기능을 포함한다.
데이터를 절대로 외부에서 직접 접근을 하면 안되고 오로지 함수를 통해서만 접근해야하는데 이를 가능하게 해주는 것이 바로 캡슐화이다

상속

각 클래스는 고유의 속성과 오퍼레이션을 가지고 있으며, 여러 클래스에 공통된 속성과 오퍼레이션이 존재할 수 있다.
클래스 사이에 유사성이 존재할 때 이 유사성을 모아 하나의 새로운 클래스를 정의 내리는 것을 일반화라고 한다.
일반화를 통해 나타나는 중요한 특성은 상위 클래스에 하위 클래스의 공통적인 속성과 오퍼레이션을 표시하고 상위 클래스의 정보가 하위 클래스에 상속 된다는 것이다.
일반화를 통해 나타나는 상속은 클래스의 정의를 단순화시키고, 기존에 정의되어 있는 클래스를 이용하여 새로운 클래스를 쉽게 정의할 수 있도록 해준다.

추상화

추상화는 클래스를 정의할 때 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 개략화 하는 것을 말한다.
객체의 공통적인 속성과 기능을 추출하여 정의하는것으로, 클래스를 정의하는 것, 위에 상속에서 말하는 '일반화'와 유사한 개념이라고 할 수 있겠다.

다형성

다형성은 동일한 이름의 오퍼레이션이라도 클래스에 따라 다르게 동작하는 것을 말하며, 하나의 함수 이름이나 연산자가 여러 목적으로 사용될 수 있는 것을 의미한다.
객체 지향에서의 다형성은 주로 상속 관계에서 사용되어 상위 클래스에 정의된 하나의 오퍼레이션에 대해 각 하위 클래스가 가지고 있는 고유한 방법으로 응답할 수 있도록 유연성을 제공한다.
오버로딩과 오버라이딩이 있음

객체 지향 설계 5원칙 (SOLID)

단일 책임의 원칙(SRP: Single Responsibility Principle)

클래스는 단 하나의 책임을 가져야한다.
클래스가 여러 책임을 갖게 되면 그 클래스는 각 책임마다 변경되는 이유가 발생하기 때문에 클래스가 한 개의 이유로만 변경되려면 클래스는 한 개의 책임만을 가져야한다

개방 폐쇄의 원칙(OCP: Open Closed Principle)

하나의 클래스는 수정에는 폐쇄되어있고, 확장에는 개방되어 있어야 한다.
이는 객체 지향의 대표적인 특징인 다형성과 추상화에 관련된 내용이며, 기능 개선 시 직접적인 수정보다는 상속을 통한 개선이 이루어지는 것이 좋다. 또한, 로직 변경 가능여부를 고려한 추상화 클래스 구현이 되어야한다.

리스코프 치환의 원칙(LSP: Liskov Subsitution Principle)

상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.

인터페이스 분리의 원칙(ISP: Interface Segregation Principle)

객체가 반드시 필요한 기능만 가지도록 제한하자는 원칙이다. 객체는 자신이 호출하지 않는 메소드에 의존하지 않아야 한다는 원칙이다.

의존성 역전의 원칙(DIP : Dependency Inversion Principle)

인터페이스를 통한 추상화를 통해 최대한 느슨하게 설계하자는 원칙. 저수준의 모듈보다는 고수준의 모듈에 의존해야한다는 원칙이다.

profile
Nest.js 백엔드 개발자

0개의 댓글