# Scala

### 1. 스칼라 언어는 누가 만들었을까?

[Martin Ordersky](https://en.wikipedia.org/wiki/Martin_Odersky) 라는 스위스 [어느 대학](https://en.wikipedia.org/wiki/%C3%89cole_Polytechnique_F%C3%A9d%C3%A9rale_de_Lausanne)의 교수님이 만들었음.

### 2. 스칼라의 특징은?

* JVM 위에서 작동하는 언어 (Java와 호환)
* 사용하다보니 Java에 비해서 작성해야 하는 코드의 양이 많이 줄어든다.

{% code title="HelloJava.java" %}

```java
public class HelloJava {
  public static void main(String[] args) {
    System.out.println("Hello, Java!");
  }
}
```

{% endcode %}

{% code title="HelloScala.scala" %}

```scala
object HelloScala {
  def main(args: Array[String]): Unit = {
    print("Hello, Scala!")
  }
}
```

{% endcode %}

여기까지만 적었다면 분명 Java와 Scala 별로 차이 없네\~ 하고 끝날꺼 같아서 진짜 줄어든 형태를 적어본다.

{% code title="HelloScala2.scala" %}

```scala
object HelloScala2 extends App {
  print("Hello, Scala2")
}
```

{% endcode %}

* Java보다 규칙이 단순하다.

예를들면, 세미콜론 생략, 인자가 없는 함수 호출 시 () 생략 가능.

* 컴파일러의 Type 추론 능력이 뛰어나다.
* 패턴 매칭으로 사용하면 편한점이 있다.

```scala
val test = "Hello, Scala2"

test match {
  case "Hello, Scala" => print("wrong")
  case "Hello, Scala2" => print("yes!")
  case _ => print("????")
}
```

* 변수의 선언이 간편하다.

```scala
val test1: Int = 1              <- Java의 final 변수와 같다. 나중에 수정이 불가능
var test2: Int = 2              <- 수정 가능

test1 = 3                       <- 오류 발생
test2 = 4
```

*
* Java 의 Pojo 객체처럼 데이터만 담을 수 있는 객체를 정의해서 자료형으로 쓰기 편하다.\
  (이런 객체를 이용하여 위에서 적었던 패턴 매칭에 활용할 수도 있다.)

{% code title="ArticleTest.scala" %}

```scala
case class Article(id: Long, title: String, content: String)

object ArticleTest extends App {
  val article = Article(1, "title", "content")

  print(article)
}
```

{% endcode %}

다양한 내용들이 더 있다. 많이 사용되는곳이라던지...\
하지만!\
글이 길어지면 읽지 않는 사람이 있다고 들었으니, 여기까지만 알아보도록 한다.

### 3. 스칼라에 대해서 더 알아보고 싶다면?

[스칼라 공식 홈페이지 문서](https://docs.scala-lang.org)

[스칼라 시작하기](https://www.scala-lang.org/documentation/your-first-lines-of-scala.html)

[자바 개발자를 위한 스칼라 튜토리얼](https://docs.scala-lang.org/ko/tutorials/scala-for-java-programmers.html)
