문법
val <identifier> [:<type>] = <data>
var <identifier> [:<type>] = <data>
Type inference
#직접 자료형을 명세해주는경우
val x: Int = 20
val symbol : Char = "@"
#자료형을 명세해주지않고, 컴파일러가 직접 타입을 추론하게 하는것
val x = 20
val symbol = "@"
Variable vs Value
- Variable(변수)는 데이터를 재할당 하는것이 가능함
- Value(값)은 데이터를 재할당 하는것이 불가능함
- Value를 위주로 사용하면서, Variable을 최대한 적게 사용하는것이 스칼라의 프로그래밍 전략
연산자
== : 같은값을 참조하는것이 아니라, 데이터가 같은 값인지 확인하는 역할
& : 앞에 1개만 평가
&& : 앞뒤를 모두 평가
Tuple
- index는 1부터 시작한다
#1단위 튜플
val info = (5, "korben", true)
5 : Int
Korben : String
true : Boolean
#접근
val name = info._2
#2단위 튜플
val red = "red" -> "0xf"
red : String
0xf : String
=> (red, Oxf)
#2단위 튜플
val reversed = red._2 -> red._1
=> (0xf, red)
- 인덱싱할때는 identifier._ 형태로 접근한다
Expression
- 표현식은 { } 로 구성되어있다
- 값을 변경하지 못하고, 값을 반환할때 새로운 Data를 다른변수를 만들어서 저장한다는게 특징
val <식별자> [:<type>] = <표현식>
val <식별자> [:<type>] = <표현식>
#변경 전 (x에 큰 의미가없는상황)
val x = 5 * 20
val amount = x + 10
#변경1
val amount = {val x=5*20 ; x+10}
#변경2
val amount = {
val x = 5*20
x+10
}
- 변경 전에 사용했던 변수 x는 전체프로세스에서 큰 의미가 없었음
- 따라서 표현식 { } 내부에 변수x를 따로 넣고 계산하는 방식으로 진행했음
if else / match
if (부울식) <표현식>
#eg1
val max = if(x>y) x else y
#eg2
val max = x>y match{
case true => x
case fasle => y
}
#eg3
val status = 500
val message = status match {
case 200 => "ok"
case 400 => {
println("we called service incorrectly")
"error"
}
case 500 => {
println("service encounted error")
"error"
}
}
- 일반적으로는 if, else문을 많이 쓴다고 하지만
- 함수형 프로그래밍에서는 match를 권장한다고 한다
- case가 400,500인 경우에는 println으로 메세지를 출력하고, message 값에 “error”를 반환한다
List
- head : 맨앞에 있는 값 1개
- tail : 맨앞을 제외한 나머지 리스트
- isEmpty : 비었나?
- 값 :: 리스트 방식으로 앞에 추가함
//리스트를 하나 만듬
val temp=List(3,4,5)
temp.isEmpty //false
temp.head // 3
temp.tail // List(4,5)
//리스트 앞에 추가하는 경우
2 :: temp //(2,3,4,5)
1 :: 2 :: temp //(1,2,3,4,5)
3::4::5::Nil == temp //내부적으로 List는 Nil이라는 빈객체의 앞부분에 더하는것임
Nil.isEmpty
temp.size
temp(0)
temp(1)
temp(2)
temp.contains(2) // 값이 들어있으면 true, 아니면 false
temp.indexOf(3) // 해당 값이 몇번 인덱스에 들어있는지
for 문
val numbers = List(32,95,24,21,17)
var total = 0
for (i <- numbers) {
total += i
}
map reduce
- map : 단일 리스트 요소 → 다른값 타입으로 전환
- reduce : 두개의 단일리스트 요소 → 단일 항목으로 전환
val colors = List("red","green","blue")
colors.map((c:String) => c.size) #3,5,2
val numbers = List(32,95,24,21,17)
numbers.reduce((a:Int, b:Int) => a+b) #189
'DATA Engineering > Scala' 카테고리의 다른 글
스칼라에서 => 연산 (0) | 2023.09.08 |
---|---|
Mac에서 Scala 설치하기 (0) | 2023.07.22 |
스칼라 공부 자료 (0) | 2022.10.02 |