객체지향 프로그래밍이란 무엇일까?

김효진·2022년 4월 18일
0

객체지향 프로그래밍이란 뭘까?

객체지향 프로그래밍이란 프로그램을 설계하는 방법 중 하나이다.
여기서 나오는 객체란 하나의 사물 또는 생명체 각각의 특징과 기능을 가지고 있는 것을 말합니다.
따라서 객체지향 프로그래밍이란, 프로그램을 상태와 행위로 이루어진 객체라는 기본단위로 나누고, 이 객체들간의 상호작용을 통해서 프로그램을 설계하고 개발하는 것입니다.

객체지향은 4가지의 특징을 가지고 있다.
(캡슐화, 추상화, 상속성, 다형성)

캡슐화

: 연관된 속성을 가진 객체를 하나로 묶을 수 있고 아니면 분리할 수 있게 즉 분류할 수 있게 설계할 수 있다. 그리고 더 나아가 접근 제한자를 통해 내가 보여줘야되는 것과 보여주면 안되는 것도 분류하여 프로그래밍을 할 수 있다.

추상화

여러 객체들의 공통적인 특징(속성과 기능)을 도출해 내는 것.
예를 들면, 강아지와 닭은 동물이고 소리를 내고 다리를 가지고 있습니다. 하지만 소리를 내는 것이 다르고 다리의 개수가 다르죠. 하지만 가지고 있는 속성은 같기 때문에 동물이라는 것으로 분류할 수 있고 이것을 추상 클래스로 만들어서 그 추상 클래스를 사용해서 이 동물들을 구현할 수 있습니다.

상속성

이미 정의된 상위 클래스(부모 클래스)의 모든 속성과 연산을 하위 클래스가 물려받는 것.
예를 들어, 비행기라는 부모 클래스가 있다면 비행기는 사람들을 태울 수 있고 날아다닐 수 있습니다. 이 때, 전투기를 만들고 싶다면! 전투기는 사람도 태우고 날아다녀야 하고 공격까지도 할 수 있어야 합니다. 그럴 때 비행기라는 부모클래스를 상속받아서 공격하는 부분의 기능만 추가해주면 됩니다. 이것이 상속입니다.

다형성

하나의 변수 또는 함수가 상황에 따라 다른 의미로 응답하는 것.
예를 들어, 닭과 강아지는 소리를 내지만 다른 소리를 냅니다. 이 때 부모클래스의 기능에 소리라는 것이 있다면 이것을 가져다가 닭과 강아지의 소리를 만들어서 상황에 맞게 소리라는 기능을 활용할 수 있습니다.


객체지향 언어의 장단점은 무엇이 있을까요 ?

장점

1) 재사용의 용이
: 상속을 통해 프로그래밍시, 코드의 재사용률을 높일 수 있다.

2) 생산성 향상
: 잘 설계된 클래스를 통해 독립적인 객체를 활용함으로써, 개발의 생산성을 향상시킬 수 있다.

3) 자연적인 모델링
: 일상생활에서 쓰는 개념을 그대로 객체라는 구조로 표현하여 개발함으로써, 생각한 것을 그대로 구현할 수 있다.

4) 유지보수의 용이성
: 프로그램 수정, 추가시 캡슐화를 통해 주변 코드에 영향이 적기 때문에 유지보수가 용이하다.

단점

1) 실행속도가 느림
: 절차지향언어(C언어 등)은 컴퓨터의 처리구조와 비슷해 실행속도가 빠른 반면, 객체지향언어(C++, JAVA 등)은 상대적으로 실행속도가 느립니다.

2) 프로그램 용량이 크다
: 객체단위로 프로그램을 많이 만들다보면, 불필요한 정보들이 같이 삽입될 수 있고, 이는 프로그램의 용량 증가로 이어질 수 있다.

3) 설계에 많은시간 소요
: 클래스별로, 객체별로 설계하고, 상속 등의 구조 또한 설계하여야하기 때문에, 절차지향언어에 비해 설계에 드는 시간이 많다.


객체지향의 5대 원리는 무엇일까? (feat. SOLID)

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

: 작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집중되어 있어야 한다는 원칙입니다.

예를 들어, 소리를 내는 기능과 날 수 있다는 기능이 있는 클래스를 만들었다고 가정을 한다면 강아지를 만들고 싶은데 강아지는 소리를 내는 기능만 필요하고 날지는 못하기 때문에 이 클래스를 사용할 수 없다. 즉, 이 기능이 각각 구현이 되어 있다면 재활용성이 높아진다는 것이다.

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

: 변경을 위한 비용은 최소화하고 확장을 위한 비용은 극대화시켜야 한다는 원칙입니다. 즉, 변경이나 추가사항이 발생하더라도, 기존 코드의 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다는 뜻입니다.

3) LSP (리스코브 치환의 원칙: The Liskov Substitution Principle)

: 서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다는 원칙으로 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 합니다.

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

: 클라이언트는 자신이 사용하지 않는 메소드의 의존 관계를 맺으면 안된다.

단일 책임 원칙에서는 하나의 역할만 하도록 다수의 클래스로 분할하였다면
인터페이스 분리 원칙은 각 역할에 맞게 인터페이스로 분리하는 것입니다.

결론적으로는 단일 책임 원칙과 인터페이스 분할 원칙은 같은 문제에 대한 다른 두 가지 다른 해결책이라고 볼 수 있습니다.

하지만 특별한 경우가 아니라면 단일 책임 원칙을 적용하는 것이 더 좋은 해결책이라고 생각합니다.

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

: 고차원 모듈은 저차원 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다. 추상화된 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화된 것에 의존해야 한다.

자동차가 타이어에 의존하면 어떻게 될가? 자동차 타이어는 자주 바뀌게 되는 것 중 하나고 이렇게 자주 바뀌면 자동차는 영향을 받게 되어있다. 즉, 자동차 자신보다 더 자주 변하는 타이어에 의존하면 좋지 않다.

자동차가 구체적인 타이어가 아닌 추상화된 인터페이스 타이어에 의존함으로써 타이어가 변하더라도 자동차엔 영향이 가지 않게하는 것이 좋다.

이처럼 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것이 의존 역전 원칙이다.

profile
어제보단 하나라도 나은 오늘이 되자!!💪

0개의 댓글