CodeKata
64번 체육복 재풀이
class Solution {
    fun solution(n: Int, lost: IntArray, reserve: IntArray): Int {
        var lostList = (lost.sorted() - reserve.sorted()).toMutableList()
        var reserveList = (reserve.sorted() - lost.sorted()).toMutableList()
        for (i in reserveList) {
            if (lostList.contains(i - 1)) {
                lostList.remove(i - 1)
            } else if (lostList.contains(i + 1)) {
                lostList.remove(i + 1)
            }
        }
        
        return n - lostList.size
    }
}
Github 사용 강의
//브랜치 생성 
git branch 브랜치이름 
//브랜치 확인 
git branch 
//이상 시 
q 눌러서 빠져나오기 
//브랜치 이동(둘다 상관없음) 
*git switch 브랜치이름 
git checkout 브랜치이름 
//브랜치 한 번에 생성 & 이동법 
git switch -c 브랜치이름 
git checkout -b 브랜치이름 
//브랜치 합치기 
1. git switch 최종브랜치이름 
2. git merge 합칠브랜치이름 
설명 : 최종브랜치(main)으로 가서 merge로 합칠 브랜치를 가져온다. 
===================================== 
//Pull Request 
? git reset으로 되돌릴 수 있다. 
따로 찾아서 공부해보길 
1. git push origin 브랜치명 
2. github에서 pull request 사용해서 
허용누르고 합치기 
3. git pull origin main 
으로 땡겨오면 update된다. 
//정리 
1. 브랜치 생성 및 이동 
2. 기능 개발 및 코드 저장 
3. 코드 업록드 및 풀 리퀘스트 
4. git에서 merge 
5, git pull 로 업데이트하기 
팀장의 역할(github에 처음올릴사람) 
1. 폴더 생성 
2. 초기 코드 작성(프로젝트 생성) 
3. git init, add, commit 
4. github 레포지토리 생성 
5. github 업로드 
6. git switch -c dev (dev는 테스트용으로 만들면 좋다) 
7. git push origin dev 
8. github에서 default 브랜치를 dev로 변경(설정에 있음) 
팀원의 역할 
1. 주소 복사해서 가져오기(git clone 주소 .)( . 필수) 
2. 브랜치 개설 (git switch -c 재혁) 
3. git add . 
4. git commit -m "first coomit" 
5. git push origin 재혁 
6. 깃헙에서 풀리퀘스트 진행 
전체 (권장) 
[ git pull origin dev ] 로 받아와서 merge오류 확인하기
5-1 강의 정리
값.toInt() / 값.toDouble() / 값.toString() 
업 캐스팅(자식 클래스 -> 부모클래스의 자료형으로 객체 생성) as 사용 
다운 캐스팅(부모클래스 -> 자식클래스의 자료형으로 객체 생성) as 사용 
-> 주의사항 : 자식이 부모가 가져야할 정보를 모두 가지고 있지 않을 때 사용 못함(부모에서 자식으로 강제로 바꾸는건 불가능하다.) 
is키워드를 사용해서 자료형 타입 확인 가능 
복수 데이터 리턴 방법 
Pair, Triple 
자기 자신의 객체를 효율적으로 전달해서 처리할 때 
Scope Functions [let, with, also, apply, run] 
let
fun <T, R> T.let(block: (T) -> R): R
- let 함수를 사용하면 객체의 상태를 변경할 수 있다.
    val person = Person("", 0)
    //let
    var resultIt = person.let {
        it.name = "John"
        it.age = 10
        it
    }
- let 블럭 안에는 non-null만 들어올 수 있어서 non-null체크 시 유용하게 쓸 수 있다.

with
fun <T, R> with(receiver: T, block: T.() -> R): R
- 함수 내에서 this를 사용하지 않고도 입력받은 객체의 속성을 변경할 수 있다.
    with(person){
        println(name)
        println(age)
    }

run
- 객체에서 호출하지 않는경우로 호출하는 경우가 있다.
객체에서 호출하는 경우의 예시
fun <T, R> T.run(block: T.() -> R): R
-with와 달리 null체크를 수행할 수 있으므로 더욱 안전하게 사용가능하다.
- run은 확장 함수가 아니고, 블럭에 입력값도 없다. 따라서 객체를 전달받아서 속성을 변경하는 형식에 사용되는 함수가 아니다.
- 어떤 객체를 생성하기 위한 명령문을 블럭 안에 묶음으로써 가독성을 높이는 역할을 한다.
val person = Person("James", 56)
val ageNextYear = person.run {
    ++age
}
println("$ageNextYear")
- person?.run -> 으로 with보단 run으로 사용해서 null처리 추천
객체에서 호출하지 않는 예시
fun <R> run(block: () -> R): R
val person = run {
    val name = "James"
    val age = 56
    Person(name, age)
}
- 이 run은 확장 ㅎ마수가 인고, 블럭에 입력값도 없다. 따라서 객체를 전달받아서 속성을 변경하는 형식에 사용되는 함수가 아니다. 이 함수는 어떤 객체를 생성하기 위한 명령문을 블럭 안에 묶음으로써 가독성을 높이는 역할을 한다.

apply
fun <T> T.apply(block: T.() -> Unit): T
apply는 T의 확장 함수이고, 블럭 함수의 입력을 람다 리시버로 받았기 때문에 블럭 안에서 객체의 프로퍼티를 호출할 때 it이나 this를 사용할 필요가 없다. run과 유사하지만 블럭에서 return 값을 받지 않으며 자기 자신인 T를 반환한다는 점이 다르다.
val person = Person("", 0)
val result = person.apply {
    name = "James"
    age = 56
}
println("$person")

also
- it으로 자신의 객체를 전달하고 객체를 반환한다.
- apply와 함께 자주 사용한다.

Scope Functions 왜 사용하나?

기능자체로는 큰 차이가 없지만 영역 함수 안에 있는 코드들이 Student 클래스와 관련된 코드라는 것을 한눈에 확인할 수 있다.
일기
과제도 맘에 안들게 냈는데 시간을 너무 썼다....
정수 실수 상관없이 계산해도 한번에 잘 나오고 싶었는데 생각보다 예외처리할게 많았다.
과제를 통해 BigDecimal을 알게 되었는데 사용못했다.
계산기 과제는 나중에 따로 정리/리코딩해서 올릴예정
이제 Android 공부를 저녁에만이라도 할 수 있다면 할 예정./
'Kotlin > TIL' 카테고리의 다른 글
| TIL (03.11) (0) | 2024.03.11 | 
|---|---|
| TIL (03.08) (0) | 2024.03.08 | 
| TIL (03.06) (1) | 2024.03.06 | 
| TIL (03.05) (0) | 2024.03.05 | 
| TIL (03.04) (1) | 2024.03.04 |