본문 바로가기

안드로이드

[안드로이드] 2021-04-26 Kotlin In Action 정리

1. 함수와 변수

- Kotlin은 함수를 정의할 때 fun 키워드를 사용한다.

fun makeFunc(name : String){

return "무야호!"

}

 

 

 

 

- 굳이 함수를 클래스 안에 넣을 필요 없이, 최상위 수준에서 정의할 수 있다.

lateinit var temp:String

fun makeTopLevelFunc(){
    
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

 

 

- 코틀린에서 함수의 구조는 아래와 같다.

 

fun 함수이름 ( 파라미터 이름 : 파라미터 타입) : 파라미터 반환값{

      return a // 파라미터 반환값이 있을 시

}

fun thisIsFunc ( a : Int, b : Int) : Int {
	return if (a>b) a else b // 신기하게도 if문은 문이 아닌 식이 될 수 있다.
    //문(statement) / 식(expression)
}

 

- 함수에서 식이 본문이 될 수 있다.

fun max(a : Int, b : Int) = if (a>b) a else b

 

무지 편리할 것 이라 예상된다.

코틀린은 정적 타입 지정 언어이다. 그렇다면 컴파일 시점에서는 모든 식의 타입을 정의해줘야 한다. 다만, 식이 본문인 함수의 경우에는 굳이 반환 타입을 적지 않아도 된다. 이는 컴파일러가 함수 본문 식을 분석해서 식의 결과 타입을 함수 반환 타입으로 정해준다. 이러한 컴파일러가 타입을 분석해서 타입을 정해주는 기능을 타입 추론이라 부른다.

 

 

2. 변수

- 코틀린에서는 맨 앞에 오는 것은 val / var 이다.

- 변수의 타입을 지정하지 않으면 컴파일러가 초기화 식을 분석해 자동으로 변수 타입을 지정한다.

- val(value의 준말)은 변경이 불가능한 참조를 저장하는 변수이다. 자바에서는 final과 같다.

- var(variable의 준말)은 변경 가능한 참조를 저장하는 변수이다.

- var을 사용하여 변수를 초기화 하여도 지정된 타입은 변경되지 않는다.

 

val answer = 42 //컴파일러가 Int로 타입을 지정해버림

val intAnswer : Int = 1415 // 개발자가 Int로 타입 지정

var whatThe : String = "무야호" // 나중에 whatThe는 변경이 가능하다.

val notThe : String = "안무야호" // 나중에 notThe는 변경이 불가능하다.

var cantChangeType : String = "타입은 안바뀜" // var로 변수를 초기화 해도 타입은 바뀌지 않는다.

val languages = arrayListOf("Java")
languages.add("Kotlin") // 참조 자체는 불변이여도 참조가 가리키는 객체의 내부값은 변경이 될 수 있다.

 

 

3. 문자열 형식 지정

- Android Studio에서 Log를 쓸 때 

Log.d(TAG, "무야호!" + answer.toString() ) 이렇게 해주던 것을

Log.ld(TAG, "무야호! ${answer.toString()") 이런식으로 간단하게 바꿔줄 수 있다.

 

 

4. 클래스와 프로퍼티

- 클래스는 데이터를 캡슐화하고 캡슐화한 데이터를 한 주체 아래 가두는 것이 주 목적이다.

- 코틀린에서는 멤버 필드의 가시성은 주로 비공개(private)이다. 이러한 필드에 접근하기 위해서는 접근자 메소드를 사용한다.

- 자바에서 필드와 접근자를 한데 묶어 프로퍼티라 표현한다. 그리고 이러한 프로퍼티를 코틀린에서는 언어의 기본 기능으로 제공한다. 

class Person { // Java에서의 Person class
	private String final name; // 멤버변수
    
	public Person(String name){ // Person Class의 생성자
		this.name = name;
	}

	public String getName(){ // 접근자에 해당하는 getter
		return name;
	}
}

 

자바로 만든 Person 자바빈

class Person (val name : String) 
// 요거 한줄에 class 선언과 생성자, 접근자 다 만들어진다. 인간적으로 너무 많이 줄여졌다;;

 

코틀린으로 만든 Person class이다. 접근하려면 아래와 같다.

val person = Person("Bob")
Log.d(TAG, "Person's name is ${person.name}")

 

5. enum과 when

- 의외로 enum은 자바보다 코틀린에서 더 많은 키워드를 써야한다.

- enum 클래스 안에서 프로퍼티나 메소드를 정의할 수 있다.

enum class Color(val r:Int, val g:Int, val b:Int){

    RED(255, 0, 0,),
    GREEN(0, 255, 0),
    BLUE(0, 0, 255); // 밑에 나오는 메소드와 구분을 짓기 위하여 특별히 세미콜론을 써준다.
    
    fun rgb() = (r*256 + g)*256 + b
    
}

 

- 코틀린에서는 when이라는 걸 쓴다. 묘하게 좋아보인다. if문이랑 switch 짬뽕하고 그런 너끰?

- 함수식으로 when을 쓸 수 있다.

fun getMnemonic (color : Color) =
	when (color) {
    	Color.RED -> "Richard"
        Color.ORANGE -> "Of"
        Color.GREEN -> "Time"
    }
}