kotlin언어 사이트: https://kotlinlang.org/
1. kotlin은 java와 다르게 문법 마지막에 ";"을 붙이지 않는다.
2. kotlin 또한 java처럼 main함수에서 시작한다.
--> 두 식은 동일한 의미를 가진다.
1. 함수 선언은 앞에 fun을 붙여서 한다( function이라는 뜻 )
2. 리턴 타입이 void일 경우 생략 가능 --> ( 위의 main함수의 경우처럼 )
3. kotlin 언어에서는 구문식뿐만아니라 표현식으로도 함수를 작성할 수 있다. ------------------------> (중요 특징)
fun 함수명( 매개변수명 : 매개변수 타입, 매개변수명 : 매개변수 타입, ...... ): 리턴타입 { 함수내용 }
fun 함수명( 매개변수명 : 매개변수 타입, 매개변수명 : 매개변수 타입, ...... ) = 함수리턴내용
--> 이런식으로 다양하게 사용 가능
1. val은 상수에 대한 선언 --> 값을 정하면 변경할 수 없음
2. var은 변수에 대한 선언 --> 값을 정해도 변경할 수 있음
3. a처럼 선언하는 것이 기본 선언
val 변수명: 변수타입 = 값
4. kotlin은 타입추론이 가능하기 때문에 b,c처럼 타입 선언없이 선언할수도 있음
val 변수명 = 값
5. kotlin은 d처럼 선언만 할 수도 있다.
val 변수명: 변수타입
6. kotlin에서는 null_Safe라는 기능이 있기 때문에 d를 선언만하고 초기화하지 않을 경우 경우 오류를 띄운다.
--> null_safe : java의 경우 변수에 타입 선언만 하고 초기화를 안했다면 null을 자동으로 넣어주지만,
kotlin의 null_safe기능은 null에 대해서 안전하게 참조할 수 있도록, null이 들어갈 수 있는 타입을 따로 정해놓고 있다.
--> ( Not-null타입과 Nullable타입 )
따라서 d를 String타입으로 지정한 뒤 초기화시켜주지 않으면 오류메세지를 띄우게 된다.
7. 해당 변수를 Nullable하게 만들어 주려면 e와 같이 선언하면 된다.
val 변수명: String?
--> null이 할당될 수 있도록 ( Nullable하도록 ) 선언되었다.
--> kotlin은 타입추론이라는 기능이 있다.
예를 들어)
val a = 20
의 경우 a는 타입 선언을 해주지 않았지만 타입추론기능에 따라 int일 것이라고 추론되어, 이후 a는 int타입으로 인식된다.
--> 만약에 a가 int가 아니라 Long타입으로 추론되기를 원한다면, 위의 그림처럼 값 뒤에 L을 붙여주면 된다.
val a = 20 --> Int로 추론
val b = 20L --> Long으로 추론
val c = 123.4f --> Float으로 추론
val d = 123.4 --> Double로 추론
--> 위의 그림처럼 문자타입의 더하기 연산은 그냥 물리적으로 문자를 더해주게 된다.
--> true, false를 나타내며,
Boolean타입 또한 Not-Null타입이다.
따라서 null을 할당할 수 있기 위해선 위의 그림처럼
val 변수명: Boolean?
의 형식으로 변수타입뒤에 ?를 붙여서 Nullable하다는 변수타입선언을 해줘야한다.
for ( 변수 in 범위문 step 간격 ){ 반복문내용 }
위의 그림과 같이 다양하게 표현 가능하다.
( 위의 범위문 = range ) --> 그래서 range를 사용하는 반복문이라고 표현함
범위문 부분에는 그림의 마지막처럼 list를 넣어줄수도 있음
--> java에서의 while과 유사
--> do while문도 있음
--> 중간에 continue 키워드를 사용하면 While문의 처음으로 바로 되돌아 갈 수 있음
--> java에서 썼었던 기존의 if 조건식은 그대로 쓸 수 있음
kotlin에서는 표현식으로 if문 사용가능 (그림의 아래 코드)
--> 조건에 따라 변수에 다른 값이 할당되게 만듬
--> x의 값에 따라 when문 안의 조건에 해당하는 코드가 실행됨
when ( 조건변수 ) {
조건변수의조건 -> 해당조건을만족했을떄실행되는코드
조건변수의조건 -> 해당조건을만족했을떄실행되는코드
조건변수의조건 -> 해당조건을만족했을떄실행되는코드
......
else -> 위의조건에모두만족하지않을때실행되는코드
}
--> 조건변수의조건의 경우, 위의 그림처럼 다양하게 구성이 가능하다.
x는 int일때,
단일 값
0 -> 실행문
--> x = 0일경우 실행
몇몇 값
0,1,2 -> 실행문
--> x = 0 또는 1 또는 2일 경우 실행
범위 값
in 1..10 -> 실행문
--> x = 1~10사이의 정수일 경우 실행
역범위 값
!in 1..10 -> 실행문
--> x = 1~10사이 이외의 정수일 경우 실행
타입조건
is Int -> 실행문
--> x가 int타입일 경우 실행
--> 아래와 같이 when문은 매개변수 없이 조건문만 가지고도 활용할 수 있다.
-----------확장함수는 그 이전의 메소드에 대한 반환값에 대해 메소드를 실행시키는 방식이다.
예를들어
a라는 클래스가 있고, 그 클래스가 add(), minus(), DD() 라는 3개의 메소드를 가지고 있고,
각 메소드가 각각의 역할을 한 후 객체 자신 (즉, this)를 리턴한다고 할때
a 객체의 예시
class a{
a add() {
// add 의 코드
return this
}
a minus(){
// minus의 코드
return this
}
a DD() {
// DD의 코드
return this
}
}
a 클래스를 확장함수로 사용
val abc: a = a()
abc.add().DD().minus()
와 같이 확장 함수로 사용할 수 있다.
--> 위 코드의 의미는
abc 객체의 add()메소드를 실행시킨 뒤,
그 반환값(this이므로 add()가 실행된 a객체가 반환됨)의 DD()메소드를 실행시킨 뒤
그 반환값(this이므로 DD()가 실행된 a객체가 반환됨)의 minus()메소드를 실행시킨 뒤
값을 반환한다.
///////////////////////////////
이것을 조금 응용하면,
예를 들어 이러한 B와 C가 있을 경우
class B{
val DD = C()
class C {
MethodInC(){
// MethodInC의 코드
}
}
C MethodForReturnC(){
// MethodForReturnC의 코드
return DD
}
}
이런 식으로 사용할 수 있다는 뜻이다.
val abc = B()
abc.MethodForReturnC().MethodInC()
즉, abc객체의 메소드인 MethodForReturnC를 실행한 후,
그 메소드의 반환값인 DD( C 클래스의 객체 )에 대해
DD객체의 메소드인 MethodInC()를 실행시키는 형식으로도 사용할 수 있다는 것이다.