Basic Knowledge/Paradigm

프로그래밍 패러다임 (3) 객체 지향 프로그래밍

roofTopCaat 2023. 9. 17. 21:50

#  인물 개개인의 상세한 인생사, 대상의 역사와 프로그래밍 분야 외적인 업적은 잘라낸다.

 

1960년부터 지금까지의 프로그래밍은 객체지향적 프로그래밍이 대두된다.

 

객체지향 프로그래밍 (Object-Oriented Programming, OOP)은 프로그램을 객체라는 독립적 단위로 나누고, 이 객체들 간의 상호작용을 중심으로 소프트웨어를 설계, 개발하는 방식이다.

 

객체는 데이터와 그 데이터를 조작하는 메서드(method)로 구성되며, 클래스(class)라는 템플릿을 기반으로 생성된다

 

코딩 과정

 

 ● 문제 인식과 정의 -> 객체 식별 및 분류 -> 객체 속성과 메서드 정의 -> 클래스 다이어그램 작성 -> 객체 생성과 초기 데이터 입력 -> 객체간 상호작용 설계 -> 메서드 구현 -> 테스트 및 디버깅 -> 최적화 -> 유지보수

 

객체지향 설계 5원칙 Solid

 

1) 단일 책임의 원칙

 

하나의 모듈이 변경되는 이유는 한가지여야 한다. 해당 모듈이 여러 대상에 책임을 가져서는 안되고, 오직 하나의 대상에만 책임을 져야 한다.

만약 여러 대상과 관련되어 있다면 변경 이유와 요구도 빈번해질 것이다.

반면 하나의 책임만을 갖고 있다면 변경 이유와 시점이 명확해진다

 

2) 개방 폐쇄의 원칙

 

확장에는 열려있고 수정에는 닫혀있어야 한다는 원칙이다. 

요구하는 사항이 변경될 때는 새로운 동작을 추가하여 프로그램의 기능을 확장한다.

기존의 코드는 수정하지 않고 프로그램의 동작을 변경, 추가하게끔 설계한다.

개방 폐쇄의 원칙을 지키기 위해선 추상화를 해야 한다

추상화란 핵심적인 부분은 남기고 불필요한 부분은 걸러냄으로써 최소한의 무게로 최대한의 효율을 뽑아내는 것을 말한다.

 

3) 인터페이스 분리의 원칙

 

목적과 관심이 서로 다른 클라이언트가 있다면 인터페이스를 적절히 분리하여 용도에 적합한 인터페이스 만을 제공하게끔 설계한다. 클라이언트는 자신의 관심에 맞는 public 인터페이스만 접근해 불필요한 간섭을 줄일 수 있다.

파일 읽기/쓰기/저장/공유 기능을 갖는 클래스가 있는데 누군가는 공유만을 원한다면 별도로 떼서

보여줄 수 있게끔 해주는 것이다.

 

4) 리스코프 치환 원칙

 

하위 타입(자식)은 상위 타입(부모)를 언제든지 대체할 수 있어야 한다. 해당 객체의 사용자는 타입이 변경되어도, 차이점을 인식하지 못한 채 상위 타입의 public 인터페이스를 통해 서브 클래스를 사용할 수 있어야 한다.

 

5) 의존 역전의 원칙

 

고수준의 모듈은 저수준 모듈의 구현에 의존해서는 안되고 저수준의 모듈이 의존해야 한다.

고수준 모듈 : 입출력으로부터 먼(비즈니스 관련) 추상화 모듈

저수준 모듈 : 입력과 출력으로부터 가까운(http,DB,캐시 관련) 구현 모듈

비즈니스와 관련된 부분이 세부 사항에 끌려다니지 않게끔 만드는 설계 원칙이다.

 

 

객체지향의 특징

 

 **객체(Object) 중심:** 객체지향 프로그래밍은 모든 것을 객체로 모델링한다. 객체는 데이터와 데이터를 조작하는 메서드(함수)를 포함하며, 이를 통해 데이터와 관련된 동작을 캡슐화한다.

 

 **캡슐화(Encapsulation):** 필드와 메서드를 함께 묶어 캡슐화한다. private을 통한 은닉화를 통해 객체 내부의 상세 구현을 숨기고 외부에서는 인터페이스를 통해 객체와 상호작용할 수 있도록 한다.

 

 **상속(Inheritance):** 자식이 부모 클래스의 특징 기능을 물려받는다. 중복 코드를 줄이고 부모클래스만 수정해도 자식클래스 모두가 수정되는 효과가 있다. 클래스에 메소드 추가가 어려운 경우에 사용한다.

 

 **다형성(Polymorphism):** 다형성은 동일한 메서드나 연산자를 다른 객체에 대해 다르게 해석할 수 있게 한다. 이는 코드의 유연성을 높이고 다양한 객체를 동일한 인터페이스로 다룰 수 있도록 한다.

 

