스칼라에서는 다음과 같은 정규식 연산자가 지원됩니다.


. - 개행 문자를 제외한 모든 단일 문자와 일치합니다.


$ - 줄 끝과 일치합니다.


^ - 줄의 시작과 일치합니다.


[...] - 대괄호 안에있는 단일 문자와 일치합니다.


[^ ...] - 대괄호 안에있는 문자를 제외한 모든 단일 문자와 일치합니다.


\\A - A로 시작하는 문자열과 일치합니다.


re * - 선행 표현의 0 번 이상 일치


re + - 이전 것 중 하나 이상을 찾습니다.


re ? - 선행 표현의 0 또는 1 발생과 일치합니다.


re {n} - 선행 표현의 정확히 n 번 일치


re {n,} - 선행 표현식이 n 회 이상 일치합니다


re {n, m} - 선행 표현의 n 번 이상 m 번 일치


x | y - x 또는 y와 일치합니다.


(re) - 정규 표현식을 그룹화하고 일치하는 텍스트를 기억합니다.


(? : re) - 일치하는 텍스트를 기억하지 않고 정규식을 그룹화합니다.


(?> re) - 백 트랙킹없이 독립적 인 패턴과 일치합니다.


\\w - 단어 문자와 일치합니다.


\\W - 단어가 아닌 문자와 일치합니다.


\\s - 공백과 일치합니다. [\t \n \r \f]와 동일합니다.


\\S - 비 공백 문자와 일치합니다.


\\d - 숫자와 일치합니다. [0-9]와 같습니다.


\\D - 비 일치와 일치합니다.


\\A - 문자열 시작 부분과 일치합니다.


\\Z - 문자열의 끝과 일치합니다. 개행 문자가 있으면 개행 직전과 일치합니다


\\z - 문자열의 끝과 일치합니다.


\\G - 마지막 경기가 끝난 지점을 알려줍니다.


\\n - 캡처 그룹 번호 "n"에 대한 역 참조


\\b - 바깥 괄호가있을 때 단어 경계를 찾습니다.


\\B- 단어 경계와 일치합니다.


\\n, \\t, 등 .- 개행 문자, 캐리지 리턴, 탭 등과 일치합니다.


\\Q - 모든 문자를 \\E까지 이스케이프 (인용)합니다.


\\E - \\Q로 시작하는 인용 끝



스칼라가 자바보다 매력적인 이유

https://gist.github.com/mkaz/d11f8f08719d6d27bab5

https://www.toptal.com/scala/why-should-i-learn-scala

https://www.quora.com/Why-is-Scala-better-than-Java  답변 링크 

'Programming > Scala' 카테고리의 다른 글

[Scala] 정규표현식  (0) 2017.04.28
[Scala] 스칼라는 무엇이며 왜 만들어 졌나 (일문번역)  (0) 2017.02.02
[Scala] Overview  (0) 2017.01.25

원문 http://www.atmarkit.co.jp/ait/articles/1202/10/news122.html


아래는 번역한 것입니다.



Twitter와 Foursquare , LinkedIn 이 사용하는 "Scala"

 Scala "는 표준 Java 플랫폼에서 동작 할 수있는 프로그래밍 언어입니다. 2003 년경에 등장한 비교적 새로운 언어이지만, 이미 Twitter와 Foursquare, LinkedIn의 채용 실적도 있습니다. 국내(일본)에서도 일부 채용 사례가있는 것 같습니다.

 이름 Scala (스칼라)는 "확장 (확장 가능) 언어"를 의미합니다. Scala는 Java의 Generics ( 제네릭 )의 설계 등에도 관여 한 스위스 연방 공과 대학 (EPFL)의 Martin Odersky (마틴 주문 스키) 교수에 의해 설계 및 개발되었습니다.

 교수에 따르면, Scala 언어 개발 동기로서 다음의 두 가지가 있다고되어 있습니다 ( Wikpedia 에서 인용).

  1. 범용 언어는 확장이 아니고서는 안된다. 같은 개념으로 작은 프로그램도 큰 프로그램도 기술 할 수 있어야한다
  2. 확장 성 (확장 성)는 함수형 언어 와 객체 지향 언어 의 두 가지 프로그래밍의 개념을 통합하고 일반화함으로써 실현할 수있다

 개발 동기에있는 것처럼 Scala는 작은 스크립트 용도에서 대규모 시스템에서 사용하는 언어로서의 용도까지 다양한 요구에 부응 할 수 있도록되어 있습니다. 그리고 그 확장 성을 제공하기 위해, "객체 지향 언어와 함수형 언어의 개념을 결합 해 '라는 특징을 가지고 있습니다.

 또한 Scala 공식 사이트에서 Scala의 소개 글에서는 먼저 다음과 같이 언급하고 있습니다 ( Scala 공식 사이트 에서 인용).

