var a = 5

val b = 10


// 변수명: 자료형 = 값

var a: Int 10

val b: int = 20


기본 자료형

Double : 64비트 부동소수점

Float  : 32비트 부동소수점

Long   : 64비트 정수

Int    : 32비트 정수

Short  : 16비트 정수

Byte   : 8비트 정수


리터럴

val a = 10    // val a: Int

val b = 10L   // val b: Long

val c = 10.0  // val c: Double

val d = 10.0f // val d: Float


문자형

String : 문자열

Char   : 하나의 문자

val str = "안녕하세요" // val str: String

val char = "안"       // val char: char


// 함수

fun greet(str: String): Unit {

  println(str)

}


greet( str:"안녕")


// 문자열 템플릿

val str = "안녕"

println(str + "하세요") // 자바 안녕하세요


--코틀린

println("$str 하세요") // 안녕 하세요

println("${str}하세요") //안녕하세요


// 배열

val numbers: Array<Int> arrayOf(1, 2, 3, 4, 5)

val number2 = arrayOf(1, 2, 3, 4, 5) // 자료형 생략

numbers[0] = 5 // [5, 2, 3, 4, 5]


//제어문

# if

if( a < b ) max = b // 일반적인 방법


if( a < b) {

  max = a

} else {

  max = b

}


val max = if(a > b) a else b // 식처럼 사용 가능


// when 문은 자바의 switch문에 대응

#1

val x = 1

when (x) {

  1 -> println("x == 1")                // 값 하나

  2, 3 -> println("x == 2 or x == 3")   // 여러 값은 콤마로

  in 4..7 -> println("4 부터 7 사이")    // in 연산자로 범위지정

  !in 8..10 -> println("8부터 10 사이가 아님")

} else -> {                             // 나머지

  print("x는 1이나 2가 아님")

}


#2

val numberStr = 1


val numberStr = when(number % 2) {

  0-> "짝"

  else -> "홀"

}


#3

val number = 1

fun isEven (num: Int) = when (num %2) { // 결과가 String으로 추론되어 반환형 선언 생략 가능

  0 -> "짝"

  else -> "홀"

}

println(isEven(number))


// for문

#1

val numbers = arrayOf(1, 2, 3, 4, 5)


for (num in numbers) {

  println(num)  //1; 2; 3; 4; 5;

}


#2

// 1~3 까지 출력

for (i in 1..3) {

  println(i) // 1; 2; 3;

}

// 0~10까지 2씩 증가하며 출력

for (i in 0..10 step 2) {

  println(i)    // 0; 2; 4; 6; 8; 10;

}

// 10부터 0 까지 2씩 감소하며 출력

for (i in 10 downTo 0 step 2) {

  println(i)    // 10; 8; 6; 4; 2; 0;

}


// while

var x = 10

println(x)

while ( x > 0 ) {

  x--

  println(x)    //9; 8; 7; 6; 5; 4; 3; 2; 1; 0;

}

// do while

var x = 10

do {

  x--

  println(x)    // 9; 8; 7; 6; 5; 4; 3; 2; 1; 0;

} while (x > 0)


// 클래스

# 클래스 선언

class Person {


}


#인스턴스 생성

val person = Person()


// 생성자

# 코틀린에서의 클래스

calss Person(var name: String) {


}


class Person {

  constructor(name: String) {

    println(name)

  }

}


class Person(name: String) {

  init {

    println(name)

  }

}


// 프로퍼티 : 클래스의 속성을 사용할 때는 멤버에 직접 접근하며 이를 프로퍼티라고 합니다.

# 클래스 선언

class Person(var name: String) {


}

// 인스턴스 생성

val person = Person("멋쟁이")

person.name = "키다리"   // 쓰기

println(person.name)    // 읽기


// 접근제한자 : 접근제한자란 변수나 함수를 공개하는 데 사용하는 키워드이다.

Class A {

  val a = 1             // public(생략가능) : 전체 공개

  private val b = 2     // private : 현재 파일 내부에서만 사용 가능

  protected val c = 3   // protected : 같은 모듈 내에서만 사용가능

  internal val d = 4    // internal : 상속받은 클래스에서 사용가능

}


// 클래스 상속

// 코틀린에서의 클래스는 기본적으로 상속이 금지된다.

// 상속이 가능하게 하려면 open키워드를 클래스 선언 앞에 추가한다.

// 다음은 Animal클래스를 상속받는 Dog 클래스를 나탄내다.

open class Animal {


}

class Dog : Animal() {


}

open class Animal(val name: String) {


}

class Dog(name: String) : Animal(name) {


}


// 내부 클래스

// 내부 클래스 선언에는 inner를 사용

// 내부 클래스는 외부 클래스에 대한 참조를 가지고 있다.

// 아래 코드에서 inner 키워드가 없다면 a를 20으로 변경할 수 없다.

class OuterClass {

  val a = 10


  // 내부클래스

  inner class OuterClass2 {

    fun something() {

      a = 20 // 접근 가능

    }

  }

}


// 추상 클래스

// 추상클래스는 미구현 메서드가 포함된 클래스.

// 클래스와 미구현 메서드 앞에 abstract키워드를 붙인다.

// 추상클래스는 직접 인스턴스화 할 수 없고 다른 클래스가 상속하여 미구현 메서드를 구현해야 한다.

// 기본적으로 자바와 동일한 특성을 가진다.

abstract class A {

  abstract fun func()


  fun func2() {


  }

}

class B: A() {

  override fun func() {

    println("Hello")

  }

}

val a = A() // 에러

val a = B() // ok


// 인터페이스

// 인터페이스는 미구현 메서드를 포함하여 클래스에서 이를 구현한다.

// 추상클래스와 비슷하지만 클래스가 단일 상속만 되는 반면 인터페이스는 다중 구현이 가능하다.

// 주로 클래스에 동일한 속성을 부여해 같은 메서드라도 다른 행동을 할 수 있게 하는데 사용한다.

// 코틀린의 인터페이스는 자바와 거의 사용법이 같다.

//# 인터페이스 선언

//  다음과 같이 인터페이스에 추상 메서드를 포함할 수 있다.

//  원래 추상 클래스에서 추상 메서드는 abstract키워드가 필요한데 인터페이스에서는 생략할 수 있다.

interface Runnable {

  fun run()

}


// 인터페이스는 구현이 없는 메서드뿐만 아니라 구현된 메서드를 포함할 수 있다. 이는 자바의 default 메서드에 대응한다.

interface Runnable {

  fun run()


  fun fastRun() = println("빨리 달린다")

}

// 인터페이스의 구현

// 인터페이스를 구현할 때는 인터페이스 이름을 콜론 뒤에 나열한다.

// 그리고 미구현 메서드를 작성하는데 이때 override 키워드를 메서드 앞에 추가한다.

// run 함수를 오버라이드한다고 말한다.

class Human : Runnable {

  override fun run() {

    println("달린다")

  }

}


// 상속과 인터페이스를 함께 구현

// 다음과 같이 상속과 인터페이스를 함께 구현할 수 있다.

// 상속은 하나의 클래스만 상속하는 반면 인터페이스는 콤마로 구분하여 여러 인터페이스를 동시에 구현할 수 있다.


open class Animal {


}

interface Runnable {

  fun run()

  fun fastRun() = println("빨리 달린다")

}

interface Eatable {

  fun eat()

}

class Dog: Animal(), Runnable, Eatable {

  override fun eat() {

    println("먹는다")

  }


  override fun run() {

    println("달린다")

  }

}

val dog = Dog()

dog.run()

dog.eat()



+ Recent posts