Search
Duplicate
🧸

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

객체지향 프로그래밍 언어

객체지향이란 현실 세계의 개체 모델을 바탕으로 프로그램을 구조화하고 개발하는 프로그래밍 기법
왜 객체지향 프로그래밍이 등장했는가
객체지향 프로그래밍 등장 이전에는 순차적 프로그래밍, 절차적 프로그래밍이 주류였음
순차적 프로그래밍은 구조라는 개념이 없기 때문에 goto문을 사용해 흐름을 제어해주어야 했음
이런 goto문이 많아지는 것은 결국 스파게티 코드를 만들게 되는 일임
따라서 코드의 중복을 피하기 위해 코드를 단위화하기 위한 방법으로 등장한 것이 절차적 프로그래밍
절차적 프로그래밍에서 절차란 프로시저 즉 함수를 의미함
절차적 프로그래밍은 반복될 가능성이 있는 모듈을 재사용 가능한 프로시저 단위로 나눈 프로그래밍
goto문이 무분별하게 남발되던 순차적 프로그래밍과 달리 반복되는 부분을 프로시저 단위로 쪼개고, 각각의 프로시저 안에서 중복되는 부분은 for문과 같은 반복문으로 구성하게 됨
절차적 프로그래밍에도 문제는 존재했는데 프로시저라는 추상적인 단위로는 물리적인 요소를 관리하기 힘들었음

객체지향 프로그래밍 등장

특정 개념의 함수와 자료형을 묶어서 관리할 수 있는 객체지향 프로그래밍이 등장
모든 객체는 그 내부에 자료형과 함수가 존재하는데 가능한 물리적, 논리적 요소를 모두 객체로 생성
변수와 메소드를 그룹핑한 객체는 다른 객체로부터 높은 수준의 독립성을 가지게 되는데, 개발자들은 초반에 객체를 설계할 때만 시간을 쓰고 중복코드를 줄일 수 있고, 독립성이 확립되므로 유지보수에 도움이 됨

객체지향 프로그래밍 특징

추상화
객체들의 공통적인 특징(기능, 속성)을 추출해서 정의하는 것
파일을 읽는 함수가 있다면 얘는 csv, xlsx, txt 등 확장자만 달라지지 읽는다는 역할을 하는건 똑같다
실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통적인 특성을 파악한 후, 필요없는 특성을 제거해 하나의 묶음으로 만들어내는 과정
객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있음
캡슐화
관련이 있는 변수와 함수를 하나의 클래스로 묶고 외부에서 쉽게 접근할 수 있도록 은닉하는 것
외부에서 객체를 손상시키는 일을 방지할 수 있도록 객체 내부의 세부적인 동작에 대한 구현을 감추는 것
외부에서 접근할 필요가 없는 것들을 접근 지정자 private으로 두어 접근을 제한하는 것을 예시로 들 수 있음
캡슐화를 사용하면 높은 응집도와 낮은 결합도를 유지할 수 있음, 즉 코드간의 책임 분리가 용이해짐
상속
이미 정의된 상위 클래스의 모든 속성과 연산을 하위 클래스가 물려받는 것
기존 코드를 재활용해서 사용함으로써 코드의 생산성을 높여준다.
하지만 상속 자체는 코드 재사용의 개념으로 보기는 어려운데, 반드시 기능의 확장 관점으로써 포함 관계일때만 사용해야 한다.
상속은 자식 클래스를 외부로부터 은닉하는 캡슐화의 개념을 가지고 있다.
다형성
하나의 변수 또는 함수가 명령을 받았을 때, 상황에 따라 서로 다른 방식으로 동작하는 것
동일한 명령을 각자 연결된 객체에 의존해서 해석하는 것을 뜻함
오버라이딩과 오버로딩이 존재
오버라이딩 : 부모 클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의 하는 것
오버로딩 : 같은 이름의 함수를 여러개 정의한 후 매개변수를 다르게 선언하여 같은 이름을 경우에 따라 다르게 호출하여 사용하는 것

객체지향 프로그래밍 장점

코드 재사용 용이
모듈화된 객체, 그리고 상속을 통해 코드의 재사용을 높일 수 있음
생산성 향상
독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있음. 이미 생성된 클래스를 상속받거나 객체를 재사용, 부분 수정 등 적은 노력으로 높은 효율을 만들어낼 수 있음
자연적인 모델링 기능
현실세계에서 사용하는 개념을 대입하여 생각한 것을 그대로 구현할 수 있음
유지보수 용이
프로그램 수정, 추가시에도 캡슐화 덕분에 주변 코드에 영향이 덜 가기 때문에 유지보수가 용이함

객체지향 프로그래밍 단점

실행속도 느림
전반적으로 객체지향 언어는 컴퓨터의 처리 구조와 비슷한 절차지향 언어보다 상대적으로 실행속도가 느림
프로그램 용량이 커질 수 있음
객체단위 프로그램을 많이 만들다 보면 불필요한 정보가 들어갈 수 있는데, 프로그램의 용량이 증가될 수 있음
설계에 많은 시간 소요
초기에 클래스별, 객체별, 상속 등의 구조 등을 모두 설계해야 하기 때문에 절차지향 언어에 비해 설계 시간이 많이 듦