분류 전체보기
[코딩 노트] 小 : 라인 레벨 : 자주 사용하는 패턴
[코딩 노트] 小 : 라인 레벨 : 자주 사용하는 패턴
2017.12.02이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
[Kotlin/Java] data class
[Kotlin/Java] data class
2017.12.02Object / Any 상속 자바 플랫폼에서 모든 클래스는 ``java Object``(코틀린의 경우는 ``kt Any``) 클래스를 상속하고, 이 최상위 클래스가 ``kt equals()/hashCode()/toString()``를 가지고 있기 때문에 이를 상속하게 된다. equals() / hashCode() [Coding/Kotlin Java] - [Effective Java] 3장 모든 객체의 공통 메서드 코틀린에서 ``kt x.equals(y)``는 ``kt x == y``와 같다. (내부적으로 equals를 호출한다.) 참조 비교를 위해서는 ``kt x === y`` 를 사용한다. Data Classes 코틀린에서는 ``kt data`` 키워드를 붙여주면 equals() / hashCode()..
[Kotlin] 프로퍼티, 커스텀 접근자, 지연 초기화
[Kotlin] 프로퍼티, 커스텀 접근자, 지연 초기화
2017.12.02프로퍼티 = 필드 + 접근자 클래스 내부의 변수 선언은 자바에서는 필드 선언을 의미하지만 코틀린에서는 프로퍼티 선언을 의미한다. 즉, 필드 뿐만 아니라 접근자 메서드도 알아서 생성해준다. ```kt class Person( val name: String, // val은 읽기 전용 프로퍼티. private 필드와 getter. var isMarried: Boolean // private 필드와 getter, setter. ) /* 코틀린에서 호출할 때 (자동으로 getter, setter 호출로 변환해준다) */ person.name person.isMarried = true /* 자바에서 호출할 때 */ person.getName() person.isMarried() // boolean 프로퍼티 gett..
[Kotlin] Class, 생성자
[Kotlin] Class, 생성자
2017.12.01``java extends / implements`` 구분 없이 그냥 ``kt :``붙이고 적는데, 클래스 상속인 경우 super class의 생성자를 호출해야 하므로 ``kt ()``를 붙여주어야 하고 인터페이스 구현인 경우 생성자가 없기 때문에 붙이지 않아야 하므로 이를 보면 둘을 구분할 수 있다. 주 생성자(primary constructor) 주 생성자는 클래스 이름 뒤에 오는 `` ()``로 둘러싸인 코드를 의미한다. 주 생성자의 파라미터는 1. 초기화 블록, 2. 프로퍼티 초기화 식, 3. 주 생성자 자체 에서만 접근할 수 있다. 1. 정석대로 초기화하면 이런 식이다. 생성자를 정의할 때는 ``kt contsructor`` 키워드를 사용한다. 주 생성자의 body(초기화 블록) 지정은 ``kt..
[Kotlin] enum / when / sealed
[Kotlin] enum / when / sealed
2017.12.01enum 자바처럼 ``kt enum`` 클래스 안에 프로퍼티나 메소드를 정의할 수 있다. 메소드를 정의하는 경우 상수와 메소드 사이에 반드시 `` ;``를 적어주어야 한다. ```kt enum class Color(val r: Int, val g: Int, val b: Int) { RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255), INDIGO(75, 0, 130), VIOLET(238, 130, 238); fun rgb() = (r * 256 + g) * 256 + b } >>> Color.RED.ordinal // index 0 >>> Color.RED.r 255 ``` enum은 cla..
[Kotlin/Java] Inner Class / Nested Class
[Kotlin/Java] Inner Class / Nested Class
2017.12.01Kotlin 중첩 클래스 / 내부 클래스아무 변경자를 붙이지 않고 클래스의 내부에 다시 정의된 클래스는 자바의 ``java static`` 중첩 클래스와 동일하다.내부 클래스로 변경해 바깥쪽 클래스에 대한 참조를 포함하도록 하려면 ``kt inner`` 변경자를 붙여준다.내부 클래스에서 바깥쪽 클래스의 인스턴스에 접근하기 위해서는 ``kt this@``를 붙여주어야 한다.```ktclass Outer { inner class Inner { fun getOuterReference() : Outer = this@Outer }}``` Java 중첩 클래스 / 내부 클래스최상위에 정의하는 class에 ``java static``을 붙이면 에러가 발생하는데, 이는 ``java static`` class로 만들 수..
직렬화, Serialization
직렬화, Serialization
2017.12.01어떤 언어를 사용하든 변수에 담기는 데이터는 크게 Value와 Address 두 가지로 구분할 수 있다.포인터, 객체 변수 등등은 변수 자체에 담기는 데이터가 Address다.문제는 객체를 저장/전송하려고 할 때 발생하는데, 객체 변수에 들어있는 Address를 저장/전송한다면 받는 측에서 그 Address를 참조해봐도 아무런 데이터가 없기 때문에 전혀 의미가 없다. 그래서 레퍼런스를 따라가서 실제로 의미있는 데이터인 Value를 저장하는 작업이 직렬화, Serialization이다.직렬화 결과 데이터 형식은 선택에 따라 Binary일 수도, JSON, CSV일 수도 있다. 그래서 그냥 포인터로 따라가서 직접 저장하는 방식으로도 구현할 수 있겠지만 객체 내부에서 또 다른 객체 변수가 있다던지, 클래스 내..
[Regex] Kotlin
[Regex] Kotlin
2017.12.01Kotlin정규식 간단히 만들기```ktprintln("12.345-6.A".split("""\.|-""".toRegex()))```그냥 ``kt "``를 하나만 적으면 escape를 위해 ``kt \\``를 사용해야 하기 때문에, 정규식을 사용하는 경우 ``kt """``를 사용하는 편이 좋다. 사실 이런 경우 굳이 정규식 쓰지 않아도 된다.```ktprintln("12.345-6.A".split(".", "-"))``` 간단한 정규식 예제```ktfun parsePath(path: String) { val regex = """(.+)/(.+)\.(.+)""".toRegex() val matchResult = regex.matchEntire(path) if (matchResult != null) { v..
[Kotlin] 확장 함수 / 확장 프로퍼티, 최상위 함수 / 최상위 프로퍼티
[Kotlin] 확장 함수 / 확장 프로퍼티, 최상위 함수 / 최상위 프로퍼티
2017.12.01확장 함수 / 확장 프로퍼티 Note ) 코틀린의 최상위 객체는 ``kt Any``이기 때문에, 여기에 추가하면 모든 객체에 확장 함수를 추가할 수 있다. 확장 함수를 사용하면 좋은 경우는 String 같은 기본 타입을 확장하고 싶을 때. e.g., String.appendSignature (public으로 쓰는 경우도 많고, 시그니처를 사용하는 부분이 제한되어 있다면 private으로 만들면 아주 깔끔) 내가 만든 클래스라 마음대로 메서드 정의가 가능한 상황일지라도, 클래스에 포함하자니 무언가 애매한 기능일 때. (역시 보통은 사용처가 제한되는 경우가 많아서 private) 확장 함수를 사용해도 실행 시점에 부가 비용이 들지 않는다. 확장 함수가 클래스를 노출시키면 안되므로, 확장 함수의 가시성은 클래..
SQL injection Mitigation : preparedStatement
SQL injection Mitigation : preparedStatement
2017.11.30SQL 구문을 미리 preparedStatement로 확정시켜 놓고 거기에 파라미터만 대입하는 형식으로 사용하면 SQL 구조가 외부 입력값에 의해서 변경되는 것을 방지할 수 있다. SQL문 실행 순서는 다음과 같다. ``` SQL 구문 분석 -> 컴파일 -> 쿼리 실행 ``` preparedStatement 사용하지 않는 동적 쿼리 구조 : id로 어떤 값이 넘어오느냐에 따라 쿼리 구조가 변경될 수 있다. ```java String sql = "select * from tbl where id=" + id; statement(sql) // 구문 분석 & 컴파일 // 쿼리 실행 ``` preparedStatement 사용하는 동적 쿼리 구조 : id에 어떤 값이 오든 쿼리 구조는 이미 확정된 상태. ```j..
[Kotlin] Tip2 + 문자열 템플릿
[Kotlin] Tip2 + 문자열 템플릿
2017.11.30가변 인수가변 인수를 받을 때는 앞에 ``kt vararg`` 키워드를 붙인다.```ktfun listOf(vararg values: T): List { ... }``` 이미 배열에 들어있는 원소를 가변 길이 인자로 넘길 때는 spread 연산자 ``kt *``를 붙인다.```ktval list = listOf("args: ", *args)```자바 코드로 변환해보면 호출하는 측에서 `` SpreadBuilder``라는 객체에 ``kt *``로 지정된 인자를 모두 풀어서 추가하고, 이를 배열로 만들어 넘기게 된다. infix(중위) 함수 호출 구문과 딕셔너리( 맵 )함수 선언 시에 ``kt infix``를 붙이면 ``kt 3.mul(10)``을 ``kt 3 mul 10``으로 쓸 수 있도록 하는 건데, ..
[Kotlin] Tip
[Kotlin] Tip
2017.11.28Kotlin. Java 대비 장점이 무엇인가? Java도 버전 올라가면서 """ string, when expression, utility stream API 등 코틀린을 쓰면서 느꼈던 장점들이 보완되고 있다. 그렇다면 코틀린을 써야 할 이유가 있는가? 코틀린과 Java의 가장 큰 차이는, 자바는 모든 타입이 Nullable이라는 명확한 한계를 가지고 있다는 점이다. Optional이 있지만 제한적이다. 컴파일 타임에 아예 널이 될 수 없음을 강제하는 코틀린의 컨셉과는 확실한 수준 차이가 있다. Coroutine이라는 더 나은 동시성 처리 방법을 지원한다. java도 많이 편해졌지만, 결국 Mono, Flux. reactive까지다. 마지막으로 Java가 많이 좋아졌다고는 하지만 아직도 default a..