코틀린 메인 함수
- fun 이용
- ; 사용 안함
fun main(){
print("Hello World")
println("Hello World")
}
코틀린 변수
- 자동으로 타입을 추론해 설정하기 때문에 타입 지정 필수 아님
- 하지만 : 타입 을 이용해 타입 지정 가능
fun main(){
var i : Int = 10
var name : String = "지영"
var point : Double = 3.3
}
var 와 val 의 차이점
- var : 재선언(수정 가능)
- val : 재선언(수정 불가능)
var i : Int = 10
i = 20 //가능
val i2 : Int = 20
i2 = 30 //불가능
톱레벨 const
const val num = 20
fun main(){
...
}
형변환
var i = 10
var l = 20L //Long
var name = "지영"
i = name.toInt() //name을 string -> int
l = i.toLong() //i를 int -> long
i = l.toInt() //l을 long -> int
String
fun main(){
var name = "지영"
print("제 이름은" + name + "입니다")
print("제 이름은 $name 입니다") //괄호 없으니 띄어쓰기
print("제 이름은 ${name}입니다") //괄호 있으니 띄어쓰기 없어도 괜찮음
}
max, min (최대 / 최소)
fun main(){
var i = 10
var j = 20
print(max(i, j))
print(min(i, j))
}
random
fun main(){
val randomNumber = Random.nextInt() // 랜덤한 숫자
print(randomNumber)
val randomNumber1 = Random.nextInt(0, 100) // 0 ~ 99까지의 랜덤한 숫자
print(randomNumber1)
val randomNumber2 = Random.nextInt(0.0, 1.0) // 0.0 ~ 0.9까지의 랜덤한 숫자
print(randomNumber2)
}
입력
fun main(){
val reader = Scanner(System.`in`)
reader.nextInt() //int 입력받는
reader.next() //string 입력받는
}
조건문
fun main(){
var i = 5
var result = if(i > 10){
"10보다 크다"
}else if(i > 5){
"5보다 크다"
}else{
"5보다 작다"
}
print(result)
val result = if(i>10) true else false
//Alt + Enter를 이용해 when으로도 변경 가능
}
반복문
fun main(){
val items = listOf(1,2,3,4,5)
//for(int i = 0; i<items.length; i++)
for(i in 0..3){
print(i)
}
for(i in 0..(items.size-1)){
print(items[i])
}
}
List (리스트)
fun main(){
val items = mutableListOf(1,2,3,4,5) //타입 자동추론으로 <타입> 안해도 된다
items.add(6)
items.remove(3)
}
Array
fun main(){
val items = listOf(1,2,3)
//예외처리
try{
val item = items[4]
} catch (e: Exception){
print(e.message)
}
}
Null 타입지정
fun main(){
//null을 넣으려면 타입옆에 ? 붙여야한다
var name: String? = null
name = "준석"
var name2: String = ""
name?.let{ //name이 null이 아니라면
name2 = name
}
}
함수
fun main() {
print(sum(10, 20))
print(sum(b = 10, a = 20)) //a,b 순서 안맞춰도 에러 안남
}
//int a, b의 합을 int로 반환하는 함수
fun sum(a: Int, b: Int) : Int{
return a + b
}
//코틀린 내용이 한줄이라면
//fun sum(a: Int, b: Int) : Int = a + b 로 가능
//fun sum(a: Int, b: Int) = a + b 로 가능 (리턴 타입 생략 가능)
fun sum(a: Int, b: Int, c: Int = 0) = a + b + c
//c에 디폴트값이 있다면 print(sum(10, 20)) 해도 가능
class
fun main() {
val jiyoung = Person("jiyoung", 19)
print(jiyoung.name)
print(jiyoung.age)
jiyoung.age = 23 //var로 수정 가능
//class의 val와 var를 이용해 getter, setter 기능 가능
}
//코틀린의 기본 생성자를 괄호 안에 작성
//Alt + Enter로 put ~ 를 이용해 깔끔히 정리
class Person(
val name: String,
var age: Int
){
}
data class
fun main() {
val jiyoung = Person("jiyoung", 19)
print(jiyoung.name) //private으로 getter도 불가 (에러)
print(jiyoung.age)
jiyoung.age = 23 //var로 수정 가능
//코틀린의 기본 생성자를 괄호 안에 작성
//Alt + Enter로 put ~ 를 이용해 깔끔히 정리
class Person(
private val name: String, //getter, setter 모두 불가 (기본값은 public)
var age: Int
){
data class (getter, setter)
fun main() {
val jiyoung = Person("jiyoung", 19)
val jiyoung2 = Person("jiyoung", 19)
println(jiyoung) // 해시코드 : @6b143ee9
println(jiyoung2) // 해시코드 : @1936f0f5
print(jiyoung == jiyoung2) //F로 나옴 (다른사람이니)
jiyoung.hobby = "sing" //여기서도 바꿀 수 있다
}
//data : 재정의 (data class). 이름과 나이가 같으니 같은 사람으로 값이 나온다
data class Person(
private val name: String,
var age: Int
){
var hobby = "축구"
//더 무언가를 하고 싶다면 (실행할때마다 init안의 코드가 실행된다)
init{
println("init");
}
//생성자안에 별도의 프롬프트가 있다면
fun some(){
hobby = "농구"
}
}
getter, setter 재정의(제어)
fun main() {
val jiyoung = Person("jiyoung", 19)
val jiyoung2 = Person("jiyoung", 19)
println(jiyoung) // 해시코드 : @6b143ee9
println(jiyoung2) // 해시코드 : @1936f0f5
print(jiyoung == jiyoung2) //F로 나옴 (다른사람이니)
}
//data : 재정의 (data class). 이름과 나이가 같으니 같은 사람으로 값이 나온다
data class Person(
private val name: String,
var age: Int
){
var hobby = "축구"
private set //이렇게 붙이면 외부(fun main)에서 수정 못함
get() = "취미 : $field" //getter 재정의
//더 무언가를 하고 싶다면 (실행할때마다 init안의 코드가 실행된다)
init{
상속
open class Person
fun main() {
}
class SuperMan : Person()
abstract class Animal{
open fun move(){ //open을 해야 상속하고 Dog, Cat에서 오버라이드가 가능
print("이동")
}
}
class Dog : Animal(){
override fun move(){
print("껑충")
}
}
class Cat : Animal(){
override fun move(){
print("살금")
}
}
인터페이스(interface)
open class Person
fun main() {
}
interface Drawable{
fun draw()
}
class SuperMan : Person()
abstract class Animal{
open fun move(){ //open을 해야 상속하고 Dog, Cat에서 오버라이드가 가능
print("이동")
}
}
class Dog : Animal(), Drawable{ //인터페이스 적용 방법 (, Drawable)
override fun move(){
print("껑충")
}
override fun draw() {
TODO("Not yet implemented")
}
}
class Cat : Animal(), Drawable{
override fun move(){
print("살금")
}
override fun draw() {
TODO("Not yet implemented")
}
}
타입체크(is)
open class Person
fun main() {
val dog: Animal = Dog()
val cat = Cat()
//타입체크(is)
if(dog is Dog){ //T
println("멍멍이")
}
if(dog is Cat){ //F
println("멍멍이")
}
}
interface Drawable{
fun draw()
}
class SuperMan : Person()
abstract class Animal{
open fun move(){ //open을 해야 상속하고 Dog, Cat에서 오버라이드가 가능
print("이동")
}
}
class Dog : Animal(), Drawable{ //인터페이스 적용 방법 (, Drawable)
override fun move(){
print("껑충")
}
override fun draw() {
TODO("Not yet implemented")
}
}
class Cat : Animal(), Drawable{
override fun move(){
print("살금")
}
override fun draw() {
TODO("Not yet implemented")
}
제네릭
fun main() {
val box = Box(10)
val box2 = Box("dfdfd")
print(box.value)
}
//제네릭(프로그래밍에서 타입 파라미터를 사용하여 코드를 일반화하고 재사용성을 높이는 방법)
class Box<T>(var value: T){
}
callBack함수 (람다식)
// 람다식
fun main() {
myFunc(10) { //전달하는게 하나라면 myFunc(){}에서 ()생략 가능
println("함수 호출")
}
}
//함수는 input, output 정의하기
//input, output 아무것도 없다면
fun myFunc(a: Int, callBack : () -> Unit){
println("함수시작")
callBack() //함수호출
println("함수끝")
}
코루틴
// 람다식
fun main() {
lifecycleScope.launch{
myFunc(10) {
println("함수 호출")
}
}
}
suspend fun myFunce(a: Int, callBack: () -> Unit = {}){
println("함수시작")
callBack()
println("함수끝")
}
dependencies {
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.5.0")
}