개발관련/정보

객체지향형, 함수형 프로그래밍 특징 및 장단점

고통받는다 2023. 7. 5. 20:04

자바와 코틀린을 공부하다 보면 객체지향형과 함수형 프로그래밍에 대해 알게 되실 겁니다.

자바도 JDK8 이상부터 객체지향형 + 함수형 프로그래밍을 지원하고

코틀린 역시 자바 언어를 호환하기 때문에 객체지향 + 함수형 프로그래밍을 지원합니다.

즉 두 언어 모두 객체지향과 함수형 프로그래밍을 지원하는 다중 패러다임 프로그래밍 언어라고 할 수 있죠.

하지만 보통 언어를 설명할 때 자바는 객체지향형, 코틀린은 함수형 프로그래밍 언어라고 많이 말합니다.

이유는 두 언어가 강조하는 특성이 자바는 객체지향 쪽을... 코틀린은 간결성을 위해 함수형 프로그래밍을 강조하기 때문이죠...

 

자.... 자바는.... 객체지향형이 근본이라고 생각해요....

 

아마 언어가 만들어진 시기의 차이 때문에 그런 게 아닌가 싶습니다... JDK8 이후 자바도 사실 함수형을 지향하긴 하는데... 아직까지도 JDK8 미만 문법을 사용하시는 분들이 많죠.

그럼 객체지향과 함수형 프로그래밍에는 어떤 특징이 있는지 장단점이 뭔지 알아보겠습니다.

​​

객체지향형 프로그래밍

 

특징

객체지향은 아래와 같은 주요 특성을 가집니다.

  1. 클래스와 객체

클래스는 객체의 틀이며, 객체는 클래스의 인스턴스를 의미합니다.

클래스는 객체를 생성하기 위한 설계되와 같은 역할을 하며, 객체는 클래스를 기반으로 생성되어 실제로 동작하는 프로그램의 단위를 뜻합니다.

2. 캡슐화

객체의 속성(데이터)과 메서드(함수)를 하나의 단위로 묶어서 외부에서 직접 접근하지 못하도록 보호하는 개념입니다.

객체의 내부 구현을 감추고, 외부에서는 객체의 인터페이스를 통해 상호작용할 수 있도록 합니다.

3. 상속

클래스는 다른 클래스의 특성을 상속받아 자신만의 특성을 추가할 수 있습니다.

상속은 코드의 재사용을 촉진하고, 계층적인 구조를 구성하여 객체들 간의 관계를 표현할 수 있습니다.

4. 다형성

객체들이 동일한 인터페이스를 공유하면서, 각각의 독립적인 구현을 가질 수 있는 개념입니다.

다형성은 코드의 유연성을 높이고, 확장성을 갖출 수 있도록 합니다.

5. 메시지 전달

객체 간의 상호작용은 메시지를 통해 이루어집니다.

객체는 메시지를 수신하고, 이를 처리하여 원하는 동작을 수행합니다.

6. 객체의 상태와 행위

객체는 상태(데이터) 와 행위(메서드)를 함께 가지며, 객체의 상태가 변경되면 그에 따라 객체의 행위도 변경될 수 있습니다.

이를 통해 객체는 상태와 행위를 하나의 단위로 관리하고, 객체 간의 상호작용을 표현할 수 있습니다.​​

 

장점

 

1. 코드의 재사용성

클래스와 객체를 통해 코드를 모듈화하고 객체 간의 관계를 표현함으로 재사용성을 높일 수 있습니다.

2. 유연성과 확장성

캡슐화와 상속을 통해 유연하고 확장 가능한 코드를 작성할 수 있습니다.

3. 코드의 가독성과 유지 보수성

클래스와 객체를 통해 코드를 모듈화하고, 객체의 인터페이스를 통해 외부와의 상호작용을 단순화하기 때문에 가독성과 유지 보수성이 높습니다.

4. 모듈화와 협업의 용이성

클래스와 객체를 통해 코드를 모듈화하여 개발자들이 각자의 역할과 책임을 가지고 개발 모듈을 개발할 수 있도록 지원합니다.

5. 대규모 소프트웨어 개발의 지원

모듈화와 추상화를 통해 대규모 소프트웨어 개발을 지원합니다.

 

단점

 

1. 학습 곡선과 복잡성

다양한 개념과 용어, 디자인 패턴 등을 포함하고 있어 초기 학습곡선이 매우 높습니다.

또한, 클래스와 객체를 통해 구조화되어 있기 때문에 코드의 복잡성이 증가할 수 있습니다.

2. 메모리 사용과 성능

객체를 생성하여 메모리를 사용하고 객체 간의 상호작용을 통해 데이터를 주고받기 때문에 메모리 사용이 증가할 수 있습니다.

3. 설계와 모델링의 어려움

객체 간의 관계를 정의하고 객체의 상태와 동작을 모델링 하는 과정이 필요하기 때문에 설계와 모델링의 어려움이 있습니다.

