코틀린 Kotlin 기본1

이정수·2022년 2월 25일
0
post-thumbnail

1.함수

코틀린에서 함수를 정의내리는 방법은 아래와같다.
특이한점은 다른 언어들과 다르게
function이 아니라 fun이라고 쓰고, 리턴타입을 함수명 앞에 쓰는게 아니라 : 뒤에 써준다.
java에서는 return 값이 없으면 void라고 하지만 kotlin에서는 Unit이라 하며 생략가능하다.

fun hello() : Unit {
	println("helloworld")
 }
//argument가 있다면 아래처럼 '변수명:타입'식으로 넣어주면된다. 
fun add(a:Int, b:Int): Int{
    return a+b
}

2.변수 val vs var

val(=valuable의 abb)로 상수를 나타내고 재할당불가
val(=variable의 abb)로 변수를 나타내고 재할당 가능

fun hi(){
    
    val x: Int = 10 
   _// x = 14 error_
    var y: Int = 12 
    y = 14 //okay
    val c=13
    var d=14
}

3.String Template

따로 string선언없이 바로 변수에 ""로 할당할수있다.
만약 String변수를 문자열안에 넣어서 제대로 변수취급해주고 싶다면->
${ 변수명 }을 써주면 된다.Javascript때에서 백틱안에서 문자열,변수를 취급했었는데 그것과 비슷하다.

fun stringprc(){
    val name= "elle"
    println("my name is ${name} iam 15")
    //$를 이스케이프문자로 취급할때는 \$ 로 써주면 됨
}

4.조건식

기본적인 if,else문은 다른언어와 크게 다르지 않다.

fun max(a:Int, b:Int):Int{
    if(a>b){
        return a
    }else{
        return b
    }
}

단, Kotlin에서는 ()?a:b 같은 삼항연산자가 존재하지 않는다.
대신 아래와 같이 max함수를 더 짧게 나타낼수도 있다.

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

Kotlin에서는 When이란 문법이 존재하는데 느낌은 자바의 switch문과 비슷하다.
score가 찬찬히 when문에 들어가서 해당되는 열의 -> 다음의 문장을 실행하게 된다.
이때에는 (내가 이해하기로는) 단순 when문이 있고, 해당 조건이 맞아떨어지게되면 변수에 그 값을 할당하게되는 when문이 있다.
전자에서는 else문을 생략해도되지만, 후자에서는 변수에 값을 할당해야되므로 모든 조건이 맞지 않았을 경우 막판에서라도 값이 들어가게 해야하니까 else문이 생략될 수 없다.
또한 특히하게도 in a..b라는 문법이 있어서 만약 score가 a~b사이에 해당되는 값이라면 ->다음을 실행하게 된다.


fun checkNum(score : Int): Unit{
    when(score){
        0 -> println("this is 0")
        1 -> println("this is 1")
        2 -> println("this is 2")
        3,4 -> println("this is 3 or 4")
        else -> println(" i dont know~")//생략가능
    }
    var b:Int = when(score){
        1 -> 1
        2 -> 2
        else -> 3 //생략불가
    }
    when(score){
        in 90..100 -> println("you did great")
        in 10..80 -> println("cheer up")
        else -> println("..umm")
    }
}

5.Expression vs Statement

이 개념에 대해서는 선생님이 불친절하게 알려주신것 같아서 구글링을 좀 해보았다..

Expression

Expression은 값을 만들어 낸다. 간단히는 값을 return한다고 생각해도 좋다.
(단. Kotlin에서는 모든 함수는 expression이다. 적어도 unit을 반환하기 때문이다.)
(그러나 Java에서 void함수는 Statement이다.이부분에서 이제 상당히 헷갈려지기 시작한다.)

그런데 이렇게 뭉뚱그려 이해하게되면 괄호안의 말들에서 혼돈의 카오스를 겪게된다.
그러니 정의로 다시 돌아가 보자

프로그래밍 언어의 expression은 프로그래밍 언어가 다른 값을 산출하기 위해 해석하고 계산하는 하나 이상의 명시 적 값, 상수, 변수, 연산자 및 함수의 조합이다.

그러니까 단순한 1+1, sumof(1,2)또한 Expression이 될 수 있다는 말이다.
그리고 Expression은 다른 Expression을 포함 할 수 있다!

_그러나 단순 변수선언

var a=10

값의할당

a=20

로컬클래스선언

class a{}

들은 전부다 Expression이 아니라 Statement다._

Statement

컴퓨터 프로그래밍에서 statements은 수행 할 작업을 나타내는 명령형 프로그래밍 언어의 가장 작은 독립 실행형 요소다.

6. Array vs List

Array

Array는 정해저있는 사이즈가 있고, 그게 메모리에 할당되어 나오기 때문에 미리 크기를 지정해주어야 한다.
기본적으로 mutable(수정가능)

List

list는 interface.
(command키 + get()클릭)

(immutable)list : 수정 불가능, 읽기전용, 대표적으로 ArrayList가 있음
mutable list : 수정 가능, 읽기&쓰기가능
7번째 줄처럼 list안의 요소를 가져와서 다른변수에 할당하는 것은 가능하지만,
6번째 줄처럼 list안의 요소를 직접 수정할 수 없다.

fun array(){
    val arr = arrayOf(1,2,3)
    val list = listOf(1,2,3)
    val arr2 = arrayOf(1, "d",3.4f)

    arr[0] = 3
    //list[0] = 3 ERROR!!
    var b = list.get(0)
    println(b)
}

