2022-09-23,   권재우

이번 포스팅은 객체 지향 프로그래밍 OOP에 대해 포스팅 하겠습니다.

OOP란?

OOP는 Object_Oriented Programming의 약자로 객체지향 프로그래밍. 즉, 객체의 관점에서 프로그래밍을 한다는 뜻입니다.

이미지출처 - https://blog.martinwork.co.kr/theory/2017/12/10/oop-solid-principle.html

OOP는 객체를 기준으로 코드를 나누어 구현합니다. 자바와 파이썬의 경우 그 구성 단위가 클래스(Class)입니다.

파이썬과 자바는 클래스(Class)라는 자료형을 이용해서 객체를 생성하고, 인스턴스를 활용해서 다른 이름의 객체로 저장하는 시스템을 가지고 있습니다. 클래스를 얼마나 잘 다루는지를 보고 코딩 실력을 평가하는 기준이 되기도 합니다.

  • OOP의 기본 전제는 기능(클래스, 함수, 변수)을 재사용이 가능하도록 설계 및 프로그래밍 했는지 입니다.

OOP의 장,단점

  • 장점
    • 코드 재사용이 용이 : 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 사용자가 확장해서 사용 가능
    • 유지보수가 쉬움 : 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 있기 때문에 해당 부분만 수정 가능
    • 대형 프로젝트에 활용하기 편함 : 클래스단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담하기 쉬움
  • 단점
    • 처리속도가 상대적으로 느릴 수 있음
    • 객체가 많으면 불필요한 용량이 커질 수 있음
    • 설계시 많은 시간과 노력이 필요

OOP의 4가지 특성

객체지향개발의 특성에는 크게 4가지(추상화, 캡슐화, 상속성, 다형성)가 존재합니다.

1) 상속성 (Inheritance)

상속이란 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념입니다.
상속은 가장 중요한 개념이며 객체지향의 꽃입니다.

img4

이미지출처 - https://codepen.io/sujeong91/full/ZVgMBw

OOP에서 상위클래스로부터 상속을 받아 하위클래스를 정의할 수 있는데 이를 부모 클래스, 자식 클래스라고 표현합니다.

  • 상속이 필요한 이유

상속이 필요한 이유는 코드의 중복을 없애기 위함입니다. 코드의 중복이 많아지면 개발 단계에서도 피곤하지만, 유지 보수에서도 많은 비용이 들게 됩니다. 그래서 개발을 할때 코드의 중복은 반드시 피해야합니다.

2) 추상화 (Abstraction)

공통적인 요소나 특징을 추출하는 과정이 추상화라고 합니다.

img2

object의 기능에 따라 공통적인 요소를 추출해서 추상클래스(상위클래스)를 만들고 하위클래스들은 상속받아 생성합니다.

3) 캡슐화 (Encapsulation)

하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것을 의미합니다.

img3

그리고 캡슐화를 하는 중요한 목적은 바로 정보은닉입니다. 유저 정보를 가지고 있는 User라는 객체에서 유저의 정보가 public으로 선언되어 있다면, 누구든 접근해서 유저 정보를 변경할 수 있습니다. 그렇기 때문에 private로 해서 데이터를 보호해서 접근을 제한해야 합니다.

이렇게 보호된 변수는 getter나 setter 등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것이 캡슐화의 중요한 목적입니다.(setter도 아무생각 없이 만들면 안된다.)

4) 다형성 (Polymorphism)

다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해줍니다. 즉, 다형성은 형태가 같은데 다른 기능을 하는 것을 의미합니다(같은 동작이지만 다른 결과물이 나올때 다형이라고 생각하면 됨)

img5

상속과 유사하다고 느껴질 수 있지만, 상속은 상위 클래스의 기능(함수, 변수)을 그대로 재사용합니다. 하지만 위 그림처럼 다형성은 상위 클래스의 기능을 변경하여 사용하는 것입니다.

출처

  • https://zeuskwon-ds.tistory.com/50?category=950126
  • https://velog.io/@hkoo9329/OOPObject-Oriented-Programming-%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

업데이트: