KotlinInAction/코틀린 기초

함수와 변수

webmaster 2022. 7. 25. 14:42
728x90
fun main(args: Array<String>) {
    println("Hello, world");
}
  • 함수를 선언할 때, fun 키워드를 사용한다.
  • 파라미터 이름 뒤에 그 파라미터의 타입을 쓴다.
    • 변수 선언을 할 때도 마찬가지 방식이다.
  • 함수를 최상위 수준에 정의할 수 있다(자바와 다르다.)
    • 꼭 클래스 안에 함수를 넣어야 할 필요 X
  • 배열도 일반적인 클래스와 마찬가지다
    • 코틀린에서 자바와 달리 배열 처리를 위한 문법이 따로 존재하지는 않는다.
  • 출력하기 위해서는 println()을 쓴다.
    • 코틀린 표준 라이브러리는 여러 가지 표준 자바 라이브러리 함수를 간결하게 사용할 수 있게 감싼 래퍼를 제공
  • 최신 프로그래밍 언어 경향과 마찬가지로 줄 끝에 세미콜론이 생략이 가능하다.

함수

void 형식을 경우 위와 같이 사용하면 되지만 의미 있는 값을 반환한다면 어떻게 해야 될까??

 

REPL

  • 함수 선언은 fun 키워드로 시작한다.
  • fun다음에는 함수 이름이 온다
    • 예제에서는 max라는 함수명이다
  • 함수 이름 뒤에는 괄호 안에 파라미터 목록이 온다
  • 함수의 반환 타입은 파라미터 목록의 닫는 괄호 다음에 온다(괄호와 반환 타입 사이를 콜론(:)으로 구분한다)
  • 코틀린에서의 if는 문장이 아닌 결과를 만드는 식이다.
    • 자바의  3항 연산자를 생각하면 된다.

위 식을 더 짧게 작성이 가능하다

fun max(a: Int, b: Int): Int = if(a > b) a else b
  • 본문이 중괄호로 둘러싸인 함수를 블록이 본문인 함수라 하고, 등호와 식으로 이뤄진 함수를 식이 본문인 함수라고 한다.
  • IntelliJ 아이디어 팁을 사용해 서로 변경이 가능하다.

한번 더 짧게 작성하면?

fun max(a: Int, b: Int) = if(a > b) a else b
  • 반환 타입 생략이 가능하다.
    • 식이 본문인 함수의 경우 굳이 사용자가 반환 타입을 적지 않아도 컴파일러가 함수 본문 식을 분석해서 식의 결과 타입을 함수 반환 타입으로 정해준다.
  • 이렇게 컴파일러가 타입을 분석해 프로그래머 대신 프로그램 구성요소의 타입을 정해주는 기능을 타입 추론이라 한다.
  • 식이 본문인 함수의 반환 타입만 생략 가능하다.
    • 블록이 본문인 함수가 값을 반환한다면 반드시 반환 타입을 지정하고, 리턴 문을 통해 반환 값을 명시해야 한다.

변수

코틀린에서는 탕비 지정을 생략하는 경우가 흔하다.

코틀린에서는 변수 이름 뒤에 타입을 명시하거나, 생략하게 허용한다

val question = "삶, 우주, 그리고 모든 것에 대한 궁극적인 질문";
val answer = 42;
val answer:Int = 42;

val yearsToCompute = 7.5e6

val answer:Int;
answer = 42;

val languages = arrayListOf("JAVA");
languages.add("Kotlin"); //val 참조가 가리키는 객체 내부를 변경

var answer = 42;
answer = "no answer"; //오류 발생
  • 컴파일러가 초기화 식을 분석해서 초기화 식의 타입을 변수 타입으로 지정한다.
  • 부동소수점 상수를 사용한다면 변수 타입은 Double이 된다.
  • 초기화 식을 사용하지 않고 변수를 선언하려면 변수 타입을 반드시 명시해야 한다.
  • 변경 가능한 변수와 변경 불가능한 변수
    • val : 변경 불가능한 참조를 저장하는 변수다. val로 선언된 변수는 일단 초기화하고 나면 재대입이 불가능하다(JAVA = final)
    • var : 변경 가능한 참조다. (JAVA = 일반 변수)
    • 기본적으로 모든 변수를  val키워드를 사용해 불변 변수로 선언하고, 나중에 꼭 필요할 때에만 var로 변경해라
  • val 참조 자체는 불변일지라도 그 참조가 가리키는 객체 내부 값은 변경될 수 있다.
    • language를 보면 객체 내부의 값이 변경되는 것은 상관없다.
  • var 키워드를 사용하면 변수의 값을 변경할 수 있지만 변수 타입은 고정돼 바뀌지 않는다.
    • 컴파일러는 변수 선언 시점의 초기화 식으로부터 변수의 타입을 추론하며, 변수 선언 이후 변수 재대입이 이뤄질 때는 이미 추론한 변수의 타입을 염두에 두고 대입문의 타입을 검사한다.
    • 어떤 타입의 변수에 다른 타입의 값을 저장하고 싶다면 변환 함수를 써서 값을 변수의 타입으로 변환하거나, 값을 변수에 대입할 수 있는 타입으로 강제 형 변환해야 한다.

문자열 템플릿

fun main(args: Array<String>) {

    val name = if (args.size > 0) args[0] else "kotlin";
    println("Hello, $name"); //문자열 템플릿, Bob을 인자로 넘기면 Hello, Bob 아무 인자도 안넘기면 Hello, Kotlin 출력
    
    if(args.size > 0 ){
        println("Hello, ${args[0]}!"); //복잡한 식도 중괄호로 둘러싸써 템플릿안에 넣을수 있다.
    }
    
    println("Hello, ${if(args.size > 0) args[0] else "someone"}!")
}
  • name이란 변수를 선언하고 문자열 리터럴 안에서 그 변수를 사용했다.
  • 변수를 문자열 안에 사용할 수 있다.
    • 문자열 리터럴의 필요한 곳에 변수를 넣되 변수 앞에 $를 추가
  • 만약 존재하지 않는 변수를 넣게 된다면 컴파일러가 각 식을 정적으로 검사하기 때문에 컴파일 오류가 발생한다.
  • $문자를 문자열에 넣고 싶다면 "\$"와 같이 $를 이스케이프 시켜야 한다.
  • 복잡한 식도 중괄호({})로 둘러싸서 문자열 템플릿 안에 넣을 수 있다.
  • 중괄호로 둘러싼 식 안에서 큰 따옴표를 사용할 수도 있다.
728x90

'KotlinInAction > 코틀린 기초' 카테고리의 다른 글

코틀린의 예외 처리  (0) 2022.07.26
While과 for 루프  (0) 2022.07.26
enum과 when  (0) 2022.07.25
클래스와 프로퍼티  (0) 2022.07.25