SlideShare a Scribd company logo
1 of 21
Download to read offline
Scala
기초
(2)
Scala 함수
함수는 재사용 가능한 로직의 핵심 구성 요소다.
함수형 프로그래밍
함수형 프로그래밍 언어는 재사용성이 아주 높고 구성력이 좋은 함수를 지원하고, 개발자들이 자신의 코드 기반을 이 함수를
둘러싸고 구조화할 수 있도록 돕는 데 맞춰져 있다.
스칼라에서 함수(function)는 이름을 가진, 재활용 가능한 표현식이다. 함수는 매개변수화할 수도 있으며 값을 반환할 수도
있지만, 이 특징 중 어느 것도 필수사항은 아니다. 하지만 이 특징들은 확실히 재사용성과 구성력을 최대화한다.
매개변수화된 함수를 사용하여, 중복 코드를 정규화할 수 있으며 로직을 단순화하고 로직이 더 발견하게 쉽게 도와준다.
Scala 순수함수(pure function)
표준 함수형 프로그래밍의방법론을따르고 가능하면순수 함수를 구성하면이보다 더 훌륭한 이점을 얻을 수 있다.
함수형 프로그래밍에서순수 함수는 다음과 같은 특징을 갖는다.
● 하나 또는 그 이상의 입력 매개변수를가진다
● 입력 매개변수만을가지고 계산을 수행한다
● 값을 반환한다
● 동일 입력에 대해 항상 같은 값을 반환한다.
● 함수 외부의 어떤 데이터도사용하거나영향을 주지 않는다.
● 함수 외부 데이터에영향받지않는다.
Scala 순수함수(pure function)
순수 함수는 근본적으로수학에서함수의 정의와 동일하게입력 매개변수로만유도되는계산을 의미하며, 함수형 프로그래밍에서프로그램의구성
요소가 된다.
순수 함수는 이 요건을 만족시키지않는 함수에 비해 더 안정적인데, 이는 순수 함수가 상태 정보를 저장하지않으며, 파일, 데이터 베이스, 소켓, 전역변수
및 다른 공유 데이터와같은 외부 데이터에관계없이독립적이기때문이다. 본질적으로는순수 함수는 변경될 수 없으며, 순수 로직을 변경하지않는
표현식이다.
입력값 없는 함수 정의
def <식별자> = <표현식>
Scala 함수 정의하기
함수 정의하기
def <식별자>(<식별자>: <타입>[, …]) : <타입> = <표현식>
Scala 프로시저(prosedure)
프로시저(procedure)는 반환값을가지지 않는 함수다.
println() 호출과 같은 문장으로끝나는 모든 함수 또한 프로시저다.
반환값이없다면 Unit 이라는 타입으로명시할 수 있다.
Scala 빈 괄호를가지는함수
입력 매개변수가없는 함수를 정의하고호출하는다른 방법으로는빈 괄호를 사용하는것이다.
이 스타일이더 좋은 방식임을알 수 있을 텐데, 이 방식이 함수와 값을 분명하게구분해 주기 때문이다.
def <식별자>() [:<타입>] = <표현식>
> 부작용이있는 함수는 괄호를 사용해야한다. (즉, 함수가 그 범위 밖의 데이터를변경한다면) 빈 괄호를 사용하여정의되어야한다. 예를 들어,
콘솔에 메시지를쓰는 입력 매개변수가없는 함수는 빈 괄호와 함께 정의되어야한다.
Scala 표현식블록을이용한함수 호출
함수에 전달하고자하는 값이 이미 계산되었다면, 함수 매개변수를지정하기위해 괄호를 사용하는것이 자연스럽다.
하지만 함수에서계산식만유일하게사용하고코드를 다른 사람들이읽을 수 있도록 유지할 수 있다면, 표현식 블록을 이용하여함수를 호출하는것이 좋은
방법이다.
Scala 재귀함수
재귀 함수(recursive function)는 자기 자신을 호출하는함수로, 되도록 특정 타입의 매개변수또는 함수 호출이 무한 루프에 빠지는 것을 피하고자검사할
외부 조건과 함께 호출 한다.
재귀 함수는 함수형 프로그래밍에서매우 보편적인데, 이는 데이터 구조 또는 계산을 가변적인데이터를사용하지않고 반복하는방법을 제공하기
때문이다.
이것이 가능한 이유는 각 함수 호출이 함수 매개변수를저장하기위한 자신만의스택(stack)을 가지기 때문이다.
Scala 재귀함수
재귀 함수를 사용하는데 있어 문제점은스택오버플로우(stack overflow) 에러다.
이 에러는 재귀 함수를 너무 많이 호출하면결국 할당된 스택 공간을 모두 소진하면서발생한다.
이를 예방하기위해 스칼라 컴파일러는재귀적 호출이 추가적인스택 공간을 사용하지않도록 꼬리재귀(tail-recursion)를 사용하여일부 재귀 함수를
최적화 할 수 있다.
꼬리-재귀를 위해 최적화될함수를 표시하는함수 애너태이션이존재한다.
꼬리-재귀로 최적화 될 수 없다면 컴파일 시점에서에러가 발생할 것이다.
안타깝게도함수는 최적화 될 수 없다.
Scala 재귀함수
적절하게구현된 꼬리재귀형태
재귀와 꼬리-재귀는 여전히 가변 데이터를사용하지않고 반복할 수 있는 가치 있는 방법이다.
// 피보나치수열
Scala 고차함수: 함수를함수에전달 (꼬리 재귀 심화)
순수한 함수적 프로그램을 작성할 때에는 다른 함수를 인수로 받는 함수를 작성하는 것이 유용한 경우가 많다.
그런 함수를 고차 함수(higher-order function, HOF; 또는 고계 함수)
풀어보기
두가지 함수를 이용하여 factorial을 구현해보자.
Scala 중첩함수
함수는 이름을 가진 매개변수화된 표현식 블록이며, 표현식 블록은 중첩이 가능하므로 함수 자체가 중첩
가능하다는 사실은 그리 놀라운 일은 아닐 것이다.
예 ) 메소드 내에서만 반복되야 하는 로직이 있다고 할 때 외부 메서드로 추정되어 득이 되지 않은 때가
존재한다.
이런 경우 함수 내부에 존재하는 내부 함수를 정의하여 그 함수 내에서만 사용되도록 하는 것이 낫다.
Scala 이름으로매개변수를지정하여함수 호출하기
함수를 호출할 때에는 원래 함수가 정의될 때의 순서대로 매개변수가 지정되어야 하는 것이 관례다.
하지만 스칼라에서는 이름으로 매개변수를 호출할 수 있으므로 매개변수를 순서와 관계없이 지정하는
것이 가능하다.
<함수명>(<매개변수> = <값>)
ex )
Scala 기본값을갖는 매개변수
함수를 정의할 때 맞닥뜨리는 보편적인 문제는 재사용을 극대화하기 위해 어떤 입력 매개변수를 취할
것인지를 결정하는 것이다. 스칼라와 자바 그리고 다른 언어에서 공통된 해결책은, 동일한 이름을 갖지만
입력 매개변수가 다른 동일한 함수를 여러 버전으로 제공하는 것이다. 이것은 함수명이 다른 입력값에
대해 재사용되기 때문에 함수 오버로딩(function overloading) 이라고도 한다.
Scala 가변 매개변수
자바와 C 개발자는 가변 인수(vararg)란 용어를 알 것이다. 가변 인수는 0개 이상의 여러 인수가 일치할 수
있는 함수 매개변수다. 가장 보편적인 용도로는 C의 printf()와 자바 String.format()같은 문자열 보간 함수를
들 수 있다.
Scala 타입 매개변수
스칼라에서는 값 매개변수를 보완하기 위해 값 매개변수 또는 반환값에 사용될 타입을 지시하는 타입
매개변수(type parameter)를 전달할 수도 있다.
def <함수명>[타입명](<매개변수 이름>: <타입명>):<타입명> …
Scala 메소드와연산자
메소드는 클래스에서 정의된 함수로, 클래스의 모든 인스턴스에서 사용할 수 있다.
스칼라에서 메소드를 호출하는 표준 방식은 메소드 이름 앞에 인스턴스 이름과 점(.) 구분자를 붙이는 삽입
표기법(infix dot notation)을 사용한다.
<클래스 인스턴스>.<메소드>[(매개변수)]
Scala 연산자표기법으로메소드호출하기
이 표기법을 더 정확한 용어로 말하자면 중위 연산자 표기법(infix operator notation)이 된다.
<객체> <표기법> <매개변수>
Scala 가독성있는 함수 작성하기
함수를 작성한다는 것은 이를 재사용한다는 것이다. 그리고 함수가 확실히 재사용될 수 있도록 하려면,
다른 개발자들이 읽기 쉽게 만들어야 한다. 읽기 쉬운 함수는 분명하고, 이해하기 쉬우며, 단순하다.
함수를 읽기 쉽게 만드는 방법에는 두 가지가 있다. 먼저, 함수를 짧고 이해하기 쉬운 이름으로 정하고,
분명하게 유지하는 것이다.
복잡한 함수를 한눈에 볼 수 있는 텍스트 페이지의 높이(40줄)보다 짧은, 더 단순한 함수로 나누어서
코드를 읽는 사용자가 함수를 보기 위해 스크롤을 위아래로 움직이지 않아도 되게 한다. 그리고 함수가
하고자 하는 일을 합리적으로 요약할 수 있는 이름을 사용하는 것이 좋다.
Scala 참고 도서
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&barcode=9791185890791
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791185890180

