ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kotlin 강의 1일차 (함수, 객체, 문자열템플릿, 조건식, 표현식과 선언문 차이, 배열과 리스트 차이, 반복문, null과 엘비스프레슬리, 클래스, 상속)
    coding 2022. 8. 23. 04:14
    728x90
    반응형
    SMALL

    joyce님의 유튜브 코틀린 3강으로 끝내기 강좌를 시작했다.

    중간중간 비유도 잘 들어주시고 어려운 부분은 길이를 늘리고 후시 녹음으로 티 안나게 자연스레 편집도 잘하셨다.

    몇일 나눠서 촬영 하셨다는데 편집도 몇일 걸렸을거 같다.

     

    아무튼 목표는 오픈 소스 java 게임 훔쳐서 내껄로 환골탈태 후 어플 판매

    올해는 꼭 이루고 싶다.

     

    1강에선 (함수, 객체, 문자열템플릿, 조건식, 표현식과 선언문 차이, 배열과 리스트 차이, 반복문, null과 엘비스프레슬리, 클래스, 상속) 크게 총 10가지를 한시간안에 강의를 해주시는데 6시간 걸렸다ㅋㅋ

    엄청 재밌었다. 내일 2강 들을 생각에 설렌다.

     

     

    자잘한 오류들

    게 같은 문제가 생겼다.(다 쓰고 보니 엘이 아니라 아이었음 not capital I but l)

     

    일단 업데이트 해주고

     

    build.gradle(Module: 내가지은이름.app)에서 맨 위 노란줄로 sync now를 클릭하니 해결됐따.

    시작한지 50분만에 접을뻔했다.

     

    이외에도 

    이런 게같은 오류가 두번째 Run 마다 가끔 일어났는데 아마도 안드로이드 스튜디오는 C드라이브에, 프로젝트는 D드라이브에 있어서 그런거 같다. 아님 말고

    해결 방법은

    reload all from disk를 해주고 실행을 하면 에러가 발생되지 않았다.

     

    아래는 예제 파일 2개

    //https://www.youtube.com/watch?v=IDVnZPjRCYg
    //joyce
    
    package com.example.kotlinpractice0822_02
    
    fun main() {
        helloWorld()
    
        println(add(a = 4, b = 5))
    
        /////03String템플릿/////////
        /*
        변수를 표시하고 싶을 땐 $ 표시
        띄어쓰기 유의!!! ${name}대괄호 항상 쓰거나
         */
        val name = "1조를 벌 사나이"
        val lastName = "Woo"
        val age = "29"
        println("my name is ${name+"  " + lastName} I'm $age")
        println("this is \$2 달러 쓰고 싶으면 백슬래시$ 쓰세요")
    
        checkNum(score = 80)
    
        forAndWhile()
    
        nullcheck()
    
    
    }
    
    //////////////01함수////////////////////////
    // 리턴 타입이 없는 경우
    fun helloWorld() {
        println("Hello World!")
    }
    
    //리턴타입이 있는경우
    /*add(변수명 : 변수타입) : 리턴타입{}
    자바는 (변수타입 : 소문자int)
    */
    fun add(a : Int, b: Int) : Int {
        return a+b
    }
    
    ////////////02 val vs var////////////////////
    //val = value
    //var = variable
    
    fun hi(){
        val a : Int = 10
    
        var b : Int = 9
    
        //a = 100 는 안되지요
        //b = 100 은 되지요요
    
        val c = 100
        val d = 100
        // Int 안 써도 되지요오오
    
        var name = "1조를 벌 사나이이"
    
        var age : String
        //바로 할당 안해줄거면 타입을 써줘야지요오오
    }
    
    
    /////////04조건식////////////
    
    fun maxBy(a : Int, b : Int) : Int {
        if( a > b){
            return a
        }else{
            return b
        }
    }
    
    fun maxBy2(a : Int, b : Int) : Int = if(a>b) a else b
    
    // return (a>b) ? a : b 자바처럼 사망 연산자가 없어어
    
    
    fun checkNum(score : Int) {
        when(score){
            //when 을 파라미터로 받은 변수 score
            0 -> println("this is 0")
            1 -> println("this is 1")
            2,3 -> println("this is 2 or 3")
            //이런 function은 else를 안 써도 됌
            }
    
        //이렇게 리턴식처럼 쓰일 수도 있음
        //마치 이것처럼  Int = if(a>b) a else b처럼 리턴식을 썼던것 처럼
        var b :Int = when(score) {
            1 -> 1
            2 -> 2
            else -> 3
                //이런식으로 else를 무조건 써줘야 함
        }
    
        println("b : $b")
    
        //점수를 주고 싶을 때
        when(score){
            in 90..100 -> println("You did a great job")
            in 10..80 -> println("not bad")
            else -> println("kill yourself")
        }
    }
    
    ///////////////05Expression vs Statement 차이점/////////////
    /*
    모든 함수는 : Unit을 리턴함(생략되지만)
    그래서 모든 함수는 Expression 표현식임
    자바는 void라는 리턴값이 없는 함수는 Statement로 사용된다.
    자바에서 if를 statemnet로 밖에 사용할 수 없었다면 코틀린은 다르다.
    when도 마찬가지로
    뽀짝뽀짝 값을 반환하면 표현식
    명령하고 선언하면 선언문
     */
    
    ///////////////////06 Array and List/////////////////////
    /*
    Array는 값이 할당되기 때문에 값을 처음에 지정해줘야 함
    List는 immutable list와 mutable list 두개로 나뉜다.
     */
    
    fun array() {
        val array: Array<Int> = arrayOf(1, 2, 3)
        val list: List<Int> = listOf(1, 2, 3)
        val list1 = listOf<Int>(1,2,3)
        val list2 = listOf(1,"d",3.4f)
        val list3 = listOf(1,2,3)
    
    
    
        val array2 = arrayOf(1,"d",3.4f)
        val array3 = arrayOf(1,2,3)
        val array4 = arrayOf(3,4,6)
    
        array[0] = 9
        //list는 가져와 읽기는 가능하지만
        //list[0] = 1 직접 바꾸는건 안된다. 읽기 전용
       var result = list.get(0)
    
        val arrayList = arrayListOf<Int>()
        arrayList.add(10)
        arrayList.add(20)
    }
    
    
    ///////////07 For / While을 사용한 반복문/////////////
    
    fun forAndWhile(){
    
        val students = arrayListOf("joyce","tan","woo","jennifer")
    
        for ( name in students ){
            println("${name}")
        }
    
        var sum : Int = 0
        for ( i in 1..10 ){
            sum += i
            //sum = sum+ i 랑 똑같은 말
        }
        println(sum)
    
        //여기서 sum은 55가 된다
    
        for ( i in 1..10 step 2){
            //step 1 3 5 7 9가 됌 2씩 건너뛰란 말
            //55에다가 i를 더하란 말 i는 뭐다? 1 3 5 7 9
            sum += i
        }
        println(sum)
    
        //여기서 sum은 80
    
        for (i in 10 downTo 1){
            sum -= i
            println(sum)
            //80에서 10부터 1까지 순차적으로 빼라 70, 61, 53 ..... 25
        }
    
        for (i in 1 until 100){
            //1부터 99까지임
            sum += i
        }
        println(sum)
    
        var index = 0
        while(index < 10){
            index++
            println("current index is ${index}")
        }
        println("current index is ${index}")
    
        for ((index, name) in students.withIndex())
            println("${index+1}번째 학생 : ${name}")
    }
    
    //////////////08 Null / NonNull/////////////////////
    
    fun nullcheck(){
        //NPE :NULL pointer Exeption
        //런타임에서만 잡히기 때문에
        //재생을 해봐야지만 암
        //컴파일 시점에는 절대 모름
        //////////그래서 코틀린에선 ?로 컴파일 시점에서 잡아줌/////////////
        var name : String = "woo"//null이 아니어야 하는 타입이잖아
    
        var nullName : String? = null
        //? 하나 넣냐 안넣냐로 null인지 아닌지 알게 됨
        //? = safe call이란 말임
        //위에 껀 var name = "woo"써도 되지만 물음표를 붙일거면 생략하면 안됨
    
        var nameInUpperCase = name.uppercase()
        var nullNameInUpperCase = nullName?.uppercase()
        //?의 역할 Null이 아니면 바로 uppercase 박아버리고 Null이면 Null 반환하라 이거임
    
        // ?: 엘비스 프레슬리 연산자 Null이면 (age?: "age가 Null이면 이거출력해라")
    
        val lastName : String? = null
        val fullName = name+"  " + (lastName?: "NO lastName")
    
        println(fullName)
    
    
    }
    //!!////////////////////!! Nullable이긴한데 눌이 아닌걸 보증해주는거임
    fun ingoreNulls(str : String?){
        val mNotNull : String = str!!
        //!! mNotNull은 절대절대 Null일리 없으니까 알아서 해
        val upper = mNotNull.uppercase()
        //Nullable이지만 내가 아니라고 했으니까 어퍼케이스 바로 쓸 수 있게 된거야야
    
    
        var email : String? = "antcow0706@gmail.com"
        email?.let{
            println("my email is ${email}")//${it}이라 써도 됨
            //null이 아니면 let 해라 이말이야
            //let은 리시버 객체를 람다식 내부로 옮겨서 실행하는 구문이에요! 무슨 말인지 몰라요
            // 리시버 객체 = email을 이 안으로 옮겨준다는 거임
            //안에 있는게 눌이면 println을 쓰지 않기 때문에 굉장히 safe 한것이지요
        }
    }
    
    
    ///////09 Class/////////
    package com.example.kotlinpractice0822_02
    
    //fun = 메소드 val, var = 프로퍼티스(객체)
    //코틀린은 파일이름이랑 클래스 이름이 일치하지 않아도 되고
    //여러 클래스도 한 파일안에 넣을 수 있는게 자바와 다른 점
    //그래도 자바랑 클래스 이름이랑 맞춘다
    
    
    open class Human constructor(val name : String = "default name") {
        //이 안엔 프로퍼티스나 메소드가 들어 갈 수 있음
    
        //val name이게 프로퍼티스임임
        //여기서 이름을 바로 안 만들고 아래에 fun main에서 객체를 만들 때 이름을 정해주고 싶다면?!
        // constructor를 써주면 됩니다~ 물론 Human (val name : String) 쓰고 constructor 생략해도 됨
    
        //코드블록을 못 쓰니까 init이라는 함수가 있습니다
        init {
            //처음 인스턴스를 생성할 때 어떤 동작을 하고 싶은지 적을 수 있음
            println("New human has been born!!")
        }
    
      fun eatingCake(){
            println("This is so YUMMYYYY~~~")
        }
     open fun singASong(){
          println("lalala")
      }
    /////////////////////////10 class의 상속//////////////////////////////////////////
    class Koreansing : Human(){
        //코틀린의 클래스는 기본적으로 final 이기 때문에 Human에 open을 써줘야 함
        override fun singASong(){
            super.singASong()
            //super를 쓰면 상속 override 했지만 다시 쓸 수 있게 되는거죠 영어 lalala를
            println("라라랄")
    
        }
    }
    
    728x90
    반응형
    LIST

    댓글

Designed by Tistory.