ArrayList

val arrayList = arrayListOf<Int>()
arrayList.add(10)
arrayList.add(20)

//arrayList= arrayListOf<Int>(1,2,3) ERROR
//val은 reassign될 수 없다.

7.반복문 for, while

for

in 연산자를 통해 students라는 arraylist안을 돌게된다.

fun forandwhile(){
    val students = arrayListOf<String>("soo","charm","ham","elle")
    for(name:String in students){
        println("${name}")
    }
}

1부터 10까지의 합을 구하는 반복문을 만들어보자

	var sum= 0
    for(i in 1..10){
        sum= sum+i
    }
    println(sum)

in연산자와 곁들일 수 있는 다른 것들도 있는데 되게 신기하고 재밌다ㅋㅋ

step 말그대로 스텝을 밟듯이 껑충껑충 뛰어넘을 수 있는녀석
1,3,5,7,9 순서대로 for문을 돈다

var sum= 0
    for(i in 1..10 step 2){
        sum= sum+i
    }
    println(sum)

downTo 큰값에서 시작해 작은수쪽으로 for문을 돈다.
10,9,8,...3,2,1 순서대로 for문을 돈다

var sum= 0
    for(i in 10 downTo 1){
        sum= sum+i
    }
    println(sum)

until until은 마지막 숫자는 포함시키지 않는다.

in 1..100 은 1부터 100까지
in 1 until 100 은 1부터 99까지

var sum= 0
    for(i in 1 until 100){
        sum= sum+i
    }
    println(sum)

for문 withIndex()

val students = arrayListOf<String>("soo","charm","ham","elle")
    for((index:Int, name:String)in students.withIndex()){
        println("${index+1}번째 학생은 ${name}입니다.")

   }

while

while문은 다른 언어들과 비슷하다.

var index= 0
    while(index<10){
        println("current index is ${index}")
        index++
    }

8. NonNull vs Nullable

자바와 다른 코틀린만의 가장 큰 특징중 하나
*NPE : Null Point Exception

var name:String = "Elle"

는 Null이 할당될 수 없는 NonNull type이다.

var nullname:String? = null

은 Null이 할당될 수 있는 Nullable type이다.
타입생략불가하고 물음표를 추가하면된다.

fun nulltype(){
    var name: String = "joyce"
    var nullname: String?= null
    var nameInUpperCase:String = name.uppercase()
    var nullnameInUpperCase = nullname?.uppercase()
}

.uppercase()는 name을 대문자로 바꿔준다.
단, 여기서
var nullnameInUpperCase = nullname.uppercase()
라고만 작성할경우 에러가 나게 된다.

var nullnameInUpperCase = nullname?.uppercase()
-> nullname이 null일 경우 nullnameInUpperCase에 null을 반환
null이 아닐경우 대문자로바꿔반환한다.

엘비스연산자 ?:

null일경우 default값을 줄 수 있다.

 var name:String = "joyce"
 val lastName:String? = null
 val fullName = name + " "+ (lastName?: "No lastname")
 println(fullName)

lastName이 있어없어? 없으면 "No lastname"써

결과적으로 joyce No lastname 이 출력된다.

코틀린 타입 시스템 !!

컴파일러에게 보내는 메세지 //지양하자...

이거 눌아니야!! 이거 nullable타입으로 지정되어있는데 null이 아님을 내가 보증해 줄게!!

fun ignoreNulls(str:String?){
    val mnotNull : String = str!!
}

let함수

let은 자신의 receiver객체(아래에선 email)를 람다식 내부로 옮겨서 실행시켜줌

val email:String? = "lalala@gsd.com"
    email?.let{
        println("my email ${email}")
    }

//email이 null이 아니면 {}안을 실행

9.Class

주생성자와 부생성자는 이 블로그글을 참고하여 추가공부하였음


class Human (val name:String = "anonymous"){

    constructor(name: String, age: Int): this(name){
        //부생성자
        println("my name is ${name}, ${age} years old")
    }
    init{
        println("new human has been born!!")
    }
    fun eatingCake(){
        println("this is so yummy")
    }
}

fun main(){
    val human = Human("Minsu")
    val stranger= Human()//이름 넣지 않았기때문에 stranger의 이름은 anonymouse가 된다.
    val mom = Human(name = "kuri", age = 57)

}

주생성자

:클래스 이름옆에 괄호로 둘러쌓인 코드
코틀린의 클래스는 하나의 주생성자와 여러개의 부생성자를 가질 수 있다.
init은 주생성자의 일부로 constructor보다 먼저 실생되며, 처음 instance를 생성할때 어떤동작이 수행되는지를 나타낸다.

class Human(val name:String){}

초기값이 없으므로 val a = Human() //ERROR

class Human (val name:String = "anonymous"){
}

anonymouse가는 default값을 지정할수있다.
instance생성시 따로 name을 주지않으면 자동으로 anonymouse가 할당된다.

부생성자

:클래스 블록내에 존재하는 생성자, constructor 키워드를 사용한다.
주생성자가 존재한다면 부생성자는 무조건 주생성자에게 직간접적으로 생성을 위임해야 한다->this(name)

class 상속

상속에 관해서 이 블로그글을 참고하여 공부함

profile
keep on pushing

0개의 댓글