More Related Content

What's hot

자바8강의 0강. java8 overview
자바8강의 0강. java8 overview자바8강의 0강. java8 overview
자바8강의 0강. java8 overviewSejong Park
 
Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Park Jonggun
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Park Jonggun
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Park Jonggun
 
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩해강
 
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda기현 황
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기rupert kim
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)MIN SEOK KOO
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Park Jonggun
 
자바8 람다 나머지 공개
자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개Sungchul Park
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)MIN SEOK KOO
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선daewon jeong
 
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)MIN SEOK KOO
 

What's hot (19)

자바8강의 0강. java8 overview
자바8강의 0강. java8 overview자바8강의 0강. java8 overview
자바8강의 0강. java8 overview
 
Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자
 
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
 
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초
 
자바8 람다 나머지 공개
자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
STL study (skyLab)
STL study (skyLab)STL study (skyLab)
STL study (skyLab)
 
9 swift 클로저1
9 swift 클로저19 swift 클로저1
9 swift 클로저1
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
 
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
 
Lua 문법
Lua 문법Lua 문법
Lua 문법
 

Similar to Scala 기초 (2)

Clean code(03)
Clean code(03)Clean code(03)
Clean code(03)규열 김
 
JavaInAction 자바 8
JavaInAction 자바 8JavaInAction 자바 8
JavaInAction 자바 8NBT Inc.
 
