- Java 기반
- 타입추론 기반 정적타입지정
- 집합의 경우 immutable이 기본 ( list, map형식도 mutable이 따로 존재 )
- null에 엄격
기본 구성
- Activities : 화면
- Services : 백그라운드 실행 구성요소
- Broadcast receivers : 이벤트 delegate
- Content providers : api? 터미널? 브릿지
- 타입추론 기반
- var : 변수
- val : 상수
- 선언시 타입지정은 optional ( 타입추론을 통해 알아서 정적지정 )
- var [name] : [type] = [value]
- 집합
- 배열 타입
- array ( collection )
- list
- map ( dictionary )
- map은 key값의 중복이 불가, dictionary는 가능
- set ( 중복값 자동제거, 내용물을 unique하게 유지함 )
- arrayList
- 동적 리스트와 비슷..?
- method 명명 또 이상함 ( add, clear, get, remove )
- 초기화 시 ArrayList<type>( index length )
- 물론 arrayListOf<type>( values ) 도 가능
- iteration : while ( [name].hasNext() )를 통해 가능
- .length 대신 .size
- immutable 기본
- list, map조차도 기본형은 추가,제거,내용수정이 불가
- 선언 시 mutableListOf<>() 혹은 [List] = [List].toMutableList와 같이 명시적으로 mutable로 지정해야 함
- pseudo
- type은 IntArray 혹은 Array<type> ( 구지 다중타입배열의 타입을 명시하고싶으면, Array<Any>쓰면 될듯..? )
- data init은 arrayOf( [values] ) 또는 arrayOf<type>( [values] ) 또는 intArrayOf( [values] )
- 내용물 보는건 .contentToString()
- 데이터 스트럭쳐
- class
- data class ( struct )
- 배열 타입
- Null 관리 ( NPE = null pointer exception )
- 예외 확인 및 nullptr, null 등의 예외처리를 최소화하기 위해 null 허용 및 관리를 엄격하게 가져감
- 모든 변수는 기본적으로 !nullable
- var에 null 입력시 exception을 throw하지않으려면, 타입선언 시 물음표를 붙여줘야 함 ( var [name] : [type]? = [data])
- null시 exception 처리방법 - [name]? : [null일시 exec할 내용] ( isnullptr의 대체? ) ( Elvis operator )
- not null일때만 실행 - [name] ?. let { exec statement }
- 클래스 내의 메서드에 접근 시, 각 단계에서 안전하게 접근할때, 그냥 경로상의 클래스/멤버 단위에 각각 ?붙여주면 됨 ( null safe operator )
- ex. class?.mathod1?.method2?.method3?.param1?
- nullable var/val 뒤에 !!를 붙이면 not null에 대입할 수 있음 ( nullable var/val의 값이 null이면 그 statement에서 에러 반환 )
- var s : Int? = null → var c : Int = s!!
- Type
- 모든 type ( custom class 포함 )은 class Any 를 상속함
- [class] :: class 를 통해 타입 획득 ( .simpleName을통해 클래스이름만 출력 )
- [name] is [type] 을 통해 논리연산 가능
- switch-case문의 대체인, when-[value] 문에서 when-is [type] 을통해 타입기반 switch가 가능
- 범위 선언
- in 1..10 = [1, 2, ... , 9, 10]
- in [범위] step [간격]
- 형변환(cast)는 as로 함, ?를 붙여 safe cast 가능
- var a: A = b as A
- var a: A = b as? A ?: [exec statement when b<A> is null]
- a에는 null을 반환함
- Constructor와 Initializer
- method의 name이 contructor면 자동으로 subconstructor method로 기능
- class 생성시 초기화 param은 primary constructor를 통해 받음
- class [name] ( params ) : type { class block }
- subconstructor는 이후 primary constructor를 덮어씌워서 초기화 하는 느낌?
- constructor ( parmasb ) : this ( paramsb ) { subcons block }
- method의 name이 init이면 자동으로 initializer method로 기능
- 작동 순서
- primary cons → 모든 subcons의 초기화 → 모든 init → 모든 subcons block
- method의 name이 contructor면 자동으로 subconstructor method로 기능
- Class
- 접근지정자
- 상속가능 여부 : Open, Final ( final이 기본 )
- 접근가능 여부 : public, protected, private, internal
- protected는 open 추가로 붙여줘야 함 ( 당연히 public도 )
- internal은 같은 모듈안에서 접근 가능 ( 한번에 컴파일되는 단위 기준? )
- 내부inner
- 클래스 내 클래스에만 접두 가능
- 자기 테두리클래스에도 접근가능
- private 멤버에도 접근 가능
- 중첩nested ( 내부인데 inner로 지정하지 않을 경우 기본클래스 )
- 그냥 클래스안에 있는 클래스인듯
- class Outer{
var a = 3
val innerObj = Inner()
init {
this.a = 4
}
inner class Inner{
val c = a
fun setA(a: Int){
this@Outer.a = a
}
}
}var outer = Outer()
var inner = outer.innerObj
var inner2 = Outer().Inner()
var inner3 = outer.Inner()println(inner.c)
println(inner2.c)
println(inner3.c)
println(Outer().a)
println("---------")
println(outer.a)
inner3.setA(10)
println(outer.a)3
4
4
4
---------
4
10Process finished with exit code 0
- 접근지정자
- Lamda식
- val/var [name] = { [parma n] : [type n], [param m] : [type m] → return value ( with params ) }
- Android View Class Hierarchy
- 뷰 : 시각적 컴포넌트의 최상위 클래스
- 뷰 그룹 : 여러개의 뷰를 포함
- 위젯 : 기능성 버튼
- 레이아웃 : 내부에 뷰를 포함, 뷰들의 배치와 정렬에 대해 관리
함수 정리
함수 정리
- Log
- .e ( tag, message ) : 오류
- .w ( tag, message ) : 경고
- .i ( tag, message ) : 정보
- .d ( tag, message ) : 디버그
- .v ( tag, message ) : 상세
|