2. Scala
스칼라는 이 언어가 만들어진 목적에 부합하는 표현인 확장가능한 언어(SCAlable LAnguage)의 약자다.
2003년 마틴 오더스키 교수와 EPFL의 연구진은 자바 가상 머신(JVM, Java Virtual Machine) 플랫폼에서
함수형 프로그래밍과 객체지향 프로그래밍을 동시에 지원하는, 성능이 우수한 환경을 제공하기 위해 이
언어를 만들었다.
3. Scala 리터럴, 값, 변수 타입
- 리터럴(literal) : 숫자 5, 문자 A, 텍스트 ‘hello world’ 처럼 소스 코드에 등장하는 데이터
- 값 : 값은 불변의 타입을 갖는 저장 단위이다. 정의될 때 데이터가 할당될 수 있지만 절대 재할당될
수는 없다.
- 변수: 변수는 가변의 타입을 갖는 저장 단위다. 변수는 정의 시 데이터를 할당할 수 있으며, 언제라도
데이터를 재할당할 수도 있다.
- 타입 : 타입은 여러분이 작업하는 데이터의 종류로, 데이터 정의 또는 분류를 의미한다.
4. Scala
값
값(value)은 불변의, 타입을 갖는 스토리지 단위이며, 관례적으로 데이터를 저장하는 기본 적인 방법이다.
val <식별자>[: 타입] = <데이터>
ex) val x: Int = 20
값은 이름과 할당된 데이터를 모두 필요하지만, 명시적 타입이 있어야 하는 것은 아니다. 타입이 지정되지
않았다면, 스칼라 컴파일러는 할당된 데이터를 기반으로 타입을 추론한다.
5. Scala
변수
컴퓨터 과학에서 용어 변수(variable)는 일반적으로 값을 저장하고 그 값을 가져올 수 있도록 할당되거나
예약된 메모리 공간에 대응하는 유일한 식별자를 의미한다. 메모리 공간이 예약되어 있는 동안에는
새로운 값을 계속 할당할 수 있다. 따라서 메모리 공간의 내용은 동적이며 가변적(variable)이다.
6. Scala
튜플
튜플(tuple)은 둘 이상의 값을 가지는 순서가 있는 컨테이너로, 여기에 포함된 각각의 값은 서로 다른 타입을 가질 수 있다. 테이블의 단일 행을 튜플로 간주하는 관계형 데이터베이스로 작업해본 경험이 있다면 이
용어가 익숙할 것이다.
튜플은 값을 논리적으로 분류할 필요가 있고, 그렇게 분류한 값들을 하나의 응집된 단위로 표현하는 데 유용하다. 하지만 리스트와 배열과는 달리 튜플의 요소들을 반복할 수 없다. 튜플은 단지 하나 이상의 값을 담기
위한 컨테이너다.
튜플 생성
(<값 1>, <값 2>[, <값 3>...])
ex) val info = (5, “Korben”, true)
info: (Int, String, Boolean) = (5, Korben, true)
val name = info._2
name: String = Korben
val red = “red” -> “0xff0000”
red (String, String) = (red, 0xff0000)
7. Scala 표현식과조건문
표현식(expression)
실행 후 값을 반환하는 코드 단위를 말한다.
val <식별자>[: <타입>] = <표현식>
표현식 블록
중괄호 { } 를 사용하여 하나로 묶어 단일 표현식 블록을 만들 수 있다.
표현식 블록에 국한된 값과 변수를 포함한다.
9. Scala 매치 표현식
매치 표현식은 단일 입력 항목을 평가하여처음으로‘일치하는(matched)’ 패턴이 실행되고 그 값이 반환되는 C와 자바의 ‘switch’문과 유사하다.
스칼라의 매치 표현식은 C와 자바의 ‘switch’문 처럼 default로 또는 와일드카드로‘모두 잡아내는(catch-all)’ 패턴을 지원한다.
반면 매치 표현식은 0개 또는 단 하나의 패턴만 매칭할 수 있으므로 여러 개의 패턴을 한번에 순서대로 매칭하는 형태의 제어 이동(fall-through)이 없다.
스칼라의 매치 표현식은 타입, 정규표현식, 숫자 범위, 데이터 구조 내용 같은 다양한 항목으로 매칭할 수 있을 만큼 놀라울 정도로 유연한 방법이다.
10. Scala 매치 표현식
패턴 가드를 이용한 매칭
구문:패턴 가드
case <패턴> if <부울식> => <하나 이상의 표현식>
11. Scala 매치 표현식
패턴 변수를 이용한 타입 매칭
case <identifier>: <type> => <one or more expressions>
패턴 변수를 명명하는 데 있어 유일한 제약사항은반드시 소문자로 시작해야 한다는 것이다.
스칼라가 다형적(polymorphic)인 타입을 지원한다는사실이 매치 표현식 사용법의 단서가 될 것이다.
12. Scala 루프
루프(loop)는 하나의 작업을 반복적으로수행하는 것을 나타내는 용어로, 일정 범위의 데이터를 반복하거나부울식이 false를 반환할 때까지 반복하는
것이 여기에 해당한다.
스칼라에서가장 중요한 루프 구조는 for 루프로, for-컴프리헨션(for-comprehension)이라고 한다.
for 루프는 일정 범위의 데이터를 반복하며, 반복할 때마다 표현식을 실행한다. 그리고 선택적으로그 실행문의 반환값들을컬렉션(collection)으로
돌려준다. 이 for 루프는 반복문 중첩, 필터링, 값 바인딩을 지원하는 등 맞춤 변경(customiziong)이 매우 쉽다.
<시작 정수값> [to|until] <끝 정수값> [by increment]
다음은 for 루프의 기본 정의를 나타낸다.
구문 for 루프로 반복하기
for(<식별자> <- <반복자>) [yield] [<표현식>]
yield는 선택사항이다. 표현식과 함께 yield가 쓰였다면 호출된 모든 표현식의 반환 값은 컬렉션으로반환된다.
14. Scala 루프
반복자 가드
매치 표현식에서패턴 가드와 마찬가지로, 반복자 가드(iterator guard) 또는 필터(filter)는 반복자에 if 표현식을 추가한다.
반복자 가드를 사용하면 if 표현식이 true를 반환할 때에만 반복을 수행할 것이다.
for(<identifier> <- <iterator> if <Boolean expression) …
15. Scala 루프
값 바인딩
for 루프에서 일반적인 전략은 현행 반복을 기반으로 하는 표현식 블록 내에 임시 값 또는 변수를 정의하는 것이다.
스칼라에서이에 대응하는 다른 방법으로는for 루프 정의에서 값 바인딩(value binding)을 하는 것이다.
for (<식별자> <- <반복자> ; <식별자> = <표현식> ) …
16. Scala 루프
while과 Do/While 루프
for 루프와 함께 스칼라는 부울식이 거짓(false)을 반환할 때까지 문장을 반복하는 ‘while’과 ‘do/while’ 루프를 지원한다.
하지만 이 루프는 스칼라에서for루프만큼 보편적으로사용하지는않는데, 이 루프가 표현식이 아니며 값을 생성(yield)하는 데에는 사용할 수 없기
때문이다.
while (<부울식>) 표현식
17. Scala 요약
표현식 관점에서 작업하는 법을 배우는 것이 유용하고 가치 있는 기법이다.
코드를 작성할 때 표현식을 고려하고, 그 표현식을 둘러싼 애플리케이션을구조화해야한다.
표현식을 작성할 때 주의해야 할 중요한 원칙은
(1) 여러분의 코드를 표현식으로어떻게 구조화할 것인지,
(2) 어떻게 여러가지의표현식이 반환값을 유도할 것인지
(3) 그 반환값으로무엇을 할 것인지다.
표현식은 코드 구조의 기반이 되는 것 외에도 스칼라 구문의 기반이기도하다.
표현식과 표현식 블록의 기본 특성과 구문을 이해하는 것이 언어의 나머지에 대한 구문을 습득하는 핵심 요소가 될 것이다.