Kotlin Programming Intermediate - 1

htwenty-1·2022년 1월 24일
0

Kotlin for Android

목록 보기
1/11
post-thumbnail

안녕하세요. 오늘부터 새롭게 시작할 컨텐츠는 코틀린입니다.

코틀린은 인텔리제이(Java IDE)의 개발사인 JetBrains에서 만든 프로그래밍 언어입니다. JVM 기반 언어이고 Java보다 다소 간결한 문법과 확장된 기능들이 있습니다.

Java와 100% 연동되는 것도 특징 중의 특징입니다.

또한 요즘 Google이 Android 공식 개발 언어로 선정하여 관심이 뜨겁습니다.

코틀린 시리즈는 Java Programming for Starter에 이어서 작성되므로 생략되는 부분이 있어 초심자에게는 적절하지 않을 수 있습니다.

시작하기


Hello World 출력하기

프로그래밍의 가장 기본이 되는 Hello World를 출력해보겠습니다.

우선 자바 코드에서는 콘솔에 어떤 것을 출력하기 위해 System.out.println();을 사용했습니다.

public class Main {
	public static void main(String[] args){

		System.out.println("Hello World!");

	}
}

코틀린에서는 좀 더 간결합니다.

fun main(args: Array<String>) {

	println("Hello World")

}

함수를 선언할 때, fun이라는 키워드로 함수를 선언해주고 자바의 메인 함수처럼 파라미터로 String 형태의 Array를 받아줍니다.

이제부터 작성할 모든 코드는 main 함수 안에 기재해줍니다.

주석문 달기

자바 기반의 언어이기 때문에 주석문 다는 방법도 동일합니다.

한 줄 주석은 //으로 처리하고, 범위 주석은 /**/으로 처리합니다.

fun main(args: Array<String>) {

	// 한 줄 주석
	// println("Hello World")

}
/* 범위 주석
fun main(args: Array<String>) {

	println("Hello World")

}
*/

Java의 Scanner로 입력받기

마찬가지로 자바 기반의 언어이기 때문에 입력을 받을 때 자바 유틸인 Scanner를 사용할 수 있습니다.

다만 자바에서 사용되는 방식과 아주 조금 다릅니다.

// 자바에서 사용
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
// 코틀린에서 사용
val read = Scanner(System.`in`)

코틀린에서는 in에 백틱(``)을 넣어줍니다.

Kotlin의 입력 체계

코틀린에서는 readLine()이라는 것이 입력을 받을 수 있는 도구입니다.
자바에서 BufferedReaderreadLine과 비슷한 역할을 합니다. 이 때 입력은 문자열로 받아지기 때문에 숫자 자료형으로 바꾸고자 한다면 캐스트 변환을 꼭 해주어야 합니다.

구분JavaKotlin
숫자로Integer.parseInt()toInt()
문자로Integer.toString()toString()
var number = readLine().toInt()

변수와 값


변수와 상수 선언하기

자바에서 변수를 선언해줄 때는 자료형 + 변수명 = 값의 형태로 선언했습니다. 예를 들어,

int number = 10;
String name = "Kim";

과 같은 방식을 취했습니다.

코틀린에서는 선언자 + 변수명:자료형 + = + 값의 형태를 취합니다.

예를 들어

var name:String = "Kim"

과 같은 형태입니다.

여기에서 선언자라고 하는 것은 변수인지 상수인지를 나타내는 것으로

var이면 변수, val이면 상수를 나타냅니다. val는 자바에서 final과 같은 역할이라고 보면 됩니다.

var hisName:String = "Hong GilDong"
val herName:String = "Seong ChunHyang"

이라면 hisName은 변수, herName은 상수가 됩니다. 변수는 값을 재할당해줄 수 있다는 특징을 갖고 있기 때문에

var hisName:String = "Hong GilDong"

hisName = "Go GilDong"

은 가능하지만

val herName:String = "Seong ChunHyang"
herName = "IU"

는 불가능합니다.

자료형을 굳이 밝혀야 하나?

자료형을 굳이 밝히지 않더라도 컴파일러에서 선언된 값을 판단하여 자료형을 알아서 넣어줍니다.

자바 기반이지만 그리 엄격하진 않아서 자바처럼 하나하나 자료형을 넣어줄 필요는 없습니다.

