확장 함수란 문법은 상속 없이 클래스 외부에서 멤버 함수를 추가할 수 있는 문법을 뜻한다.

아래의 예제에서는 String 클래스에서 isNumber이라는 기존에 정의되어 있지 않은 함수를 확장 함수 문법을 통하여, 추가한 것이다.

fun String.isNumber(): Boolean
{
  var i = 0
  while (i < this.length)
  {
    if (!('0' <= this[i] && this[i] <= '9'))
    return false
    i += 1
  }
  return true
}

fun main(args: Array<String>)
{
  println("1234567890".isNumber())
}

그리고 확장 프로퍼티는 함수가 아닌 Property를 확장하는 것이다.

아래의 예제 코드를 참고하면 되겠다.

val String.isNumber: Boolean
  get()
  {
    var i = 0
    while (i < this.length)
    {
      if (!('0' <= this[i] && this[i] <= '9'))
      return false
      i += 1
    }
    return true
  }

fun main(args: Array<String>)
{
  println("1234567890".isNumber)
}

참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다.

'Kotlin' 카테고리의 다른 글

[Kotlin] 함수 리터럴과 람다식, 익명함수, it 식별자  (0) 2020.09.06
[Kotlin] Sealed Class  (0) 2020.09.01
[Kotlin] is 연산자  (0) 2020.09.01
[Kotlin] Nothing type, Nullable, null  (0) 2020.08.31
[Kotlin] Class  (0) 2020.08.29

is 연산자란 java에서 InstanceOf의 키워드와 동일한 역할을 한다.

다시 말하자면, 참조 변수가 실제로 가리키고 있는 객체의 타입을 알아낼 수 있는 역할을 한다.

이에 대한 예제는 다음과 같다.

open class Person(val name: String, val age: Int)

class Student(name: String, age: Int, val id: Int) : Person(name, age)

class Professor(name: String, age: Int) : Person(name, age)

fun main(args: Array<String>)
{
	val person: Person = Student("Mark Zuckerberg", 33, 20171225)
	println(person is Person)
	println(person is Student)
	println(person is Professor)

	val person2: Person = Professor("Kim", 48)
	println(person2 is Person)
	println(person2 is Student)
	println(person2 !is Professor)
}

위의 예제 코드를 확인할 수 있듯이 객체 타입을 비교 하고 있으며, 이에 대한 결과는 다음과 같다.

println(person is Person)  : true

println(person is Student) : true
println(person is Professor) : false

println(person2 is Person) : true
println(person2 is Student) : false
println(person2 !is Professor) : false

 

참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다.

'Kotlin' 카테고리의 다른 글

[Kotlin] Sealed Class  (0) 2020.09.01
[Kotlin] 확장함수 / 확장 프로퍼티  (0) 2020.09.01
[Kotlin] Nothing type, Nullable, null  (0) 2020.08.31
[Kotlin] Class  (0) 2020.08.29
[Kotlin] lateinit  (0) 2020.08.29

Nothing Type은 실행 흐름이 도달할 수 없는 구역을 나타내기 위한 특수 타입이라고 생각하면 된다.

다시 이야기 하자면, Nothing 으로 정의된 함수는 Return 처리 하지 않는 함수라는 것을 명시 하는 것이라고 보시면 될 것 같습니다.

예를 들어서, 아래의 예제 코드를 보자

fun throwing(): Nothing = throw Exception()

fun main(args: Array<String>)
{
  val i: Int = throwing()
  println(i)
}

위의 코드에서 보면 "throwing()" 함수 호출 후, Process가 멈추게 된다.

 

그러나 만약 아래와 같이 정의하게 된다면, compile error가 발생하게 된다.

fun test(a:Int, b:Int): Nothing = {return a + b}

fun main(args: Array<String>)
{
	val i: Int = test(1, 30)
	println(i)
}

 

참고 사이트 : https://readystory.tistory.com/143

 

[Kotlin] 헷갈리는 "Nothing" 확실하게 이해하기(feat. Any, Unit)

기존에 자바에 대한 지식이 있는 상태에서 코틀린으로 넘어오신 분들은 코틀린에서 제공하는 대다수의 타입과 클래스들에 대해 거부감이 없으실테지만, 그럼에도 Any와 Unit까지는 어찌어찌 이��

readystory.tistory.com

Nullable Type과 null 에 대해서 알아보자

아래의 Kotlin 코드를 보면,  Nullable type과 null간의 관계를 알 수 있다.

fun main(args: Array<String>)
{
  var testCls: TestClass ? = TestClass()
  testCls = null

  var num: Int? = null
  num = 10
}

위의 코드를 보면, 타입 뒤에 ? 를 붙이는 것을 볼 수 있는데, 이는 해당 타입을 nullable하게 만들 수 있다고 정의 하는 것이다.

다시 말하자면, null값을 지정할 수 있는 변수를 뜻한다.

 

위와 같이 변수에 null 값을 지정하도록 선언할 수 있다고 한다면, 안전한 호출 연산자(?.)를 통하여, null 예외 처리를 할 수 있다.

다음의 예제 코드를 보자

fun main(args: Array<String>)
{
  var obj: Building? = null
  obj?.print()
  obj?.name = "Alice"

  obj = Building()
  obj?.name = "Tower"
  obj?.date = "20200810"
  obj?.area = 131_3212
  obj?.print()
}

위의 코드를 보면, obj에 null을 지정하지만, compile error는 발생하지 않으며, 또한 정상적으로 실행이 된다.

이유는 안전한 호출 연산자(?.)를 호출하였기 때문이다.

안전한 호출 연산자(?.)를 호출하게 되면, 해당 객체가 Null이여도 Exception이 발생하지 않으며, 또한 프로퍼티 또는 참조 함수를 호출하지도 않는다.

 

또한 이 반대도 존재한다.

Not-null 단정 연산자(!!)로 해당 연산자를 선언하게 되면, 해당 객체가 null일시, 반드시 Exception이 발생하게 된다.

fun main(args: Array<String>)
{
  var obj: Building? = Building()
  obj!!.name = "City"
  println(obj!!.name)

  obj = null
  obj!!.print()
}

위의 예제 코드에서는 결국 obj!!.print()에서 Exception이 발생하게 된다.

 

추가적으로 엘비스 연산자(?:)라 하여, 해당 객체가 널이면, 대신 다른 처리를 하도록 지정하는 것도 존재한다.

이는 다음과 같이 생각하면 된다.

[피연산자]?:[Null일 경우 표시할 값]왼쪽의 피 연산자가 null이 아니면, 그 값을 그대로 사용하고, 만약 null일 경우에는 [Null일 경우 표시할 값]으로 대체한다.

 

이에 대한 예제 코드는 다음과 같다.

fun main(args: Array<String>)
{
  val number: Int? = null
  println(number ?: 0)

  val number2: Int? = 15
  println(number2 ?: 0)
}

위의 코드를 실행하면, 결국은 다음과 같은 결과가 나오게 된다.

0

15

 

참고 : 초보자를 위한 Kotlin 200제 라는 책을 기반으로 공부 내용을 정리하였습니다.

'Kotlin' 카테고리의 다른 글

[Kotlin] 확장함수 / 확장 프로퍼티  (0) 2020.09.01
[Kotlin] is 연산자  (0) 2020.09.01
[Kotlin] Class  (0) 2020.08.29
[Kotlin] lateinit  (0) 2020.08.29
[Kotlin] const  (0) 2020.08.29

+ Recent posts