-
2022.09.21
[Kotlin] 검사와 자료형 변환
검사와 자료형 변환 코틀린의 자료형 변환 기본형을 사용하지 않고 참조형만 사용 서로 다른 자료형은 변환 과정을 거친 후 비교 val a: Int = 1 // 정수형 변수 a를 선언하고 1을 할당 val b: Double = a // 자료형 불일치 오류 발생 val c: Int = 1.1 // 자료형 불일치 오류 발생 변환 메서드의 이용 val b: Double = a.toDouble() // 변환 메서드 사용 표현식에서 자료형의 자동 변환 val result = 1L + 3 // Long + Int -> 결과는 Long 변환 메서드의 종류 toByte : Byte toLong : Long toShort : Short toFloat : Float toInt : Int toDouble : Double toC..
-
2022.08.28
[Kotlin] 널(Null)
널(Null) 널(Null), 너는 누구니? 코틀린은 변수를 사용할 때 반드시 값이 할당되어 있어야 한다는 원칙이 있다. 만약 값이 할당되지 않은 변수를 사용하면 코틀린에서 오류가 발생한다. 한편 값이 없는 상태는 널(Null) 이라고 부른다. 프로그램이 실행되는 도중에 값이 null 인 변수에 접근하려 하면 NPE(NullPointerException) 오류가 발생한다. 변수에 null 할당을 허용하려면 자료형 뒤에 물음표 기호(?)를 명시해야 한다. null을 이용한 변수 검사 코틀린의 변수 선언은 기본적으로 null을 허용하지 않는다. val a: Int = 30 var b: String = "Hello" 다음과 같이 null 가능한 변수들을 선언할 수 있다. val a: Int? = null va..
-
2022.08.27
[Kotlin] 자료형과 변수
자료형과 변수 자료형과 변수 자료형 Int String Float ... 변수 val (Value) : 불변형(Immutable) var (Variable) : 가변형(Mutable) 변수의 선언 val username: String = "Kildong" 선언 키워드 변수 이름 자료형 값 변수 선언 예 val username = "Kildong" // 자료형을 추론하여 String 으로 결정 var username // 자료형을 지정하지 않은 변수는 사용할 수 없음. val init: Int // 사용 전 혹은 생성자 시점에서 init 변수를 초기화 해야 함. val number = 10 // number 변수는 Int 형으로 추론 여기서 주의할 점은, var username 과 같이 자료형을 지정하지 ..
-
2022.08.26
[Kotlin] InteliJ IDEA 살펴보기 & main() 함수
InteliJ IDEA 살펴보기 & main() 함수 IntelliJ IDEA 도구 창의 단축키 도구창 단축키(윈도우) 단축키(맥) Message [Alt] + [0] [Cmd] + [0] Project [Alt] + [1] [Cmd] + [1] Favorites [Alt] + [2] [Cmd] + [2] Run [Alt] + [4] [Cmd] + [4] Debug [Alt] + [5] [Cmd] + [5] TODO [Alt] + [6] [Cmd] + [6] Structure [Alt] + [7] [Cmd] + [7] Terminal [Alt] + [F12] [Option] + [F12] Create a new project Coding main을 타이핑하고 [Tab] 키를 눌러보자. main 함수가 코..
-
2022.08.26
[Kotlin] 자바 JDK 설치하기 / 환경 변수 설정하기
자바 JDK 설치하기 / 환경 변수 설정하기 JDK 설치는 왜? 코틀린을 JVM에서 실행하기 위해 기존 자바와 상호작용할 수 있고, 자바 라이브러리를 이용할 수 있음. Oracle JDK vs. OpenJDK Oracle JDK : 보안 업데이트를 지속적으로 받으려면 '구독' 방식으로 라이선스를 구매해야 함. OpenJDK : 제한 없이 사용 가능하지만, 보안 서비스의 의무가 없어 유지보수가 어려움. Azul의 Julu TCK 인증을 통과한 OpenJDK를 묶어서 배포하는 제 3의 벤더 https://www.azul.com/downloads/ Downloads No matter the size of your company, Azul offers competitive pricing options to fi..
-
2022.08.24
[Kotlin] 코틀린의 개요
코틀린의 개요 Kotlin 탄생 배경 목표 풀 스택 웹 개발, Android와 iOS 앱 그리고 임베디드, IoT 등 모든 개발을 다양한 플랫폼에서 개발할 수 있도록 하는 것 특징 IDE(Android Studio의 모체)로 유명한 JetBrains 에서 개발하고 보급 코드가 간결하고 다재 다능하며 호환성이 높다. 문장 끝에 세미콜론은 옵션이다. Android Studio 에서 안드로이드 공식 언어로 추가 변수는 Nullable(널 값 사용 가능)과 NotNull로 나뉘는데, 변수 선언시 '?'를 붙여 Nullable로 만들 수 있다. 다양한 플랫폼 사용 가능한 플랫폼 Kotlin/JVM : 자바 가상 머신 상에서 동작하는 앱을 만들 수 있다. Kotlin/JS : 자바 스크립트에 의해 브라우저에서 동작..
-
2022.08.21
[Kotlin] 코틀린 한 눈에 알아보기
코틀린(Kotlin) 한 눈에 알아보기 코틀린(Kotlin) IntelliJ IDEA의 개발사 JetBrains에서 2011년에 공개한 오픈 소스 프로그래밍 언어 JVM 기반의 언어이며, Java와 유사하지만 더 간결한 문법과 다양한 기능을 추가하였다. Java와의 상호 운용이 100% 지원된다. JVM 바이트 코드가 기본이지만, Kotlin/Native 컴파일러를 사용하여 기계어로 컴파일할 수 있다. 안드로이드, 스프링 프레임워크, 톰캣, JavaScript, Java EE, HTML5, iOS, 라즈베리 파이 등을 개발할 때 사용할 수 있다. 2017년에 구글이 안드로이드의 공식 언어로 Kotlin을 추가하였다. 이는 오라클과의 Java API 저작권 분쟁의 여파로 보는 시각이 많다. 이름은 JetB..
-
2021.04.10
[안드로이드] 합성 프로퍼티(Synthetic Property)를 사용한 뷰 바인딩(View Binding)
# 뷰 바인딩(View Binding) 안드로이드에서 UI 를 화면에 나타낼 때 레이아웃 파일인 xml 파일에 UI 의 요소를 태그 표기법으로 작성함. xml 파일을 코드에서 사용하려면 뷰(View) 로 불리는 UI 요소의 id를 코드에서 지정해야 함. 이 작업을 뷰의 바인딩(View Binding) 이라고 함. 뷰의 바인딩을 이용하려면 코틀린 안드로이드 확장이 build.gradle 파일에 지정되어야 함. 모듈 단위의 build.gradle(.app) 파일에 다음 플러그인이 명시되어 있는지 확인함. apply plugin: 'kotlin-android-extensions' # 합성 프로퍼티 사용하기 코틀린 확장 기능을 이용해 다음과 같이 합성 프로퍼티(Synthetic Property) 를 사용하여 U..
-
2021.04.05
보일러플레이트(Boilerplate)
보일러플레이트(Boilerplate) 보일러플레이트(Boilerplate)한 코드 반복되어 자주 쓰지만 매번 작성하기 번거롭고 읽기 어려운 많은 양의 코드 코틀린의 목표는 이러한 보일러플레이트한 코드를 제거해서 자주 사용되는 루틴을 간략화하는 것이다. 참고 : Wikipedia
-
2021.04.05
[코틀린] 기본 스레드 생성하기
■ 스레드 루틴 만들기 (Java) - Thread 클래스 상속받기 - Runnable 인터페이스 구현 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // (1) Thread 클래스를 상속받아 구현하기 class SimpleThread: Thread() { override fun run() { println("Current Threads: ${Thread.currentThread()}") } } // (2) Runnable 인터페이스로부터 run() 메서드 구현하기 class SimpleRunnable: Runnable { override fun run() { println("Current Threads: ${Thread.currentThread()..
-
2021.04.03
[코틀린] 컬렉션의 순서와 정렬 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 fun main() { val unsortedList = listOf(3, 2, 7, 5) // reversed: 뒤집힌 순서로 컬렉션 반환 println("reversed: " + unsortedList.reversed()) // sorted: 요소를 정렬한 후 정렬된 컬렉션 반환 println("sorted: " + unsortedList.sorted()) // sortedDescending: 내림차순 정렬 println("sortedDescending: " + unsortedList.sortedDescending()) // sortedBy: 특정 비교식에 의해 정렬된 컬렉션 반환 println("sortedBy: " + unsor..
-
2021.04.03
[코틀린] 컬렉션의 분리와 병합 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 fun main() { val list1 = listOf(1, 2, 3, 4, 5, 6) val list2 = listOf(2, 2, 3, 4, 5, 5, 6, 7) // union: 두 List를 합침 (중복 요소는 하나만) println(list1.union(list2)) // plus: 두 List를 합침 (중복 요소 포함), + 연산자와 같음. println(list1.plus(list2)) // partition: 주어진 식에 따라 2개의 컬렉션으로 분리해 Pair로 반환 val part = list1.partition { it % 2 == 0 } println(part) // zip: 동일한 인덱스끼리 Pair를 ..
-
2021.04.03
[코틀린] 컬렉션 요소 처리와 검색 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 fun main() { val list = listOf(1, 2, 3, 4, 5, 6) val listPair = listOf(Pair("A" , 300), Pair("B", 200), Pair("C", 100), Pair("D", 200)) val listRepeated = listOf(2, 2, 3, 4, 5, 5, 6) // elementAt: 인덱스에 해당하는 요소 반환 println("elementAt: " + list.elementAt(1)) // e..
-
2021.04.03
[코틀린] 컬렉션 요소의 매핑 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 fun main() { val list = listOf(1, 2, 3, 4, 5, 6) val listWithNull = listOf(1, null, 3, null, 5, 6) // map: 컬렉션에 주어진 식을 적용해 새로운 컬렉션 반환 println(list.map { it * 2 }) // mapIndexed: 컬렉션에 인덱스를 포함하고 주어진 식을 적용해 새로운 컬렉션 반환 val mapIndexed = list.mapIndexed { index, it -> index * it } println(mapIndexed) // mapNotNull: null을 제외하고 식을 적용해 새로운 컬렉션 반..
-
2021.04.03
[코틀린] 컬렉션 요소의 필터와 추출 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 fun main() { val list = listOf(1, 2, 3, 4, 5, 6) val listMixed = listOf(1, "Hello", 3, "World", 5, 'A') val listWithNull = listOf(1, null, 3, null, 5, 6) val listRepeated = listOf(2, 2, 3, 4, 5, 5, 6) val map = mapOf(11 to "Java", 22 to "Kotlin", 33 to "C++") // fil..
-
2021.04.03
[코틀린] 컬렉션 요소의 검사 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 fun main() { val list = listOf(1, 2, 3, 4, 5, 6) val listPair = listOf(Pair("A" , 300), Pair("B", 200), Pair("C", 100)) val map = mapOf(11 to "Java", 22 to "Kotlin", 33 to "C++") // all: 모든 요소가 일치해야 true 반환 println(list.all { it < 10 }) println(list.all { it % 2 == 0 }) // any: 최소한 하나 혹은 그 이상의 특정 요소가 일치해야 true 반환 pr..
-
2021.04.03
[코틀린] 컬렉션 요소의 처리와 집계 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 fun main() { val list = listOf(1, 2, 3, 4, 5, 6) val listPair = listOf(Pair("A", 300), Pair("B", 200), Pair("C", 100)) val map = mapOf(11 to "Java", 22 to "Kotlin", 33 to "C++") // forEach: 각 요소를 람다식으로 처리 list.forEach { print("$it ") } println() list.forEachIndexed { index, val..
-
2021.04.03
[코틀린] 컬렉션 연산 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 fun main() { val list1: List = listOf("one", "two", "three") val list2: List = listOf(1, 3, 4) val map1 = mapOf("hi" to 1, "hello" to 2, "Goodbye" to 3) println(list1 + "four") // + 연산자를 사용한 문자열 요소 추가 println(list1 + 1) // + 연산자를 사용한 정수형 요소 추가 println(list2 + listOf(5, 6, 7)) // 두 List의 병합 println(list2 - 1) // 요소의 제거 println(list2 - listOf(3, 4, 5)) // 일치하는 요..
-
2021.04.03
[코틀린] 불변형(Immutable) List를 가변형(Mutable)으로 변환하기
- List의 toMutableList() 메서드를 사용하여 불변형(Immutable) List를 가변형(Mutable)으로 변환할 수 있음. (가변형 List를 불변형 List로 변환하는 메서드는 존재하지 않음.) 1 2 3 4 5 6 fun main() { val names: List = listOf("one", "two", "three") // 불변형 List 초기화 val mutableNames = names.toMutableList() // 새로운 가변형 List가 만들어짐. mutableNames.add("four") // 가변형 List에 하나의 요소 추가 println(mutableNames) } [one, two, three, four]
-
2021.04.02
[코틀린] 배열의 인덱스 찾아내기 예제 (제네릭, 배열 사용)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 fun find(a: Array, Target: T): Int { for (i in a.indices) { if (a[i] == Target) return i } return -1 } fun main() { val arr1: Array = arrayOf("Apple", "Banana", "Cherry", "Durian") val arr2: Array = arrayOf(1, 2, 3, 4) println("arr.indices ${arr1.indices}") // indices는 배열의 유효 범위 반환 println(find(arr1, "Cherry")) // 요소 C의 인덱스 찾아내기 println(find(arr2, 2)) // 요소 2의..
-
2021.03.31
[코틀린] 접근 지정자(Getter, Setter) 예제
게터와 세터가 포함되는 프로퍼티 선언에 대한 구조 var 프로퍼티_이름[: 프로퍼티 자료형] [= 프로퍼티 초기화] [get() { 게터 본문 }] [set(value) { 세터 본문 }] val 프로퍼티 이름[: 프로퍼티 자료형] [= 프로퍼티 초기화] [get() { 게터 본문 }] 프로퍼티를 var로 선언하는 경우 게터와 세터 둘 다로 선언할 수 있음. 프로퍼티를 val로 선언하는 경우 게터로만 선언 가능함. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class User(_id: Int, _name: String, _age: Int) { // 프로퍼티 val id: Int = _id get() = field var name: St..
-
2021.03.17
[코틀린] 사용자 예외 클래스 생성 & 사용 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class InvalidNameException(message: String) : Exception(message) // 1. 사용자 예외 클래스 설정 fun main() { var name = "Kildong123" // 2. 숫자가 포함된 이름 try { validateName(name) } catch (e : InvalidNameException) { // 3. 숫자가 포함된 예외 처리 println(e.message) } catch (e : Exception) { // 기타 예외 처리 println(e.message) } } fun validateName(name: String) { if (name.matches..
-
2021.03.16
[코틀린] Try-Catch-Finally & Throw 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 fun main() { var amount = 600 try { amount -= 100 checkAmount(amount) } catch (e : Exception) { println(e.message) } finally { println("이 문장은 무조건 실행됩니다.") } println("amount: $amount") } fun checkAmount(amount: Int) { if (amount < 1000) { throw Exception("잔고가 $amount 으로 1000 이하입니다.") } } 잔고가 500 으로 1000 이하입니다. 이 문장은 무조건 실행됩니다. amount: 500
-
2021.03.15
[코틀린] 람다식의 매개변수
람다식의 매개변수 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 fun main() { // 매개변수가 없는 람다식 noParam({ "Hello World!" }) noParam { "Hello World!" } // 위와 동일한 결과, 소괄호 생략 가능 println() // 매개변수가 1개 있는 람다식 oneParam({ a -> "Hello World! $a" }) oneParam { a -> "Hello World! $a" } // 위와 동일한 결과, 소괄호 생략 가능 oneParam { "Hello World! $it..
-
2021.03.15
함수에서 다양한 인자의 개수를 전달받기 (vararg 키워드)
함수에서 다양한 인자의 개수를 전달 받기 가변 인자(Variable Argument) 를 사용하여 여러 개의 인자를 받을 수 있음. 가변 인자(Variable Argument) '인자의 개수가 변한다.' 는 뜻 함수는 하나만 정의해 놓고, 여러 개의 인자를 받을 수 있음. 사용 방법 함수를 선언할 때, 매개변수 왼쪽에 vararg라는 키워드를 붙이면 됨. 사용 예 1 2 3 4 5 6 7 8 9 10 11 fun main() { normalVarargs(1, 2, 3, 4) // 4개의 인자값 구성 normalVarargs(4, 5, 6) // 3개의 인자값 구성 } fun normalVarargs(vararg counts: Int) { // vararg 키워드 사용 for (num in counts) ..
-
2021.03.15
[코틀린] XOR을 이용하여 2개의 변수 값 바꾸기 (Swap 기법)
XOR을 이용하여 2개의 변수 값 바꾸기 xor의 독특한 성질을 이용하여 2개의 변수 값을 바꿀 수 있음. 스왑(Swap) 기법 xor 연산자를 3번 사용하여 두 변수의 값을 바꿈. 임시 변수를 놓고 변수를 저장하여 옮기는 등의 작업을 하지 않아도 간편하게 두 수를 바꿀 수 있어 편리함. 1 2 3 4 5 6 7 8 9 10 11 fun main() { var number1 = 12 var number2 = 25 number1 = number1 xor number2 // number1 = 21, number2 = 25 number2 = number1 xor number2 // number1 = 21, number2 = 12 number1 = number1 xor number2 // number1 = 25..