ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 챕터[20] OOP와 FP의 조화 : 자바와 스칼라 비교
    모던자바인액션 2020. 10. 22. 01:29

    서론

    스칼라란?

    자바와 스칼라 관계

    클래스와 트레이트


    스칼라란?

    • 스칼라는 객체지향과 함수형 프로그래밍의 혼합한 언어이며, JVM에서 동작하기에 자바의 클래스를 사용할 수 있으며 마찬가지로 자바에서 라이브러리 추가만으로 스칼라 코드를 호출하여 사용할 수 있다.

    • 스칼라에서의 모든 데이터 타입은 객체로 취급한다.

    • 스칼라에서의 변수는 일반 선언 var과 상수 선언인 val이 존재한다.

    스칼라 사용하기

    • 문자열 보간법

    • 컬렉션 사용

    import scala.io.Source
    
    class ScalaExam {
      object Beer {
        def main(arg : Array[String]): Unit = {
          var n : Int = 2;
          while( n <= 6) {
            println(s"Hello ${n} bottles of beer")
            n += 1
          }
          // 2 ~ 6 foreach (n)
          2 to 6 foreach { n => println(s"Hello ${n} bottles of beer")}
    
          // Map<String, Int>
          val authorsToAge = Map("Raoul" -> 23, "Mario" -> 40, "Alan" -> 53);
    
          // List<String>
          val authors = List("Raoul", "InWoo", "Alan")
    
          // Set<Int>
          val numbers = Set(1, 2, 3, 4)
          // numbers 요소와 9 요소를 포함한 새로운 Set 생성
          val newNumbers = numbers + 9
    
          // filter : 길이가 10 이상인 행만 가져온 뒤
          // Map : 대문자로 변경한다.
          val fileLines = Source.fromFile("data.txt").getLines().toList
          val linesLongUpper = fileLines.filter(l => l.length() > 10)
                              .map(l => l.toUpperCase())
    
          // 병렬 비슷하게 parallel In Scala
          // val linesLongUpper2 = fileLines.par filter (_.length() > 10) map(_.toUpperCase())
    
          // option == java.optional
          /*
          def getCarInsuranceName(person: Option[person], minAge: Int) =
              person.filter(_.getAge() >= minAge)
              .flatMap(_.getCar)
              .flatMap(_.getInsurance)
              .map(_.getName)
              .getOrElse("Unknown")
           */
        }
      }
    }
    

    함수

    스칼라의 함수는 어떤 작업을 수행하는 일련의 명령어 그룹이다. 명령어 그룹을 쉽게 추상화 할 수 있는 것도 함수 덕분이며 동시에 함수는 함수형 프로그래밍의 중요한 기초석이다.

    1. 함수 형식 : 함수 형식은 3장에서 설명한 자바 함수 디스크립터의 개념을 표현하는 편의문법(함수형 인터페이스에 선언된 추상 메서드의 시그니처를 표현하는 개념)

    2. 익명 함수 : 자바의 람다 표현식과 달리 비지역 변수 기록에 제한을 받지 않는다.

    3. 커링 지원 : 여러 인수를 받는 함수를 일부 인수를 받는 여러 함수로 분리하는 기법

    스칼라

    1. 익명함수 지원

    2. 일급 함수
      • 스칼라의 함수는 일급값이기에 String, Integer 처럼 함수를 인수로 전달하거나, 결과로 반환하며 변수에 저장할 수 있다.

    3. 클로저

      • 자바의 람다에서 사용하는 변수는 상수처리 혹은 그렇게 준하여 사용해야 하지만 scala 에서는 상관없이 사용가능

    4. 커링 지원

    5. 게터, 세터, 생성자 암시적으로 생성

    6. 트레이트

      • 자바의 인터페이스이며 디폴트 메서드 사용가능

      • class 뿐만 아니라 객체 인스턴스화 과정에서도 조합가능

    댓글

Designed by Tistory.