1강. [코틀린 기본 문법] - 코틀린 3강으로 끝내기

728x90

[1강. 코틀린 기본 문법]

1. 함수 

[함수 선언] : fun 키워드
        -함수 매개변수에는 val 자동 적용되므로 따로 키워드 선언 X
        -함수 안에서 매개변숫값 변경 불가능
        -함수의 매개변수에 기본값 선언 가능
        ex. fun some(data1: Int, data2: Int = 10) : Int { ... } 로 선언한 경우
이후, 해당 함수 호출할 때 data2에 해당하는 인수 안줘도 기본값 적용된다.


-
매개변수가 여러개일 경우 호출 방법


1) 순서대로 인자 전달

-some(10, 20)

2) 매개변수명 지정하여 호출 : 명명된 매개변수

-이 경우 순서 안지켜도 됨
-some(data2 = 20, data1 = 10) 으로 호출 가능
//1. 함수
fun helloWorld() : Unit { //반환값 없는 함수 (Unit 생략O)
    println("hello world")
}
fun add(a :Int, b: Int) : Int { // 반환 타입 Int인 함수
    return a+b
}

2. 변수 선언 : val /var 차이

[변수 선언]

-선언 키워드 : val , var

val : 최초 할당된 초기값 변경 불가 변수. (불변)

var: 최초 할당된 초기값 변경 가능 변수. (가변)

val 변수명:타입 =
var 변수명:타입 =
//2. val vs var 변수 키워드 차이
//val = value
//var = variable
fun h1() {
    val a : Int = 10 //최초 할당된 초기값 변경 불가
    var b : Int = 9 // 최초 할당된 초기값 변경 가능

    b = 100
    val c = 100
    var d = 100
}

3. String 템플릿 ${ }

<문자열 템플릿>
-String 타입 데이터에 변수값 or 어떤 연산식의 결과값 포함해야 할 경우.
, 문자열로 출력할 경우, 내부에 연산 결과값 넣거나 할 때 형식지정자 대신 $ {}기호 사용함

val name : String = “kkang”
println(“name : $name, sum: ${sum(10)}, plus: ${10+20}”)
//3. Sting 템플릿  ${ } : 변수 or 연산 결과를 ""문자열로 출력하고 싶을 때. <형식지정자>
fun h2() {
    val name = "Joyce"
    val lastName = "SEO"
    println("my name is ${name + lastName}")
}

4. 조건식 

 (1) if-else 문 

[if-else]

-표현식으로도 사용 O (결과 반환하는 식)

-각 영역의 마지막 줄에 해당한느 결괏값을 반환

//4. [조건식]
// (1) if-else 문
fun max(a:Int, b: Int) : Int {
    if(a>b) {
        return a
    }else{
        return b
    }
}
fun amxBy2(a:Int, b:Int):Int = if(a>b) a else b

 (2) when 문

[when ]

-표현식으로도 사용 O (결과 반환하는 식)

// (2) when 문
fun checkNum(score:Int) {
    when(score) {  //기본 when 문
        0 -> println("this is 0")
        1 -> println("this is 1")
        2, 3->println("this is 2 or 3")
    }
    var b = when(score) { //표현식으로 사용한 when문
        1->1
        2->2
        else -> 3
    }
    when(score){ //범위로 score값 조건 나누기
        in 90..100 -> println("You are genius")
        in 10..80 -> println("not bad")
        else -> println("okay")
    }
}

5. 컬렉션 타입 : Array 와 List 

-초기화는 _Of() 함수 사용

-List/Map/Set의 경우 : 불변/가변 나뉨 

//5. Array 와 List  : 초기화는 _Of() 함수로 할 수 있음
// Array = 기본 할당된 크기가 정해져 있음
// List 1.List 2.MutableList 불변/가변 나뉨
fun array() {
    val array:Array<Int> = arrayOf(1,2,3)
    val list:List<Int> = listOf(1,2,3)

    val array2: Array<Any> = arrayOf(1,"d",3.4f )
    val list2 : List<Any> = listOf(1, "d", 11L)
}

6. 반복문 

 (1) for문

[for ]

for(i in 1..10) {
       sum += I
}

