반응형
동작 방식
- 자바 - 하이브리드 방식 (컴파일, 인터프리터)
- Source(.java) - compile - Byte Code(.class) - interpreter(jvm) - Running
- 안드로이드 - 리눅스 커널
- 안드로이드는 바이트 코드에서 한번 더 번역해서 DEX 파일을 만든다. (.class)
- DEX 파일을 ART(Android Runtime)에서 해석 - ART는 가상머신이다.
- APK 파일은 안드로이드는 뷰 영역인 Resource 파일도 같이 만든다.
- Source - compile - Byte Code - APK(DEX,Resource) - ART
안드로이드 구조
- Application
- Java Api Framework - 자바 라이브러리
- c/c++ lib / ART
- HAL - Hardware Abstract Layer
- Kernel
- H/W
Component
- Activity
- Java(Kotlin) file
- Resource file (xml)
- Service
- Background 동작
- Broadcast
- 방송
- Content Provider
- 앱과 앱 사이의 컨텐츠 공유 (이미지를 갤러리에서 가져오는 등 )
Kotlin 기본 문법
fun main() {
var x:Int = 5
var y = 0
y = x * 4
println("Welcome to Kotlin World : ${++y}")
}
타입을 적는 건 자유 (첫 글자 대문자)
기본자료형 - byte, short 등 (주소저장 x 단순 값 저장)
객체 참조변수 - Byte , Long 등 (주소저장 O)
${}를 통해 출력
변수 선언
var x:Short
var y:Int = 5
val z = 5
자료형을 작성하지 않아도 컴파일러가 알아서 변수타입을 확인해주는 기능이 있다.
val vs var
val : read-only - 초기화 후 값을 변경할 수 없다. (한번만 초기화)
var : 초기화 후 값을 변경할 수 있다.
클래스 선언
class Rect {
var r:Int = 0
fun area{
}
}
class Rect2(var r:Int) {
fun area{
}
}
- 인스턴스 생성방법
- var r:Rect = Rect() - 중간 Rect는 생략 가능하다
- var r = Rect2(3) - 매개변수가 있는 클래스
//global scope
val g1 = 0
lateinit var g2:String //lateinit으로 초기화 나중에 하겠다 선언
var g3:Float = 0.0F // primitive 형은 lateinit 사용 불가 (참조타입만 사용 가능)
fun test() {
val x = 5 //read-only local variable
var y = 10
y += x
println("$x : $y")
}
fun main() {
var x:Int = 5
var y = 0
y = x * 4
println("Welcome to Kotlin World : ${++y}")
test()
fun rand() {
val a = 1
var b = 8
println((a..b).random()) // min, max 사이 임의의 수 생성
}
rand() // a~b 사의 임의의 값 출력
// Dice object
val myDice = Dice(6)
println(myDice.roll())
}
class Dice(private var sides:Int) {
fun roll():Int {
return (1..sides).random()
}
}
- (a..b).random 으로 random 값 구현
- 객체 인스턴스 생성은 val myDice =Dice(6) 와 같이 사용
MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Roll Button referencing
val rollBtn : Button = findViewById(R.id.role)
rollBtn.setOnClickListener {
// 토스트 사용
// Toast.makeText(this, "Button clicked", Toast.LENGTH_LONG).show()
val myDice = Dice(6)
val num = myDice.roll()
// TextView reference
val textView = findViewById<TextView>(R.id.number)
textView.text = num.toString()
}
}
//Inner class
class Dice(private var sides: Int) {
fun roll(): Int {
return (1..sides).random()
}
}
}
제어문
- 실행 흐름 : 순차적
- 조건문 - 분기 (branch)를 통해 조건에 따라 지정
- if, when(자바의 switch)
- Statement 표현
if (a < 8) { b = ++a; c = b+2; } else { ... }
- Expression 표현 ( ++a, b+2 와 같은 결과를 만들어주는 수식)
when(a){ // 서로 다른 타입도 조건문에 넣을 수 있다. 1..3 -> {} // a가 1~3이라면 (range) 4 -> {} "문자" -> is Long -> //Long 타입일 때 !is Int -> // Int 타입일 때 else -> {} // Expression 표현을 사용할 때는 else가 꼭 있어야 한다. Statement는 생략 가능 }
a = if (b > 3) ++b else --b
- 반복문 - 조건 만큼 반복 실행
- for , while, do ~ while
```kotlin for (i in 1..10) // i는 1~10까지 for (i in 1 until 10) for (i in 1..10 step 2) for (i in 10 downTo 1) // 10에서부터 1까지 ```
private var lemonImage: ImageView? = null // lemonImage가 nullable
lemonImage!!.setOnClickListener{ clickLemonImage()} // null이면 nullPointerException 발생 !! 사용
반응형