그렇지만 확실히 해두는게 오히려 좋을때도 있기 때문에 저는 자료형을 밝혀 적는 타입이 좋은 것 같습니다.

val num1 = 5      // 자료형을 밝히지 않으면 컴파일러에서 (Int로) 추정
val num2 = 3
val num3:Int = num1 + num2

변수/상수를 텍스트와 함께 출력하기

만약 num1이라는 변수와 num2라는 변수가 있을 때 화면에 출력해주기 위해서 어떻게 하면 될까요?

var num1:Int = 10
var num2:Int = 20

기존에 자바에서는

String name = "Hong Gildong";
int num = 10;

System.out.println(name + num);

과 같은 형태로 출력을 하였다면, 코틀린에서는

var num1:Int = 10
var num2:Int = 20

println("num1 is $num1, num2 is $num2")

처럼 템플릿 리터럴 안에 작성해줍니다. 참고로 자바스크립트에서는 백틱안에 ${} 형태를 넣어주어 작성했었습니다.

참고로 출력시 연산처리를 하기 위해서는 중괄호로 감싼 후 연산처리 해주면 됩니다. 각각에 1씩 더해서 출력하고자 한다면

var num1:Int = 10
var num2:Int = 20

println("num1 is ${num1+1}, num2 is ${num2+1}")

과 같이 사용할 수 있습니다.

값 비교

값을 비교할 때 특히 문자열을 비교할 때 자바에서는 equals라는 메서드를 사용했습니다.

예를 들어

String name = "Kim";
String hisName = "kim";

System.out.println(name.equals(hisName));		// false

이렇게 첫글자가 다르기 때문에 false를 반환합니다. 문자열 객체를 참조하여 비교할 때는 ==로 비교시 메모리주소를 비교하게 되어 우리가 의도치 않은 결과를 얻을 수 있다고 했습니다. 그래서 값을 비교하기 위해서는 equals를 사용해야 합니다.

var name:String = "Kim"
var hisName:String = "Kim"

이라는 변수를 선언했을 때, 코틀린에서는 어떻게 값을 비교할까요?

var name:String = "Kim"
var hisName:String = "Kim"
println(name == hisName)
println(name === hisName)

첫번째로 ==로 비교했을 때는 자바의 equals처럼 값을 비교해줍니다.
다시 말해서 equals를 자동으로 호출하여 객체의 주소값이 아닌 값의 동등함을 비교하여 나타내줍니다.

===의 경우에는 자바에 없는 연산자인데요. 자바의 ==와 같은 역할로 주소값을 비교해줍니다.

위의 경우에는 모두 true를 반환합니다.

참고적으로 아래와 같이 ?를 붙인 상태(null을 허용한 상태)에서 비교하게 되면 객체 주소 비교시 false를 반환합니다... (추후에 다른 포스팅으로 정리하겠습니다..)

val a:Int = 128
val b = a
println(a === b)        // 같은 객체

val c:Int? = a
val d:Int? = a
println(c == d)         // 값 비교
println(c === d)        // 객체(주소) 비교

?!!

코틀린에서는 NullPointException을 방지하여 애플리케이션 운용에 효율성을 극대화하고자 null 처리에 대해 까다로운 편입니다.

자바에서는 어떤 변수를 초기화할 때 null을 대놓고(?) 사용해도 문제가 되지 않습니다.

String name = null;

System.out.println(name);	// null

그렇지만 코틀린에서는 어떤 변수에 null을 집어넣기 위해서는 어떤 조치가 필요합니다.

바로 자료형 뒤에 ?를 붙이는 것인데 이를 통해 null값을 대입해줄 수 있습니다.

var name:String = null		// 에러
var name:String? = null		// null 값을 넣어주기 위해 ?를 붙임

또한 !!라는 것도 있는데 이는 null이 아님(not null)을 나타냅니다.

예를 들어

var t:Int = 0
var p:Int? = 10
t = p!!

t는 기본적으로 ?를 선언하지 않은 상태이기 때문에 null이 들어올 수 없습니다. 그러나 p?를 붙였기 때문에 null을 허용한 상태가 됩니다.

null을 허용하지 않은 tp를 넣어주기 위해서는 pnull일 수 없음을 밝혀야 에러없이 실행되게 됩니다.

profile
tried ? drinkCoffee : keepGoing;

0개의 댓글