본문 바로가기

Programming Project/FunctionalProgrammingPrinciples in Scala

Lecture 1.6(1-5 포함) - Blocks and Lexical Scope (Functional Programming Principles in Scala / Coursera 강의 정리)


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

1-5 강의는 실습 강의라서 간단하게 내용만 정리하여 대체하도록 하겠다.

 

요걸 만들려고 한다. 이를 구현하기 위해

위와 같은 방법을 사용하도록 한다. 

이는 guess * guess = x가 되어야 하는 상황에서 guess = x / guess로 이항 한 후 현재 guess와 평균을 내어 근사화 시키는 과정이다.

 

 

 

요걸 만들어 놓고

 

요걸 실행하면 근사값을 구하게 된다.

 

 

그치만 sqrt에 너무 큰 수를 넣으면 너무 오랜 시간이 걸리게 된다. (원하는 정확도가 실질적인 수의 크기에 비해 너무 정밀하기 때문에)

 

 

그래서 1e50같은 수를 넣으면 너무 오래 걸려서 평가 지표를 아래와 같이 바꾼다.

 

이러면 수의 크기에 따라 대략적인 정밀도를 구하게 된다.

 

----이게 1.5 lecture전부---

 

위의 프로그램들은 작은 조각으로 구분되어 있다.

이제 우리 프로그램을 모듈화 하여 정리할 수 있도록 도와주는, 블록을 기반으로 하는 기본적인 구조화 매커니즘을 배워보도록 하자. 위의 프로그램을 기반으로 작성해보도록 한다.

 

 

특히, 함수형 프로그래밍에서는 어떤 작업을 여러 작은 함수로 분할할 수 있다. 그렇지만, sqrtIter, improve, isGoodEnough 는 단순히 

구현에만 초점이 맞춰진 이름이지, 용도에 맞춰진 이름은 아니다. 

우리는 사용자들이 이런 함수를 직접적으로 호출하는 것을 원하지 않는다(의도하지 않았다). 그러므로 우리는 이 함수들을 sqrt함수 내부로 배치함으로써 name-space의 pollution(낭비)을 막으면서 우리의 의도대로 사용할 수 있게 된다.

위와 같이 코드를 재 작성 할 수 있다.

우리가 이렇게 한 것은 block을 사용한 것이다. block은 중괄호를 통해 범위가 정해지며 몇몇 정의에 해당하는 줄을 적을 수 있으며 마지막으로 해당 블록의 반환값을 반환한다. (위 예시에서는 x*x 부분) block은 스칼라의 표현식이며, 따라서 함수 정의의 우변을 포함하여 모든 부분에서 사용할 수 있다.

두가지 간단한 법칙에 의해 블록 안 코드의 가시성을 높여준다.

- block안에서 정의된 정의들은 블록 안에서만 볼 수 있다.

- block안에서 정의된 정의들은 블록 밖의 같은 이름의 정의들을 shadow한다. (일시적으로 그 이름 대신 안쪽 이름의 새로운 정의를 참조한다는 뜻) 위의 예시에서 x는 shadowing된 x이다.

위의 예시를 한번 직접 풀어보자.

 

 

 

 

 

스칼라에서는 한줄에 여러개 쓰고 싶지 않은 이상 세미콜론이 필수적인 것은 아니다.

 

반대로, 한줄을 여러줄로 쓰고 싶을 때는 아래와 같이 하면 원하는대로 동작하지 않는다.

 

 

그래서 아래와 같이 작성해야 한다.

 

1. 괄호로 묶기

2. 연산자를 뒤에 두어 앞으로 추가적인 어떤 변수가 기다린다는 것을 알게 해 주기.

 

summary는 다음과 같다.