본문 바로가기

Programming/Scala26

Evaluation Strategies and Termination - Coursera 강의 ppt 번역 Call-by-name, Call-by-value and termination 지난 시간에 call-by-name과 call-by-value 전략에 대해 간략히 살펴보았다.그런데 만약 종료 조건이 보장이 안된다면 어떻게 할까? 아래의 명제는 반드시 보장이 된다. - 만약 call-by-value가 종료된다면, call-by-name 역시 종료가 된다. Scala's evaluation strategy Scala는 일반적으로 call-by-value를 실행한다.그러나 만약 함수 파라미터의 타입이 =>로 시작한다면 이는 call-by-name을 실행하겠다는 의미가 된다.ex)def constOne(x: Int, y:=> Int) = 1 constOne(1 + 2, loop) Vs constOne(loop, .. 2015. 12. 24.
Elements of Programming - Coursera 강의 ppt 번역 Elements of Programming 대다수의 중요한 programming 언어에서는 아래의 요소들을 제공한다. - 가장 단순한 element를 표현할 수 있는 기본 표현법- 표현을 결합하기 위한 방법들- 추상 표현을 하기 위한 방법들 The Read-Eval-Print Loop Functional programming은 계산기의 사용과 약간 비슷하다. interactive shell(REPL )은 표현을 쓰고 값을 리턴할 수 있게 해준다.Scala REPL은 단순하게 타이핑 함으로써 시작할 수 있다. > scala Expressions 아래 예제는 REPL을 이용하여 interaction하는 단순한 방법이다. scala> 87 + 145232 Functional programming languag.. 2015. 12. 23.
Functional Programming Principles in Scala - Coursera 강의 ppt 번역 Programming Paradigms Paradigm : 과학적으로 paradigm은 구별된 개념 또는 몇몇의 과학적 규율 내에서의 생각의 패턴등을 말한다.주요 programming paradigms은 - imperative programming- functional programming- logic programming 을 들 수가 있으며, 이와는 독립적으로 - object-oriented programming 을 들 수가 있다. Review: Imperative programming - 변수를 수정할 수가 있다.- 값을 대입한다.- if-then-else나 loops, break, continue, return 등과 같은 제어 로직을 사용한다. imperative program의 대표적인 예로 Vo.. 2015. 12. 22.
패키지와 임포트 Package 자바, C#과 마찬가지로 Scala에서도 namespace 격인 package가 존재한다. Scala에서는 아래와 같은 3가지 방법으로 package를 선언하고 사용할 수가 있다. 자바에서의 package 사용 용법 1. 자바와 비슷한 형태 package com.jufactory class factory1 2. C#과 비슷한 형태 package com.jufactory { class factory1} 3. 중첩 형태 package com { package jufactory { class factory1 package otherfactory{ class factory2 } }} 만약에 아래와 같은 중첩 코드라면 package의 scope가 어떻게 될까?? package com { class .. 2015. 5. 28.
Trait 스칼라에는 자바의 Interface와 비슷한 trait라는 것이 존재한다. 비슷하면서도 다른 게 바로 자바의 Interface와 스칼라의 trait인데, 우선 자바의 Interface는 Interface 내에 정의만 가능하고 구현은 Interface를 상속받은 클래스 내에서 구현을 해야 했다.그에 반해 스칼라의 trait는 정의 뿐 아니라 실제 구현도 가능하기 때문에 사용자가 직접 구현을 하지 않아도 되는 장점을 가지고 있다.또한 Trait는 다중 상속 개념에 대해서 자바나 C++보다 합리적인 방안을 제시하고 있다. 이에 대한 설명은 차츰 진행하기로 하며, 우선 trait를 어떻게 사용하는지에 대해 살펴보자. trait Philosophical{ def philosophize(){ println("phi.. 2015. 4. 27.
[12강] 상속 스칼라에서도 추상 클래스가 존재하며 그에 대한 상속도 존재한다. abstract class Element{ def contents: Array[String]} 위의 예제는 Element 라는 추상 클래스를 정의한 것이고, contents라는 매서드를 정의만 한 것이다. contents라는 매서드가 정의만 되었기 때문에 추상 맴버가 되고 (추상 맴버일 경우에는 맴버 앞에 abstract를 붙여주지 않아도 됨) 추상 맴버를 가진 class는 자연스럽게 추상 클래스가 된다. (class 앞에 abstract 붙여 줘야 한다.)이 Element를 상속 받기 위해서는 contents라는 매서드를 반드시 구현을 해주어야 한다. 상속은 자바와 마찬가지로 extends 키워드를 사용한다. 상속은 private 맴버를 .. 2015. 4. 25.
[11강] 코드 중복 줄이기와 Currying 파일의 마지막 이름이 입력된 문자와 일치하는지를 찾는 함수, 파일 이름에 해당 문자열이 포함되어 있는지를 찾는 함수가 아래와 같이 정의되어 있다고 가정하자. def fileEnding(query : String) = { for (file fileName.contains(query)) filesMatching((fileName:String, query:String) => fileName.endsWith(query)) 함수는 filesMatching 함수에서 인자 타입을 명시하였기 때문에 인자 타입을 생략할 수가 있다. def fileEnding(query:String) = filesMatching(query, (fileName, query) => fileName.endsWith(query)) 또한 file.. 2015. 4. 24.
[10강] 함수와 클로저 스칼라에서 함수 사용함에 있어 기본 C나 자바와 다른 몇가지 특징이 있어 이번 포스팅에서 설명하려 한다. 첫번째로 스칼라에서는 함수 내에서 함수를 선언하고 사용할 수가 있다. def processData(data: List, width: Int){ def processLine(line: String){ if (line.length > width) ..... } for (d x + 1 위의 함수 리터럴은 x를 입력으로 받아 1을 더해주겠다는 뜻이다. 스칼라에서는 이러한 함수 리터럴을 값으로 저장할 수 있다. var function = (x : Int) => x + 1 위와 같이 선언한 경우 함수 리터럴은 아직 소스코드인데 반해, 아래와 같이 값을 실행시키게 되면 객체로 변환이 된다. function(10).. 2015. 4. 22.
[9강] 제어 문 스칼라에서 제어 구문은 if, while, for, try, match 가 전부이다. if 스칼라에서 if 표현식은 단지 표현식이 아니라 값을 리턴한다. 그래서 아래와 같은 표현이 가능하다. val filename = if(!args.isEmpty) args(0) else "default.txt" 위와 같이 표현을 하면 좋은 게 변수 선언과 동시에 값을 배정할 수가 있기 때문에 val 변수 사용이 가능하다는 것이다.이렇게 val로 한번 선언한 변수는 final 효과를 지니기 때문에 효과적인 코딩 스타일을 구사할 수 있다. while while은 Unit 타입의 결과를 리턴한다. Unit은 빈괄호 ()를 리턴하기 때문에 void와는 다르다고 할 수 있다.변수에 재할당 하는 코드 역시 Unit을 리턴한다. .. 2015. 4. 21.