Scala is a general purpose programming language designed to express common programming patterns in a concise,

elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages,

enabling Java and other programmers to be more productive.

Code sizes are typically reduced by a factor of two to three when compared to an equivalent Java application.

 일본어 번역입니다 ( 프로그래밍 언어 Scala 일본어 정보 사이트 에서 인용).

Scala는 일반적인 프로그래밍 패턴을 간결하게 · 우아한 · 그리고 형태 안전하게 표현하기위한 범용 프로그래밍 언어입니다.

Scala는 객체 지향 기능과 함수형 언어의 기능을 잘 통합하고, Scala를 사용하여 Java 및 기타 프로그래머의 생산성은 더욱 향상 될 것입니다.

Scala 코드 크기는 일반적으로 동일한 기능을 제공하는 Java 응용 프로그램에 비해 2 분의 1 ~ 3 분의 1 정도입니다.

 "객체 지향 함수형 언어의 기능을 통합함으로써보다 간결하게 코드를 작성하고 생산성을 향상 할 것"이라고 말했다.

코드를 Java와 Scala에서 비교해 보자

 여기에 하나 예를 살펴 보자. 아래의 코드는 '인수로 전달 된 문자열 목록 중 제 2 인수에 지정된 길이 이상의 요소 를 모두 대문자로 변환하고 그 요소를 함수 내부에서 새로 정의 된 목록에 추가하여 반환 "함수를 Java로 기술 한 것입니다.

public List filterNames ( List < String > names , int len ) {

List < String > result = new ArrayList ();

for ( String name : names ) {

if ( name . length () > = len ) {

result . add ( name . toUpperCase ());

}

} return result ;

}

Java 소스 코드

 목록 루프 돌려 요소마다 길이를 체크하여 조건에 맞는 요소를 함수 내부에 정의 된 목록에 추가합니다.

 동일한 작업을 Scala로 작성하면 이렇게됩니다.

   def filterNames ( list : List [ String ] len : Int ) = list . filter ( _ . length () > = len ) map ( _ . toUpperCase )    
Scala의 소스 코드

 전달 된 목록 길이 (len)에서 필터링 하고 결과 목록의 요소마다 모두 대문자로 변환 한 목록을 반환합니다. 어떻습니까? 물론, Java 코드보다 많이보다 적은 코드로되어 있습니다.

 이것은 매우 간단한 예는 있지만, Scala이라고 간결하고 이해하기 쉬운 코드를 쓸 것을 알 수 있습니다.

기존의 언어를 좋은 모습을 가지고 한 'Scala "의 5 가지 특징

 Scala는 다음과 같은 특징을 가지고 있습니다. 다양한 기능을 가지고 있습니다 만, Scala 만이 가지는 특별한 기능이라고하는 것은별로없고 기존의 프로그래밍 언어에서 좋은 점을 받아 들여 잘 균형을 가지고 있다고 생각합니다.