[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수Keunhyun Oh
 
애플이 스위프트 프로그래밍 언어를 위해 "훔친" 몇 가지 기능
애플이 스위프트 프로그래밍 언어를 위해 "훔친" 몇 가지 기능애플이 스위프트 프로그래밍 언어를 위해 "훔친" 몇 가지 기능
애플이 스위프트 프로그래밍 언어를 위해 "훔친" 몇 가지 기능ETRIBE_STG
 
PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기찬희 이
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework경주 전
 
Perl Script Document
Perl Script DocumentPerl Script Document
Perl Script Document오석 한
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java유리 하
 
Clojure/Chapter3
Clojure/Chapter3Clojure/Chapter3
Clojure/Chapter3destinycs
 
함수형사고 실용적사고
함수형사고 실용적사고함수형사고 실용적사고
함수형사고 실용적사고Sunggon Song
 
파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기 파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기 Yong Joon Moon
 
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]leusin2
 
2. lambda expression
2. lambda expression2. lambda expression
2. lambda expression흥래 김
 
[2011 04 30]python-3장
[2011 04 30]python-3장[2011 04 30]python-3장
[2011 04 30]python-3장Jong Pil Won
 

Similar to Scala 기초 (2) (20)

Clean code(03)
Clean code(03)Clean code(03)
Clean code(03)
 
