ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 커니의 코틀린-(2) 자바와 비교해보는 코틀린 컬렉션, 클래스, 인터페이스, 싱글톤, 제네릭, 널 안전성
    Client/Android 2020. 2. 28. 17:08

    차세대 안드로이드 개발자를 위한 커니의 코틀린

    ch2 자바와 비교해보는 코틀린

     

     

     

    🍓 2.2 컬렉션

    java : 자료 수정 가능여부 제한 불가능.  가변만 존재

    Kotlin : 자료 수정 가능여부 제한 가능. 가변, 불가변 모두 존재

     

     

     

    🍓 2.3 클래스 및 인터페이스

    프로퍼티

    Java : 클래스 내에 자료를 저장하고 접근하기 위해 필드와 메서드를 사용한다. 

            자료에 접근하기 위해서는 Getter/Setter 메서드를 추가해야해서 불필요하게 코드가 길어진다

    Kotlin : 이러한 불편함을 개선하기 위해 프로퍼티를 사용한다. 

     

     

    생성자

    Java : 필드 정의, 생성자 초기화 코드를 직접 작성해야 한다.

    Kotlin : 한 줄의 코드로 인자로 받은 값을 사용하여 내부의 필드 및 프로퍼티에 값을 할당할 수 있다.

     

     

    클래스와 인터페이스의 선언 및 인스턴스 생성

    추상클래스

    Java : 클래스의 인스턴스를 생성하기 위해 new 키워드를 사용

    Kotlin : object : [생성자] 형태로 선언  ex) object : Foo()

     

    인터페이스

    Java : 클래스의 인스턴스를 생성하기 위해 new 키워드를 사용

    Kotlin : object : [인터페이스 이름] 형태로 선언 ex) object : Bar 

     

    추상클래스와 인터페이스의 공통점과 차이점에 대해 알고 싶다면? Click

    👉 공통점과 목적 및 특징의 차이점에 대해 적어놨습니다😁

     

     

     

     

    🍓 싱글톤

    java와 달리 kotlin은 object를 붙여 코드 한 줄로 쉽게 싱글톤을 생성할 수 있다.

    object singleton{
    
    	val test1 = "test다!"
        
        fun testValue() {}
    }
    
    //object singleton의 test1참조
    val refTest1 = singleton.test1
    
    //object singleton의 testValue 함수참조
    singleton.testValue()

     

     

    🍓 2.6 제네릭

    인자로 사용하는 타입에 따라 구체화되는 클래스나 인터페이스

     

     

    1. 클래스 인터페이스 정의

    class Car(){ ... }
    
    interface Container<T>{    //타입을 Car 클래스에 한정하고 싶은 경우, Container<T : Car>
    	fun put(item : T)
        fun take() : T
    }
    
    class Garage : Container<Car>{
    	override fun put(item : Car){ ...  }
        override fun take() : Car { ... }
    }
    

     

    2. 제네릭을 인자로 받는 함수

    Java :  ? super T,  ? extends T

    Kotlin : in T, out T

     

    T : 별도의 Wildcard 정의가 없이 read/write 모두 가능

    in T : Java의 ? super T와 같음. input의 약자이며 write 만 가능

    out T : Java의 ? extends T와 같음. output의 약자이며 read 만 가능

     

     

     

    🍓 2.8 널 안전성

    프로그램을 개발하며 가장 빈번하게 발생하는 오류는 널 포인터 예외이다.

    Java : @Nullable @NonNull 어노테이션을 사용하여 객체의 널 허용여부를 표시

    Kotlin : ?를 붙이면 Nullable

     

     

    1. 널 허용 여부 표기

     

     

    2. 엘비스 ( ?: )  연산자. 널 값을 대신하는 방법 

    널 값을 허용하지 않는 값 or 변수에 널 값을 반환할 수 있는 함수의 결과를 대입해야하는 경우에 사용한다

    조건문과 유사하다.

     

    //foo가 널이면 bar반환
    foo ?: bar
    
    //Code함수가 널이면 Code.NONE 대입
    val postal : PostalCode = Code("1600 pppp cd") ?: Code.NONE
    
    fun MapImage (address : String){
    	//Code함수가 널이면 함수 실행을 종료하고 결과로 null 반환
    	val postal = Code("1600 pppp cd") ?: return null
        
        //지도 이미지 생성
        ...
    }

     

     

    3. 안전한 호출 ( ?. ) 연산자.  널 값 확인과 처리 한번에

    java : null 값 여부 확인을 위해 주로 if문 사용

    Kotlin

    //bar가 null이 아닐 경우만 foo에 값 대입. null인 경우는 null 대입
    val foo = bar?.baz
    
    //foo가 null 아닐 경우에 bar() 호출
    foo?.bar()

     

     

    4. as? 연산자. 안전한 자료형 변환

    지원되지 않는 자료형 변환을 시도하는 경우 예외 발생시키는 대신 널 값 반환해준다.

     

     

    5. !! 비 널값 보증 연산자. 널 값 아님 명시

    보증하려는 항목 뒤에 !!을 붙여 사용. 

    그러나, null인 경우 예외가 발생하니 주의

     

    6. lateinit 키워드. 나중에 초기화 되는 변수를 위해

    Kotlin : 널 값 허용하지 않는 경우 초기화 or 생성자를 통해 초기화 강제함. 

    그러나, 초기화 없이 변수만 선언할 수 있다. 바로 lateinit 키워드를 사용하여!

     

     

     

     

     

     

    반응형
Designed by Tistory.