package Kotlin2020
fun main(args : Array<String>){
val a: Int = 10 // variable : 변할 수 있는 변수 방법 -> let (js)
val b: Int = 20 // value : 변할 수 없는 변수 선언 방법 -> const (js)
val c: Char = 'a';
val s: String = "String 입니다";
val f: Boolean = true;
}
package Kotlin2020
fun main(args: Array<String>) {
var intArr = arrayOf(1,2,3,4,5)
val nullArr = arrayOfNulls<INT>(4)
intArr[2] = 8
println(nullArr[2])
}
package Kotlin2020
fun add(a: Int, b: Int, c:Int): Int{
return a + b + c
}
fun add2(a: Int, b: Int, c:Int) = a + b + c
fun main(args: Array<String>) {
val result: Int = add(10,20,30)
println(result)
}
package Kotlin2020
fun main(args: Array<String>) {
var a = 10;
if(a> 100){
println("$a 입니다.")
}else{
println("안뇽 만나서 반가웡")
}
doWhen(1)
doWhen("GI")
doWhen(12L)
doWhen(12.3)
}
fun doWhen(a: Any){
when(a){
1-> println("1 입니다.")
"GI"-> println("GI 입니다.")
is Long -> println("Long type 입니다.")
!is Long -> println("logn type이 아닙니다.")
else -> println("어떤 조건도 만족하지 않습니다.")
}
}
package Kotlin2020
fun main(args: Array<String>) {
var a = 0;
while(a < 5){
println(++a) // 1,2,3,4,5
}
println()
a = 0
while(a < 5){
println(a++) // 0,1,2,3,4
}
println()
for(i in 0..10){
println(i)
}
println()
for(i in 0..10 step 3){
println(i)
}
println()
for(i in 100 downTo 30 step 30){
println(i)
}
}
package Kotlin2020
fun main(args: Array<String>) {
for(i in 1..10){
if(i == 3) break;
println(i)
}
for(i in 1..10){
if(i == 3) continue
println(i)
}
loop@for(i in 1..10){
for(j in 1..10){
if(i == 2 && j == 4 ) break@loop
println("$i : $j")
}
}
}
package Kotlin2020
fun main(args: Array<String>) {
val person1 = Person("gi", 920105,1)
val person2 = Person("vv", 920106, 2)
val person3 = Person("dj", 920106, 3)
val person4 = Person("cc", 920106, 29)
person4.greeting()
// person1.greeting()
}
//이렇게 변수 키워드를 적어줘야 함수 내부에서 변수로 사용이 가능합니다.
class Person(var name: String , val birthDay : Int, var age:Int){
init{
println("${this.name} , ${this.birthDay} $age")
}
//보조 생성자를 사용하기 위해서는 무조건 기본 생성자를 초기화를 해줘야 한다. :this(기본생성자의 필요)
constructor(name: String, age:Int):this(name, 1997, age){
println("보조 생성자가 사용되었습니다.")
println("${name} 입니다. -> ${birthDay} : ${age}")
}
fun greeting(){
println("${name} 입니다. -> ${birthDay}")
}
}
package Kotlin2020
fun main(args: Array<String>) {
val a = Animal("동물", 2,"고래")
val dog1 = Dog("멍멍이", 5)
val cat1 = Cat("나폴레옹",2)
a.greeting()
println()
dog1.greeting()
dog1.bark()
println()
cat1.greeting()
cat1.bark()
}
open class Animal(var name: String, var age: Int, var type: String){
fun greeting(){
println("안녕 하세요 ${name} 입니다. ${age}, ${type} 입니다.")
}
}
class Dog(name: String, age: Int ) : Animal(name, age, "dog"){
fun bark(){
println("$name bow - bow ")
}
}
class Cat(name: String, age: Int) : Animal(name, age, "cat"){
fun bark(){
println("${name} mew - mew")
}
}
수퍼클래스에서 허용만 한다면 같은 이름과 형태를 가진 함수를 재정의 할 수 있다
추상화란? : "abstract" 키워드 사용 -> 무조건 오버라이팅 해줘야 해야 한다.
인터페이스 사용가능 : 구현부가 있는 함수 + 없는 함수를 동시에 사용하능하나 생성자가 없을 뿐이다. -> 자바랑은 조금 다른 부분이네
오버라이딩은 이미 구현이 끝난 함수의 기능을 서브 클래스에서 변경해야 할 때 그리고 추상화는 실제 구현은 서브클래스에서 일임할 때 사용하는 기능이며
인터 페이스는 서로다른 기능들을 구현할 때 여러개를 물려주어야 할 떄 유용한 기능입니다.
package Kotlin2020
fun main(args: Array<String>) {
val t = Tiger()
t.eat()
t.eat("고기")
val c = Benz()
c.drive()
c.stop()
println()
val m = Me()
m.eat()
m.run()
}
open class Animal {
open fun eat() {
println("음식을 먹습니다.")
}
}
class Tiger : Animal() {
fun eat(food: String) {
println("${food}를 먹습니다.")
}
override fun eat() {
println("타이거가 음식을 엄청나게 맛나게 먹고 있습니다.")
}
}
abstract class Car {
abstract fun drive()
fun stop() {
println("정지 합니다.")
}
}
class Benz : Car() {
override fun drive() {
println("자동차가 출발 합니다.")
}
}
interface Runner {
fun run()
}
interface Eater {
fun eat() {
println("음식을 먹습니다.")
}
}
class Me : Runner, Eater {
override fun run() {
println("달리기하기")
}
override fun eat(){
println("dkdkdk")
}
}
package Kotlin2020
val a1 = "피키지 스코프"
class B {
val a = "스코프 a class"
fun print(){
println(a)
}
}
fun main(args: Array<String>) {
var a1 = "함수 스코프"
println(a1)
B().print()
}
package Kotlin2020
fun main(args: Array<String>) {
b(::a)
val c : (String) -> Unit = {str:String
-> println("$str <-- 이거는 람다 함수에서 실행")
}
b(c)
}
//1. 파라미터로 받아보기
fun a(str: String){
println("$str <-- 이거는 a의 값입니다.")
}
//2. 고차함수의 파라미터로 받아볼수 있도록 한다.
//기술한 형태와 같은 형식의 함수는 모두 파라미터로 받을 수 있다.
fun b(function: (String) -> Unit){
function("b의 값이 들어 갔어")
}
package Kotlin2020
fun main(args: Array<String>) {
val a = Book("GIBOOK", 30000).apply {
name = "[초특가]"+name
discount()
}
println(a.name)
println(a.price)
println()
println("여기 아래서 부터는 run을 사용한 값을 출력하는 부분 입니다.")
// let를 사요해보기
val price = 1000 // 이렇게 선언 할 경우 아래 run 스코프 내부에서 불러지는 price 값이 되어 버려
// 기존 인스턴스의 값을 불러 올 수 없게 된다.
// 이렇때는 let 스코프 함수를 사용하여 it. 으로 접근할 수 있도록 처리 한다.
val letResult : String = a.let{
it.discount()
"현재 ${it.name}책 값은 ${it.price} "
}
val runReuslt : String = a.run{
discount()
"현재 ${name}책 값은 ${price} "
}
println(letResult)
println(runReuslt)
println()
val b: String = Book("AM_BOOK",100000).run{
name+" LOVE"
}
println(b)
}
// apply 사용해보기
class Book(var name : String, var price: Int){
fun discount(){
price -= 2000
}
}
package Kotlin2020
import java.util.zip.CheckedOutputStream
object Counter {
var count = 0;
fun up() {
count++
}
fun down() {
if (count > 0) {
count--
}else{
print("count의 최솟값인 0 입니다.")
}
}
}
fun main(args: Array<String>) {
println(Counter.count)
Counter.up()
Counter.up()
Counter.up()
println(Counter.count)
Counter.down()
Counter.down()
Counter.down()
Counter.down()
val ja = foodPoll("짜장")
val jm = foodPoll("짬뽕")
ja.counter()
ja.counter()
ja.counter()
jm.counter()
println()
println("ja : ${ja.count}")
println("jm : ${jm.count}")
println("Total : ${foodPoll.total}")
}
class foodPoll(val name : String){
companion object {
var total = 0
}
var count = 0
fun counter(){
total++
count++
}
}
package Kotlin2020
fun main(args: Array<String>) {
EventPrinter().start()
}
/*
* 1. 이벤트를 수신해서 출력하는 EventPrinter
* 2. 숫자를 카운트 하며 5의 배수 마다 이벤트를 발생시킬 Counter
* 3. 두 개를 연결시킬 인터페이스 EventListener 를 만들어 본다.
*
* */
//이벤트가 발생할 때 숫자를 반환해 준다.
interface EventListener {
fun onEvent(count: Int) // 추상함수 만들기.
// 리스너를 통해 이벤트를 반환하는 함수 이름은 관례적으로 'on'이라는 규칙을 따른다.
}
//이 벤트가 발생하는 Counter 클래스의 구현.
class CounterEvent(var listener: EventListener) {
fun count() {
for (i in 1..100) {
if (i % 5 == 0) listener.onEvent(i)
}
}
}
// 이벤트를 전달 받아 화면에 출력할 EventPrinter 클래스의 구현.
class EventPrinter:EventListener{
override fun onEvent(count: Int) {
print("${count}-")
}
fun start(){
val counter = CounterEvent(this) // * this는 키원드가 사용된 '객체 자신'을 참조하는 키워드 입니다.
//EventPrinter 객체 자신을 나타내지만 받는쪽에서는 이벤트 리스너만 요구했기 떄문에
//이벤트 리스너 구현부만 넘겨 주게 된다.
//이를 객체지향의 다형성 이라고 한다.
counter.count()
}
}
///////////////////////////익명 객체 방법
class EventPrinter{
fun start(){
val counter = CounterEvent(object : EventListener{
override fun onEvent(count: Int) {
print("${count}-")
}
})
counter.count()
}
}
package Kotlin2020
fun main(args: Array<String>) {
var a = Drink()
a.drink()
var b : Drink = Cola()
b.drink()
if(b is Cola){
b.washDishes()
}
var c = b as Cola
c.washDishes()
b.washDishes()
}
open class Drink{
var name = "음료"
open fun drink(){
println("${name} 마십니다.")
}
}
class Cola : Drink(){
var type = "콜라"
override fun drink() {
println("$name 중에 $type 을 마십니다.")
}
fun washDishes(){
println("${type}로 설거지를 합니다.")
}
}
package Kotlin2020
fun main(args: Array<String>) {
UsingGeneric(A1()).doShout()
UsingGeneric(B1()).doShout()
UsingGeneric(C1()).doShout()
doShouting(B1())
}
fun <T: A1> doShouting(t: T){
t.shout()
}
open class A1 {
open fun shout(){
println("A Shout")
}
}
class B1: A1(){
override fun shout() {
println("B Shout")
}
}
class C1: A1(){
override fun shout() {
println("C Shout")
}
fun say(){
println("sayyyy")
}
}
class UsingGeneric<T:A1>(var t : T){
fun doShout(){
t.shout()
}
}
package Kotlin2020
fun main(args: Array<String>) {
val a = listOf(1,2,3,4)
for(i in a){
println(i)
}
val b = mutableListOf(1,2,3,4,5)
println(b)
b.add(5)
println(b)
b.add(1,0)
b.shuffle()
println(b)
}
package Kotlin2020
fun main(args: Array<String>) {
val test1 = "Text.Kotile.String"
println(test1.length)
println(test1.toLowerCase())
println(test1.toUpperCase())
val test2 = test1.split(".")
println(test2)
println(test2.joinToString())
println(test2.joinToString("-"))
println(test1.substring(5..10))
/*
* null check 가능한 함수
*
* isNullOrEmpty()
* isNullorBlank()
* */
/*
* startWith("")
* endWith("")
* contains("")
*
*
* */
}
package Kotlin2020
fun main(args: Array<String>) {
var a : String ? = "sd"
// a?.run{
// println(toUpperCase())
// println(toLowerCase())
// }
var v1 = Product("콜라",1000)
var v2 = Product("콜라",1000)
var v3 = v1;
var v4 = Product("사이다",1000)
println(v1 == v2)
println(v1 === v2)
println(v1 === v3)
println(v1 == v3)
println(v1 == v4)
println(v1 === v4)
}
class Product(val name : String, val price : Int){
override fun equals(other: Any?): Boolean {
if(other is Product){
return other.name == name && other.price == price
}else{
return false
}
}
}
package Kotlin2020
fun main(args: Array<String>) {
read(1)
read("HH")
deliveryItem("장건일", destination = "학교")
sum(1,2,3,4,12,1,231,2,41,24,3)
}
fun read(x: Int){
println("number $x")
}
fun read(x:String){
println("감사합니다. $x")
}
//
fun deliveryItem(name : String, count: Int= 1 ,destination: String = "집"){
println("$name $count $destination")
}
//
fun sum(vararg number: Int){
for(i in number){
println(i)
}
}
//
infix fun Int.mul(x:Int):Int = this * x
package Kotlin2020
fun main(args: Array<String>) {
Outer.Nested().say()
var Outer = Outer()
val inner = Outer.Inner()
inner.say()
inner.say2()
Outer.text ="Changed Test"
inner.say2()
}
class Outer{
var text = "Outer Class"
class Nested{
fun say(){
println("Nexted Class")
}
}
inner class Inner{
var text = "Inner Class"
fun say(){
println(text)
}
fun say2(){
println(this@Outer.text) //외부 클래스의 값에 접근이 가능해진다.
}
}
}
package Kotlin2020
fun main(args: Array<String>) {
var a = Gclass("s",1)
println(a == Gclass("s",1))
println(a.hashCode())
println(a)
var b= Data("d",2)
}
class Gclass(val name: String, val id: Int)
data class Data(val name: String, val id: Int)
package Kotlin2020
fun main(args: Array<String>) {
val a = mutableSetOf("바나나","사과","김치")
for(item in a){
println("${item}")
}
a.add("사과")
a.add("귤")
println(a)
val b = mutableMapOf("d" to "11","d2" to "22" )
for(e in b){
println("${e.key} : ${e.value}")
}
}
package Kotlin2020
fun main(args: Array<String>) {
val nameList = listOf("박수영", "김지수", "김다현", "신유나","김지우")
nameList.forEach{println(it)}
println()
val newNameList = nameList.map{name -> "welcome , $name"}
println(newNameList)
val kimList = nameList.filter{it.contains("장")}
println(kimList)
}
package Kotlin2020
fun main(args: Array<String>) {
data class Person(val name : String, val birth : Int)
val personList = listOf<Person>(
Person("유나",1992),
Person("조이",1996),
Person("츄",1999),
Person("유나",2003)
)
val associted = personList.associateBy { it.birth }
println(associted)
val grouped = personList.groupBy { it.name }
println(grouped)
val (over98, upder98) = personList.partition { it.birth > 1998 }
println(over98)
println(upder98)
val numbers = listOf(-3, 7,2,-10,1)
println(numbers.flatMap { listOf(it*10, it+10, it*0) })
println(numbers.getOrElse(1){50})
println(numbers.getOrElse(100){50})
}
package Kotlin2020
fun main(args: Array<String>) {
// val foodCourt = FoodCourt()
// foodCourt.searchPrice(FoodCourt.FOOD_STEAK)
// foodCourt.searchPrice(FoodCourt.FOOD_PIZZA)
// foodCourt.searchPrice(FoodCourt.FOOD_CREAM_PASTA)
// val testLateInit = LateInitSample()
// println(testLateInit.getLateInitTest())
// testLateInit.setTextInit("Hello world")
// println(testLateInit.getLateInitTest())
val number : Int by lazy{
println("초기화를 합니다.")
5
}
println("start")
println(number)
println(number)
}
class FoodCourt{
fun searchPrice(foodName: String){
val price = when(foodName){
FOOD_CREAM_PASTA -> 13000
FOOD_PIZZA -> 25000
FOOD_STEAK -> 30000
else -> 0
}
println("${foodName}의 가격은 ${price} 입니다.")
}
companion object{
const val FOOD_CREAM_PASTA = "크림파스타"
const val FOOD_STEAK = "스테이크"
const val FOOD_PIZZA = "피자"
}
}
class LateInitSample{
private lateinit var text: String
fun getLateInitTest(): String {
if(::text.isInitialized)
return text
else
return "기본값"
}
fun setTextInit(std: String){
text = std
}
}
package Kotlin2020
fun main(args: Array<String>) {
var bitData : Int = 0b10000 //지정되지 않은 상위비트는 0으로 채워 집니다.
bitData = (1 shl 2)
bitData = (1 shr 2)
bitData = bitData or (1 shl 2) // 1이라는 값을 자측으로 2번 밀기
println(bitData.toString(2))
bitData = bitData or (1 shr 2)// 1이라는 값을 우측으로 2번 밀기
}
package Kotlin2020
import kotlin.coroutines.*
fun main(){
val scope = GlobalScope
runBlocking {
val a = lanuch{ //JOB
for(i in 1..45){
println(i)
deley(10)
}
}
val b = async{ // DIfferd
"async 종룍"
}
println("async 대기")
println(b.await())
println("launch 대기")
a.join()
println("launch 종료")
}
runBlocking{
val result : String? = withTimeoutOrNull(50){
for(i in 1..1000){
println(i)
delay(10)
}
}
"finish"
}
}