독서관련/Programming in Scala

Scala CH07. 내장 제어 구문

ColinKang 2020. 3. 29. 13:16
아래의 글은 마틴 오더스키,렉스 스푼,빌 베너스 공저 / 오현석,이동욱,반영록 공역, 『Programming in Scala 3/e』,에이콘출판사(2017), CH01의 내용을 기반으로 작성하였습니다.

optional

if, while, for, try, match, 함수 호출

 

if : 값 리턴 가능

 

val filename =

if (!args.isEmpty) args(0) else "default.txt"

 

루프의 결과 타입은 Unit

유닛 값 = ()

 

while, do while

 

for 표현식

컬렉션 이터레이션

 

필터링

 

for {

file ← fileList

if file.isFile

if file.getName.endsWith(".scala")

} println(file)

 

중첩 이터레이션

 

for {

file ← fileList

if file.getName.endsWith(".scala")

line ← fileLines(file)

if line.trim.matches(pattern)

} println(file + ":" + line)

 

for 중에 변수 바인딩

 

for {

file < - fileList

line < - lineList(file)

trimmedLine = line.trim

if trimmedLine.matched(pattern)

} println(line)

 

새로운 컬렉션

def scalaFileList = 

for {

file < - fileList

if file.getName.endsWith(".scala")

} yield file

 

try 표현식으로 예외 다루기

예외 발생 : throw new IllegalArgumentException

throw의 타입은 Nothing 이라는 타입

try catch finally 도 결과는 값

 

try  안의 값이 최종 값

finally는 예외처리 과정

 

match 표현식

val firstArg = if (args.length > 0) args(0) else ""

 

firstArg match {

case "salt" => println("p1")

case "chips" => println('"p2")

case _ => println("default")

}

 

자바와 다른 점 : break 없음.

상수는 다 사용 가능, 즉 문자열도 됨.

 

스칼라에서는 break와 continue 제외

 

break 유사 : scala.util.control.Break 클래스의 break 메소드 : breakable지정한 곳으로 이동

 

변수 : 지역변수

자바와 다르게 동일 변수 하위 스코프에서 중복 정의 가능, 단 상위 스콥 변수는 shadow 됨

 

object PrintMultiTable extends App {

  def printMultiTable() = {

    var i = 1

    while (i <= 10) {

      var j = 1

      while (j <= 10) {

        var prod = (i * j).toString

        var k = prod.length

        while (k < 4) {

          print(" ")

          k += 1

        }

        print(prod)

        j += 1

      }

      println()

      i += 1

    }

  }

  printMultiTable()

 

  def makeRowSeq(row:Int) =

    for (col <- 1 to 10) yield {

      val prod = (row * col).toString

      var padding = " " * (4 - prod.length)

      padding + prod

    }

  def makeRow(row: Int) = makeRowSeq(row).mkString

 

  def multiTable = {

    val tableSeq =

      for (row <- 1 to 10)

        yield makeRow(row)

    tableSeq.mkString("\n")

  }

  println(multiTable)

}