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

객체 지향 프로그래밍은 컴퓨터 프로그래밍 페러다임 중 하나로 프로그래밍에서 필요한 데이터를 추상회시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다

 

C언어는 절차 지향 프로그래밍이라 하는데 절차 지향 프로그래밍은 프로세스가 함수 단위로 순서대로 진행되는것을 말합니다

반면 OOP는 객체들의 유기적인관계를 통해서 프로세스가 진행됩니다

즉, 애플리케이션을 구성하는 요소를 객체로 ㅂ라보고 객체들을 유기적으로 연결하여 프로그래밍 하는 것을 말합니다

 

객체 지향 프로그래밍( OOP )은 프로그램 설계 철합입니다

객체 지향 프로그래밍( OOP )의 모든것은 객체로 그룹화 합니다

객체 지향 프로그래밍( OOP )의 4가지 주요개념을 통해 재사용성을 얻을수있습니다

 

 

객체지향 프로그래밍의 장단점

 

장점

  • 재사용성 ( 상속을 통해 프로그래밍시 코드의 재사용을 높일수 있음 )
  • 유지 보수가 우수함 ( 프로그램 수정 시 추가 , 수정을 하더라도 캡슐화를 통해 주변 영향이 적기 때문에 유지보수가 쉬움 )
  • 생산성 향상 ( 잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향싱시킬 수 있음 )
  • 자연적인 모델링 ( 일상생활의 모습의 구조가 객체에 자연스럽게 녹아들어가 있기 때문에 생각하고 있는 것을 자연스럽게 구현 가능 )

단점

  • 설계시 많은 시간과 노력이 필요 ( 객체가 처리하려는 것에 대한 정확한 이해( 모든 객체의 역활과 기능을 이해해야함 )가 필요하기에 설계단계에서 많은 시간이 소모 됨)
  • 실행속도가 느림 ( 객체지향언어는 속소든 절차지향언어보다 속도가 느립니다 )
  • 코딩 난이도 상승 ( 객체 지향언어는 데체로 난이도가 높습니다 특히 다중 상속이 지원되는 c++에서는 악명이 높다고 합니다 )

 

객체 지향 프로그래밍이란 절차 지향 프로그래밍과는 다르게 데이터와 기능을 한곳에 묶어서 처린다고 합니다

속성과 메서드가 하느이 객체라는 개념에 포함되며 이는 자바스크립트 내장 타입인 object (이하, object literal) 와는 다르게 클래스         ( Class ) 라는 이름으로 부른다고합니다  

객체지향언어가 절차지향언어의 단점을 보완하고 등장했다고 해서 무조건적으로 우수하다고 할 수 없습니다

구조와 특징이 명확히 다를뿐 어떻게 활용하느냐에 따라 다를것입니다

 

