국비교육(22-23)

68일차(1)/Android App(9) : Kotlin 기본 문법 예제

서리/Seori 2023. 1. 13. 01:01

68일차(1)/Android App(9) : Kotlin 기본 문법 예제

 

- 홈페이지 : https://kotlinlang.org/ 

- 이곳에서 공부 가능!

 

 

- 코틀린은 약간 typescript+java 같은 느낌이다.

 

fun main(){ }

- run 했을때 실행되는 main함수

 

 

- 홈페이지의 Play-Playground로 들어가면 마음대로 작업할 수 있다.

- 코틀린 연습, 구현 실습 등을 해볼 수 있는 공간!

 

 

- fun main( ){ } 은 run했을 때 실행되는 메인 메소드

- java와 비교해서 작성해보면 이런 느낌이다.

 

- 코틀린은 자바를 좀 다른 문법으로 사용한다고 생각하면 된다.

- 좀더 효율적으로, 편리하게 사용하는 자바와 비슷!

- java+javascript 의 장점을 섞어서 만든 언어 같다...

 

* Docs - Basic syntax : https://kotlinlang.org/docs/basic-syntax.html

- 여기서 문법을 자세히 공부할 수 있다.

 

 

 

- 홈페이지에서 쭉 따라서 공부하면 된다! 기본 문법들이 잘 들어있다.

- 저 우측 공간에서 직접 테스트도 할 수 있다. 불편하면 우측의 playground에서 run해볼 수도 있다.

 

 

- java로 바꾸면 어떤코드가 되는지 상상해가면서 공부하면 좋다.

- 리턴값의 타입을 어떻게 표기하는지, 인자의 타입을 어떻게 표기하는지 등

 

변수명 : type

- 콜론 우측에 변수나 함수의 타입을 명시한다.

 

 

- 변수는 val, var을 사용한다.

- val : 상수역할(static final)

- 타입을 추론할 수 있을 때에는 타입 표기를 생략 가능하다!

 

 

- 스튜디오에서 코틀린 파일 만드는 법!

- File-New Module

- Java or Kotlin Library 에서 선택해서 생성 (언어 코틀린으로 변경)

- 라이브러리로 만들어준다.

 

 

MyClass.kt

package com.example.kotlin_test

class MyClass {

}

fun main(){
    println("Hello, world!!!")
}

 

- 메인클래스는 기본적으로 있는 클래스 밖에 fun main(){} 으로 만들어주면 된다.

- 그럼 java의 main 메소드 역할을 하는 함수가 만들어지는 것이다.

 

- 코틀린 파일은 확장자 .kt 로 만들어진다.

 

- 메인메소드 좌측 실행 아이콘으로 실행하기!!

 

- 콘솔창에 이렇게 출력된다.

 


 

- spring도 코틀린으로 만들 수 있고, javascript, C언어로도 바꿀 수 있다.

 

- 코틀린 파일은 라이브러리 모듈로 생성.

- File-New Module 에서 코틀린 클래스(.kt)를 만들고 테스트할 수 있다.

 

- .java 파일을 만들면 java 문법을 사용하고, 나중에 이걸 실행가능하게끔 컴파일하면

 최종적으로 .class 파일을 사용하게 된다.

- .kt 코틀린 파일도 결국 .class로 바뀐다. 

→ 결국 똑같은 파일을 만드는데, 사용하는 문법이 다른 것이라고 보면 된다.

 

- 코틀린을 js용도로 사용하면? .js로 바뀐다.

- C언어로 컴파일하게되면 c언어에 관련된 파일로 바뀐다.

 

- 문법은 하나인데, 다양한 방면(용도)으로 만들 수 있다는 것!

- 다양한 형태로 바꿀 수 있다는 것은 유연성이 높다는 것이고,

 우리가 아는 java문법 등보다 문법이 더 많고 다양해야 한다는 것을 뜻한다.

 

- 관련된 모듈을 만들어놓고 화면에서 테스트하기

- 코틀린 클래스를 만들어주기

 

 

- run 했을 때 바로 실행된 것처럼 보이지만, 사실 이 내용을 활용해서 class 파일을 만들어내서 실행한 것

- 이 클래스파일이 실행되어 콘솔창에 어떤 내용을 출력해준 것이다.

 


 

