언어의 종류
절차지향 프로그래밍
반복문 작성 후 함수 또는 메소드를 사용해서 해야할 일들을 정의
범위가 더 넓어질경우 반복문, 함수 또는 메서드로만 코드를 간편하게 정의하는데 한계가 있음
프로세스가 함수 단위 순서대로 진행된다.
객체지향 프로그래밍
각각의 대상에게 클래스로 정의한 아이템과 동작들을 할당하여 데이터와 기능을 클래스로 캡슐화
객체지향이란?
프로그래밍을 더 쉽게 할 수 있도록 만들어진 프로그래밍 방식, 패러다임
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
객체지향의 구성
객체지향 프로그래밍(OOP) 에서는 모든게 객체로 구성.
먼저 서로 관계가 있는 속성과 기능들을 묶어 클래스로 정의하고, 클래스를 가지고 우리가 실제 사용할 객체 제작
객체
객체(또는 인스턴스)란 대상을 나타내는 단어
상위 클래스의 속성을 가지고 있으면서 개별적인 특성과 행위(Method) 포함
클래스
객체들이 공통적으로 갖는 속성들을 모아서 정의내린 것
다른 클래스들과 독립적으로 디자인
메서드
클래스로부터 생성된 객체를 사용하는 방법
객체의 속성을 조작하는 데 사용
예시)
클래스 : 붕어빵을 찍어내는 기계
객체 : 붕어빵 틀에서 만들어진 붕어빵들
객체 지향의 특징
캡슐화
객체의 데이터를 외부에서 직접 접근하지 못하게 막고, 함수를 통해서만 조작이 가능하게 하는 작업
높은 응집도와 낮은 결합도를 유지 할 수 있도록 설계해야 요구사항을 변경할 때 유연하게 대처
- 응집도 : 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지
- 결합도 : 어떤 기능을 실행하는 데 다른 클래스나 모듈들에 얼마나 의존적인지
상속
프로그래밍에서의 상속
부모 클래스가 어떠한 속성이나 기능을 가지고 있다면 그 자식의 클래스도 부모의 속성이나 기능을 상속받음
부모 클래스의 입장 : 자신의 속성들이 자식 클래스로 넘어가면서 확장되는 것
자식 클래스 입장 : 부모 클래스의 속성을 물려받는 것
객체지향에서 상속
프로그래밍 언어에서 상속은 <extends>로 표현
상속을 통해 코드의 중복같이 불필요한 코드들을 제거할 수 있기 때문에 코드의 복잡도 감소
다형성
다형성
어떤 하나의 변수명이나 함수명이 상황에 따라 다르게 해석되는 것
서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
형태가 같은데 다른 기능을 하는 것
객체지향에서 다형성
여러 가지 객체 유형이 서로 다른 방식으로 작동하더라도 공통 인터페이스에서 지원하는 동일한 기능을 구현
ex)
다양한 자동차의 외향, 연비, 세부 옵션들은 다를 수 있다 하더라도 엑셀을 밟으면 앞으로 가는 기능은 동일
따라서 한 대의 자동차를 운전하는 방법을 배웠다면 다른 차를 운전할 수도 있음
-> 동일한 드라이버 인터페이스를 가지기 때문이다.
추상화
추상화
목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현
프로그래머의 의도에 맞추어 가장 중요한 것들만 뽑아 복잡한 모델을 보다 단순한 모델로 변환하는 작업
각 개체의 구체적인 개념에 의존하지 말고 추상적 개념에 의존해야 설계를 유연하게 변경 가능
객체지향에서 추상화
인터페이스를 간단하게 만들어주고 어떠한 변화의 영향을 감소
ex)
엔진이 어떻게 돌아가고 연료가 어떻게 사용되고 속력은 어떻게 올리고 타이어는 어떤 원리로 돌아가는지 이해하지 못해도 '운전대' '브레이크' '가속페달' 같이 추상화 되어있는 인스턴스 즉 객체를 사용하기만 하면 동작
운전자에게 노출되어있는 부분이 적으므로 운전자가 엔진이 돌아가는 방식이나 연료가 연소되는 방법 등등을 개조 함으로써 발생하는 위험성 감소
객체지향의 장단점
장점
✔️ 코드 재사용이 용이
남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용 가능
✔️ 유지보수가 편리
절차 지향 프로그래밍 : 코드를 수정해야할 때 일일이 찾아 수정
객체 지향 프로그래밍 : 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 있기 때문에 해당 부분만 수정
✔️ 대형 프로젝트에 적합
클래스 단위로 모듈화시켜서 개발 가능
대형 프로젝트처럼 여러 명, 여러 회사에서 개발이 필요할 시 업무 분담 편리
단점
✔️처리속도가 상대적으로 느림
✔️객체가 많으면 용량이 커질 수 있음
✔️설계시 많은 시간과 노력이 필요