[Kotlin] 기본 문법(1)
- [ Languages ]/Kotlin
- 2022. 6. 30.
오랜만에 배우는 새로운 언어
1. 함수
fun functionName() {
println("Hello World!");
}
fun add(a:Int, b:Int) :Int {
return a+b;
}
자바와 다른 점은 변수/함수의 타입을 변수명/함수명 뒤에 별도로 선언해준다는 점이다.
2. 상수/변수
fun main() {
val a:Int = 10; //상수(final)
var b:Int = 20; //변수
}
val은 상수, var은 변수를 의미한다. 추가적으로 선언과 동시에 초기화가 이루어질 경우 파이썬과 같이 dynamic type binding이 가능하기 때문에 타입을 별도로 지정하지 않아도 된다. 다만 선언과 동시에 초기화하지 않으면 별도로 타입을 지정해주어야 한다.
3. 변수 출력
val name:String = "name";
println("my name is ${name}");
변수 출력시 ${}를 사용하여 인용하여 출력할 수 있다. $를 직접 출력하고 싶다면 escape('\')문자를 사용하면 된다.
4. 조건식
fun main() {
var a:Int = 4;
when(a) {
0->println("0")
1,2->println("1 or 2")
in 3..10->println("3~10"); //3<=x<=10
else->println("else num")
}
var b:int = when(a) {
1->1
else->3
}
}
자바와 동일하게 동작한다. 다만 java와 다르게 삼항연산자는 존재하지 않으며, 조건문 자체를 statement가 아닌 expression으로 사용 가능하다.
코틀린에도 switch역할을 하는 when이 존재한다. 이때 case는 '->'를 이용해서 구분하며, else를 이용하여 나머지 경우를 구분할 수도 있으며, when문장 자체를 expression으로도 사용할 수 있다.
5. 배열, 리스트
fun main() {
val array: Array<Int> = arrayOf(1,2,3);
val list: List<Int> = listOf(1,2,3);
val arrayList: ArrayList<Int> = arrayListOf<Int>();
val mixedArray: Array<Any> = arrayOf(1,"d", 3.4f);
val mixedList: List<Any> = listOf(1, "d", 3.4f);
array[0] = 3; //array는 mutable
// list[0] = 2; //list는 immutable이므로 변경 불가능
var rst = list.get(0); //list에서는 read만 가능하다.
arrayList.add(10); //arrayList는 mutable
arrayList.remove(0);
// arrayList = arrayListOf<Int>(); //val이므로 재할당 불가
}
기본적으로 배열과 리스트가 존재하는데, ~Of() 함수를 사용하여 초기화한다. 코틀린의 변수도 java와 같이 reference로 접근하기 때문에 val로 선언해도 안에 있는 원소의 변경은 가능하다. 다만 array와 다르게 list는 immutable하기 때문에 read만 가능하며, write가능한 리스트를 만들려면 ArrayList를 사용하면 된다.
6. 반복문
fun main() {
val students = arrayListOf("joyce", "james", "jenny");
for(name in students)
println("${name}");
for((index:Int, name:String) in students.withIndex())
println("${index+1}번째 학생 ${name}");
var sum: Int=0;
for(i in 1..10 step 2) //1<=x<=10
sum+=i;
println(sum); //sum+1+3+5+7+9
for(i in 10 downTo 1)
sum+=i;
println(sum); //sum+10+9+..+2+1
for(i in 1 until 10) //1<=x<10
sum+=i;
println(sum); //sum+1+2+..+9+10
var index = 0;
while(index<10) {
print("${index}" + " ");
index++;
}
}
자바와 비슷하게 for, while등의 문법을 사용할 수 있다. 여기서 in, step, downTo, until등의 문법을 사용하여 반복문을 컨트롤할 수 있으며 기본적으로 자바의 iter문과 비슷한 양식을 띈다. withIndex같은 문법을 사용하면 별도로 변수를 컨트롤하지 않고서도 리스트의 내용을 컨트롤하여 출력 가능하다.
7. Nullable, NonNull
자바는 NPE(NullPointerException)과 같은 에러를 런타임 시점에 확인할 수 있다. 반면 Kotlin에서는 컴파일 시점에 null에 관한 컨트롤이 가능하다.
var name: String = "name";
var nullName: String? = null;
> 가장 먼저 ?를 이용하여 null이 들어갈 수 없는 공간에 null을 집어넣을 수 있다.
var toUpperCase = name.toUpperCase();
// var nullNameToUpperCase = nullname.toUpperCase(); > null체크가 되지 않음
var nullNameToUpperCase = nullname?.toUpperCase();
> null이 아닐경우 toUpperCase()함수를 실행시키는 효과를 가진다.
val lastName:String? = null;
val fullName = name+" "+(lastName?: "NO lastname");
println(fullName);
> 이렇게 사용하면 null일 경우 이름 뒤에 "No lastname"을, null이 아닐경우 name과 lastname을 출력해주게 된다.
반면 !!를 사용하여 nullable타입이긴 한데 null이 아님을 프로그래머가 프로그램에 보장해줄 수도 있다.
fun printName(str:String?) {
val mNotNull:String = str!!;
val upper = mNotNull.toUppercase();
}
> 이런 경우 mNotNull은 널이 아님을 프로그래머가 보장하기 때문에 mNotNull?.toUpperCase()와 같이 ?를 붙여 사용하지 않아도 된다.
val email:String? = "kim123@gmail.com"
email?.let{
println("my email is ${email}");
}
> 이 식은 email이 Null인 경우 print문이 사용되지 않기 때문에 런타임에 NullPointerException이 일어나는 것을 방지한다.
8. 클래스
코틀린도 자바와 동일하게 클래스를 이용하여 캡슐화와 같은 장점을 가질 수 있다.
8-1. 생성자
class Human (val name: String = "Anonymous", val age:Int) {}
> 일반적으로 오버로딩이 되지 않은 상태에서 하나의 생성자가 사용될 경우 주 생성자라고 하고, 이렇게 초기화할 수 있다. 주 생성자는 생성자 파라미터를 지정하고 그 생성자 파라미터에 의해 최고하되는 프로퍼티를 정의하는데 사용된다.이 경우 함수 매개변수꼴 같이 생겼는데, 사실 뒤에 나오는 constructor 키워드가 생략된 모습이다. 하지만 주 생성자는 constructor와 다르게 추가적인 코드를 가질 수 없다.
constructor(name:String, age:Int):this(name) {
println("my name is ${name}, ${age} years old");
}
> 생성자 오버로딩이 필요한 경우 이런식으로 constructor를 추가로 생성할 수 있다. 이 경우 constructor 옆의 this는 이 함수에 선언된 name이라는 변수를 갖고와서 사용할 것임을 의미한다.
class Human(name:String) {
val name:String;
init {
this.name = name;
}
}
> 매개변수로 받을 값을 초기화하기 위해서 init키워드를 이용하여 초기화할 수도 있다. init키워드는 주 생성자의 일부이므로 constructor보다 먼저 실행된다.
open class Human... {}
class Korean:Human... {}
> Korean 클래스가 Human 클래스를 상속하고 있음을 나타낸다. 코틀린에서 모든 클래스와 함수는 기본적으로 final이기 때문에 클래스를 상속하거나 함수를 override할때는 반드시 원래 클래스/함수에 open키워드를 추가해주어야 한다.
+ 자바에서 상속후에 생성자를 부를때는 자식 생성자보다 super가 존재하면 super의 생성자, 아니면 부모클래스의 기본 생성자를 호출한다. 그런데 코틀린은 어떻게 돌아가는지 아직 모르겠음
'[ Languages ] > Kotlin' 카테고리의 다른 글
[Kotlin] 자바 대신 코틀린 사용하기 (0) | 2023.09.01 |
---|---|
[Kotlin] 안드로이드 코틀린 연습 (0) | 2022.07.06 |
[Kotlin] 기본 문법(2) - 심화 (0) | 2022.07.02 |