-
커니의 코틀린-(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 키워드를 사용하여!
반응형'Client > Android' 카테고리의 다른 글
코틀린 퀴즈 -3 확장함수,제네릭, 고차함수, 람다 (0) 2020.03.12 코틀린 퀴즈 -2 제네릭, 주생성자, 확장함수, 익명함수, 엘비스 연산자 (0) 2020.03.12 코틀린 퀴즈 -1 컬렉션, 생성자, 추상클래스, 인터페이스 (0) 2020.03.12 [Kotlin] 커니의 코틀린-(8) 코틀린 안드로이드 익스텐션 (0) 2020.03.11 [Kotlin] 커니의 코틀린-(4) 코틀린 표준 라이브러리 (0) 2020.03.11