본 강좌에서는 클로저에 대해 알아보도록 하겠습니다. 클로저란 내부 함수와 내부 함수에 영향을 미치는 주변환경을 모두 포함한 객체로정의할 수 있습니다. 또한 클로저는 func와 함수이름이 생략된 경량의 함수객체로 클로저 표현을 통해 문장릉 짧고 간단하게 만들 수 있습니다.
Youtube
- https://youtu.be/0bIRlDCH8kU
본 강좌에서는 클로저에 대해 알아보도록 하겠습니다. 클로저란 내부 함수와 내부 함수에 영향을 미치는 주변환경을 모두 포함한 객체로정의할 수 있습니다. 또한 클로저는 func와 함수이름이 생략된 경량의 함수객체로 클로저 표현을 통해 문장릉 짧고 간단하게 만들 수 있습니다.
Youtube
- https://youtu.be/0bIRlDCH8kU
이것이 자바다 익명 객체 + Chap.11 기본 API 클래스(java) 발표용 PPT.
간단하게 정리한 것.
이것이 자바다 책을 기반으로 작성한 강의용 PPT입니다.
부족한 게 많으니 쓰실 때에는 추가하셔서 쓰세요~
참고 자료 : 이것이 자바다
사진 첨부 : http://palpit.tistory.com/
이것이 자바다 익명 객체 + Chap.11 기본 API 클래스(java) 발표용 PPT.
간단하게 정리한 것.
이것이 자바다 책을 기반으로 작성한 강의용 PPT입니다.
부족한 게 많으니 쓰실 때에는 추가하셔서 쓰세요~
참고 자료 : 이것이 자바다
사진 첨부 : http://palpit.tistory.com/
박교수의 Swift강좌10-열거형과 구조체, 클래스에 대하여 이론적인 설명과 예제 프로그램을 통해 살펴보도록 하겠습니다. Swift의 열거형은 튜플값을 멤버로 가질 수 있으므로 C/C++보다 풍부하고 강력한 기능이 가능합니다. 또한 클래스와 구조체 모두 메소드를 가질 수 있다는 점이 C++와는 다른 점입니다.
Youtube
- https://www.youtube.com/watch?v=TykLyvMsGho
SLiPP(https://slipp.net) 서비스를 Java에서 Scala로 전환하는 과정에 대해 살펴본다. Scala를 선택한 이유, Java와 Scala를 동시에 서비스하면서 점진적으로 리팩토링하는 과정, Scala + Spring 기반으로 개발할 때 고려사항, Java에서 Scala로 전환하는 과정에 대한 경험담을 공유한다.
[논문발표] 20160725 A Random Walk Around the City: New Venue Recommendation in Lo...Sanghoon Yoon
A Random Walk Around the City: New Venue Recommendation in Location-Based Social Networks
Anastasios Noulas, ASE/IEEE International Conference on Social Computing, 2012
2. 1. Scala는?
2. Hello world!
3. Java와 함께 사용하기
4. 모든 것은 객체다
5. 클래스에 대하여
6. Q&A
목차
3. 1.1 페이지 제목
Scala는?
3 / 14
Scala는 함수형 프로그래밍과 very strong static type system을 지원하는 프로그래밍 언어이다.
• Scala의 소스코드는 Java 바이트코드로 컴파일된다.
• 따라서 JVM에서 구동된다.
• Java library 코드를 소스코드에서 바로 사용할 수 있다.
• Java의 단점을 보완하기 위한 언어.
• JVM 기반의 언어 중 단연 최고의 인기도.
• Learning curve.
• Apache Spark에서 사용.
4. 2.1 도형 4 / 14
Hello world!
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
• object는 singleton class.
• Scala에는 static이라는 개념이 없다.
• static 변수 및 메서드는 전부 object에 집어 넣는다.
5. 2.1 도형 5 / 14
Java와 함께 사용하기
import java.util.{Date, Locale}
import java.text.DateFormat
import java.text.DateFormat._
object USDate {
def main(args: Array[String]) {
val now = new Date
val df = getDateInstance(LONG, Locale.US)
// equivalent to df.format(now)
println(df format now)
}
}
• Java 코드와 함께 사용할 수 있다. (java.lang 패키지는 import 없이 사용 가능)
• import 구문에서 * 대신 _ 사용
• 하나의 매개변수를 가지는 메서드는 이항 연산자와 같이 쓸 수 있다.
6. 2.1 도형 6 / 14
모든 것은 객체다
object Timer {
def oncePerSecond(callback: () => Unit) {
while (true) { callback(); Thread sleep 1000 }
}
def timeFlies() {
println("time flies like an arrow...")
}
def main(args: Array[String]) {
oncePerSecond(timeFlies)
}
}
• Java에서 기본 타입이었던 int나 boolean도 Scala에서는 객체다.
– 1 + 2 * 3 / x
– (1).+(((2).*(3))./(x))
• 함수마저 객체다. (함수형 프로그래밍)
• 이름 없는 함수도 만들 수 있다.
7. 2.1 도형 7 / 14
클래스에 대하여
class Complex(real: Double, imaginary: Double) {
def re() = real
def im() = imaginary
}
• 생성자 역할을 하는 부분이 클래스 선언부에 갈 수 있다.
• 프로퍼티 기능이 있다.
• override 키워드로 상위 클래스의 메서드를 상속할 수 있다.
class Complex(real: Double, imaginary: Double) {
def re = real
def im = imaginary
override def toString() =
"" + re + (if (im < 0) "" else "+") + im + "i"
}
8. 2.1 도형 8 / 14
케이스 클래스 그리고 패턴 매칭
abstract class Tree
case class Sum(l: Tree, r: Tree) extends Tree
case class Var(n: String) extends Tree
case class Const(v: Int) extends Tree
• 산술 표현식을 나타내는 트리를 정의하자.
• Java에서는 Tree 추상 클래스 및 Node와 Leaf에 대한 하위 클래스를 정의했을 것이다.
• Scala에서는 추상 클래스와 일반 클래스 사이에 있는 케이스 클래스를 이용할 수 있다.
• 케이스 클래스는 다음과 같은 특성을 지닌다.
– 인스턴스를 생성할 때 new 키워드를 생략할 수 있다. (new Const(5) 대신 Const(5))
– 생성자 파라미터들에 대한 getter 메서드가 자동으로 정의된다.
– equals, hashCode 메서드도 공짜로 제공된다. 생성자 파라미터 값이 같다면 같은 것으로 여긴다.
– toString 메서드에 대한 기본적 구현이 제공된다.
9. 2.1 도형 9 / 14
케이스 클래스 그리고 패턴 매칭
type Environment = String => Int
• 주어진 환경에서 산술 표현식에 맞게 값을 계산하는 함수를 정의하자.
• 산술 표현식을 나타낼 수 있는 데이터 타입을 정의했으니 이제 그것들을 계산할 연산자들
을 정의할 차례다.
• 먼저 변수들의 값을 지정하는 환경을 선언하자.
def eval(t: Tree, env: Environment): Int = t match {
case Sum(l, r) => eval(l, env) + eval(r, env)
case Var(n) => env(n)
case Const(v) => v
}
• 왜 eval 함수를 Tree의 메서드로 정의하지 않았을까? (취향 문제)
• 멤버 함수로 정의하게 되면 새로운 데이터 타입을 추가하기 쉽지만 새로운 연산을 추가할
때마다 모든 하위 클래스의 해당 메서드를 정의해야 한다.
• 패턴 매칭을 사용하면 정반대이다.
10. 2.1 도형 10 / 14
트레잇에 대하여
trait Ord {
def < (that: Any): Boolean
def <=(that: Any): Boolean = (this < that) || (this == that)
def > (that: Any): Boolean = !(this <= that)
def >=(that: Any): Boolean = !(this < that)
}
• Java의 interface와 비슷하다.
• interface에 로직이 있는 것이라고 생각하면 된다.
• 연산자 오버로딩이 가능하다.
11. 2.1 도형 11 / 14
제네릭함
class Reference[T] {
private var contents: T = _
def set(value: T) { contents = value }
def get: T = contents
}
• 타입 T가 파라미터화 되어있다.
• _는 기본값을 뜻한다. (Int는 0, Boolean은 false, 객체는 null)
object IntegerReference {
def main(args: Array[String]) {
val cell = new Reference[Int]
cell.set(13)
println("Reference contains the half of " + (cell.get * 2))
}
}
12. 1.1 페이지 제목
마치며
12 / 14
• Scala By Example
• 참조
– 자바 프로그래머를 위한 스칼라 튜토리얼
– Scala (programming language)_Wikipedia