본문 바로가기
  • GDSC Ewha Tech Team Blog

3-1기 스터디/Kotlin15

[3-2, 5주차] 연산자 오버로딩과 기타 관례(4) 1. 위임 프로퍼티 class Foo { var p : Type by Delegate() } p 프로퍼티는 접근자 로직을 다른 객체에게 위임한다. Delegate 클래스의 인스턴스를 위임 객체로 사용하며 by 뒤에 있는 식을 계산해서 위임에 쓰일 객체를 얻는다. class Foo { private val delegate = Delegate() // 컴파일러가 생성한 도우미 프로퍼티 var p: Type set(Value:Type) = delegate.setValue(..., Value) get() = delegate.getValue(...) } 다음과 같이 컴파일러는 숨겨진 도우미 프로퍼티를 만들고, 그 프로퍼티를 위임 객체의 인스턴스로 초기화 한다. p 프로퍼티는 바로 그 위임 객체에게 자신의 작업을 .. 2022. 5. 31.
[3-2, 3주차] 연산자 오버로딩과 기타 관례(3) - 구조 분해를 사용하면 복합적인 값을 분해해서 여러 다른 변수를 한꺼번에 초기화할 수 있다. 내부에서 구조 분해 선언은 관례를 사용하는데, 각 변수를 초기화하기 위해 다음과 같이 componentN이라는 함수를 호출한다. val (a,b) = p ---> val a = p.component1() val b = p.component2() data 클래스의 주 생성자에 들어있는 프로퍼티에 대해서는 자동으로 componentN 함수가 만들어진다. 구조 분해 선언은 함수에서 여러 값을 반환하게 할 때 유용하다. data class NameComponents(val name:String, val extension: String) fun splitFilename(fullName:String): NameCompon.. 2022. 5. 17.
[3-2, 2주차] 연산자 오버로딩과 기타 관례(2) 1. 동등성 연산자: equals - 코틀린은 관례에 따라 == 연산자 호출을 equals 메소드 호출로 컴파일한다. != 연산자를 사용하는 식도 equals 호출로 컴파일된다. 이 연산자의 경우 내부에서 인자가 널인지 검사해서 널이 아닌 경우에만 equals를 호출한다. a == b -> a?.equals(b) ?: (b==null) class Point2(val x:Int, val y:Int){ override fun equals(obj: Any?): Boolean{ if(obj === this) return true //최적화: 파라미터가 this와 같은 객체인지 if(obj !is Point) return false return obj.x==x && obj.y==y //Point로 스마트 캐스트 .. 2022. 5. 7.
[3-2, 1주차] 연산자 오버로딩과 기타 관례(1) 어떤 언어 기능과 미리 정해진 이름의 함수를 연결해주는 기법을 코틀린에서는 관례라고 부른다. 언어 기능을 타입에 의존하는 자바와 달리 코틀린은 관례에 의존한다. 1. 이항 산술 연산 오버로딩 data class Point(val x:Int, val y:Int){ operator fun plus(other:Point):Point{ return Point(x+other.x, y+other.y) } } >>>val p1 = Point(10, 20) >>>val p2 = Point(30, 40) >>>println(p1 + p2) Point(x=40, y=60) 연산자를 오버로딩하는 함수 앞에는 꼭 operator가 있어야 한다. operator 키워드를 붙임으로써 어떤 함수가 관례를 따르는 함수임을 명확히 할.. 2022. 4. 6.
[12주차] 코틀린 타입 시스템(2) 프로그램에서 사용하는 Int, Boolean, Any 등의 원시 타입에 대해 살펴보자. 코틀린은 원시 타입과 래퍼 타입 구분하지 않는다. 6.2.1 원시 타입: Int, Boolean 등 자바에서는 원시 타입 (primitive type)과 참조 타입 (reference type)을 구분한다. 하지만 코틀린에서는 구분하지 않으므로 항상 같은 타입 사용. val i : Int = 1 val list : List = listOf(1,2,3) 코틀린에서는 숫자 타입 등 원시 타입의 값에 대해 메소드 호출 가능. 아래 예시 코드는 표준 라이브러리 함수 coerceIn을 사용해 값을 특정 범위로 제한. fun showProgress(progress:Int) { val percent = progress.coerce.. 2022. 1. 30.
[11주차] 코틀린 타입 시스템(1) 6.1. 널 가능성 6.1.1. 널이 될 수 있는 타입 - 코틀린과 자바의 가장 중요한 차이는 코틀린 타입 시스템이 널이 될 수 있는 타입을 지원한다는 점이다. 자바에서는, 어떤 변수가 널이 될 수 있다면 그 변수에 대해 메소드를 호출할 시 NullPointerException이 발생할 수 있으므로 안전하지 않다. 코틀린은 그런 메소드 호출을 금지함으로써 많은 오류를 방지한다. (NPE의 경우 런타임 시 발생하지만, 코틀린에서는 컴파일 시 오류를 발생시킨다.) - strLen 함수의 경우 파라미터 s의 타입인 String이 널로 넘어오지 못하게 컴파일 오류를 발생시킨다. 이 함수가 널과 문자열을 인자로 받을 수 있게 하려면 타입 이름 뒤에 물음표(?)를 명시해야 한다. fun strLenSafe(s:St.. 2022. 1. 21.