- 패키지에서 우클릭해서 새 파일 생성

 

- 파일로 선택해서 만들어주면 클래스 없이 단순 파일만 만들어진다.

 

Step01_Basic.kt

package com.example.kotlin_test
/*
    함수명 : sum
    함수에 전달되는 인자의 갯수 : 2개
    인자의 type : Int
    함수의 리턴 type : Int
 */
fun sum(a:Int, b:Int):Int{

    return a+b
}
//run 했을때 실행의 흐름이 시작되는 함수(main 메소드)
fun main(){
    println(sum(10,20))
    println(sum(5,5))
    //변수를 만들때 사용하는 예약어 val vs var
    val a=10 // val은 readonly (읽기전용, 값 수정 불가)
    var b=10 // var read, write(값 수정 가능)
    //선언만 하고 값을 나중에 넣고싶으면 type 을 지정해야 한다.
    val c:Int
    c=20
    //c=30 //값이 결정되면 수정 불가

    //var로 변수를 만들면
    var d:Int
    d=20
    d=30

    //값이 대입되면서 String type을 myName이 만들어진다.
    val myName="바나나"
    //String type으로 선언된 yourName에 값 대입하기
    val yourName:String="딸기"
    //String type ourName 변수 만들고
    val ourName:String
    //값을 나중에 대입하기
    ourName="복숭아"
}

 

fun 함수명(){} 

- js에서 함수를 만드는것과 구조가 비슷하다.

 

- 정수값 2개를 받아서 합을 출력하는 함수라고 가정한다면

 

fun sum(a, b){
	return a+b
}

- javascript라면 이렇게 작성한다.

- 그러나 코틀린에서는 타입을 설정해주어야 한다.

- java에서는 매개변수 앞에 타입을 선언하지만, 코틀린은 : 우측에 타입을 선언한다.

 

- java라면 이렇게 함수를 선언하고, 리턴타입을 명시한다.

 

fun sum(a:Int, b:Int):Int{
	return a+b
}

- 코틀린에서는 이렇게 작성한다. 각각의 요소 뒤에 :타입 을 적어준다.

- 함수가 선언된 것을 보고 분석 가능하도록 연습하기.

 

- 메인메소드 안에 sum 함수와 인자 2개를 넣어주면 계산되어 출력된다.

 

 

- val : value의 약자라고 보면 된다. 어떤 값인데, 읽기 전용이다. 값이 정해지면 수정 불가하다.

- var : 자유롭게 수정할 수 있는 변수이다.

 

- 만약 타입 추론이 가능하면 타입은 생략 가능하다( :int )

 

- 하지만 만약 변수를 선언만 하고 값을 나중에 집어넣을 것이라면 (타입 추론이 불가하므로) 반드시 타입을 써주어야 한다.

 

- val 은 값을 한번 집어넣으면 수정할 수 없다. 이렇게 작성하면 오류 발생!

 

 

- 문자열의 경우 " " 로 감싸서 만들고, val, var의 사용법은 똑같다.

- 문자 타입은 똑같이 String을 사용한다.

 

 


 

- 새 파일 생성

 

Step01_Basic2.kt

package com.example.kotlin_test

fun main(){
    var myName="바나나"
    var yourName="딸기"
    //연결 연산자 +
    var result="내 이름:"+myName
    var result2="너의 이름:"+yourName

    //javascript에서 backtick을 이용해서 문자열 만들때 사용했던 ${ } 표현식 가능
    var result3="내 이름:${myName}"
    var result4="너의 이름:${yourName}"

    //읽기 전용 배열
    val names=listOf<String>("바나나", "딸기", "복숭아")
    println(names[0])
    println(names[1]) //배열참조하기
    println(names.get(2)) //함수로 값 가져오기
    //names[0]="xxx" //수정불가

    println("---------------")

    //반복문
    for (i in names.indices){
        println("${i} 번째 item:${names[i]}")
    }

    println("---------------")

    for(item in names){
        println(item)
    }

    println("---------------")

    names.forEach{
        println(it)
    }
}

 

- 문자를 이어붙일 때 사용하는 연결 연산자를 코틀린에서도 쓸 수 있다.

 

var result3="내 이름:${myName}"

