콜백 지옥( Callback Hell )이란 콜백이 하나 있을 때 그 콜백이 다른 콜백을 호출하고 호출된 콜백이 또 다른 콜백을 호출하는 방식의 콜백이 콜백을 호출하는 것이 꼬리를 물고 반복되는 안티 패턴을 뜻한다. 콜백 지옥에 대한 예시 Future.onComplete { case Success(_) => Future.onComplete { case Success(_) => Future.onComplete { case Success(_) => ... } } } 이러한 콜백 지옥은 코드를 추적하기가 어려워지고 리팩토링이나 유지보수가 힘들다는 단점을 가지고 있다. 스칼라의 Future를 통해 값을 얻은 후에 또 다른 Future에서 해당 값을 사용해야 할 때 콜백 지옥에 빠지게 되는데 이때 for comp..
ensuring은 조건에 맞으면 값을 반환하고 틀리면 java.lang.AssertionError: assertion failed 에러가 발생한다. 위의 에러가 발생하는 이유는 ensuring 내부적으로 assert 메서드를 사용하고 있기 때문이다. 사용 방법은 ( 조건 식이 참일 때 반환될 값 ) ensuring ( 조건 식 )와 같이 사용한다고 생각하면 된다. ex) 홀수 일 때 에러를 발생시키고 짝수면 해당 숫자를 반환하는 메서드 def test1(num: Int): Int = num ensuring (num % 2 == 0) 또는 def test2(num: Int): Int = num ensuring (_ % 2 == 0) ex) 홀수 일 때 에러를 발생시키고 짝수면 해당 숫자에 1을 더해 반환하..
부분 적용 함수란 기존에 있던 메서드의 파라미터를 미리 채워둔 함수를 새로 만드는 것을 의미한다. 아래는 부분 적용 함수의 예제들이다. ex 1) def numberAdd1(number1: Int)(number2: Int) = number1 + number2 val numberAdd2 = numberAdd1(2)_ // Int => Int println(numberAdd2(1)) // 3 ex 2) def numberAdd3(number1: Int)(number2: Int)(number3: Int) = number1 + number2 + number3 val numberAdd4 = numberAdd3(1)_ // Int => (Int => Int) println(numberAdd4(1)(1)) // 3 ..
sealed 제어자는 class/trait에 사용할 수 있으며 같은 파일에서만 상속받을 수 있도록 강제하기 위한 제어자이다. 만약 다른 파일에서 상속받으려 한다면 컴파일 시 아래와 같은 에러가 발생한다. Illegal inheritance from sealed trait 스칼라에서 사용되는 예는 Option이나 Try가 있다. 상속을 제어하기 위한 sealed 제어자가 있는 class/trait을 상속받은 자식은 어디서든 상속할 수 있기 때문에 보통 final 제어자와 같이 쓰거나 object로 생성한다. 스칼라에서 사용되는 예는 Option의 Some(final 제어자)과 None(object)이 있다. trait과 class의 차이점은 여러가지가 있을 수 있지만 두 가지 차이점을 작성해본다.(trai..
unapply 메소드는 객체에서 인수를 추출하기 위한 메소드로 패턴 매칭에서 자주 쓰인다. 아래는 패턴 매칭에서 사용하는 예시이다. object NumberClass { def apply(num: Int): Int = num def unapply(num: Int): Option[Int] = Some(num) } object Main extends App { val number: Int = NumberClass(100) number match { case NumberClass(n) => println(n) // 100 } } 패턴 매칭이 아니라 변수로 추출하여 사용할 수도 있는데 아래는 그 예시이다. object NumberClass { def apply(num: Int): Int = num def un..
apply 메서드를 선언하면 해당 객체의 인스턴스는 apply 메서드라고 명시하지 않아도 파라미터를 넣는 형식으로 사용할 수 있다. 예를 들어 class ApplyTestClass { def apply(): Int = 1 } 라고 정의한 후에 아래와 같이 코딩하면 val applyTestClass = new ApplyTestClass() println(applyTestClass()) 1을 출력하게 된다. 소괄호가 아닌 중괄호를 사용해도 되는데 이는 파라미터가 없으면 에러가 발생한다. val applyTestClass = new ApplyTestClass() println(applyTestClass{}) // Too many arguments error 때문에 class ApplyTestClass { de..
간단하게 var은 변수를 담기 위한 키워드고 val은 상수를 담기 위한 키워드며 def는 함수를 담기 위한 키워드다. var과 val의 차이점은 var은 변수이기에 변경이 가능하고 val은 상수이기에 변경할 수 없다. 예제) var number = 1 number = 2 // 정상 val number = 1 number = 2 // 에러 def에도 그냥 값을 담을 수 있어 def와 var, val에 대한 내용이 헷갈릴 수 있는데 차이점은 var, val은 선언을 할 때 값이 정해지며 def는 호출할 때 계산한 후 값을 반환한다. 예제) val numberA = 1 var numberB = 2 val printA = numberA + numberB def printB = numberA + numberB p..
동반 객체 혹은 짝 객체라고 불린다. 동반 객체는 class나 trait과 동일한 이름을 가지는 object가 Class나 trait과 같은 파일에 있을 때 동반 객체라고 한다. class LearnScala { } object LearnScala { // 동반 객체 } 혹은 trait LearnScala { } object LearnScala { // 동반 객체 } object는 class의 private 한 변수나 함수에 접근할 수 있다. class LearnScala { private val privateValue: Int = 1 } object LearnScala { val learnScala = new LearnScala def hardStudy: Int = { learnScala.private..
Option 타입은 값을 담고 있는 컬랙션으로 값의 존재 여부가 불확실하여 값이 존재할 수 있고 존재하지 않을 수 있다는 것을 나타내기 위한 타입이다. 하위 타입으로 "None"과 "Some"이 있는데 "None"은 값이 존재하지 않는다는 것을 나타내기 위한 타입이고 "Some"은 값이 존재한다는 것을 나타내기 위한 타입이다. * Option 생성 방법 Option(1)은 Some(1)을 Option(null)은 None을 반환한다. 이렇게 Option 타입을 사용하면 가질 수 있는 장점으로 Java와 비교해본다면 NullPointException 에러가 발생할 일이 없어진다는 것이다. 이제 Option이 있을 때와 없을 때를 비교를 해보자 Map을 자바에서 호출한다면 V를 반환하고 Scala에서는 Op..