[1] Scala는 객체 지향 언어

 Scala는 순수 "객체 지향"언어입니다. 모든 값은 " 객체 "이며, 모든 작업은 " 방법 "입니다.

 Java의 int 및 double과 같은 기본 형식 은 존재하지 않습니다. 예를 들어, Scala에서 "1 + 2"라는 코드는 "Int 클래스 (값 1)의"+ "라는 메서드에 인수 2를 전달할 '라는 뜻입니다.

 또한 Scala에서는 객체 지향을 실현하기 위해 클래스 기반의 상속과 ' 믹스 인 합성」을 지원하고 있습니다.

 "믹스 인 합성 '은' 토레이토 "(Ruby에서 말하는 "모듈"Java로 말하면 '구현을 가질 인터페이스의 일종 ")를 사용하여 하나의 클래스에 여러 구현을 가지는 기능을 맞추는 것입니다.

[2] 함수형 프로그래밍이 가능

 함수형 프로그래밍 "이라는 단어는 최근 잘 듣는 키워드지도 모릅니다. 이것은 간단하게 말하면, 부작용 (데이터의 내부 상태를 변경할 수)를 가지지 않는 "함수"를 사용하여 프로그램을 구축하는 프로그래밍 기법입니다.

 함수형 프로그래밍의 장점으로 " 함수가 독립적이고"상태 "가 없기 때문에 가독성과 유지, 테스트, 리팩토링이 용이하게된다 "는 장점이 있습니다.

 Scala에서는 함수를 "퍼스트 클래스"로 간주합니다. 즉, "정수 나 문자열 등처럼 함수를 인수 또는 반환 값에있다" 라는 것입니다.

 또한 "상수"(val) 나 「불변 컬렉션 "을 사용하여 프로그래밍 가능 합니다 (※ 변수 (var)과 가변 컬렉션을 사용해도 상관 없습니다).

 이 같은 특징을 가지고 있기 때문에 표현력이 올라 간결한 작성할 수 있습니다.

 객체 지향과 함수형 프로그래밍은 대립하는 개념이 아니라 Scala에서는 각각 상승하고 간결한 묘사와 유연성을 실현하고 있습니다.

[3] 정적 타이핑

 정적 타이핑 "는 변수 나 함수가 미리 정해진 데이터 형을 처리하도록 정확한 설명을 요구하는 프로그래밍 언어의 특성입니다.

 Scala는 정적 타입 언어이기 때문에 안전하게 추상화가 가능한 타입 시스템 을 가지고 있습니다. 따라서 형식으로 인한 오류는 런타임이 아닌 컴파일시에 존재를 알 수 있습니다.

 "정적 타이핑이라고 형태의 기술로 프로그램이 중복되는 것은?"라고 생각하는 분들도 있을지 모릅니다. 하지만 Scala에서는 형태 추론 에 의해 형식 설명을 생략 할 수 간결한 표현을 가능하게하고 있습니다.

[4] Java와의 호환성

 Scala의 소스 파일을 컴파일하면 JVM (Java 가상 머신)의 바이트 코드입니다. Java 가상 머신에서 작동하기 때문에 Scala에서 Java의 메소드 나 필드를 호출 할 수 있으며, 반대의 경우도 가능 합니다.

 즉, 기존의 풍부한 Java 라이브러리를 그대로 활용할 수 있습니다 (※ 일부 예외 있음).

【5】 병행 처리

 현재 CPU의 멀티 코어 화 (하나의 프로세서에 여러 개의 프로세서 코어를 봉입 한 기술)이 일반화되고 있습니다. Java에서 병렬 처리 를 할 때 java.lang.Thread 클래스와 java.util.concurrent 패키지를 사용하여 병렬 처리를 수행합니다.

 Scala에서는 멀티 코어를 인식하고 효율적으로 병렬 처리를위한 'Actor'라는 라이브러리를 가지고 있습니다. 이것은 " 행위자 모델 '에 따라 라이브러리에서 액터끼리 메시지를 보내 서로를 처리하는 프로그래밍 모델입니다.

 또한 Scala 2.9는 병렬 처리 지원의 컬렉션 (palallel collection)가 사용 가능하게되었습니다. 이것은 컬렉션을 병렬화하여 각각의 스레드에서 수행 할 작업을 간단하게 작성할 수 있습니다.


'Programming > Scala' 카테고리의 다른 글

[Scala] 정규표현식  (0) 2017.04.28
[Scala] Scala가 자바보다 매력적인 이유  (0) 2017.04.04
[Scala] Overview  (0) 2017.01.25


Scala 란?


공식

https://www.scala-lang.org/



제작자

    1. Martin Odersky(독일) 2001년에 만듬
    2. 스위스 로잔 EPFL(로잔 연방공대)의 교수
    3. 타입세이프의 공동 창업자
    4. 자바 제네릭스 설계자의 일원
    5. javac 참조 컴파일러 최초 개발
    6. Coursera(온라인강의사이트) 에서 함수형 프로그래밍과 Principles Reactive Programming(진보된 웹 프로그래밍) 을 가르치고 있음.

목적
    1. Gj, Pizza 프로젝트에서 출발
    2. 컴포넌트 소프트웨어를 잘 지원하기 위한 언어 (자바가 많이 비대해졌음 / 대형 프로젝트에도 모듈별로 설계가능)
    3. Scalable, abstraction, composition, decompositio 을 충족하기 위해 암수형 언어가 필요했다.

특징

    1. Scalable Language 확장가능한 언어
    2. 순수 객체지향언어이며 클래스와 특성을 통한 고급 구성 요소 아키텍처를 지원한다. (스칼라 모든것이 객체이다)
          -> 1+1 구문에서 1도 객체임
    1. 다른 언어의 전통적인 디자인 패턴이 이미 적용되어 있다. (예: 싱글톤)
    2. 함수형 언어
    3. 암시적 클래스를 통해 자바와 관계없이 기존 작업에 새 작업을 추가 할 수 있다.
    4. 표준 자바 플랫폼에서 실행 (JVM 에서 실행)
    1. -> 자바와 스칼라는 자바 프로젝트에 같이 존재 할 수 있고 다른 프로젝트에 존재할 수 있다.
    2. -> 자바 라이브러리, 프레임워크 및 도구를 모두 사용할 수 있다.
    3. ant 또는 maven, Eclipse, IntelliJ, Netbeans 와 같은 IDE, Spring 또는 Hibernate 와 같은 프레임워크 모두 Scala 와 완벽하게 작동한다. 심지어 모든 JVM 과 안드로이드에서도 실행가능하다.
    4. 발전된 자바로 다루기 보다는 새로운 언어로 접근 하는 것이 낫다.

기능적인 특징

    1. 스칼라는 순수한 객체지향 언어이다.
    2. 개념적으로 모든 값이 객체이며 모든 연산은 메소드 호출이다.
    3. 이 언어는 클래스와 특성을 통한 고급 구성 요소 아키텍쳐를 지원합니다.
    4. 컬렉션 프레임워크 Scala 2.8 릴리즈에서 제공하는 것이 중요한 변화 이전에도 지원을 하긴 했고 프레임워크에서는 그것들과 호환됩니다.


함수형 언어?

함수형 프로그래밍 언어의 시초

IPL -> LISP -> Scheme -> Erlang -> Clojure -> Scala 의 갈래



기본 습득을 위한 문서

http://docs.scala-lang.org/index.html

가이드 및 개요

http://docs.scala-lang.org/overviews/?_ga=1.4105904.1400885517.1486215221

튜토리얼

http://docs.scala-lang.org/tutorials/

등등




Review

먼저 기초적인 문법을 살펴본 결과 의외로(?) 형식이 엄격하지 않다. (예: 메소드 return 타입 등)

코딩시 불필요한 입력을 최소화 할 수 있게 신경쓴 모습이 많다.

아래 메소드 정의 모두 같은 결과를 가진다.

def add(x:Int, y:Int):Int = {
	return x + y		
}
def add(x:Int, y:Int) = {
	x + y
}
def add(x:Int, y:Int) = x + y
그리고 변수 선언도 var, val 변수와 상수 구분 외 변수타입 설정이 없다.
for 문에서도 중첩 for 문을 ; 으로 구분해서 한라인으로 지정 가능하다.
뿐만아니라 
함수에서 getOrElse 구문으로 기본 리턴값을 지정 가능하다. 
switch 문에서도 break 생략이 가능하다.
세미콜론 ; 도 한라인에서 구분을 위한 것이 아니면 생략 가능하다.
결론.
그동안 기본 로직에서 예외처리를 해야 했던 것들을 없앴다.
언어적으로 쉽게 접근이 가능하도록 했다.
JAVA 플랫폼에서 연동이 강력하지만 오히려 JAVA 랭귀지 보다는 JAVASCRIPT 를 자주쓰던 개발자가 접근하기 더 용이해 보일 정도록 자바스크립트와 어느정도 유사하며 기존 랭귀지 형식에 얽매이지 않는 모습이다.
단, 이러한 기본 구조에서 문법들이 얽히고 설켜서 완성된 코드들을 보면 눈이 돌아간다.
하나씩 이해하고 넘어가던 문법들도 헷갈릴정도다.
뭔가 접근이 쉬운 언어같지만 또 어려운 언어같아 보인다.


스칼라 실행에 대해서

https://www.scala-lang.org/documentation/getting-started.html

터미널 & 쉘

> scala
This is a Scala shell.
Type in expressions to have them evaluated.
Type :help for more information.
scala> object HelloWorld {
    |   def main(args: Array[String]): Unit = {
    |     println("Hello, world!")
    |   }
    | }
defined module HelloWorld
scala> HelloWorld.main(Array())
Hello, world!
scala>:q
>


터미널 & 쉘 실행

자바 바이트 표준코드 생성
$ scalac HelloWorld.scala

클래스 파일 생성
$ scalac -d classes HelloWorld.scala

생성된 바이트 코드 실행
$ scala HelloWorld

옵션을 지정 할 수 있다. (cp 는 classpath 별칭)
$ scala -cp classes HelloWorld


스크립트로 실행  

#!/usr/bin/env scala
object HelloWorld extends App {
  println("Hello, world!")
}
HelloWorld.main(args)
$./script.sh


IDE 에서 실행

(생략..)







그외 참조할만한 문서


Programming.In.Scala 책 Summary 정리

https://github.com/wonury/Programming.In.Scala/wiki - 11장까지 하다 멈춤

https://github.com/codeport/scala/wiki/Programming-in-scala - 31장까지 진행. 거의 끝났음


자바 프로그래머를 위한 스칼라 튜토리얼

http://docs.scala-lang.org/ko/tutorials/scala-for-java-programmers.html


스칼라 예제소스

https://github.com/vkostyukov/scalacaster


휘리릭 읽어볼만

https://github.com/taokim/h3scala


개발환경

https://www.scala-lang.org/download/


그외 정리 잘된 문서

https://twitter.github.io/scala_school/


위키백과의 스칼라

https://ko.wikipedia.org/wiki/%EC%8A%A4%EC%B9%BC%EB%9D%BC_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)



+ Recent posts