객체지향 프로그래밍 언어
•
객체지향이란 현실 세계의 개체 모델을 바탕으로 프로그램을 구조화하고 개발하는 프로그래밍 기법
•
왜 객체지향 프로그래밍이 등장했는가
◦
객체지향 프로그래밍 등장 이전에는 순차적 프로그래밍, 절차적 프로그래밍이 주류였음
▪
순차적 프로그래밍은 구조라는 개념이 없기 때문에 goto문을 사용해 흐름을 제어해주어야 했음
•
이런 goto문이 많아지는 것은 결국 스파게티 코드를 만들게 되는 일임
•
따라서 코드의 중복을 피하기 위해 코드를 단위화하기 위한 방법으로 등장한 것이 절차적 프로그래밍
▪
절차적 프로그래밍에서 절차란 프로시저 즉 함수를 의미함
•
절차적 프로그래밍은 반복될 가능성이 있는 모듈을 재사용 가능한 프로시저 단위로 나눈 프로그래밍
•
goto문이 무분별하게 남발되던 순차적 프로그래밍과 달리 반복되는 부분을 프로시저 단위로 쪼개고, 각각의 프로시저 안에서 중복되는 부분은 for문과 같은 반복문으로 구성하게 됨
•
절차적 프로그래밍에도 문제는 존재했는데 프로시저라는 추상적인 단위로는 물리적인 요소를 관리하기 힘들었음
객체지향 프로그래밍 등장
•
특정 개념의 함수와 자료형을 묶어서 관리할 수 있는 객체지향 프로그래밍이 등장
•
모든 객체는 그 내부에 자료형과 함수가 존재하는데 가능한 물리적, 논리적 요소를 모두 객체로 생성
•
변수와 메소드를 그룹핑한 객체는 다른 객체로부터 높은 수준의 독립성을 가지게 되는데, 개발자들은 초반에 객체를 설계할 때만 시간을 쓰고 중복코드를 줄일 수 있고, 독립성이 확립되므로 유지보수에 도움이 됨
객체지향 프로그래밍 특징
•
추상화
◦
객체들의 공통적인 특징(기능, 속성)을 추출해서 정의하는 것
▪
파일을 읽는 함수가 있다면 얘는 csv, xlsx, txt 등 확장자만 달라지지 읽는다는 역할을 하는건 똑같다
◦
실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통적인 특성을 파악한 후, 필요없는 특성을 제거해 하나의 묶음으로 만들어내는 과정
◦
객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있음
•
캡슐화
◦
관련이 있는 변수와 함수를 하나의 클래스로 묶고 외부에서 쉽게 접근할 수 있도록 은닉하는 것
◦
외부에서 객체를 손상시키는 일을 방지할 수 있도록 객체 내부의 세부적인 동작에 대한 구현을 감추는 것
▪
외부에서 접근할 필요가 없는 것들을 접근 지정자 private으로 두어 접근을 제한하는 것을 예시로 들 수 있음
◦
캡슐화를 사용하면 높은 응집도와 낮은 결합도를 유지할 수 있음, 즉 코드간의 책임 분리가 용이해짐
•
상속
◦
이미 정의된 상위 클래스의 모든 속성과 연산을 하위 클래스가 물려받는 것
◦
기존 코드를 재활용해서 사용함으로써 코드의 생산성을 높여준다.
◦
하지만 상속 자체는 코드 재사용의 개념으로 보기는 어려운데, 반드시 기능의 확장 관점으로써 포함 관계일때만 사용해야 한다.
◦
상속은 자식 클래스를 외부로부터 은닉하는 캡슐화의 개념을 가지고 있다.
•
다형성
◦
하나의 변수 또는 함수가 명령을 받았을 때, 상황에 따라 서로 다른 방식으로 동작하는 것
◦
동일한 명령을 각자 연결된 객체에 의존해서 해석하는 것을 뜻함
◦
오버라이딩과 오버로딩이 존재
▪
오버라이딩 : 부모 클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의 하는 것
▪
오버로딩 : 같은 이름의 함수를 여러개 정의한 후 매개변수를 다르게 선언하여 같은 이름을 경우에 따라 다르게 호출하여 사용하는 것
객체지향 프로그래밍 장점
•
코드 재사용 용이
◦
모듈화된 객체, 그리고 상속을 통해 코드의 재사용을 높일 수 있음
•
생산성 향상
◦
독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있음. 이미 생성된 클래스를 상속받거나 객체를 재사용, 부분 수정 등 적은 노력으로 높은 효율을 만들어낼 수 있음
•
자연적인 모델링 기능
◦
현실세계에서 사용하는 개념을 대입하여 생각한 것을 그대로 구현할 수 있음
•
유지보수 용이
◦
프로그램 수정, 추가시에도 캡슐화 덕분에 주변 코드에 영향이 덜 가기 때문에 유지보수가 용이함
객체지향 프로그래밍 단점
•
실행속도 느림
◦
전반적으로 객체지향 언어는 컴퓨터의 처리 구조와 비슷한 절차지향 언어보다 상대적으로 실행속도가 느림
•
프로그램 용량이 커질 수 있음
◦
객체단위 프로그램을 많이 만들다 보면 불필요한 정보가 들어갈 수 있는데, 프로그램의 용량이 증가될 수 있음
•
설계에 많은 시간 소요
◦
초기에 클래스별, 객체별, 상속 등의 구조 등을 모두 설계해야 하기 때문에 절차지향 언어에 비해 설계 시간이 많이 듦