728x90
반응형

코틀린은 안드로이드 애플리케이션 공식 개발언어이다. 안드로이드 애플리케이션은 자바와 코틀린으로 개발할 수 있다.

 

코틀린의 특징
- 코틀린 컴파일러는 JVM(자바 가상머신)에서 실행되는 자바 바이트 코드(클래스 파일)를 생성하므로,

자바와 완벽하게 호환되는 크로스 플랫폼을 지원
  - 자바 애플리케이션이 실행 가능한 환경이면 코틀린 애플리케이션도 실행 가능
  - 다음과 같은 애플리케이션 작성 가능
    - 네이티브 애플리케이션
    - 웹 브라우저에서 실행되는 자바스크립트
    - 서버에서 실행되는 Http 서블릿
    - 구글 안드로이드 애플리케이션
- 객체지향 프로그래밍 지원
- 함수형 프로그래밍 지원함
- 문법과 코드 간결

- 코틀린 개발 IDE : IntelliJ, Android Studio, Eclipse, Compiler

 

기본타입

- 코틀린에서 모든 것이 객체 : 멤버함수나 프로퍼티 호출할 수 있다
- Numbers(Byte,Short,Int,Long,Float,Double), Character(Char), Boolean, Array, String

- Char가 코틀린에서는 숫자형이 아니다

  • Numbers
    • 10진수 : 123
    • 16진수 : 0x0F
    • 2진수 : 0b00000010101001
    • 8진수는 지원하지 않는다
  • Long : 123L
  • Double : 123.9, 123.3e10
  • Float : 13.4f
  • Underscores( _ ) : 숫자가 길어서 실수할 수 있어서 구분자를 주는 것
    • val oneMillion = 1_000_000
    • val creditCardNumber = 1234_5678_3456L

- Explicit Conversions

  - 작은 타입은 큰 타입의 하위 타입이 아니다 -> 작은 타입에서 큰 타입으로 대입이 안된다(서로간에 상속관계가 없다)

모든 숫자 데이터 클래스는 Number라는 추상 클래스를 상속하고 있다
val a:Int =1
val b:Long = a //오류

val a:Int =1
val b:Long = a.toLong()

 

<타입 변환 함수들>
toByte() toShort() toInt() toLong() toFloat() toDouble() toChar()

 

- 산술 연산에서는 묵시적 변환이 이루어짐
val num = 1L + 3 // Long + Int => Long

 

  • Characters
    • char는 숫자로 취급되지 않음, 비교도 하면 안됨 ex> char c ==1 (오류)

변수 및 상수

- 클래스의 멤버 변수 및 전역 변수는 반드시 선언하면서 초기화해야 함

- 지역 변수의 경우, 선언 후 사용 가능하다(단, 초기화가 되어 있지 않으면 사용할 때 에러 발생함)

변수(Variable, mutable variable)

형식 : var variable:Type = value 

var a: Int = 7

var b: Double = 10.5

 

상수(Value, immutable variable) => Java에서는 final 키워드에 해당한다

형식 : val variable:Type = value

val variable:Type = value
val a: Int = 7
val b: Double = 10.5

 

숫자 타입
val a = 100 // 자동 추론(Int) -> 생략 가능
val b:Long = a // 숫자 타입간 변환 자동으로 해주지 않음, Int타입에서 Long타입으로 변환 안된다. 꼭 명시적으로 형변환 해줘야함
val b:Long = a.toLong() // 변환 함수 사용
val b:Long = a + 1L // 표현식을 Long 타입으로 변환 
val b:Long = a+3.5 // 에러난다

 

문자열 : String 타입

// Escape string
val s1 = "hello\nworld"
// Raw String -> 입력형태 그대로 출력한다 (""" """ 사용)
val s2 = """hello world"""
Raw String에는 trim이라는 기능을 사용할 수 있다.
trimIndent() -> 들여쓰기 했던것을 지우겠다.
trimMargin(">") -> 파라미터로 준 기호(여기서는 >)까지 trim하겠다.

 

String 타입을 숫자로 변환하고 싶으면 명시적으로 변환함수를 호출해주면 된다.
toInt() , toDouble()
변수나 상수 출력할때는 $기호를 사용하고 변수명을 주면 된다.

${표현식}--> 계산이 된다.

문자열 비교
== : java의 equals()와 동일

모든 변수는 null을 허용하지 않음
- 객체의 생성과 동시에 초기화해야 함
Null을 허용하려면 물음표(?)를 추가해야 함
- 타입을 생략할 수 없음

var str:String? = "hihello"
str = null (가능)
val a:String //오류
val b:String? = null
var c:String // 오류
var d:String? = null


Variable Nullable
Lateinit 키워드로 나중에 초기화 가능 -> 쓰기전에 초기화 꼭 해주기
- Var 변수에만 사용 가능
- Null 값으로 초기화할 수 없음
초기화 전에는 사용할 수 없음
- Int, Long, Double, Float 등 기본 데이터 타입에는 사용할 수 없음

lateinit var c: String
c="Hello"
println(c)


Lazy로 늦은 초기화
- Val 에 사용하여 늦은 초기화
- 초기화 블록에 초기화에 필요한 코드 작성
- 처음 호출될 때 초기화 블록의 코드가 실행됨
- 마지막 줄에는 초기화할 값을 명시함

val str:String by lazy{
	print("초기화")
	"Hello"
}


이렇게 되면 처음에는
println(str) 하면 초기화Hello
그다음에 println(str) 하면 Hello출력됨

