자바스크립트를 허용해주세요.
[ 자바스크립트 활성화 방법 ]
from Mohon Aktifkan Javascript!
 

[Scala] 4장 - 함수형 프로그램 (FP) 패러다임

728x90

✅ 1. 순수 함수 (Pure functions)

순수 함수는 같은 입력에 같은 출력, 외부 상태를 변경하거나 부수효과(side-effect)를 만들지 않는 함수 입니다. 부수효과는 애플리케이션의 경계(I/O, DB, println 등)로 몰아두고 내부 로직은 순수하게 유지하면 테스트와 재사용성에 좋습니다.

object PureFunctionExample {
    // 순수 함수 
    def add(a: Int, b: Int): Int = a + b;

    // 비순수 (부수효과 포함) 예시 - 테스트/재사용성 떨어지는 코드
   def addAndPrint(a: Int, b: Int): Int = {
     val r = a + b
     println(s"result = $r") // 부수 효과
   }
   
   
   def main(args: Array[String]): Unit = {
    var result1 = add(3,5)
    var result2 = add(3,5)

    println(s"result1 = $result1") // result1 = 8
   }
}
}

✅ 2. 고차 함수 (Higher-order functions)

함수를 인자로 받는(또는 반환하는)함수입니다.

object HigerOrderExample {
    // 함수를 인자로 받음
    def applyTwice(f: Int => Int, x: Int): Int = f(f(x))

    def main(args: Array[String]): Unit = {
        val double = (n: Int) => n * 2
        val result = applyTwice(double, 5)
        println(s"applyTwice(double, 5) = $result") // applyTwice(double, 5) = 20
    }
}

✅ 3. 익명 함수 (Anonymous Function, Lambda)

익명 함수는 이름 없이 즉석에서 정의할 수 있는 함수로서 더욱 축약된 문법을 가집니다.

object AnonymousFunctionExample {
   def main(args: Array[String]): Unit = {
     val nums = List(1, 2, 3, 4); 
     val doubled = nums.map(n => n * 2)
     println(s"doubled = $doubled") // doubled = List(2, 4, 6, 8) 


     // 더 축약된 문법
     val tripled = nums.map(_ * 3)
     println(s"tripled = $tripled") // tripled = List(3, 6, 9, 12)
   }
}

✅ 4. 컬렉션 함수(map, filter, reduce) 

object CollectionFunctionExample {
    def main(args: Array[String]): Unit = {
        val nums = List(1, 2, 3, 4, 5)

        val squared = nums.map(n => n * n)
        println(s"squared = $squared") // squared = List(1, 4, 9, 16, 25)

        val evens = nums.filter(_ % 2 == 0)
        println(s"evens = $evens") // evens = List(2, 4)

        val sum = nums.reduce(_ + _)
        println(s"sum = $sum") // sum = 15
    }
}

✅ 5. 불변성 (Immutable & val 중심 코딩)

불변성은 val을 기본으로 사용하며 var은 거의 사용하지 않습니다. Scala의 기본 컬렉션은 immutable이 기본(Scala 2.13/3 기준 List, Vector, Map등이 immutable)

object ImutabilityExample {
    def main(args: Array[String]): Unit = {
        val nums = List(1, 2, 3)
        // nums(0) = 10 // 🚫 불변 컬렉션 수정 불가

        val newNums = nums :+ 4 // 새로운 리스트 생성
        println(s"원본: $nums") // 원본: List(1, 2, 3)
        println(s"수정본: $newNums") // 수정본: List(1, 2, 3, 4)
    }
}

 ✅ 6. Option, Some, None

Null 대신 안전하게 값을 다루는 방법으로 Option[T]는 값이 있거나(Some)없거나(None)를 표현하며 Java의 null을 만나면 Option(null)을  사용해 None으로 안전하게 리핑할 수 있습니다.

object OSNExample {
    def findName(id: Int): Option[String] = {
        val names = Map(1 -> "Alice", 2 -> "Bob")
        names.get(id)  // 값이 없으면 None
    }

    def main(args: Array[String]): Unit = {
        val name1 = findName(1)
        val name2 = findName(3) 

        println(s"name1 = $name1") // name1 = Some(Alice)
        println(s"name2 = $name2") // name2 = None

        // 안전한 처리
        println(name1.getOrElse("Unknown")) // Alice 
        println(name2.getOrElse("Unknown")) // Unknown
    }
}

 

 

GitHub - Koras02/scala-bloging: https://thinky.tistory.com/category/Back-End/Scala

https://thinky.tistory.com/category/Back-End/Scala - Koras02/scala-bloging

github.com

 

728x90
LIST