전체 글 97

Scala와 Java의 String interpolation(문자열 덧붙이기)

String Interpolation은 자주 쓰이고 유용한 구문이다. 대부분의 뷰 템플릿 엔진에서는 지원하고 있고, 당연하게 쓰이고 있다. 간단하게 설명하자면 문자열을 출력하거나 선언할 때 중간중간 다른 변수를 끼워넣는 구문이다. 간단하게 예를 들자면 JSP에서 123456 cs 으로 쓰는 바로 그 기능이다. 1. 스칼라에서의 String interpolationval str1 = "Hello" val str2 = "World" val int1 = 100 val string = s"$str1 $str2 - $int1" println(string) // Hello World - 100 // 값으로 선언해 사용할 수 있다. println(s"${str1} World!") // Hello World! // {..

Scala 2017.05.27

Java의 Enum과 Scala의 Enum

Enumeration, 줄여서 enum이라고 부르는 열거 자료형은 자바나 스칼라 모두에서 아주 유용하게 쓰인다. Effective Java에 따르면 enum은 JVM에서 지원하는 싱글톤으로써 syncronized된 'getInstance' 메소드들을 선언할 필요 없이 아주 간편하게 만들 수 있고(메소드나 필드에서는 syncronized 키워드가 필요할 수 있다), 프로그램 전역에서 호출이 가능한 장점이 있다. 1. 자바에서의 enum자바의 enum은 열거 자료형으로써의 역할을 충실하게 수행해준다. public enum Fruits { Apple, Banana } public static void main(String[] args) { // 기본적인 호출 Fruits fruits = Fruits.Apple..

Scala 2017.05.16

Scala의 Symbol(심볼)

스칼라에는 심볼 혹은 심볼 리터럴이라고 불리는 특이한 객체가 있다. 심볼은 String과 다르게 단 하나의 객체만을 가진다는 특징이 있다. JVM에서 String은 값은 같지만 '다른' 객체가 생길 수 있다. 옛날 코드, 특히 URL을 인코딩하는 예제에 많이 보이는 이상한 경우다.val str1 = new String("String") val str2 = new String("String") println(str1 eq str2) // false // 스칼라에서 eq는 자바의 ==와 같다. // 반대로, 스칼라에서 ==는 자바의 .equals() 메소드와 같다. new String()을 이용하지 않고 "..." 구문으로 문자열을 만들거나 intern() 메소드를 이용하면 다른 결과가 나타난다. 두 가지 ..

Scala 2017.05.15

Scala와 Java에서 일반적인 파일 입출력

자바는 1.7부터 Paths와 Files 클래스를 이용해 이전보다 훨씬 간편하게 파일 입출력이 가능해졌다. 1. Path 객체// 상대주소나 절대주소를 이용한 Path Path path = Paths.get("/resources/test.txt"); // URI를 이용한 Path ClassLoader classLoader = FileInputOutputJava.class.getClassLoader(); URL url = classLoader.getResource("test.txt"); Path resourcePath = Paths.get(url.toURI()); // throw URISyntacExceptionPaths.get() 메소드를 이용해 직접 파일의 위치를 입력하거나 URI 객체를 이용해 파일을..

Scala 2017.05.11

Scala 부분 함수(PartialFunction)의 runWith, andThen

두 메소드는 모두 부분 함수(PartialFunction) 트레잇에 구현된 함수들이다. 따라서 PartialFunction 트레잇을 구현한 함수에서 사용할 수 있다. 심지어 위 메소드들이 반환하는 값이 부분 함수라는 점을 이용해 메소드 체이닝도 가능하다. 1. runWith 메소드runWith는 함수의 apply를 수행하고 얻은 값을 Action 함수에 전달하는 새로운 함수를 만드는 메소드다. 만들어진 함수가 반환하는 값은 파라미터로 입력받은 값이 apply 함수를 호출할 수 있는지 여부에 해당하는 Boolean 값이다. Scala의 Collection들은 PartialFunction Trait을 구현하고 있기 때문에 Collection에서도 사용이 가능하다. Map의 apply 함수는 Key를 입력받아..

Scala 2017.05.10

Scala, Map Collection의 withDefault, withDefaultValue 메소드

Scala의 Key-Value Collection인 Map에는 withDefault와 withDefaultValue 메소드가 있다. 이 메소드들은 Map에 Key가 없을 때의 기본 값을 지정해 준다. val baseMap = Map[String, String] ( "Hello" -> "World", // 기본적인 Map "One" -> "1", "Two" -> "2" ) withDefault 메소드는 부분 함수를 입력받아 Key가 없으면 부분 함수에서 매칭된 값을 반환하는 Map을 만들어 준다.val defaultMap1 = baseMap.withDefault { // withDefault 메소드는 부분 함수를 입력받는다. case "Number" => "numb" case _ => "None!" } p..

Scala 2017.05.09

Android 버전에 따라 실행되는 코드

안드로이드 어플리케이션의 하위 호환성을 위해 버전에 따라 기능을 제한할 필요가 있다. 그러기 위해서는 몇 가지 설정이 필요하다. 1. Build.gradle먼저 어플리케이션의 타겟 Sdk 버전과 지원가능한 최소 Sdk버전을 정해야 한다. 여기서 최소 Sdk 버전(minSdkVersion)에 따라 앱을 설치할 수 있는 최소 버전의 안드로이드가 정해지고 타겟 Sdk 버전(targetSdkVersion)에 따라 빌드할 때 앱에서 상위 버전 코드를 아예 제외할지 여부가 결정된다.minSdkVersion 18 targetSdkVersion 22 이렇게 설정하면 젤리빈MR2(Sdk 18)부터 설치가 가능하고 롤리팝(Sdk 22) 이후 버전에서 지원되는 기능은 모두 제외된 앱이 만들어진다. 2. 버전에 따른 실행 분..

Java | Android 2017.05.09

Java HTML parser, Jsoup로 원하는 값 얻어내기 - 로그인

이 포스트에서는 로그인이 필요한 사이트와 Request Header를 검사하는 사이트를 파싱하는 과정을 적어둔다. 0. 웹 사이트 로그인 먼저 웹 사이트에 로그인에 대해 다시 생각해 볼 필요가 있다. 최근 웹 사이트에서 사용되는 로그인 방법은 크게 두 가지로 볼 수 있다. 첫 번째는 세션을 이용한 방법이고, 두 번째는 Restful API에 주로 사용되는 토큰 인증이다. 발급 받은 토큰을 이용하는 방법은 이전 포스트에서 원하는 값을 Jsoup의 Document를 파싱해 얻어낸 것처럼 간단하게 얻어낼 수 있다. 물론 토큰이 HTML요소가 아니라 Script 요소로 있는 경우도 많지만 정규식이나 replace, split 같은 메소드를 이용하면 별 어려움이 없다. 다시 첫 번째, 세션 로그인으로 돌아가면 세..

Java | Android 2017.05.08

Java HTML parser, Jsoup로 원하는 값 얻어내기 - 기본

Jsoup는 아주 강력하고 재미있는 라이브러리다. 단순한 HTML 문서 파싱을 넘어 웹 사이트에 대한 Request, Response를 모두 처리할 수 있다. 덕분에 일부 특별한 경우(플래시, 애플릿, ActiveX같은 비표준이나 WebSocket)가 아니라면 브라우저로 사이트를 이용하는 상황을 그대로 재현해낼 수 있다. 다시 말해, 대부분의 사이트의 원하는 정보만 뽑아내는 '뷰어'를 만들 수 있다는 것이다. 몇 가지 간단한 예제를 통해 사이트에서 원하는 정보만 뽑아내는 과정을 적어보려 한다. 0. Gradle 디펜전시 추가compile group: 'org.jsoup', name: 'jsoup', version: '1.10.2'Maven Repository를 통해 간단하게 디펜전시를 추가 할 수 있다...

Java | Android 2017.05.04

Android Activity 스와이프해서 닫기(SwipeBackLayout)

최근 출시되는 대부분의 앱은 스와이프해서 액티비티를 닫는 기능을 지원한다. 사용자 측면에서 생각해도 엄지손가락에 힘주고 닫기버튼을 찾아 누르는 것보다 화면을 스와이프하는게 당연히 더 편하다. 아무튼, 액티비티를 스와이프해서 닫는 가장 기본적인 방법은 Layout에 onTouchEvent를 구현하는 방법이다. new View.OnTouchListener(){ private float x; @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()){ case MotionEvent.ACTION_DOWN : x = motionEvent.getX(); break; case MotionEv..

Java | Android 2017.05.04