다형성 - 오버라이딩 : 부모클래스의 메서드를 자식클래스에서 재정의해 사용

부모클래스의 강아지의 견종과 나이는 리트리버 7살이다

extends로 상속받고 자식클래스에서 재정의 강아지의 성별은 수컷이다

 

다형성 - 오버로딩 : 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형,개수를 다르게 하는 기술

이름이 A인 메서드 / int 매개변수가 2개인 A 메서드 / String 매개변수가 1개인 A 메서드

 

객체지향의 장점

 

 **모듈화(Modularity):** 객체지향 프로그래밍은 코드를 객체로 나누어 모듈화할 수 있으므로, 개발과 유지보수가 용이하다. 각 객체는 독립적으로 개발하고 테스트할 수 있다.

 

 **재사용성(Reusability):** 상속과 다형성을 통해 코드의 재사용성이 증가한다. 이미 개발된 클래스나 모듈을 새로운 프로젝트에서 활용할 수 있다.

 

 **유지보수성(Maintainability):** 캡슐화로 인해 객체 내부의 변경이 외부 코드에 미치는 영향이 제한된다. 따라서 유지보수 시에는 해당 객체만 수정하면 되므로 코드의 안정성이 증가한다.

 

 **확장성(Scalability):** 객체지향 설계는 계층적이며 확장 가능한 구조를 쉽게 구성할 수 있. 새로운 클래스를 추가하거나 상속을 통해 시스템을 확장하기 용이하다.

 

객체지향의 단점

 

 **복잡성(Complexity):** 객체지향 프로그래밍은 대규모 프로젝트에서는 복잡성을 증가시킬 수 있다. 객체 간의 관계와 상속 구조를 올바르게 설계하기 위해서는 신중한 계획과 디자인이 필요하다.

 

 **성능(Performance):** 일부 경우에는 객체 지향 코드가 절차 지향 코드보다 실행 속도가 느릴 수 있다. 이러한 오버헤드는 최적화를 통해 극복할 수 있으나 고려해야 한다.

 

 **학습 곡선(Learning Curve):** 객체지향 프로그래밍은 초기에 학습 곡선이 높을 수 있다. 객체, 클래스, 상속, 다형성 등의 개념을 익히는데 시간이 걸릴 수 있다.

 

1) 1960년대 중반의 Simula

 

Nils A. JensenOle-Johan Dahl이 개발한 시뮬라 언어는 클래스와 객체 개념을 도입하여 객체지향 프로그래밍의 기반을 닦고, 시뮬레이션과 모의실험 분야에서 사용되었다.

 

오브젝트, 클래스, 메서드, 상속, 상/하위 클래스 등의 개념도 함께 등장한다. 이후에 등장하는 객체지향 언어에 큰 영향을 미쳤다

 

2) 1970년대 초의 Smalltalk

 

1970년대 초에 Xerox PARC 연구소에서 Alan Kay 의해 개발된 Smalltalk 또한 객체지향 프로그래밍(OOP)의 개념을 처음으로 정립하고 이를 구현한 언어 중 하나이다.

 

개발자에게 코드, 디버깅, 테스팅을 하나로 수행할 수 있게끔 하는 환경을 제공했다.

 

이후 등장하는 Java가 smalltalk의 큰 영향을 받아 만들어졌다

 

3) 1985년의 C++

 

1970년대 중반에 이르러 컴퓨터의 속도가 빨라지며 소프트웨어 또한 무거워지게 되었고, C언어로는 규모가 큰 프로그램을 개발할 때 코드를 관리하는 것이 어려워졌다. 이러한 점을 개선하기 위해 C언어와의 호환성을 유지하며 객체지향 특성과 편의 기능이 추가된 C++언어가 덴마크의 컴퓨터과학자 비야네 스트로스트룹에 의해 개발되었다.

 

객체지향 프로그래밍의 방법론을 구축하고 python, Java, JavaScript, PHP등이 만들어지는 데 지대한 영향을 끼쳤다.

출처 : hipertextual.com

4) 1990년대 중반 Java의 등장과 객체지향의 현재

 

오라클에서 배포중인 Java는 지금에 이르러서도 다양한 분야에서 널리 쓰이는 객체지향 언어이다. 자바로 작성된 프로그램은 어떠한 운영체제에서도 실행될 수 있으며 강력한 표준 라이브러리를 가지고 있다.

 

현재 객체지향은 python, ruby, java, kotlin 등의 다양한 언어를 중심으로 웹 애플리케이션, 게임 엔진, 의료 정보 시스템 등의 소프트웨어 개발 분야에서 널리 사용되는 패러다임이다.