Upload
naver-d2
View
4.298
Download
5
Embed Size (px)
Citation preview
스칼라를 통한
다양한 언어의 패러다임 맛보기
변하는 것과 변하지 않는 것
• 변하는 것
• 변하지 않는 것
오늘의 목표
• 프로그래밍 언어의 패러다임?
• 스칼라
• 실습
프로그래밍 언어의 패러다임
• 패러다임이란?
• 패러다임의 종류
• 객체지향
• 함수형
• 타입시스템
• 기타
세벌식 자판
객체지향
• 프로그래머들이 프로그램을 상호작용하는 객체들의 집합으로 보는 시각
함수형
• 상태값을 지니지 않는 함수값들의 연속으로 보는 시각
타입 시스템
• 프로그램 각 부분이 만들어낼 수 있는 값의 종류를 나눔
으로써 그 프로그램이 특정 오류 상황을 발생시키지 않는
다는 것을 자동으로 검증해주기 위한 문법적 검증 방법
프로그래밍 언어
• 좋은 프로그래밍 언어란?
• 프로그래밍 언어의 종류와 역사
좋은 프로그래밍 언어?
실무에서 어떤 언어를 사용하나요?
• Java
• Python
• Ruby
• JavaScript
• DSL
• SQL
• Template Language
코딩하는 시간이 전체 개발에서 차지하는 비율
• CI
• 빌드
• 테스트
• 배포
• 분석
• 테스트
• VCS
• 협업
• 개발 도구
• 문서화
• 적절하게 휴가 쓰는 법
스칼라
• 스칼라 소개
• 선택의 이유
• 스칼라 패러다임과 스타일
스칼라의 탄생
• Martin Odersky
현재…
스칼라
Scalability
Functional Object
선택의 이유
• FP and OOP with Java libraries
• 자바 프로젝트의 효율성을 끌어올리기 위해서
• 실용적인 함수형 프로그래밍 언어
• 거쳐가는 언어
• 배울게 많아서
• 스타일을 강제하지 않음
• 우수한 개발자 커뮤니티
학습에 투자할 만한 가치가 있을까?
• 스칼라는 어렵다?
• 스칼라를 배움으로써 얻을 수 있는 것은?
어렵다는 것은?
• 학습에 필요한 기반 지식이 필요하다.
• 외워야 할 것이 많다.
• 생소한 개념을 익혀야 한다.
• 문서나 샘플이 부족하다.
스칼라를 배움으로써 얻을 수 있는 것은?
• More OOP
• Pure Functional
• Be better developer
Scala vs Java
• Simple Simple Simple
• More OOP
• Pure Functional
// Java ClassA classA = new ClassA(“myFirstClass”); ClassB classB = new ClassB(“mySecondClass”); !// Scala val classA = ClassA(“myFirstClass”) val classB = ClassB(“mySecondClass”)
Simple
// Java List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list.add(“3”); // Arrays.asList("1", "2", "3"); !!// Scala val list = List("1", "2", "3")
Simple
// Java List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list.add(“3"); !!// Scala val list = List("1", "2", "3")
Simple
// Java List<Integer> iList = Arrays.asList(2, 7, 9, 8, 10); List<Integer> iDoubled = new ArrayList<Integer>(); for(Integer number: iList){ if(number % 2 == 0){ iDoubled.add(number 2); } } !!// Scala val iList = List(2, 7, 9, 8, 10); val iDoubled = iList.filter(_ % 2 == 0).map(_ 2)
Java vs Scala
5 + 3
More OOP
Imperative vs Functional (Declarative)
• 퀵소트 알고리즘
public void quickSort(int left, int right){ int i,j; TableEntry p, tmp if(left<right){ i=left; j=right; p=table[left]; while(i<j){ while (table[j].key>p.key) j--; while (i<j && table[i].key<=p.key) i++; ! tmp = table[i]; table[i]=table[j]; table[j]=tmp; } table[left] = table[i]; table[i]=p; quickSort(left,i-1); quickSort(i+1,right); } }
Quick sort (Java, Imperative)
def sort(xs: Array[Int]) { def swap(i: Int, j: Int) { val t = xs(i); xs(i) = xs(j); xs(j) = t } ! def sort1(l: Int, r: Int) { val pivot = xs((l + r) / 2) var i = l; var j = r while (i <= j) { while (xs(i) < pivot) i += 1 while (xs(j) > pivot) j -= 1 if (i <= j) { swap(i, j) i += 1 j -= 1 } } if (l < j) sort1(l, j) if (j < r) sort1(i, r) } sort1(0, xs.length - 1) }
Quick sort (Imperative)
def sort(xs: Array[Int]): Array[Int] = { if (xs.length <= 1) xs else { val pivot = xs(xs.length / 2) Array.concat( sort(xs filter (pivot >)), xs filter (pivot ==), sort(xs filter (pivot <))) } }
Quick sort (Functional)
Python vs Scala
Python
• 코드의 의미가 명료하고 간결하다.
• 적절한 함수형 스타일, 절차형 스타일, 객체지향
• 훌륭한 라이브러리와 프레임워크
• 유용한 Wrapper 언어
• 동적언어
• 통일된 스타일
Scala
• 확장성 (타입 시스템, 순수 함수형)
• 잘 설계된 기본 라이브러리
• 풍부한 자바 라이브러리
• 확장 가능성
• 깊이 이해하기까지 익혀야 할 개념들이 많음
• JVM
• 다양한 스타일
Swift와의 비교
// Swift var myString: String? !// Scala val myString: Option[String]
Option Type
// Swift switch value { case (x) where x > 0 : "positive" case (x) where x < 0 : "negative" } !// Scala value match { case x if x > 0 => "positive" case x if x < 0 => "negative" }
Switch & Pattern matching
// Swift var x: (String,String) = ("dog","cat") !// Scala val x: (String,String) = (“dog","cat")
Tuple
// Swift typealias MyString = String !// Scala type MyString = String
TypeAlias
// Swift func f() -> (Int -> Int) !// Scala def f: Int => Int !
함수 선언
// Scala @lazy var x = complexFunction() !// Swift lazy val x = complexFunction()
Lazy
// Scala extension SomeType { var convert(x: Int): Int = { return x * 2 } } !// Swift trait myTrait { def convert(x: Int) = x * 2 }
Extension & Trait
스칼라의 패러다임
• 객체지향
• 함수형
• 타입 시스템
함수형
타입 시스템
실습
• Functional
• Lazy
• Pattern matching