├── .gitignore └── src └── main └── kotlin ├── 10_enum.kt ├── 1_Variable.kt ├── 2_Function.kt ├── 3_For.kt ├── 3_If.kt ├── 3_When.kt ├── 3_While.kt ├── 4_Exception.kt ├── 5_NullSafey.kt ├── 7_ClassProperty.kt ├── 8_Inheritance.kt ├── 9_Interface.kt ├── Java_Coffee.java ├── Java_Exception.java ├── Java_If.java ├── Java_NullSafety.java ├── Java_Switch.java ├── Logger.java └── Message.java /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | bin/ 17 | !**/src/main/**/bin/ 18 | !**/src/test/**/bin/ 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /src/main/kotlin/10_enum.kt: -------------------------------------------------------------------------------- 1 | enum class PaymentStatus(val label: String) : Payable { 2 | UNPAID("미지급") { 3 | override fun isPayable() = true 4 | }, 5 | PAID("지급완료") { 6 | override fun isPayable() = false 7 | }, 8 | FAILED("지급실패") { 9 | override fun isPayable() = false 10 | }, 11 | REFUNDED("환불") { 12 | override fun isPayable() = false 13 | }; 14 | } 15 | 16 | interface Payable { 17 | fun isPayable(): Boolean 18 | } 19 | 20 | fun main() { 21 | 22 | if (PaymentStatus.UNPAID.isPayable()) { 23 | println("결제 가능 상태") 24 | } 25 | val paymentStatus = PaymentStatus.valueOf("PAID") 26 | println(paymentStatus.label) 27 | 28 | if (paymentStatus == PaymentStatus.PAID) { 29 | println("결제 완료 상태") 30 | } 31 | 32 | 33 | for (status in PaymentStatus.values()) { 34 | println("[${status.name}](${status.label}) : ${status.ordinal}") 35 | } 36 | } -------------------------------------------------------------------------------- /src/main/kotlin/1_Variable.kt: -------------------------------------------------------------------------------- 1 | // top-level 2 | var x = 5 3 | 4 | fun main() { 5 | x+= 1 6 | println(x) 7 | 8 | 9 | val a : Int = 1 10 | 11 | val b = 1 12 | 13 | val c : Int 14 | c = 3 15 | 16 | val d : Int 17 | d = 123 18 | 19 | //val(value) : 불변(Immutable) 20 | //var(variable) : 가변(Mutable) 21 | 22 | var e : String = "Hello" 23 | e = "World" 24 | 25 | var f = 123 26 | // f = "hi" // 컴파일 오류 타입은 변경이 불가 27 | 28 | 29 | 30 | } -------------------------------------------------------------------------------- /src/main/kotlin/2_Function.kt: -------------------------------------------------------------------------------- 1 | // 기본적인 함수 선언 스타일 2 | fun sum(a: Int, b: Int) : Int { 3 | return a + b 4 | } 5 | 6 | // 표현식 스타일 7 | fun sum2(a: Int, b: Int) : Int = a + b 8 | 9 | // 표현식 & 반환타입 생략 10 | fun sum3(a: Int, b: Int) = a + b 11 | 12 | 13 | // 몸통이 있는 함수는 반환 타입을 제거하면 컴파일 오류 14 | fun sum4(a: Int, b: Int) : Int { 15 | return a + b 16 | } 17 | 18 | // 반환타입이 없는 함수는 Unit을 반환한다 19 | fun printSum(a: Int, b: Int) : Unit { 20 | println("$a + $b = ${a + b}") 21 | } 22 | 23 | 24 | // 디폴트 파라미터 25 | fun greeting(message: String = "안녕하세요!!") { 26 | println(message) 27 | } 28 | // 29 | //fun main( ) { 30 | // greeting() 31 | // greeting("HI!!!") 32 | //} 33 | 34 | 35 | fun log(level: String = "INFO", message: String) { 36 | println("[$level]$message") 37 | } 38 | 39 | fun main( ) { 40 | log(message = "인포 로그") 41 | log(level = "DEBUG", "디버그 로그") 42 | log("WARN", "워닝 로그") 43 | log(level = "ERROR", message = "에러 로그") 44 | } 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/main/kotlin/3_For.kt: -------------------------------------------------------------------------------- 1 | fun main() { 2 | 3 | // 범위 연산자 .. 를 사용해 for loop 돌리기 4 | for (i in 0..3) { 5 | println(i) 6 | } 7 | 8 | // until 을 사용해 반복한다 9 | // 뒤에 온 숫자는 포함하지 않는다 10 | for (i in 0 until 3) { 11 | println(i) 12 | } 13 | 14 | // step 에 들어온 값 만큼 증가시킨다 15 | for ( i in 0..6 step 2) { 16 | println(i) 17 | } 18 | 19 | // downTo를 사용해 반복하면서 값을 감소시킨다 20 | for (i in 3 downTo 1) { 21 | println(i) 22 | } 23 | 24 | // 전달받은 배열을 반복 25 | val numbers = arrayOf(1,2,3) 26 | 27 | for (i in numbers) { 28 | println(i) 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/kotlin/3_If.kt: -------------------------------------------------------------------------------- 1 | fun main() { 2 | 3 | //if..else 사용 4 | val job = "Software Developer" 5 | 6 | if (job == "Software Developer") { 7 | println("개발자") 8 | } else { 9 | println("개발자아님") 10 | } 11 | 12 | 13 | //코틀린의 if...else는 표현식이다 14 | val age : Int = 10 15 | 16 | val str = if (age > 10) { 17 | "성인" 18 | } else { 19 | "아이" 20 | } 21 | 22 | 23 | 24 | //코틀린은 삼항 연산자가 없다. if..else가 표현식이므로 불필요하다 25 | val a = 1 26 | val b = 2 27 | val c = if (b > a) b else a 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/kotlin/3_When.kt: -------------------------------------------------------------------------------- 1 | fun main() { 2 | 3 | // 자바 코드를 코틀린의 when식으로 변환한 코드 4 | val day = 2 5 | 6 | val result = when (day) { 7 | 1 -> "월요일" 8 | 2 -> "화요일" 9 | 3 -> "수요일" 10 | 4 -> "목요일" 11 | else -> "기타" 12 | } 13 | println(result) 14 | 15 | // else를 생략할 수 있다 16 | when(getColor()) { 17 | Color.RED -> print("red") 18 | Color.GREEN -> println("green") 19 | else -> println("blue") 20 | } 21 | 22 | // 여러개의 조건을 콤마로 구분해 한줄에서 정의할 수 있다 23 | when (getNumber()) { 24 | 0, 1 -> print("0 또는 1") 25 | else -> print("0 또는 1이 아님") 26 | } 27 | } 28 | 29 | enum class Color { 30 | RED, GREEN, BLUE 31 | } 32 | 33 | fun getColor() = Color.RED 34 | 35 | fun getNumber() = 2 -------------------------------------------------------------------------------- /src/main/kotlin/3_While.kt: -------------------------------------------------------------------------------- 1 | fun main() { 2 | 3 | // 자바의 while문과 동일 4 | // 조건을 확인하고 참이면 코드 블록을 실행한 후 다시 조건을 확인 5 | var x = 5 6 | 7 | while (x > 0) { 8 | println(x) 9 | x-- 10 | } 11 | } -------------------------------------------------------------------------------- /src/main/kotlin/4_Exception.kt: -------------------------------------------------------------------------------- 1 | 2 | fun main() { 3 | 4 | try { 5 | throw Exception() 6 | } catch (e: Exception) { 7 | println("에러 발생!") 8 | } finally { 9 | println("finally 실행!") 10 | } 11 | 12 | val a = try { 13 | "1234".toInt() 14 | } catch (e: Exception) { 15 | println("예외 발생 !") 16 | } 17 | println(a) 18 | 19 | //throw Exception("예외 발생!") 20 | 21 | val b: String? = null 22 | val c: String = b ?: failFast("a is null") 23 | 24 | println(c.length) 25 | 26 | 27 | } 28 | 29 | fun failFast(message: String): Nothing { 30 | throw IllegalArgumentException(message) 31 | } 32 | -------------------------------------------------------------------------------- /src/main/kotlin/5_NullSafey.kt: -------------------------------------------------------------------------------- 1 | fun getNullStr(): String? = null 2 | 3 | fun getLengthIfNotNull(str: String?) = str?.length ?: 0 4 | 5 | fun main() { 6 | 7 | val nullableStr = getNullStr() 8 | 9 | val nullableStrLength = nullableStr?.length ?: "null인 경우 반환".length 10 | println(nullableStrLength) 11 | 12 | val length = getLengthIfNotNull(null) 13 | println(length) 14 | 15 | 16 | //throw NullPointerException() 17 | 18 | // val c: String? = null 19 | // val d = c!!.length 20 | 21 | println(Java_NullSafety.getNullStr()?.length ?: 0) 22 | 23 | 24 | 25 | 26 | 27 | } -------------------------------------------------------------------------------- /src/main/kotlin/7_ClassProperty.kt: -------------------------------------------------------------------------------- 1 | class Coffee( 2 | var name: String = "", 3 | var price: Int = 0, 4 | var iced: Boolean = false, 5 | ) { 6 | 7 | val brand: String 8 | get() { 9 | return "스타벅스" 10 | } 11 | 12 | var quantity : Int = 0 13 | set(value) { 14 | if (value > 0) { // 수량이 0 이상인 경우에만 할당 15 | field = value 16 | } 17 | } 18 | 19 | } 20 | 21 | class EmptyClass 22 | 23 | fun main() { 24 | val coffee = Coffee() 25 | coffee.name = "아이스 아메리카노" 26 | coffee.price = 2000 27 | coffee.quantity = 1 28 | coffee.iced = true 29 | 30 | if (coffee.iced) { 31 | println("아이스 커피") 32 | } 33 | println("${coffee.brand} ${coffee.name} 가격은 ${coffee.price} 수량은 ${coffee.quantity}") 34 | } 35 | -------------------------------------------------------------------------------- /src/main/kotlin/8_Inheritance.kt: -------------------------------------------------------------------------------- 1 | open class Dog { 2 | open var age: Int = 0 3 | 4 | open fun bark() { 5 | println("멍멍") 6 | } 7 | } 8 | 9 | open class Bulldog(final override var age: Int = 0) : Dog() { 10 | 11 | final override fun bark() { 12 | super.bark() 13 | } 14 | } 15 | 16 | abstract class Developer { 17 | 18 | abstract var age: Int 19 | abstract fun code(language: String) 20 | 21 | } 22 | 23 | class BackendDeveloper(override var age : Int) : Developer() { 24 | 25 | override fun code(language: String) { 26 | println("I code with $language") 27 | } 28 | } 29 | 30 | fun main() { 31 | val backendDeveloper = BackendDeveloper(age = 20) 32 | println(backendDeveloper.age) 33 | backendDeveloper.code("Kotlin") 34 | 35 | 36 | val dog = Bulldog(age = 2) 37 | println(dog.age) 38 | dog.bark() 39 | 40 | } -------------------------------------------------------------------------------- /src/main/kotlin/9_Interface.kt: -------------------------------------------------------------------------------- 1 | class Product(val name: String, val price: Int) 2 | 3 | interface Wheel { 4 | fun roll() 5 | } 6 | 7 | interface Cart : Wheel { 8 | 9 | var coin: Int 10 | 11 | val weight: String 12 | get() = "20KG" 13 | 14 | fun add(product: Product) 15 | 16 | fun rent() { 17 | if (coin > 0) { 18 | println("카트를 대여합니다") 19 | } 20 | } 21 | 22 | override fun roll() { 23 | println("카트가 굴러갑니다") 24 | } 25 | 26 | fun printId() = println("1234") 27 | } 28 | 29 | interface Order { 30 | 31 | fun add(product: Product) { 32 | println("${product.name} 주문이 완료되었습니다") 33 | } 34 | 35 | fun printId() = println("5678") 36 | 37 | } 38 | 39 | class MyCart(override var coin: Int) : Cart, Order { 40 | 41 | override fun add(product: Product) { 42 | if (coin <= 0) println("코인을 넣어주세요") 43 | else println("${product.name}이(가) 카트에 추가됐습니다") 44 | 45 | // 주문하기 46 | super.add(product) 47 | } 48 | 49 | override fun printId() { 50 | super.printId() 51 | super.printId() 52 | } 53 | 54 | } 55 | 56 | fun main() { 57 | val cart = MyCart(coin = 100) 58 | cart.rent() 59 | cart.roll() 60 | cart.add(Product(name = "장난감", price = 1000)) 61 | cart.printId() 62 | } -------------------------------------------------------------------------------- /src/main/kotlin/Java_Coffee.java: -------------------------------------------------------------------------------- 1 | public class Java_Coffee { 2 | 3 | private boolean isIced; 4 | 5 | public boolean isIced() { 6 | return isIced; 7 | } 8 | 9 | public void setIced(boolean iced) { 10 | isIced = iced; 11 | } 12 | } 13 | 14 | class Barista { 15 | 16 | public static void main(String[] args) { 17 | Java_Coffee coffee = new Java_Coffee(); 18 | coffee.setIced(true); 19 | 20 | if(coffee.isIced()) { // 상태를 메서드로 표현 21 | System.out.println("아이스 커피"); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/kotlin/Java_Exception.java: -------------------------------------------------------------------------------- 1 | public class Java_Exception { 2 | 3 | public static void main(String[] args) { 4 | 5 | // Checked Exception은 try-catch 또는 throws가 필수 6 | try { 7 | Thread.sleep(1); 8 | } catch (InterruptedException e) { 9 | // 예외 처리 10 | } 11 | 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/kotlin/Java_If.java: -------------------------------------------------------------------------------- 1 | public class Java_If { 2 | 3 | public static void main(String[] args) { 4 | int age = 18; 5 | 6 | //자바의 if...else는 구문이므로 값을 반환할 수 없다 7 | String str = ""; 8 | if (age > 18) { 9 | str = "성인"; 10 | } else { 11 | str = "아이"; 12 | } 13 | 14 | System.out.println(str); 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/kotlin/Java_NullSafety.java: -------------------------------------------------------------------------------- 1 | import java.util.ArrayList; 2 | import java.util.List; 3 | import java.util.Optional; 4 | 5 | public class Java_NullSafety { 6 | 7 | public static String getNullStr() { 8 | return null; 9 | } 10 | 11 | 12 | public static int getLengthIfNotNull(String str) { 13 | if (str == null || str.length() == 0) { 14 | return 0; 15 | } 16 | return str.length(); 17 | } 18 | 19 | public static void main(String[] args) { 20 | String nullableStr = getNullStr(); 21 | // Optional사용 22 | // nullableStr = Optional.ofNullable(nullableStr) 23 | // .orElse("null인 경우 반환"); 24 | 25 | // null 참조를 사용하더라도 컴파일 오류가 발생하지 않음 26 | int nullableStrLength = nullableStr.length(); 27 | System.out.println(nullableStrLength); 28 | 29 | // 메서드 내부에서 null을 검사하는 방법도 있다 30 | int length = getLengthIfNotNull(null); 31 | System.out.println(length); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/kotlin/Java_Switch.java: -------------------------------------------------------------------------------- 1 | public class Java_Switch { 2 | 3 | public static void main(String[] args) { 4 | int day = 2; 5 | String result = ""; 6 | switch (day) { 7 | case 1: 8 | result = "월요일"; 9 | break; 10 | case 2: 11 | result = "화요일"; 12 | case 3: 13 | result = "수요일"; 14 | break; 15 | case 4: 16 | result = "목요일"; 17 | break; 18 | case 5: 19 | result = "금요일"; 20 | break; 21 | case 6: 22 | result = "토요일"; 23 | break; 24 | case 7: 25 | result = "일요일"; 26 | break; 27 | default: 28 | result = "에러"; 29 | break; 30 | } 31 | 32 | System.out.println(result); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/kotlin/Logger.java: -------------------------------------------------------------------------------- 1 | public class Logger { 2 | 3 | public void log(String level, String message) { 4 | if (level == null || level.length() == 0) { 5 | level = "INFO"; 6 | } 7 | System.out.printf("[%s]%s%n", level, message); 8 | } 9 | 10 | public static void main(String[] args) { 11 | Logger logger = new Logger(); 12 | 13 | logger.log("INFO", "인포 로그"); 14 | 15 | logger.log(/* level = */"DEBUG", "디버그 로그"); 16 | 17 | logger.log("WARN", "워닝 로그"); 18 | 19 | String level = "ERROR"; // 설명 변수 20 | logger.log(level, "에러 로그"); 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/kotlin/Message.java: -------------------------------------------------------------------------------- 1 | class Message { 2 | 3 | public void greeting(String message) { 4 | if (message == null || message.length() == 0) { 5 | System.out.println("안녕하세요!!"); 6 | return; 7 | } 8 | System.out.println(message); 9 | } 10 | 11 | public static void main(String[] args) { 12 | new Message().greeting(null); 13 | 14 | new Message().greeting("Hello, World"); 15 | } 16 | } --------------------------------------------------------------------------------