티스토리 뷰
main()
-main함수가 있어야함
-실행시 main함수가 처음으로 실행됨
fun main(){
println("hello world")
}
변수 선언
-코틀린은 val, var 키워드로 변수 선언
-val은 value 초깃값 할당 되면 바꿀 수 없는 변수를 선언
-var는 variable 초깃값 설정 한 뒤에도 값 바꿀 수 있는 변수를 선언
-변수명 뒤에 콜론 추가해 타입 명시, 대입하는 값에 따라 타입 유추 가능할땐 생략할 수 있다
val data1: Int=10
val data2=20
위 코드에서 data1은 Int명시, data2는 20을 대입하여 유추가능하기때문에 Int명시 안함
-초깃값 할당시 최상위에 선언한 변수나 클래스 멤버 변수는 선언과 동시에 초깃값 할당해야 함
-함수 내부에 선언한 변수는 선언만 하고 초깃값 할당하지 않아도 된다. 물론 변수 이용하려고 할땐 값을 할당 한 다음 사용해야 한다
val data1:Int //최상위에 선언하였으므로 초깃값 할당해야함 이 경우 오류생김
fun main(){
val data2: Int//함수 안이므로 초깃값 없이 선언 가능
println("$data2")//선언만 하고 값 할당 안하여 사용 불가, 에러남
}
class test{
val data3: Int//클래스 멤버 변수이므로 선언과 동시에 초깃값 할당 필요, 이 경우 에러남
}
-초기화 미루기: 변수 선언할때 초기값 할당 불가능한 경우가 있음.. 그때 컴파일러에게 값을 나중에 할당할것이라고 알려줘야함 -> lateinit, lazy키워드를 사용
-lateinit
var키워드로 선언한 변수에만 사용가능함
Int, Long, Short, Double, Float, Boolean, Byte에는 사용 불가능
타입을 명시해줘야됨
lateinit var data3:String
lateinit var data4//이 경우 에러, 타입 명시해야함
-lazy
소스에서 변수가 최초로 이용되는 순간 중괄호로 묶은 부분이 자동으로 실행, 그 결과가 변수 초기값으로 할당된다
데이터 타입
-코틀린의 모든 변수는 객체
-따라서 모든 변수의 타입은 primitive type(기초 데이터 타입)이 아니라 클래스다
-클래스이므로 null대입이 가능함
- java의 경우 프리미티브 타입에 null불가능, 프리미티브 타입에는 디폴트 값이 있어서 자동으로 디폴트값으로 초기화되기때문, null을 넣고싶으면 래퍼클래스 사용해야됨
var data:Int?=null
-변수가 객체이므로 그 변수한테 해당하는 클래스 메서드 호출 가능
var data1:Int=10
data1=data1.plus(10)//메서드 호출
-기초 데이터 타입
- Int, Short, Long, Double, Float, Boolean
-문자 데이터 타입 Char, 문자열은 String
- Char의 경우 작은 따옴표로 감싸서 표현한다.
-문자열 탬플릿
- String타입 데이터에 변수값, 연산식 결과를 포함해야될때 ${} (자바스크립트에도 이거임)
-Any
- 코틀린 최상위 클래스임
- 모든 타입이 가능함(최상위 클래스니깐), 다른 모든 타입들은 Any의 하위 클래스
- Any로 선언한 변수에는 모든 타입의 데이터 할당가능
fun main(){
val data1:Any=10;
val data3:Any="hello"
val data4:Any=1.4
}
-Unit
- 반환문이 없는 함수
- 다른 타입들과 다르게 데이터의 형식이 아닌 특수한 상황을 표현하는데 사용됨
- 함수의 반환 구문이 없음을 표현하는데 흔하게 사용된다. 자바 void같은거
fun some1():Int{
return 10
}//이 함수의 경우 Int반환
//반환 타입을 명시한 경우 반드시 return 이 있어야 하며 명시된 타입과 반환 타입 일치해야 함
fun some2():Unit{
println(10+10)
}//이 함수의 경우 반환문 없음, 이렇게 Unit은 반환 없음에 사용됨
fun some3(){
println("hi")
}//이 함수는 반환 타입 생략함, 생략되면 Unit을 명시한것과 동일
-Noting
- Unit과 마찬가지로 특수한 상황을 표현하는데 사용된다
- Noting으로 선언한 변수에는 null만 대입할수있다. 따라서 Nothing으로 선언한 변수는 데이터로서의 의미없음
val data1:Nothing?=null
- 주로 함수 반환타입에 사용한다. 어떤 함수의 반환 타입이 Nothing인 경우에는 그 함수가 null을 반환하는거임 근데 null 반환하는경우엔 ? 을 붙여야됨
- 혹은 예외를 던지는 함수의 반환타입을 Nothing으로 선언한다
fun some1():Nothing?{
return null
}//null반환함, 따라서 Nothing뒤 ? 를 붙임
fun some2():Nothing{
throw Exception()
}//예외 던지는 함수
-null 허용과 비허용
- 코틀린의 모든 타입은 객체이므로 변수에 null대입이 가능
- null 대입 되는경우엔 ? 을 붙이고 아니면 안붙임
var data1:Int=10//null 불허
var data2:Int?=10//null 허용
함수 선언
-함수 선언은 아래와 같이 한다
fun 함수명(매개변수명:타입,매개변수명:타입=디폴트값):반환타입{
...
}
-함수 안에서 매개변수의 값을 변경하는것은 불가능하다
fun some3(a:Int,b:String) {
a=10//에러, 매개변수 값 변경 불가능
}
-매개변수의 디폴트 값 선언 가능
-named parameter: 매개변수명을 지정해서 함수를 호출하는것
컬렉션 타입
-컬렉션타입은 여러개의 데이터를 표현하는 방법
-Array, List, Set, Map
-Array
- 배열을 표현하는 클래스
- Array클래스 생성자
- <init>(size:Int,init(Int)->T)
- 아래처럼 선언한다
val arr1=Array(배열크기,{초깃값})
- 사용하는법
arr1[0]=10
arr1.set(2,30)//arr1의 2번 인덱스값 30으로
arr1.get(2)//arr1의 2번 인덱스값 가져오기
- 기초타입의 배열들
- BooleanArray, ByteArray, CharArray, DoubleArray, FloatArray, IntArray, LongArray, ShortArray
val data1:IntArray=IntArray(3,{0})
//data1에 Int들이 들어가는 Array를 만듦, 배열 크기는 3, 초기값은 0
//배열모양 [0,0,0]
- arrayOf() 함수 사용하면 선언과 동시에 배열 요소 값 할당 가능
val data2=arrayOf<Int>(1,2,3)
- 기초 데이터 타입인 경우 *ArrayOf()형태로 arrayOf함수를 제공
val data4=intArrayOf(1,2,3)
val data5=booleanArrayOf(true,false,true)
-List, Set, Map
- Collection<T> 는 list, set, map의 최상위클래스
- Collection 인터페이스를 타입으로 표현한 클래스
- 컬렉션 타입 클래스는 가변 클래스, 불변 클래스로 나뉜다
- 불변 클래스는 데이터 대입 후 변경이 불가능, 가변 클래스는 데이터 추가와 변경 가능
- List
- 순서가 있는 데이터 집합, 중복 가능
- List: 불변, listOf()
- Mutable List: 가변, mutableListOf()
- Set
- 순서 없고 중복 불가
- Set: 불변, SetOf()
- MutableSet: 가변, mutableSetOf()
- Map
- 키와 값으로 이루어진 테이터 집합
- 순서 없음, 키의 중복은 불허
- Map: 불변, mapOf()
- MutableMap: 가변, mutableMapOf()
- Pair객체를 통해 데이터를 넣거나 키 to 값 형태로 이용할 수 있음
- get으로 값 가져올땐 키를 사용함
//Map 객체 함수
var m=mapOf<String,String>(Pair("one","hello"),"two"to"world")
m.get("one")
조건문 if else
if(data1>0){
}else if(data1<-10){
}else{
}
-위 코드처럼 다른 언어들의 if, else와 비슷함, 하지만 코틀린에서는 표현식으로도 사용가능함
- 표현식: 결과값을 반환하는 계산식을 뜻함
-표현식으로 사용할땐 else구문이 필수적, 표현식이 반환하는 결과값은 각 영역 마지막줄에 해당됨
val res=if(data1>0){
true//data1이 0보다 크면 res에 true가 들어감
}else{
false//아니라면 res에 false
}
조건문 when
when(data1){
10->println("data is 10")
20->println("data is 20")
else->{
println("data is not valid data")
}
}
-위 코드는 data1이 10이면 "data is 10" 이 출력되고 20이면 "data is 20" 이 출력, 둘다 아니면 "data is not valid data"가 출력
var data1:Any=10
when(data1){
is String->println("data의 타입 string")//타입으로 구분
20,30->println("data가 20 또는 30")//20 또는 30 일때
in 1..10->println("data가 1~10의 값")//1~10사이 값일때
else->println("data is not valid data")//위의 조건 전부 아닐때
}
var data1=10
when{
data1<=0->println("data is <=0")
data1>100->println("data is >100")
else->println("data is valid")
}
-위의 코드처럼 when 문 파라미터에 값을 안적고 써도 됨
-참인 조건을 찾으면 바로 블록 밖으로나옴
반복문 for
-until 사용하면 끝 숫자는 포함하지 않음
-step 사용하면 몇씩 증가할지 정할수있다. downTo는 감소
-indices로 컬렉션 타입의 요소 수 만큼 반복할 수 있다
반복문 while
-다른 언어의 while과 유사
'공부 > Kotlin' 카테고리의 다른 글
이펙티브 코틀린 1장 아이템4 - inferred 타입으로 리턴하지 말자 (0) | 2024.07.06 |
---|---|
이펙티브 코틀린 1장 아이템2 - 변수의 스코프를 최소화하라 (2) | 2024.06.10 |
이펙티브 코틀린 1장 아이템1 - 가변성을 제한하라 (0) | 2024.06.09 |
null 관련 연산자(안전 호출 연산자, 어설션 연산자, 엘비스 연산자) (0) | 2022.10.29 |
코틀린이란(2022년 2월 2주 공부내용 백업) (0) | 2022.09.20 |