콘텐츠로 이동

2022 12 29

2022-12-29

스칼라 기초 맛보기

  • 참고: https://www.youtube.com/watch?v=C6B4EPbnvfo&list=PL8kmk2VivDmRueOZS4aKm0xUlYp0frQQS
  • 참고: https://docs.scala-lang.org/tour/tour-of-scala.html
  • [What is Scala]
    • OOP + FP 둘 모두 사용
    • Pure OOP
      • 모든 값은 객체다
      • 클래스, 속성, mixin based composition, 다중 상속 등을 지원
    • Functional
      • 모든 함수가 값이다
      • 익명함수 정의에 간편한 문법
      • 고차함수, 중첩함수, currying(?) 도 지원한다네
      • Singleton Object가 있어 클래스 멤버가 아닌 여러 함수를 그룹지을 수 있다
    • 정적 타입 언어
      • 정적 추상화, 안전함, 일관성으로 타입 강제
      • 제네릭
      • variance annotation
      • upper/lower bound
      • inner class
      • abstract type member: abstract method?
      • compound type: 타입 조합
      • explicitly typed self reference
      • implicit parameter
      • conversions
      • polymorphic methods
    • 확장 가능성
      • DSL(?)을 만들기 쉽다네
      • DSL: 특정 도메인에 특화된 언어를 말함
        • 특정 영역의 문제 해결에는 그 영역에 맞는 특화된 도구를 사용하자
    • Scala Interoperates
      • 자바 런타임과 잘 동작함
  • [맛보기 (Scala 2 기준)]

    • Value: 재할당 금지, 불변 객체
    • Variable: 재할당 가능, 변수로 동작
      val x: Int = 1+1;
      var y = 2;
      y = 3;
      
    • Block: 코드 블럭안에 expression 전달 가능. 전체의 결과는 마지막 줄(이게 리턴값임)을 반환
      println({
        var test = 1;
        test = 10;
        test;
      })
      
    • Functions: 스칼라가 함수를 일급 객체로써 변수에 정의하는 방법은 다음과 같다
      var plusOne = (x: Int) => x + 1;
      println(plusOne(1));
      
      var plus = (x: Int, y: Int) => x + y;
      println(plus(1, 2));
      
    • Method: 함수를 그 자체로 선언하려면 이렇게
      def add(x: Int, y: Int): Int = { 
        x + y
      }
      println(add(1, 2))
      
      // 놀랍게도 이딴것도 가능
      def addThenMultiply(x: Int, y: Int)(multi: Int) = (x + y) * multi;
      println(addThenMultiply(1, 2)(3));
      
    • Class: 생성자를 써주면서 만드는데... 여러 생성자를 통한 객체 생성은 어찌하는지 약간 궁금쓰
      class Greeter(prefix: String, suffix: String) {
        // 반환할게 없다면, Unit을 써주세요 (void와 동일)
        // Unit은 타입이고 싱글톤이며 ()로 표현됨
        def greet(name: String): Unit
      }
      
    • Case Class: 불변이며, value 값 자체로 비교되는 Value Object
      • 별도의 비교 연산자 없이도 내부 객체의 값이 같다면 같은 객체로 반환(동등성인지 동일성인지는 확인해봐야 할 듯)
      • new 없이 생성
        case class Point(x: Int, y: Int);
        val point = Point(1, 2)
        val samePoint = Point(1, 2)
        val differentPoint = Point(2, 2)
        
        if (point == samePoint) {
          println("same");
        }
        
        if (point != differentPoint) {
          println("different");
        }
        
    • Object: 자기 자신 클래스의 싱글턴 인스턴스 (오로지 하나의 인스턴스만 만드는 클래스 정도 같음)
      object IdFactory {
        private var counter = 0;
        def create(): Int = {
          counter += 1
          counter
        }
      }
      
      println(IdFactory);
      println(IdFactory.create());
      
    • Trait: field, method 담고 있는 타입
      • abstract class, interface 느낌이 나는 친구
      • multiple trait 조합될 수도 있다니, 다중 상속을 지원하나 봄
        trait GreeterTrait {
          def greet(name: String): Unit
        }
        
        class DefaultGreeter(prefix: String, postfix: String) extends GreeterTrait {
          override def greet(name: String): Unit = {
            println(prefix + name + postfix)
          }
        }
        
        val defaultGreeter = new DefaultGreeter("Hi! ", " Joel!");
        defaultGreeter.greet("Developer");