- js에서  ``으로 감싸고 ${ } 하면 바깥쪽 변수들을 참조할 수 있었던 것처럼도 작성 가능!

 

- java 에서 고정배열 만드는 방법

- 코틀린에서는 ListOf() 를사용한다. 리턴타입이 List<T>!! 제너릭은 동적이다.

 

- 참조값을 변하지 않게 담고싶으면 val 변수에 list를 담으면 된다.

 

- 타입 추론이 가능해서 타입을 굳이 적어주지 않는다.

- 아래에서 names. 에 점 찍어보면 배열에 관련된 매우 많은 기능을 확인할 수 있다.

- 하지만 이렇게 작성하면 readonly 배열이다. 값을 넣거나 수정하거나 빼지 않고 이대로만 사용!

 

- 배열 참조하는 방법

- names.get() 으로 함수를 사용해서도 값을 가져올 수 있다.

 

- 수정해보려고 하면 불가능하다고 뜬다!

- 수정 불가능. 그냥 한번에 값을 넣어놓고 사용하는 배열이다.

 

- 사실 배열을 수정할 일은 별로 없다...

- 그냥 읽기 전용으로만 사용하면 된다.(읽기전용이 속도가 훨씬 빠르다)

 

- 배열 다음으로 당연히 따라오는 반복문. for로 시작한다

- indices란? names의 방 번호를 가지고 있는 배열이다.

 

- 이 배열의 방 번호를 참조해서 배열의 특정 값을 뽑아서 사용할 수 있다.

 

- 방 번호가 꼭 필요한 것이 아니면 그냥 이렇게 작성해도 된다.

- 그냥 아이템을 하나씩 참조하는 것. 확장 for문 비슷하다.

 

- javascript 처럼 사용하기 forEach{ } 사용! (중괄호를 사용하는것이 특이하다)

- it : 그것. String 타입이라고 알려준다.

 

- 결과는 모두 같다.

- 이처럼 코틀린은 언어의 표현방식이 매우 유연하다.

 


 

- 코틀린의 클래스 만드는 문법은 java보다 좀더 복잡한 편이다.

 

Step02_Class

package com.example.kotlin_test

//클래스 정의하기
class MyCar

class YourCar{
    //멤버 함수
    fun drive(){
        println("달려요!")
    }
}

//대표(primary) 생성자는 클래스명 우측에 선언한다.
class AirPlane constructor(){
    //생성자?
    init{
        println("AirPlane 클래스의 init!")
    }
}
//constructor 예약어 생략가능
class AirPlane2(){
    //생성자?
    init{
        println("AirPlane2 클래스의 init!")
    }
}
//인자로 전달받을 게 없으면 () 생략 가능
class AirPlane3{
    //생성자?
    init{
        println("AirPlane3 클래스의 init!")
    }
}


fun main(){
    //클래스를 이용해서 객체 생성 in java => new MyCar()
    var c1=MyCar()
    var c2=YourCar()
    c2.drive()

    AirPlane()
}

 

class 클래스명

- 이렇게만 적어도 클래스가 성립한다.

- class 예약어와 함께 클래스명을 적기만 하면 된다.

 

- 코틀린에서는 new 를 사용하지 않는다. 클래스명() 이면 된다.

 

- 변수로 선언한 c1.에서 점을 찍어보면 기능이 매우 많다.

- 코틀린에서 클래스가 많은 것을 상속받는다는 것을 알 수 있다.

 

- YourCar 클래스 선언하고, YourCar{ } 중괄호 안에 메소드를 넣어준다.

 

- 메인클래스안에서 객체 생성해서 호출하기

- 변수 c2에 담아두고 점을 찍으면 drive()를 호출할 수 있다.

 

- 코틀린의 클래스에는 생성자가 있을까? java와 같은 이런 형태의 생성자는 없다.

 

- constructor (){} : 클래스에 직접 적어준다. 생성자의 모양!

- init { } : 생성자안에서 할 작업을 이 안에 명시한다.

 

- 그런데 아무것도 전달받지 않는 생성자는 생략 가능하다.

 

- 실행해보면 객체를 생성할 때 실행의 흐름이 이 init{} 으로 들어온다는 것을 알 수 있다.

- 이것을 대표생성자라고 부른다! 클래스명 우측에 선언한다.

 

- 복습하기~~