[TIL]220916 - Kotlin 문법

Jimin·2022년 9월 18일
0
post-thumbnail
post-custom-banner
  • Null Pointer Exception(NPE) 방지: nullable ? 사용
  • 이론보다는 실리
    getter/setter 사용하지 않고 default visibility가 public
  • for loop 문법이 다름
    for (int i = 0; i < 5; i++) 지원x

  • fun 함수
  • const 모두 대문자 및 _ 사용

  • class: extends대신 ":" 사용
  • 클래스 생성 default final 내 클래스를 상속받게 하려면 open을 추가해야함

  • 상수: 최상위 클래스는 Any
    • 재정의 가능 멤버에 open 명시적으로 붙여줘야 함
    • 슈퍼 클래스는 open, 서브 클래스는 override 사용
    • 슈퍼 클래스에서 open인 fun만 서브 클래스에서 override 가능

  • kotlin에서 static 없음
  • 한 클래스에 오직 한 개의 companion object가질 수 있음
companion object {
	const val REQUEST_GUNDAM = 100
    const val KEY_NAME ="name"
} //다른 클래스에서 접근 가능

  • object: 새로운 class를 만들지 않고 상속받아서 재정의할 때 사용
    자바의 anonymous inner class와 유사
    functional interface는 lamda식 가능

  • data class
    • default visibility가 public
data class person (var name: String, var age: Int) 

  • 변수
    1. val: read-only
    2. var: 할당 가능
    • 타입: 값을 초기화하는 경우에 값의 타입이 명확하다면 변수의 타입을 지정하지 않아도 됨
    • 타입 뒤에 ?가 붙는 경우 nullable의 의미

  • lateinit (late + init: 늦게 초기화하겠다!)
    • constuctor()에서 초기화할 때는 안 써도 됨
    • nullable일 때 못씀
    • inInitialized 로 검사 가능
    • Nullable이 아닌데 초기화 하지 않을 때 사용

  • fun: Unit - 반환값 없음 (void와 유사) 생략 가능!
  • default arguments 함수 호출시에 지정하지 않으면 default값 지정
  • named arguments: 순서 바뀌어도 됨(순서 맞추기 권장)

  • String Templates: printf()의 %d와 유사
  • $ 사용, {} 사용 가능

  • internal: 같은 모듈 안에서 internal멤버를 선언한 클래스를 볼 수 있다면 접근 가능 - 한 클래스 내부에 protected클래스가 있고 거기에 internal 멤버가 있다면 바깥의 다른 클래스에서 접근 불가
    • 모듈이 한 개라면 public과 동일

  • Null 안정성: kotlin에서는 null pointer exception (NPE)발생 제거 노력
    1. non-null: null 값을 가질 수 없는 변수
    2. nullable: null 값을 가질 수 있는 변수
  • nullable: 타입 오른쪽에 ?사용
    • Elvis 연산자 ?:
      null일 경우 뒤의 표현식 반환 (또는 throw로 exception발생)
      val len:Int = str?.length?:-1
  • !!! : null이 아님이 확실하거나 또는 null일 경우 NPE를 발생시킬 때
  • as? (safe cast 연산): 다른 타입으로 cast가 불가능하다면 null반환

  • 개발자 공식 문서의 코드에서 실행시 에러 발생
    getBitmap() return 타입 Bitmap을 nullable로 변경하면 해결됨
  • lamda Expression: anonymous fun
  • lamda식만 함수 인자로 전달한다면 괄호 생략 가능
  • it: lamda식이 한 개의 parameter만 갖는다면 -> 생략하고 이름은 it사용
  • SAM(Single Abstract Method) interface: 인터페이스의 경우 메소드 한 개인 경우 많음
button.setOnClickListener (
	val btn = it as Button
    textVies.text = btn.text
}

  • 사용하지 않는 parameter에는 이름을 부여하지 않고 _를 붙여서 자리만 차지
  • when (switch-case문 유사)
when(v?.id){
	btn1.id -> intent.putExtra(KEY_NAME, "111")
    btn2.id -> intent.putExtra(KEY_NAME. "222)
    NULL -> RETURN
}

  • for: 다른 언어의 전형적인 for loop 허용 안 함
for (i in 0..9)
for (i in 9 downTo 0)
for (i in 0 until mArray.size) //숫자가 정해지지 않은 경우
for (item in mArray) //컬렉션 처리

  • == 값이 같은지 비교
  • === 같은 객체를 가리키면 true
  • !== ===의 반대
post-custom-banner

0개의 댓글