같은 String 타입이여도 Null값을 가질 수 있는 타입과 가질 수 없는 타입으로 구분이 된다.
두 타입은 같은 타입이여도 대입이 되지 않는다.
!!: Null값이 아님을 보증(!!)
- 변수 뒤에 !!를 추가하면 null값이 아님을 보증 -> 아닐 경우 에러

val name:String? = "greenjoa"
val name2:String = name //오류
val name3:String? = name // OK
val name4:String = name!! // OK


변수 및 상수: Variable Nullable
안전한 호출(?.)
- Null 값이 아닌 경우에만 호출

val str:String? = null
var upperCase = if(str!=null) str else null // null


upperCase.toUpperCase() // 에러

-> String값이 될거라고 예상했지만 지금은 null값이기 때문에 멤버함수 호출 불가-> if문으로 해서 해결
upperCase = str?.toUpperCase() // null -> str이 null값이 아니면 뒤에부분 실행해서 반환하고 아니면 그냥 str반환

엘비스(Elvis) 연산자 (?:) -> null일 경우 default값을 지정할때 사용
- Null이 아닌 기본 값을 반환하고 싶을 때 사용
val str:String? = null
var upperCase = str?.toUpperCase() ?:"초기화하시오" --> str이 null값인 경우 "초기화하시오"구분을 넣겠다
// 꼭 ?.이랑같이 쓸 필요는 없음

var upperCase = str?:"초기화하시오"


배열
Array클래스
Array<String>과 같이 제너릭 타입으로 나타냄
- 배열은 크기를 변경할 수 없음
배열 생성 - arrayOf 함수
- val item: Array<Any> = arrayOf(1,"바나나",false)  

//자바에서 object타입에 해당, 꺼낼때는 어떤 type인지 모르니까 typecasting해서 사용하자
- val item:Array<String> = arrayOf("사과", "바나나", "키위") 
빈 배열 생성도 가능
// val arr = arrayOfNulls<Int>(10)

배열 생성 - Array 생성자 // 생성자에는 배열의 크기와 init이라고 하는 함수가 인자로 들어감, 각 원소는 init함수에 의해서 초기화 됨

val item2 = Array<String>(5) { i->(i*i).toString() } // 람다 함수
	item2[0] = item[1]
	for(fruit in item2){
		println(fruit)
}


앞선 것은 제너릭 타입
기본 타입 요소를 저장하는 배열 클래스 // 이것도 array타입, 생성자 둘다 가능하다.

val item: IntArray = intArrayOf(1,2,3,4,5)
val item2: IntArray(5) { j->(j*j) }
	for(num in item2){
		println(num)
}


ByteArray, ShortArray, IntArray, LongArray, FloatArray,... 등등 사용가능

연산자
연산자와 연산자 오버로딩
: 내부적으로 연산자 오버로딩(overloading)한 함수를 사용해서 연산을 처리
a+b // a.plus(b) // a와b의 값을 더한다


=> 6개가 된다는 의미는 다른 타입과는 덧셈 연산이 안된다는것을 의미한다.
연산자 오버로딩을 클래스에 오버로딩해서 만들면 된다.

-단항 연산자
+a, -a, !a, ++a, a++, --a, a--
-복합 대입 연산자
a+=b
a-=b
a*=b
a/=b
a%=b
-비트 연산자 - 오버로딩하고 있지 않음
그냥 함수를 호출해서 사용한다.
8 shr 2
8 shl 4
infix라는 키워드를 가지고 있어서 연산자 처럼 사용할 수 있다.


- 논리 연산자
and, or, not 기호 연산자도 사용가능한데 기능은 살짝 다름
and 연산자는 단락평가를 하지 않는 연산
&&은 단락평가를 적용해서 연산을 한다
- 동등 비교 연산자 
=== : 오버로딩 안됨(참조값이 같은지 판단)

in 연산자
- 특정 객체가 컬렉션에 저장되어 있는지 확인
범위(..) 연산자
- a..b : a에서 b까지의 범위 값이 생성 => a.rangeTo(b) 코드로 변환

val start = LocalDate.now()
val end = start..start.plusDays(15)
println(start.plusWeeks(1) in end) // 있으면 true 없으면 false -> 여기서는 true


- 인덱스 연산자
a[i] -> a.get(i)

- invoke 연산자 : 객체를 통한 함수 호출
invoke 오버로딩하면 클래스의 instance를 함수처럼 사용할 수 있다. 

- 타입 확인 연산자 : is, !is

입출력
- 출력 : println 함수 사용
- 입력 : readline함수-> 한 라인을 입력받음
타입 바꾸고 싶으면 명시적으로 toInt() 이런거 쓰면된다.


아니면 Java패키지 import해서 java.util.Scanner쓰면 된다.
치환 연산자 사용하면 됨(스캐너 객체 생성에만 주의)

print("Enter text: ")
val stringInput = readLine()!!
println("You entered: $stringInput")

//자바의 Scanner 객체 사용(import java.util.Scanner)
val reader = Scanner(System.`in`)
print("Enter a number: ")
var integer:Int = reader.nextInt()
println("You entered: $integer")



난수 발생

// 1. Java의 Random 클래스 사용
// Java.util.random 클래스 import 해야 함
val num = Random().nextInt(10)
// 2. Kotlin에서의 사용
val num = (0..10).random()












728x90
반응형

'App > Android' 카테고리의 다른 글

[4] Kotlin - 클래스, 컬렉션  (0) 2022.03.13
[3] Kotlin : 제어문, 함수  (0) 2022.03.11
[1] Android 소개  (0) 2022.03.08
RecyclerView  (0) 2021.08.25
Fragment  (0) 2021.08.23

+ Recent posts