객체 지향 프로그래밍(OOP)

Fox·2023년 12월 21일
0
post-thumbnail

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

정의

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체 로 만들고, 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

대표적으로 C++ , C# , Java , Python , JavaScript , Ruby , Swift 등이 있다.


객체지향의 구성

객체(Object)

  • 실제 세계에서 존재하는 사물이나 개념 등을 프로그래밍에서 표현한 것.
  • 객체는 자신만의 고유한 특성과 행동을 가지며 다른 객체들에게 행동을 요청하거나 정보를 주고받는 등 상호작용을 하면서 존재한다.
  • 객체는 크게 속성(필드, field)과 동작(메서드, method)으로 구성돼 있다.
  • 예) 학생의 속성 : 이름, 학년, 학번
  • 예) 학생의 동작 : 공부하다, 밥 먹다, 놀다

클래스(Class)

  • 객체를 만들어 내기 위한 설계도와 같은 개념이다.
  • 객체들이 공통적으로 갖는 속성들을 모아서 정의 내린 것으로 다른 클래스들과 독립적으로 디자인해야 한다.
  • 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스 화라고 한다.
  • 또한, 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 한다.(즉, 인스턴스란 메모리에 할당된 객체를 의미)

메서드(Method)

  • 메서드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이다.
  • 클래스로부터 생성된 객체를 사용하는 방법으로 객체의 속성을 조작하는 데 사용된다.


객체지향 프로그래밍 특징

캡슐화(Encapsulation)

  • 자바 언어는 캡슐화된 멤버를 노출시킬 것인지 숨길 것인지를 결정하기 위해 접근 제한자(Access Modifier)를 사용한다.
  • 객체의 필드(속성), 메서드를 하나로 묶고, 실제 구현 내용을 외부에 감추는 것을 말한다.
  • 외부 객체는 객체 내부의 구조를 얻지 못하며 객체가 노출해서 제공하는 필드와 메서드만 이용할 수 있다.
  • 필드와 메서드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는 데 있다.

상속(Inheritance)

  • 기존 클래스의 변수와 메서드를 물려받아 새로운 클래스를 구성하는 것.
  • 캡슐화, 추상화, 다형성 등 객체지향프로그래밍을 구성하는 특징 중 하나이다.
  • 부모와 자식으로 생각하면, 자식은 어머니와 아버지의 능력들을 물려받듯이 하위 클래스는 상위 클래스의 모든 멤버를 상속받게 된다.

추상화(Abstraction)

  • 핵심적인 개념, 기능을 간추려 내는 것
  • 작업을 수행할 때 복잡한 것 들을 간단한 것처럼 보이게 만들어 주는 것
  • 불필요한 것 들을 생략하고 객체의 속성 중 가장 중요한 것에만 중점을 두는 것

다형성(Polymorphism)

  • 하나의 객체가 여러 가지 형태를 가질 수 있는 것을 의미한다.
  • 다형성을 활용하면, 부모 클래스가 자식 클래스의 동작 방식을 알 수 없어도 오버라이딩을 통해 자식 클래스에 접근할 수 있다.


객체 지향 설계 원칙(SOLID)

  • 객체 지향적으로 설계하기 위해 SOLID 라 불리는 다섯 가지 원칙이 있다.

1. 단일 책임 원칙 (SRP, Single Responsibility Principle)

  • 하나의 클래스는 단 하나의 책임만 가져야 한다.
  • 단일 책임 원칙을 지키지 않을 경우 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향이 갈 수 있다.

2. 개방-폐쇄 원칙 (OCP, Open/Closed Principle)

  • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
  • 기능을 변경하거나 확장할 수 있으면서 기능을 사용하는 코드는 수정하지 않는다.

3. 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)

  • 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  • 상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.

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

  • 범용 인터페이스 하나보다 클라이언트를 위한 여러 개의 인터페이스로 구성하는 것이 좋다.
  • 인터페이스는 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
  • 클라이언트가 필요로 하는 인터페이스로 분리함으로써 각 클라이언트가 사용하지 않는 인터페이스에 변경이 있어도 영향을 받지 않도록 만들어야 한다.

5. 의존관계 역전 원칙 (DIP), Dependency Inversion Principle)

  • 추상화에 의존해야지 구체화에 의존하면 안 된다.
  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되고 저수준 모듈은 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.


장단점

장점

  • 코드 재사용이 용이하다
    클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있다.

  • 유지보수가 쉽다
    절차 지향 프로그래밍에서는 코드를 수정해야 할 때 일일이 찾아 수정해야 하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 된다.

  • 대형 프로젝트에 적합
    클래스단위로 모듈화 시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 개발이 필요할 시 업무 분담하기 쉽다.

단점

  • 처리속도가 상대적으로 느리다.
  • 객체가 많으면 용량이 커질 수 있다.
  • 설계시 많은 시간과 노력이 필요하다.












참고 : https://velog.io/@gparkkii/oop00
참고 : https://jongminfire.dev/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80

profile
주니어개발자 Fox 입니다 🦊

0개의 댓글