728x90
반응형

Develop! 58

고차함수, 리스트 조작 in Kotlin

함수를 다른 함수의 인자로 넘기거나, 함수가 반환값으로 함수를 돌려줄 수 있으면 언어가 고차함수를 지원한다고 말할 수 있다. 우선 람다를 저장한 변수의 예제를 살펴보면 아래와 같다. fun isPlus() { val isPlus: (Int) -> Boolean = { it > 0 } val result = listOf(1, 2, -3).any(isPlus) println(result) } 다음과 같은 방법으로 사용할 수 있다. (파라미터타입1, ..., 파라미터타입N) -> 반환타입 위에서는 Int 타입 1개가 넘어가고 Boolean 타입으로 반환 하는 것으로 정의 하였고, "1, 2, -3"의 값이 하나씩 들어가게 되면 0보다 큰지를 판단해서 boolean으로 응답하는 함수를 정의한 후 isPlus에 ..

Develop!/Kotlin 2023.10.04

멤버참조 in Kotlin

함수, 프로퍼티, 생성자에 대해서 호출하는 뻔한 람다를 대신할 수 있다. 사용법은 클래스 이름과 콜론 2개를 연결시켜 사용하면 된다. 관련된 내용은 아래 예제를 통해 확인해 볼 수 있다. data class Message( val sender: String, val text: String, val isRead: Boolean ) fun propertyReferenece() { val messages = listOf( Message("Kitty", "Hey!", true), Message("Kitty", "Where are you?", false) ) val unread1 = messages.filterNot(Message::isRead) val unread2 = messages.filterNot { it..

Develop!/Kotlin 2023.09.27

컬렉션에 대한 연산 in Kotlin

람다가 가독성을 올려주는 이유 중의 하나는 컬렉션에 대한 연산을 한 번에 수행할 수 있어서이다. 이미 살펴본 map, filter, any, foreach 와 같은 것들도 이러한 연산을 해 주는 것들 중 하나이다. 우선 list 를 만드는 방법 부터 살펴보자 fun createList() { val list1 = List(10) { it } println(list1) val list2 = List(10) { 0 } println(list2) val list3 = List(10) { 'a' + it } println(list3) val list4 = List(10) { list3[it%3] } println(list4) val mutableList1 = MutableList(5, { 10 * (it + 1..

Develop!/Kotlin 2023.09.25

람다 in Kotlin

람다식을 Kotlin에서도 사용할 수 있다. 가장 많이 사용하는 람다로 map이 있다. mapping의 약자인 듯 보인다. 기존 값을 사용하여 새로운 값을 맵핑해 준다는 의미로 보이는데 아래와 같이 사용한다. fun map() { val list = listOf(1, 2, 3, 4) val result = list.map { n:Int -> "[$n]" } val result2 = list.map { n -> "[$n]" } val result3 = list.map { "[${it}]" } println(result) println(result2) println(result3) val listChar = listOf('a', 'b', 'c', 'd') val resultChar = listChar.map..

Develop!/Kotlin 2023.09.25

제네릭스 in Kotlin

Java에서도 제네릭 타입이 이다. 어떠한 값을 사용할지 몰라 선언 시에 제네릭으로 선언하고 사용할 때 해당 타입으로 사용하는 것이다. 코틀린에서도 이러한 사용은 가능하다. 다음의 예를 통해 확인해 볼 수 있다. data class Automobile(val brand: String) class GenericHolder(private val value: T) { fun getValue(): T = value } fun genericHolder() { val h1 = GenericHolder(Automobile("Ford")) val a = h1.getValue() println(a) val h2 = GenericHolder(1) val i: Int = h2.getValue() println(i) val ..

Develop!/Kotlin 2023.09.22

안전한 호출과 엘비스 연산자 in kotlin

Java를 쓰면서 가장 골치 아픈게 NPE 이다. null인 객체를 바로 사용하려면 Runtime 시에 NPE가 발생하기 때문에 사용 전에 항상 if로 null인지 여부를 검증해 주거나 Optional을 사용해야 하기 때문이다. 코틀린에서는 이러한 골치아픈 내용을 손쉽게 사용할 수 있도록 해준다. fun String.echo() { println(toUpperCase()) println(this) println(toLowerCase()) } fun safeOperation() { val s1: String? = "Howdy!" s1?.echo() val s2: String? = null s2?.echo() } 이렇게 하기 위해 사용하는 것이 '?.' 이다. null이 될 수 있는 객체 뒤에 '.' 대신에..

Develop!/Kotlin 2023.09.14

Null이 될 수 없는 타입 in Kotlin

Java에서 가장 큰 실수가 null 을 만든 것이라고 한다. 그래서 Kotlin에서도 null을 없애려고 하였지만 Java를 지원하기 위해서 null을 사용하기는 한다. Java에서는 null이 될 수 없을 경우에는 lombok의 @NonNull 어노테이션을 사용한다. 코틀린에서는 기본이 non-null 이다. Java와의 연동으로 인해 null을 허용하고 싶으면 '?'를 사용하면 된다. 다음의 코드를 통해 사용법을 확인해 볼 수 있다. fun nullableType() { val s1 = "abc" // compile error // val s2: String = null val s3: String? = null val s4: String? = s1 // compile error // val s5: ..

Develop!/Kotlin 2023.09.06

구조 분해 선언 in Kotlin

사실 구조 분해라는 말은 코틀린에서 처음 들어 봤다. 어떠한 값을 여러 컴포넌트로 분해해서 나눠 준다는 의미 같다. 말로 설명하기 쉽지 않으니 소스 코드를 보자 fun compute(input: Int): Pair = if (input > 5) Pair(input * 2, "High") else Pair(input * 2, "Low") fun compute2(input: Int): Triple = if (input > 5) Triple(input * 2, "High", "Dummy") else Triple(input * 2, "Low", "Dummy") fun pair() { println(compute(7)) println(compute(4)) val result = compute(5) println(..

Develop!/Kotlin 2023.09.06

Data Class in Kotlin

값을 담는 Data class를 Java에서는 VO, DTO 등으로 부르고 @Value 또는 @Data 등의 어노테이션을 쓰면서 롬복을 활용한다. 뭐 기본적으로 그냥 getter, setter 등을 일일히 다 만들어 줘도 되긴 한다. 어째든 이러한 클래스를 별도로 분리하여 코틀린에서는 별도로 만들 수 있는데 data라는 키워드를 사용하여 만들 수 있다. data class Simple(val arg1: String, var arg2: Int) fun simple() { val s1 = Simple("Hi", 29) val s2 = Simple("Hi", 29) println(s1) println(s2) if (s1.equals(s2)) { println("eqauls") } else { println("..

Develop!/Kotlin 2023.09.04

when in kotlin

kotlin에서도 when 문을 쓸 수 있다. 다음은 독일어의 기수를 서수로 바꿔주는 when 문이다. val numbers = mapOf( 1 to "eins", 2 to "zwei", 3 to "drei", 4 to "vier", 5 to "fuenf", 6 to "sechs", 7 to "sieben", 8 to "acht", 9 to "neun", 10 to "zehn", 11 to "elf", 12 to "zwoelf", 13 to "dreizehn", 14 to "vierzehn", 15 to "fuenfzehn", 16 to "sechzehn", 17 to "siebzehn", 18 to "achtzehn", 19 to "neunzehn", 20 to "zwanzig" ) fun ordina..

Develop!/Kotlin 2023.08.23

오버로딩(OverLoading) in Kotlin

Java에서도 overloading을 사용하게 되면 같은 이름으로 다른 파라미터를 받으면서 사용할 수 있게 된다. 이렇게 함으로 추상화가 가능하게 되고 코드를 읽는 사람에게는 더 쉽게 읽히는 순 기능이 있다. 코틀린에서는 다음과 같이 사용 하게 된다. class Overloading() { fun f() = 0 fun f(n: Int) = n + 2 } fun overloading() { val o = Overloading() println(o.f()) println(o.f(11)) } 실행 결과는 아래와 같다. f라는 함수에 n이라는 파라미터를 받는 경우와 아닌 경우를 만들었다. 함수 이름과 파라미터 목록, 반환 타입을 다 합쳐서 함수의 시그니쳐 라고 하는데 함수의 파라미터를 다르게 만들면 overlo..

Develop!/Kotlin 2023.08.18

이름 붙은 인자, 가변인자 in kotlin

어떤 함수에 인자값을 전달할 때 인자의 개수들이 많다면 지금 넘기는 값이 어떤 인자에 해당하는지 알 기 어려운 경우가 많다. 그래서 클린 코드를 위해 가능하면 인자의 개수를 줄이는 행동들도 많이 한다. 이러한 어려움을 해결하기 위해 코틀린에서는 인자의 이름을 명시적으로 붙여서 전달할 수 있도록 만들어 둔 것 같다. fun color (red: Int, green: Int, blue: Int) = "($red, $green, $blue)" fun nameArgument() { println(color(1, 2, 3)) println( color( red = 76, green = 89, blue = 0, ) ) println(color(52, 34, blue = 0)) } color라는 함수에 red, gr..

Develop!/Kotlin 2023.08.16

확장함수 in kotlin

Java에서 기존에 만들어진 Class를 상속받아 메소드를 추가하고 사용하는 것을 보면서 좋은 아이디어라고 생각하고 그닥 불편하다는 생각을 못했는데 kotlin에서 하는 것을 보고 'Wow'라는 생각이 든다. 확장함수와 관련된 내용은 매우 짧다. 아래와 같이 간단하게 사용할 수 있다. fun String.singleQuote() = "'$this'" fun String.doubleQuote() = "\"$this\"" fun main() { println("Hi".singleQuote()) println("Hi".doubleQuote()) } String이란 Class를 상속 받아 새로운 함수를 넣고 싶으면 바로 정의해서 사용 하면 된다. 별도의 Class를 만들어 정의할 필요도 없다. 위의 내용을 실행..

Develop!/Kotlin 2023.08.14

Property in kotlin

Class 안에 있는 member 변수, 그리고 그 값을 get, set 하는 것과 관련하여 코틀린에서는 어떻게 처리되는지 확인할 수 있다. class Default { var i: Int = 0 get() { println("get ${field}") return field } set(value) { println("set(${value})") field = value } } fun defaultGetSet() { val d = Default() d.i = 2 d.i } fun main() { defaultGetSet() } kotlin에서는 get, set을 할 때 Java처럼 getXXX 식으로 하는게 아니라 해당 멤버변수(프로퍼티) 아래에 get, set 함수를 작성해 주면 된다. 그리고 해당 멤..

Develop!/Kotlin 2023.08.07

Set in Kotlin

Java에서도 중복된 값을 허용할 땐 List, Unique한 값만을 허용할 땐 Set을 사용한다. Kotlin에서도 그와 동일하게 사용할 수 있다. fun sets() { val intSet = setOf(1, 1, 2, 3, 9, 9, 4) println(intSet) println(9 in intSet) println(99 in intSet) println("9 contains : " + intSet.contains(9)) println("99 contains : " + intSet.contains(99)) print("[1, 9, 2] containsAll : ") println(intSet.containsAll(setOf(1, 9, 2))) print("[1, 9, 5] containsAll :..

Develop!/Kotlin 2023.08.02

가변인자 목록 in Kotlin

Java에서도 인자 값의 개수를 정해 놓지 않고 받을 경우 사용하는 문법이 있다. 가령 "String...str"와 같은 방식이다. Kotlin에서는 varargs 라는 예약어를 사용하면 된다. fun v(s: String, vararg d: Double) { println("String : $s") for (n in d) { print("$n ") } println(); } fun main() { v("abc", 1.0, 2.0) v("def", 1.0, 2.0, 3.0, 4.0) v("ghi", 1.0, 2.0, 3.0, 4.0, 5.0, 6.0) } varargs로 정의 된 인자값은 Array로 인식된다. kotlin에서 Array는 Java에서의 array와 같다. varargs로 정의하여 Arr..

Develop!/Kotlin 2023.08.02

list int kotlin

kotlin에서 list를 만들 때는 listOf 함수를 사용한다. listOf로 만들어진 list는 기본적으로 immutable 객체이다. mutable로 생성하려면 mutalbeListOf을 사용하면 된다. mutable list를 변할 수 없는 val 변수에 담으면 어떻게 될까? fun listTest() { val list1 = mutableListOf('A') list1 += 'A' list1.plusAssign('A') println(list1) val list2 = listOf('B') // list2 += 'B' // list2 = list2 + 'B' println(list2) var list3 = listOf('C') list3 += 'C' val newList = list3 + 'C'..

Develop!/Kotlin 2023.07.31

생성자 in kotlin

Kotlin에서 생성자는 Class의 이름과 소괄호만 적어 주면 된다. Java 처럼 new를 적지 않아도 된다. class Wombat { } fun main() { val wombat = Wombat() } 생성자에 파라미터를 전달할 수도 있다. class Alien(name: String) { val greeting = "Poot $name" } fun main() { val alien = Alien("Mr. Meeseeks") println(alien.greeting) } 파라미터 name은 생성자 밖에서는 접근할 수 없다. 생성자 밖에서도 접근이 가능하려면 var or val을 붙여주면 된다. class MutableNameAlien(var name: String) { fun printName(..

Develop!/Kotlin 2023.07.27

'in' in kotlin

제목이 이상하다. 코틀리에서 사용하는 in 키워드에 대해 말 하다 보니 이렇게 될 수 밖에 없다. in은 해당 값이 범위 안에 있느지 체크할 때 사용한다. fun booleanIn() { val percent = 35 println(percent in 1..100) } 해당 값이 있으면 true, 없으면 false를 반환한다. 1 ~ 100 사이에 값이 있으니 위의 메소드의 실행 결과값은 true 이다. in 키워드는 값이 있는지 없는지 뿐 아니라 for iteration에서도 사용할 수 있다. fun iterationIn() { val values = 1..3 for (v in values) { println("iteration $v") } val v = 2 if (v in values) { print..

Develop!/Kotlin 2023.07.26

for loop in kotlin

for loop문은 특정 범위의 내용을 순회 하면서 내용을 처리할 때 자주 쓴다. Kotlin에서 for 문은 아래와 같이 사용한다. fun main() { for (i in 1..3) { println("Hey $i!") } } 특정 범위를 나타낼 때 두 개의 값을 사용해서 정의할 수 있다. 범위를 나타내는 방법은 '..'를 사용하는 방법 말고 until을 사용할 수도 있다. fun range() { val range1 = 1..10 val range2 = 0 until 10 println(range1) println(range2) } '..'는 시작과 끝을 포함하지만 until은 끝은 포함하지 않게 된다. until은 실수에 대해서는 사용할 수 없다. 간격은 step 을 사용할 수 있다. 다음 예제를..

Develop!/Kotlin 2023.07.21

String Template in Kotlin

Template처럼 문자열을 다룰 수 있다. fun stringTemplate() { val answer = 42 println("Found $answer!") println("printing a $1") } 이 내용을 실행하면 아래와 같은 결과가 나온다. 값이 있는 $answer는 해석해서 나오지만 아무런 값이 할당되지 않은 $1 같은 경우에는 문자 그대로 나온다. 문자열을 이어 붙일 경우에는 '+'를 이용한다. fun stringConcat() { val s = "hi\n" val n = 11 val d = 3.14 println("first : " + s + "second : " + n + ", third : " + d) } 실행 결과는 아래와 같다. $를 사용할 때 중괄호와 같이 사용하면 내용을 ..

Develop!/Kotlin 2023.07.19

함수 in Kotlin

함수는 학교 수학 시간에 배우는 것 처럼 무엇인가 내부적으로 로직을 처리하는 것을 말한다. Kotlin에서도 함수를 사용할 수 있다. 아래와 같은 코드를 보고 하나씩 분석해 보자 fun main() { val r = multiplyByTwo(5) println(r) println(multiplyByThree(5)) println(multiplyByFour(5)) sayHello() sayGoodBye() } fun multiplyByTwo(i: Int): Int { println("Inside multiplyByTwo") return i * 2 } fun multiplyByThree(i: Int): Int = i * 3 fun multiplyByFour(i: Int) = i * 4 fun sayHello..

Develop!/Kotlin 2023.07.14

Data Type in Kotlin

코틀린에서는 데이터 타입을 명시해서 사용할 수도 있고, 그냥 Javascript나 PHP에서처럼 정의하지 않고 사용할 수 도 있다. 바로 아래와 같이... fun main() { val n = 1 var p = 1.2 val m: Int = 1 var q: Double = 1.2 val r = n + p println(r) } 이렇게 작성하게 되면 n은 Int(정수), p는 Double(소수)가 된다. Java에서는 정수를 int 또는 Integer라고 하고 소수는 float Float double Double등으로 다양하게 쓰이지만 kotlin에서는 단 두 가지만 쓰이나 보다. 스크립트 언어에서 타입을 추론해서 변수의 타입을 정하게 되는데 그런 느낌으로 만든 듯 싶다. 다만 명시적으로 타입을 정의해 줄..

Develop!/Kotlin 2023.07.14

var and val

책에서는 mutable, immutable 이라고 이야기 하지만, 우리가 보통 이야기하는 변수 또는 상수의 개념으로 보인다. var가 variable의 약자로서 변수이고, val은 value의 약자로 상수가 되는 것 같다. 기본적인 코드를 다음과 같이 작성해 본다. fun main() { var whole = 11 var fractional = 1.4 var words = "Twas Brilling" println(whole) println(fractional) println(words) } var는 변수이기에 재 할당이 가능하다. 재할당이 가능한지는 아래와 같이 해 보면 바로 알 수 있다. fun main() { var sum = 1 println(sum) sum += 3 println(sum) } 결..

Develop!/Kotlin 2023.07.13

Hello World for Kotlin

코린이라서 https://product.kyobobook.co.kr/detail/S000201206714 책을 스터디 하는 김에 하나씩 정리해서 남겨 본다. 우선 시작이니 당근 HelloWorld 부터... fun main() { println("Hello World") } 시작부터 헤맸다. 너무나도 쉬운 Hello World이지만... 위와 같이 코딩하지 않고 아래와 같이 했기 때문이다. class AtomicKotlin_01_03 { fun main() { println("Hello World") } } Class 안에 main이 당연히 존재해야 한다고 생각 했는데 그게 아니였다. 너무 Java에 익숙해졌나 보다. main method가 Class 밖에 있어야 아래 처럼 실행 버튼이 생긴다. 실행하면..

Develop!/Kotlin 2023.07.13

도커 엔진(Docker Engine) - 2

2022.01.17 - [Develop!/Docker,Kubernetes] - 도커 엔진 - 1 에 이어 계속 정리 한다. 아래의 책을 읽으면서 알게 된 내용을 정리한다. http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791158392291&orderClick=LAG&Kc= 시작하세요! 도커/쿠버네티스 - 교보문고 친절한 설명으로 쉽게 이해하는 컨테이너 관리 | ★ 이 책의 구성 ★◎ 도커의 기본 사용 방법을 익힘으로써 컨테이너의 기본 개념을 학습합니다. (1부 1장, 1부 2장)◎ 도커 스웜 모드를 통해 서 www.kyobobook.co.kr 도커 볼륨 도커 이미지를 컨테이너로 생성하면 이미지는 읽기 ..

도커 엔진(Docker Engine) - 1

아래의 책을 읽으면서 알게 된 내용을 정리한다. http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791158392291&orderClick=LAG&Kc= 시작하세요! 도커/쿠버네티스 - 교보문고 친절한 설명으로 쉽게 이해하는 컨테이너 관리 | ★ 이 책의 구성 ★◎ 도커의 기본 사용 방법을 익힘으로써 컨테이너의 기본 개념을 학습합니다. (1부 1장, 1부 2장)◎ 도커 스웜 모드를 통해 서 www.kyobobook.co.kr 도커 이미지 가상 머신을 생성할 때 사용하는 ISO 파일과 비슷한 개념. 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용 됨. 도커에서 사용하는 이미지의 기본 이름은 "저장소 이름/..

Spark란?

BigData 관련해서 아무것도 모르는 상태인데 회사에서 기본적인 Spark 사용이 필요하여 조금씩 알아가며 정리를 해 볼까 한다. 아무것도 모르는 개발자로서 하나 하나 적어 나가는 것이므로, 아주 아주 기초적인 수준이 될 것으로 보이며, 잘못된 정보가 기록될 가능성도 크다. Spark가 나오기 전에는 하둡과 맵리듀스를 사용하여 대용량 데이터를 처리하였다. 하둡과 맵리듀스도 사용해 보지 않아 정확하게는 모르지만, 맵리듀스를 이용해 정제된 데이터를 분산 디스크(HDFS)에 쓰고, 그 내용을 하둡이 다시 가지고 처리하여 저장하는 일련의 과정을 반복하여 값을 가져오는 방식이였다. 하지만 Spark는 대량의 데이터를 메모리에 유지하는 설계로 성능을 끌어 올렸으며, 이로 인해 맵리듀스보다 10 ~ 100배 빠른 ..

Develop!/BigData 2021.09.17

Get에 Body 사용하기?

Get에 Body를 사용한 API가 있어서 이게 가능한 것인가? 라는 생각이 들어 검색해 보니 아래와 같은 내용이 나왔다. https://brunch.co.kr/@kd4/158 HTTP GET 메소드와 body GET메소드에 body 를... | RESTful API를 설계함에 있어 HTTP GET 메소드는 URI에 해당하는 리소스를 조회하는 용도로 사용된다. 때문에 여기에 추가되는 API 파라미터들은 조회 조건을 설정하기 위해 사용 brunch.co.kr 몇 가지 내용만 추려 보자면... 다음과 같다. 이정도로 정리가 될 것 같다. 중요한건 같이 개발하는 구성원들의 동의와 이해인 듯 싶다.

Develop! 2021.08.26
728x90
반응형