객체 지향 프로그래밍( OOP ) 의 주요개념을 크게 4가지로 나눠볼수있습니다

  • 캡슐화 ( Encapsulation )
  • 추상화 ( Abstraction )
  • 상속  ( inheritance )
  • 다형성 ( Polymorphism

 

캡슐화 Encapsulation

한줄 정리 : 캡슐화는 코드가 복잡하지 않게 만들고 재사용성을 높임

데이터와 기능을 하나의 단위로 묶는것

은닉 : 구현은 숨기고 동작은 노출시킴

디테일한 구현이나 데이터는 숨기고 객체 외부에서 필요한 동작 ( 메서드 ) 만 노출시킴

느슨한 결합에 사용상 유리 언제든 구현을 수정할수있음 

은닉화의 특징을 살려서 코드를 작성하면 객체 내 메서드의 구현만 수정하고 노출된 메소드를 사용하는 코드 흐름은 바뀌지않도록 만들수있음 

반면 절차적코드의 경우 데이터의 형태가 바뀔떄에 콛의 흐름에 큰 영향을 미치게되어 유지보수가 어려움 

그래서 더욱 엄격한 클래스는 속성의 직접적인 접근을 막고 설정하는 함수(setter) 불러오는 함수(getter) 철저하게 나누기도함 

 

추상화 Abstraction

한줄 정리 : 코드가 복잡하지않게 만들고 단순화된 사용으로 변화에 대한 영향을 최소화시킴

추상화는 내부구현은 아주 복잡하지만 실제로 노출되는부분은 단순하게 만든다는 개념

만약 전화라는 객체가 있다면 그 안에는 스피커와 마이크가 존재하고, 서킷 보드등이 존재하는 등 내부 구현이 되어있습니다

그러나 실제로 우리가 사용할때에는 이러한 존재에 대해서는 생각하지않고 단순히 수화기를 들고 버튼을 눌러서 해결하는것으로 인터페이스를 단순화할수있습니다

이러한 추상화를 통해 인터페이스가 단순해집니다 

너무 많은 기능들이 노출되지 않은 덕분에 예기치못한 사용상의 변화가 일어나지않도록 만들수있습니다.

추상화는 캘슐화와 비교해서 종종 햇갈려하는 개념중 하나입니다

캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면 추상화는 클래스를 사용하는 사람이 필요하지않은 메서드등을 노출시키지않고 단순한 이름으로 정의하는것에 포커가 맞춰져있습니다

클래스를 정의시 메서드와 속성만 정의한것을 인터페이스라고 부르고 이것이 추상화의 본질입니다

 

상속 inheritance

한줄 요약 : 불필요한 코드를 줄여 재사용을 높임

상속은 부모 클래스의 특징을 자식 클래스가 물려받는 것입니다

부모/자식으로 이야기하기도 하지만 보다 그 튼징을 자세하게 설명하는 용언ㄴ 기본클래스의 특징을 파생클래스가 상속받는다로 표현하는것이 적합하다 

사람이라는 클래스가 있다고 가정해보면 사람은 기본적으로 이름과 성별 나이와 같은 속성 그리고 먹다 자다등과 같은 메소드가  있다고 볼수있습니다

추가적으로 학생이라는 클래스를 작성하다고 생각해봅시다

그런데 이떄와서 구현했던 사람 클래스의 속성메서드를 다시 구현한다면 비효율적일것입니다

학생의 본질은 결국 사람이므로 상속을 이용하여 하생클래스는 사람클래스를 상속받을수있습니다

학생을 추가적으로 학습내용 공부하다 같은 속성메서드를 추가합니다

 

다형성 Polymorphism

한줄 요약 : 다형성으로 인해 동일한 메서드에 대해 조건문 대신 객체의 특성에 맞게 달리 작성하는것이 가능합니다

형성의 단어 Polymorphism 이라는 단어의 poly 는 “많은” 그리고 morph는 “형태” 라는 뜻을 가지고있습니다

즉 다양한 형태를 가질수있다라는 말이됩니다

말하다라는 동작의 본질은 입으로 소리를 내다 를 의미합니다

그러나 각기 다른동물들이말할떄제각각의 소리를 내는것처럼 객체 역시 똑같은 메서드라 하더라도 다른방식으로 구현할수있습니다

 

최종 정리

  • 객체 지향 프로그래밍( OOP )
    • 객체들이 서로 유기적으로 동작하는 프로그래밍 이론
    • 코드의 재사용성과 중복제거가 가장 큰 목적
  • 캡슐화
    • 외부에 노출할 필요가없는 정보들은 은닉
  • 추상화
    • 목적과 관련이 없는 부분을 제외해서 피요한 부분을 포착하는 기법
    • 객체의 공통된 속성들중 필요한 부분을 포착해서 클랫로 정의하는 설계기법
  • 상속
    • 상속 관계에있는 두 클래스에 대해 부모 클래스가 자손 클레스에게 속성을 물려주는것
    • 코드의 재사용이 목적
  • 다형성 
    • 같은 형태지만 다른기능을 하는것
    • 오버라이딩은 이와 관련된 기능

+ Recent posts