Kim-Baek 개발자 이야기

Scala Functional Programming : 스칼라 함수형 프로그램 본문

개발/Scala

Scala Functional Programming : 스칼라 함수형 프로그램

데이터 개발자 2020. 12. 30. 21:01

 

 

스칼라에 대해서 이야기 해보려고 한다

 

이전 포스트에서 Spark 의 구조에 대한 설명을 했는데 Spark 코드를 주로 Scala로 많이 작성한 것들을 봤었다

 

Scala 무엇일까??

 

Functional Programming 언어로 많이 불린다.

 

 

Scala lets you write code in an object-oriented programming (OOP) style, a functional programming (FP) style, and even in a hybrid style, using both approaches in combination.

 

 

스칼라는 또한 객체지향적인 (OOP) 프로그래밍도 가능하고 함수형 프로그래밍(FP) 프로그래밍도 가능하다

 

Scala 공식 문서에는 Hybrid Style? 이라고 표현한다

 

 

OOP 언어라면 대표적으로 Java, C++, C# 이 있을 것 이다

 

 

하지만 FP(Functional Programming) 이라면 상대적으로 생소할 것 같다

 

대표적으로 Javascript 를 함수형 프로그래밍언어라고 많이 부른다

 

 

무엇일까???

 

 

 

Functional Programming


 

함수형 프로그래밍을 공부하기 위해 2가지 키워드를 굳이 뽑아본다면 아래 2가지를 뽑고 싶다

 

Pure Function

Immutable Value 

 

 

함수형 프로그래밍은 Pure Function 으로 처리하면서 Share state, Mutable data, side-effects 들을 피하려고 한다

 

Share state는 저장 상태 같은 것을 공유하는거고,

 

Mutable data는 Immutable data와 반대되는 개념이다

 

 

즉 Immutable values는 변하지 않는 데이터를 의미한다.

 

함수형 프로그래밍에서는 가급적 Immutable values를 사용하도록 한다

 

Immutable values 사용 => Side Effect 없앰 => Pure Function 으로 생각하면 될 것 같다

 

그렇다면, 변하지 않는 데이터 Immutable Values 는 이해가 되는데 Side Effect, Pure Function 은 무엇일까??

 

 

 

Pure Function, Side Effect


 

Pure Function (순수 함수)는 어떤 함수를 구현할때 같은 Input에 대해서는 항상 같은 값을 Return 해준다고 생각하면 된다

또한 함수안에서 외부의 값을 변경시킨다던지 Side Effect가 없어야 한다

 

1. 같은 Input, 항상 같은 Return

2. Side Effect 가 없다

 

예시를 들어보자

 

def getTaxPure(price: Int): Int = {
	price * 0.2	
}

 

var tax = 0.2

def getTaxInPure(price: Int): Int = {
	price * tax
}


getTaxInPure(100)

tax = 0.3

getTaxInpure(100)

 

 

2개의 함수의 차이점을 보면 된다.

 

첫 번째 함수의 경우는 Pure 함수라고 표현할 수 있다.

 

하지만 두번째 함수는 Pure 함수라고 표현 할 수 없다.

 

Tax 값이 변하면 Function의 Return 값은 매번 달라질 것 이다.

 

 

그렇다면?? Side Effect 없는 Pure Function을 만들면 장점은 무엇일까?

 

Immutable Value 를 사용함으로써 여러 쓰레드, 분산 처리 환경에서도 Side Effect 가 발생하지 않는 것을 보장하게 된다.

 

 

 

이 밖에 기존의 명령형(Imprerative) 프로그래밍 방식이 아닌 선언형(declarative) 프로그래밍 방식이라고 표현하기도 한다.

 

Imperative programs : the flow Control : How to do things

Declarative programs: the data flow : What to do

 

아래와 같은 특징이 있는데 다음에 더 자세히 다뤄보려고 한다

 

 

 

이 밖에 First Class Functions, High Order Function(고차함수), Currying(커링), Lazy Evaluation 등의 개념이 나오는데 천천히 다뤄보려고 한다

* 다른 정보를 더 얻고 싶다면

PC 내에서 컨텐츠 내 링크나 좌측의 관련글을 확인해주세요!

모바일에서는 컨텐츠 내, 링크를 참고해주세요:)

반응형
Comments