잘못된 설계는 나중에 코드 수정이나 확장에 어려움을 초래할 수 있습니다.

4. 오버 엔지니어링의 위험

강력한 추상화와 모듈화를 제공하여 코드의 제사 용성과 확장성을 높이는 장점이 있지만, 과도한 추상화와 모듈화로 인해 오버 엔지니어링의 위험이 발생할 수 있습니다.

5. 성능 저하 가능성

객체 간의 상호작용이 메시지 전달과 동적 메서드 호출 등의 과정을 거치기 때문에 성능 저하가 발생할 수 있습니다.

특히 대규모 시스템이나 높은 트래픽을 처리해야 하는 경우 성능에 큰 영향을 줄 수 있습니다.​​

함수형 프로그래밍

 

특징

 

1. 순수 함수

함수의 반환 값이 함수의 입력 값에만 의존하고 외부의 상태를 변경하지 않는 함수를 순수 함수라고 합니다.

순수 함수는 예측 가능하고 테스트하기 쉽기 때문에 코드의 안정성과 품질을 높일 수 있습니다.

2. 불변성

함수형 프로그래밍에서는 데이터의 불변성을 강조하며, 한번 생성된 데이터는 변경되지 않고 새로운 데이터가 생성되는 방식으로 처리합니다.

이를 통해 코드의 복잡성을 줄이고 예측 가능한 동작을 보장합니다.

 

3. 함수의 일급 시민

함수형 프로그래밍에서는 함수가 일급 시민으로 다뤄져 함수를 인자로 전달하고 반환 값으로 사용하는 고차 함수를 활용하여 코드를 간결하고 모듈화할 수 있습니다.

4. 상태 관리의 명시성

상태의 변화를 명시적으로 다루기 때문에 코드의 복잡성을 줄이고 버그를 방지할 수 있습니다.

5. 높은 추상화 수준

함수형 프로그래밍은 수학적인 개념인 함수를 기반으로 하기 때문에 추상화 수준이 높아 코드의 표현력이 좋아집니다.

높은 추상화 수준을 통해 코드의 간결성과 가독성을 높이고 개발 생산성을 향상시킬 수 있습니다.

6. 병렬 처리의 용이성

상태 변화를 피하고 불변성을 강조하므로, 여러 개의 함수가 동시에 실행되는 병렬 처리에 용이합니다.

이를 통해 성능을 향상시키고 멀티 코어 CPU 등의 다중 처리 장치를 효율적으로 활용할 수 있습니다.

 

장점

 

  1. 간결하고 가독성 높은 코드

불변성, 순수 함수, 높은 추상화 수준 등의 특성으로 코드가 간결하고 가독성이 매우 높습니다.

2. 안정성과 예측 가능한 동작

불변성을 강조하기 때문에 예측 가능한 동작과 안정성이 높은 코드를 작성할 수 있습니다.

3. 테스트 용이성

함수의 입력 값과 반환 값이 외부 상태에 의존하지 않는 순수 함수 특정으로 인해 단위 테스트가 용이합니다.

4. 병렬 처리의 용이성

상태 변화를 피하고 불변성을 강조하여 병렬 처리를 용이하게 합니다

5. 모듈화와 재사용성

함수와 데이터를 모듈화하고 재사용성을 높이는 것을 강조합니다.

6. 에러 처리와 예외 처리의 용이성

순수 함수와 명시적인 상태 관리를 통해 에러 처리와 예외 처리를 용이하게 합니다.​​

단점

 

1. 객체지향과 전혀 다른 패러다임

객체지향과 전혀 다름 패러다임을 사용하기 때문에 객체지향 프로그래밍에 익숙한 개발자에게는 어려울 수 있습니다.

2. 제한된 활용 범위

모든 문제에 대해 함수형 프로그래밍이 적용 가능한 것은 아니며, 특정한 문제나 도메인에 따라 객체지향 프로그래밍이나 다른 패러다임이 더 적합할 수 있습니다

3. 가변 상태 처리 어려움

불변성을 강조하고 가변 상태를 피하는 것을 지향하기 때문에 가변 상태의 처리가 어려울 수 있습니다.

4. 성능의 저하

가변 상태를 다루는 객체지향 프로그래밍에 비해 성능 저하가 발생할 수 있습니다. 특히, 대규모 데이터 처리와 같은 성능에 민감한 작업에서는 함수형 프로그래밍의 성능 저하가 더 크게 나타날 수 있습니다.

5. 기존 라이브러리와의 호환성

기존에 사용하던 라이브러리나 프레임워크가 함수형 프로그래밍에 적합하지 않은 경우가 있을 수 있습니다. 함수형 프로그래밍을 적용하려면 기존 코드나 라이브러리를 리팩토링하거나 새로운 함수형 라이브러리를 도입해야 할 수도 있습니다.