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{} 으로 들어온다는 것을 알 수 있다.
- 이것을 대표생성자라고 부른다! 클래스명 우측에 선언한다.
- 복습하기~~
'국비교육(22-23)' 카테고리의 다른 글
69일차(1)/Android App(11) : Kotlin Constructor, field / null 값 허용 문법 (0) | 2023.01.14 |
---|---|
68일차(2)/Android App(10) : ListView, OnClickListener, AlertDialog 활용 예제 (0) | 2023.01.13 |
67일차(2)/Android App(8) : Activity 화면 전환하기 (1) | 2023.01.12 |
67일차(1)/Android App(7) : Constraint Layout 연습, findViewById 사용 (0) | 2023.01.11 |
66일차(3)/Android App(6) : Linear Layout 예제 (1) | 2023.01.11 |