스칼라 언어 기초 - 기본 문법과 필수 기능 소개 (main method, 변수와 함수 선언, 스칼라 문법 특징, 제어 구조)
View: 201
0
0
작성자: 달빛제이크
카테고리: Scala Language
발행: 2024-05-19
수정
2024-06-21
안녕하세요. 달빛제이크입니다.
오늘은 스칼라 언어로 코딩을 하기 위해서 어떤 것들을 배워야 할지 간단히 문법과 기능들에 대해 나열해 보겠습니다.
스칼라 언어를 공부하고자 하시는 분들께 전체적인 Outline을 보여드리고 학습의 순서를 정하시는 데 도움이 되기를 바랍니다.
1. main method
main method는 프로그램을 작성하는 데 있어서 시작 지점이기 때문에 main method 만드는 법을 먼저 알고 있어야 합니다.
대체적으로 프로그램을 실행할 때 인수를 받고 Return Type을 반환하는 형태를 기본으로 해서, 정적 타입 인지 동적 타입 인지, 절차 지향 언어인지 객체 지향 언어인지 여부에 따라 선언문의 형식과 위치가 달라집니다.
main method를 사용하지 않고 자유롭게 코딩을 하며 스칼라 언어를 공부하고 싶으신 분들은 Script를 통해 자유로운 형식으로 코드를 작성할 수 있습니다.
main method에 대해 더 자세한 내용은 https://code-snippet.kr/blog/all/41 글을 참고하시기 바랍니다.
2. 변수와 함수 선언
함수형 언어는 기본적으로 값이 변하지 않고, 함수의 기본 개념인 동일한 입력 값에 단일 출력 값을 보장합니다.
스칼라 언어에서는 기본적으로 함수형 프로그래밍 방법론을 지향하지만, 문제 해결에 있어서 다양한 Solution을 적용할 수 있도록 기존의 문법 체계도 지원하고 있습니다.
변수를 선언하기 위해서 기본적으로 val, var 2개의 키워드를 제공합니다. 하나는 값을 바꿀 수 없는 변수를 선언할 수 있고, 다른 하나는 값을 변경할 수 있습니다.
스칼라에서는 변수 선언과 초기화를 동시에 진행 합니다.
// 값을 바꿀 수 없는 함수형 스타일의 변수 선언
val a = 5
a = 4 // Type Error 발생
// 값을 바꿀 수 있는 변수 선언
var b = 4
b = 5 // 정상적으로 실행됨.
함수를 작성할 때는 입력 값에 대한 일관된 출력 값을 보장하도록 작성해야 합니다.
함수에 대해서는 def 키워드를 사용하여 다음과 같이 선언 합니다.
// 함수를 선언합니다.
def sum(a: Int, b: Int) = a + b
val c = sum(3, 4) // val c: Int = 7
3. 스칼라 기본 문법 특징
앞에서 변수와 함수 선언에서 볼 수 있듯이 스칼라에서는 세미콜론(;)을 사용하지 않습니다.
구문의 끝은 컴파일러가 알아서 판단해 줍니다.
또한 정적 타입 언어임에도 불구하고 타입을 선언한 부분은 함수의 파라미터 부분 밖에 없습니다.
이것은 스칼라가 타입 추정 기능을 사용해서 알아서 타입을 추정하기 때문에 동적 타입 언어처럼 코드를 간결하게 작성할 수 있습니다.
이러한 특징은 C 언어를 비롯한 여타의 언어와 같이 타입 선언부를 변수 이름 앞에 두지 않고 콜론 (:)을 구분자로 해서 변수 이름의 뒤에 두는 형식으로 문법에 반영되었습니다.
// 불변(Immutable) 변수 선언 및 초기화.
// 초기화 값이 5이고 Integer가 명확하므로 타입 지정을 생략할 수 있습니다.
val a: Int = 5
val a = 5
// 가변(mutable) 변수 선언 및 초기화.
// 초기화 값이 3이고 Integer가 명확하므로 타입 지정을 생략할 수 있습니다.
var b: Int = 3
var b = 3
// 함수의 Parameter와 Return 값의 타입을 선언합니다.
// Integer + Integer는 Integer이므로 Return Type을 생략할 수 있습니다.
// Parameter type은 추정이 불가능하기 때문에 항상 Type을 지정합니다.
def sum(a: Int, b: Int): Int = a + b
def sum(a: Int, b: Int) = a + b
스칼라 코드의 구조를 담당하는 중괄호에 대해서는 Scala 3.0에서 Python의 들여쓰기 기반 문법이 도입되면서 병행 사용이 가능하게 되었습니다.
따라서 중괄호와 들여쓰기를 적절하게 선택해서 사용하면 코드의 가독성을 높이고 유지 보수를 용이하게 하는 데 도움이 될 것으로 기대하고 있습니다.
4. 제어 구조 (Control Structure)
스칼라 언어에서 지원하는 제어 구조는 if, while, for, try, match가 있습니다.
스칼라가 함수형 프로그래밍 언어이다 보니 함수 리터럴을 사용할 수 있고, 함수 자체를 인수로 넘길 수 있기 때문에 소수의 제어 구조로도 효과적인 논리 구조를 만들 수 있습니다.
이 중 while 문은 Return 값이 Unit (값이 없고 Side Effect 만 존재하는 Type으로 정의)이기 때문에 함수형 프로그래밍 언어에서는 var와 함께 잘 사용하지 않는 문법입니다. 다만 명령형 프로그래밍 문법을 유지하면서 다양한 프로그래밍 스타일을 허용하고, 성능 최적화 및 간단한 반복 작업에 사용하기 위해 남겨두었고 각 제어 구조에 대해 세부 구현을 설명할 때 사용하기도 합니다.
각각의 제어 구조에 대해 간단히 구현해 보았습니다. Procedure인 while 문을 제외하고 if, for, try, match 모두 expression이기 때문에 기존 프로그래밍 방식과 동일하게 분기에 사용할 수 있고 변수에 저장도 할 수 있습니다.
// if 문
val a = 3
val b =
if a == 3 then true
else false
println(b) // true
// while 문
var a = 0
var b = 0
while a <= 10 do
b = b + a
a += 1
println(b) // 55
// for 문
val a =
for num <- 1 to 10 yield num
println(a) // Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
for num <- 1 to 10 do print(num.toString + " ") // 1 2 3 4 5 6 7 8 9 10
// try 문
import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException
try
val f = new FileReader("input.txt")
catch
case ex: FileNotFoundException => println("FileNotFound!!")
case ex: IOException => println("IOError!!")
finally
file.close()
// match
val a = "cake"
a match
case "cake" => println("Cake")
case "bread" => println("Bread")
case _ => println("What??")
위의 예제는 각각의 제어 구조를 통해 구현할 수 있는 기능들 중에 극히 일부를 가장 간단하게 표현한 것입니다.
제어 구조를 효과적이고 적절하게 사용하기 위해서는 각각에 대해 특징과 기능들을 명확하게 이해해야 합니다.
특히 for 문과 match 문에 대해서는 다양한 기능들을 제공하고 자주 사용하는 구조이기 때문에 좀 더 자세히 공부하시길 바랍니다.
이 글을 쓰기 시작할 때는 스칼라의 문법 및 기능에 대해 간단히 언급 하는 수준으로, 전체적으로 어떤 것들이 있는지를 살펴 보려 했는데, 막상 설명이 붙게 되니까 글이 길어지고 기본 문법에서 벗어나지를 못했습니다.
이 글은 여기서 마무리 하고 다음 글에서 이어서 진행하도록 하겠습니다.
감사합니다.