JavaInAction 자바 8
JavaInAction 자바 8JavaInAction 자바 8
JavaInAction 자바 8
 
[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수
 
애플이 스위프트 프로그래밍 언어를 위해 "훔친" 몇 가지 기능
애플이 스위프트 프로그래밍 언어를 위해 "훔친" 몇 가지 기능애플이 스위프트 프로그래밍 언어를 위해 "훔친" 몇 가지 기능
애플이 스위프트 프로그래밍 언어를 위해 "훔친" 몇 가지 기능
 
PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
 
Perl Script Document
Perl Script DocumentPerl Script Document
Perl Script Document
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
Clojure/Chapter3
Clojure/Chapter3Clojure/Chapter3
Clojure/Chapter3
 
Javascript
JavascriptJavascript
Javascript
 
Scala variable
Scala variableScala variable
Scala variable
 
Scala syntax function
Scala syntax functionScala syntax function
Scala syntax function
 
함수형사고 실용적사고
함수형사고 실용적사고함수형사고 실용적사고
함수형사고 실용적사고
 
클로저 1
클로저 1클로저 1
클로저 1
 
파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기 파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기
 
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
 
Linq
LinqLinq
Linq
 
Java(3/4)
Java(3/4)Java(3/4)
Java(3/4)
 
2. lambda expression
2. lambda expression2. lambda expression
2. lambda expression
 
[2011 04 30]python-3장
[2011 04 30]python-3장[2011 04 30]python-3장
[2011 04 30]python-3장
 

Scala 기초 (2)

  • 2. Scala 함수 함수는 재사용 가능한 로직의 핵심 구성 요소다. 함수형 프로그래밍 함수형 프로그래밍 언어는 재사용성이 아주 높고 구성력이 좋은 함수를 지원하고, 개발자들이 자신의 코드 기반을 이 함수를 둘러싸고 구조화할 수 있도록 돕는 데 맞춰져 있다. 스칼라에서 함수(function)는 이름을 가진, 재활용 가능한 표현식이다. 함수는 매개변수화할 수도 있으며 값을 반환할 수도 있지만, 이 특징 중 어느 것도 필수사항은 아니다. 하지만 이 특징들은 확실히 재사용성과 구성력을 최대화한다. 매개변수화된 함수를 사용하여, 중복 코드를 정규화할 수 있으며 로직을 단순화하고 로직이 더 발견하게 쉽게 도와준다.
  • 3. Scala 순수함수(pure function) 표준 함수형 프로그래밍의방법론을따르고 가능하면순수 함수를 구성하면이보다 더 훌륭한 이점을 얻을 수 있다. 함수형 프로그래밍에서순수 함수는 다음과 같은 특징을 갖는다. ● 하나 또는 그 이상의 입력 매개변수를가진다 ● 입력 매개변수만을가지고 계산을 수행한다 ● 값을 반환한다 ● 동일 입력에 대해 항상 같은 값을 반환한다. ● 함수 외부의 어떤 데이터도사용하거나영향을 주지 않는다. ● 함수 외부 데이터에영향받지않는다.
  • 4. Scala 순수함수(pure function) 순수 함수는 근본적으로수학에서함수의 정의와 동일하게입력 매개변수로만유도되는계산을 의미하며, 함수형 프로그래밍에서프로그램의구성 요소가 된다. 순수 함수는 이 요건을 만족시키지않는 함수에 비해 더 안정적인데, 이는 순수 함수가 상태 정보를 저장하지않으며, 파일, 데이터 베이스, 소켓, 전역변수 및 다른 공유 데이터와같은 외부 데이터에관계없이독립적이기때문이다. 본질적으로는순수 함수는 변경될 수 없으며, 순수 로직을 변경하지않는 표현식이다. 입력값 없는 함수 정의 def <식별자> = <표현식>
  • 5. Scala 함수 정의하기 함수 정의하기 def <식별자>(<식별자>: <타입>[, …]) : <타입> = <표현식>
  • 6. Scala 프로시저(prosedure) 프로시저(procedure)는 반환값을가지지 않는 함수다. println() 호출과 같은 문장으로끝나는 모든 함수 또한 프로시저다. 반환값이없다면 Unit 이라는 타입으로명시할 수 있다.
  • 7. Scala 빈 괄호를가지는함수 입력 매개변수가없는 함수를 정의하고호출하는다른 방법으로는빈 괄호를 사용하는것이다. 이 스타일이더 좋은 방식임을알 수 있을 텐데, 이 방식이 함수와 값을 분명하게구분해 주기 때문이다. def <식별자>() [:<타입>] = <표현식> > 부작용이있는 함수는 괄호를 사용해야한다. (즉, 함수가 그 범위 밖의 데이터를변경한다면) 빈 괄호를 사용하여정의되어야한다. 예를 들어, 콘솔에 메시지를쓰는 입력 매개변수가없는 함수는 빈 괄호와 함께 정의되어야한다.
  • 8. Scala 표현식블록을이용한함수 호출 함수에 전달하고자하는 값이 이미 계산되었다면, 함수 매개변수를지정하기위해 괄호를 사용하는것이 자연스럽다. 하지만 함수에서계산식만유일하게사용하고코드를 다른 사람들이읽을 수 있도록 유지할 수 있다면, 표현식 블록을 이용하여함수를 호출하는것이 좋은 방법이다.
  • 9. Scala 재귀함수 재귀 함수(recursive function)는 자기 자신을 호출하는함수로, 되도록 특정 타입의 매개변수또는 함수 호출이 무한 루프에 빠지는 것을 피하고자검사할 외부 조건과 함께 호출 한다. 재귀 함수는 함수형 프로그래밍에서매우 보편적인데, 이는 데이터 구조 또는 계산을 가변적인데이터를사용하지않고 반복하는방법을 제공하기 때문이다. 이것이 가능한 이유는 각 함수 호출이 함수 매개변수를저장하기위한 자신만의스택(stack)을 가지기 때문이다.
  • 10. Scala 재귀함수 재귀 함수를 사용하는데 있어 문제점은스택오버플로우(stack overflow) 에러다. 이 에러는 재귀 함수를 너무 많이 호출하면결국 할당된 스택 공간을 모두 소진하면서발생한다. 이를 예방하기위해 스칼라 컴파일러는재귀적 호출이 추가적인스택 공간을 사용하지않도록 꼬리재귀(tail-recursion)를 사용하여일부 재귀 함수를 최적화 할 수 있다. 꼬리-재귀를 위해 최적화될함수를 표시하는함수 애너태이션이존재한다. 꼬리-재귀로 최적화 될 수 없다면 컴파일 시점에서에러가 발생할 것이다. 안타깝게도함수는 최적화 될 수 없다.
  • 11. Scala 재귀함수 적절하게구현된 꼬리재귀형태 재귀와 꼬리-재귀는 여전히 가변 데이터를사용하지않고 반복할 수 있는 가치 있는 방법이다. // 피보나치수열
  • 12. Scala 고차함수: 함수를함수에전달 (꼬리 재귀 심화) 순수한 함수적 프로그램을 작성할 때에는 다른 함수를 인수로 받는 함수를 작성하는 것이 유용한 경우가 많다. 그런 함수를 고차 함수(higher-order function, HOF; 또는 고계 함수) 풀어보기 두가지 함수를 이용하여 factorial을 구현해보자.
  • 13. Scala 중첩함수 함수는 이름을 가진 매개변수화된 표현식 블록이며, 표현식 블록은 중첩이 가능하므로 함수 자체가 중첩 가능하다는 사실은 그리 놀라운 일은 아닐 것이다. 예 ) 메소드 내에서만 반복되야 하는 로직이 있다고 할 때 외부 메서드로 추정되어 득이 되지 않은 때가 존재한다. 이런 경우 함수 내부에 존재하는 내부 함수를 정의하여 그 함수 내에서만 사용되도록 하는 것이 낫다.
  • 14. Scala 이름으로매개변수를지정하여함수 호출하기 함수를 호출할 때에는 원래 함수가 정의될 때의 순서대로 매개변수가 지정되어야 하는 것이 관례다. 하지만 스칼라에서는 이름으로 매개변수를 호출할 수 있으므로 매개변수를 순서와 관계없이 지정하는 것이 가능하다. <함수명>(<매개변수> = <값>) ex )
  • 15. Scala 기본값을갖는 매개변수 함수를 정의할 때 맞닥뜨리는 보편적인 문제는 재사용을 극대화하기 위해 어떤 입력 매개변수를 취할 것인지를 결정하는 것이다. 스칼라와 자바 그리고 다른 언어에서 공통된 해결책은, 동일한 이름을 갖지만 입력 매개변수가 다른 동일한 함수를 여러 버전으로 제공하는 것이다. 이것은 함수명이 다른 입력값에 대해 재사용되기 때문에 함수 오버로딩(function overloading) 이라고도 한다.
  • 16. Scala 가변 매개변수 자바와 C 개발자는 가변 인수(vararg)란 용어를 알 것이다. 가변 인수는 0개 이상의 여러 인수가 일치할 수 있는 함수 매개변수다. 가장 보편적인 용도로는 C의 printf()와 자바 String.format()같은 문자열 보간 함수를 들 수 있다.
  • 17. Scala 타입 매개변수 스칼라에서는 값 매개변수를 보완하기 위해 값 매개변수 또는 반환값에 사용될 타입을 지시하는 타입 매개변수(type parameter)를 전달할 수도 있다. def <함수명>[타입명](<매개변수 이름>: <타입명>):<타입명> …
  • 18. Scala 메소드와연산자 메소드는 클래스에서 정의된 함수로, 클래스의 모든 인스턴스에서 사용할 수 있다. 스칼라에서 메소드를 호출하는 표준 방식은 메소드 이름 앞에 인스턴스 이름과 점(.) 구분자를 붙이는 삽입 표기법(infix dot notation)을 사용한다. <클래스 인스턴스>.<메소드>[(매개변수)]
  • 19. Scala 연산자표기법으로메소드호출하기 이 표기법을 더 정확한 용어로 말하자면 중위 연산자 표기법(infix operator notation)이 된다. <객체> <표기법> <매개변수>
  • 20. Scala 가독성있는 함수 작성하기 함수를 작성한다는 것은 이를 재사용한다는 것이다. 그리고 함수가 확실히 재사용될 수 있도록 하려면, 다른 개발자들이 읽기 쉽게 만들어야 한다. 읽기 쉬운 함수는 분명하고, 이해하기 쉬우며, 단순하다. 함수를 읽기 쉽게 만드는 방법에는 두 가지가 있다. 먼저, 함수를 짧고 이해하기 쉬운 이름으로 정하고, 분명하게 유지하는 것이다. 복잡한 함수를 한눈에 볼 수 있는 텍스트 페이지의 높이(40줄)보다 짧은, 더 단순한 함수로 나누어서 코드를 읽는 사용자가 함수를 보기 위해 스크롤을 위아래로 움직이지 않아도 되게 한다. 그리고 함수가 하고자 하는 일을 합리적으로 요약할 수 있는 이름을 사용하는 것이 좋다.