간단한 프로그램으로, 작업 흐름이 가지를 뻗어나가지 않고 일직선 형태를 띄는 경우에 유리하다.
복잡한 대규모 프로그램의 경우 흐름이 그물망이나 나뭇가지처럼 여러 방향으로 얽히게 되는데, 이를 구현하기 위해서는 객체지향에 비해 훨씬 더 많은 노력이 필요하다.
함수형 :
함수형 프로그래밍의 함수는 수학의 함수 또는 포현식을 의미한다.
프로그램이 수학적 표현의 조합 또는 표현식의 조합으로 표현될 수 있다고 생각한다.
이론적으로는 가능하지만 모든 프로그램이 이에 적합한 것은 아니다.
코드의 구성 단위로 함수를 사용한다.
스테이트리스 함수 라는 점에서 절차적 프로그래밍과 다르다.
절차적 프로그래밍의 경우 전역 변수를 활용하는 반면 함수형 프로그래밍은 입력 매개변수만을 사용한다.
프로그래밍의 특수성 때문에 함수형 프로그래밍은 컴퓨터 과학, 데이터 처리, 통계 분석과 같은 특수한 분야에서만 그 장점을 충분히 발휘할 수 있다.
객체 지향 :
캡슐화
정보 은닉, 데이터 액세스 보호
은행 계좌 클래스의 경우 balance(잔고) 를 다른 클래스에서 마음대로 가져다 변경할 경우 문제가 생길 수 있다.
언어 자체에서 이를 지원하는 문법을 제공해야한다.
java,C++의public/private키워드
추상화
메서드의 내부 구현을 숨기는 것
기능의 구현 방식이 아닌, 메서드가 제공하는 기능에만 집중할 수 있다.
클래스의 메서드를 정의하거나 이름을 붙일 때는 추상적인 사고가 필요하다.
에를 들어 getNaverCloudPictureUrl()은 네이버 클라우드가 아닌 다른 곳에 사진을 저장하게 되면 이름의 수정이 필요하다. getPictureUrl() 같이 보다 추상적인 이름을 사용하는 것이 좋다.
상속
‘is-a’ 관계
단일 상속 : 하위 클래스가 단 하나의 상위 클래스만을 상속하는 것
다중 상속 : 하위 클래스가 여러 상위 클래스를 동시에 상속할 수 있음을 의미
다중 상속의 경우 상속을 지원하는 모든 언어가 지원하는 것은 아니다.
다이아몬드 상속 문제가 발생할 수 있다.
프로그래밍 언어가 상속을 표현하는 문법을 별도로 지원해야 한다.
재사용성 : 상속을 이용하여 공통 부분을 상위 클래스로 모으면, 코드를 재사용하여 불필요한 반복을 줄일 수 있다.
상속의 계층구조가 너무 깊고 복잡하면 코드의 가독성과 유지 관리성이 떨어진다. 그러므로 적게, 혹은 사용하지 않는 것이 좋고 ‘상속보다 합성’을 사용하는 것이 좋다.
다형성
코드를 실행하는 과정에서 하위 클래스를 상위 클래스 대신 사용하고, 하위 클래스의 메서드를 호출할 수 있는 특성
다형성을 충족시키기 위한 문법 (상속과 메서드 재정의를 활용한 방식)
상위 클래스 객체가 하위 클래스 객체를 참조할 수 있어야 한다.
상속을 지원해야 한다.
상위 클래스의 메서드를 재정의하는 하위 클래스를 지원해야 한다.
이 밖에도 인터페이스 문법을 사용하거나 duck-typing 문법을 사용할 수있다.
Interface 문법
동일한 인터페이스를 구현하여 서로 다른 클래스여도 같은 인터페이스 형으로 사용될 수 있다.
duck-typing 문법
모든 언어에서 지원하는 것은 아니다. (C++에서는 지원하지 않고 Python에서는 지원한다.)
동일한 함수명을 정의하여 같은 형식으로 활용할 수있다.
다형성을 훨씬 유연하게 구현할 수 있다.
다형성은 코드의 재사용성을 향상시킨다.
Advantages
재사용성
확장성
유지 보수 용이
복잡한 관계에 대한 설계의 용이성
Wrap-up
절차형 프로그래밍의 경우 간단한 선형 구조의 프로그램을 구현하는데 유리하고, 함수형 프로그래밍의 경우 컴퓨터 과학이나, 데이터 처리 등의 프로그램을 구현하는데 유리하다. 하지만 둘은 함수 작성과 같은 특정 구현 세부 사항에 중점을 두는데, 이로 인해 프로그램의 흐름이 그물처럼 얽힌 관계가 복잡한 프로그램의 경우 객체 지향 프로그래밍에 비해 효율이 떨어진다. 반면 객체 지향 프로그래밍의 경우 상속, 다형성, 캡슐화, 추상화 의 특징을 활용하여 클래스 설계를 비롯한 코드 모듈 설계에 중점을 두므로 복잡한 구조의 프로그래밍 설계에 유리하고 재사용, 확장, 유지 관리가 쉽다.