-for(i in 1..10) {...} : 1부터 10까지 1씩 증가하며 반복

-for(i in 1 until 10) {...} : 1부터 9까지 1씩 증가하며 반복

-for(i in 2..10 step 2) {...} : 2부터 10까지 2씩 증가하며 반복

-for(i in 10 downTo 1) {...} : 10부터 1까지 1씩 감소하며 반복

- [indices] : 증감 조건에 컬렉션 타입 데이터 개수만큼 반복하게 설정도 가능

fun main() {
var data = arrayOf<Int>(10. 20, 30)

     for(i in data.indices) {
         print(data[i])
         if(i !== data.size 1) printf(“,”)
     }
}

[withIndex() 함수 ] : 컬렉션 타입 인덱스 + 데이터 함께 가져옴

fun main() {
     var data = arrayOf<Int>(10,20,30)

     for((index, value) in data.withIndex()) {
         print(value)
     if(index !== data.size 1) print(“,”)
     }
}
//6. [반복문]
fun forAndWhile() {
    val students : ArrayList<String> = arrayListOf("joyce", "james", "jenny", "jennifer")
    // (1) for문
    for(name :String in students) { //students 타입 컬렉션 내부의 String값들 차례로 가져옴
        println("${name}")
    }
    for((index:Int, name:String) in students.withIndex()){
    //withIndex() 사용 시, 컬렉션 내부 인덱스와 데이터 함께 불러올 수 있음
    println("${index+1}번째 학생 이름 : ${name}이다.")
    }
    var sum : Int = 0
    for(i:Int in 1..10) {
        sum += i
    }
    // (2) while문
    var index = 0
    while(index <10){
        println("current index : ${index}")
        index++  //증감식 작성안하면 계속 index값 머물러 있어서 무한반복
    }
}

7. 널 허용/불 허용 

//7. [NonNull과 Nullable] : 널 허용 / 널 불허용 : ?붙임 여부
fun nullcheck(){
    //자바 Null pointer Exception 널 포인터 익셉션 발생을 막기 위해 구분
    var name:String = "joyce" //널 불허용 : 변수 선언 시 타입 뒤 ? 안붙음
    var nullName :String? = null //널 허용 : 변수 선언 시 타입 뒤 ? 붙임

    //(1) 엘비스 연산자  ( ?: 연산자 )// 널일 경우의 반환해줄 기본값을 지정 O
    val lastName :String? = null
    val fullName:String = name + "" + (lastName ?: "No lastName")
                                       //만약 해당 변수가 null일 경우 반환할 기본 값 지정
}
    //(2) 예외발생 연산자 ( !! 연상자) : 컴파일러에게 NUll아님을 확실하게 알리는 역할
fun ignoreNulls(str:String?) {
    val mNotNull : String = str!!   //!!붙여주면 절대 널값아니라는 표시
}

8. 클래스

//8. 클래스 개념
//코틀린은 자바와 다르게 클래스 이름이 꼭 파일 이름과 일치하지 않아도 됨
//여러 클래스를 한 타입 안에 넣을 수 도 O
open class Human constructor(val name:String = "Anomymous"){ //기본(주) 생성자를 클래스 선언 시 작성
    init{ //주 생성자를 클래스 선언 시 작성하기 때문에 본문 내용을 init{ }안에 작성
        println("No human")
    }
    // 보조 생성자
    constructor(name: String, age:Int) :this(name) { //this()로 주 생성자와 연결 반드시 필요
        println("my name is ${name}, ${age} ")
    }
    open fun eatingCake(){
        println("This is so 얌얌 ")
    }
    open fun singASong(){
        println("lalala")
    }
}
9. 상속 + 오버라이딩 
//9. 상속 (클래스 상속) + 오버라이딩(재정의)
class Korean:Human() { //상위 클래스 Human을 상속 받은 Korean 클래스
    override fun singASong() {
        super.singASong()
        println("아리랑")
        println("My name is : ${name}")
    }
    //코틀린은 오버라이딩은 상위클래스의 open 멤버 대상에 한해서만 가능함
}
[참고] : Joyce - 코틀린 3강으로 끝내기

728x90