
이렇게 노션에 쌓아뒀음
근데 알고보니 저중에 반 이상이 확장함수였던거 실화냐고요
오늘도 코트카타를 하는데 도저히 해결이안돼서 chat gpt 선생님 도움을 받았다.
선생님이 map 함수, joinToString 함수 를 사용하라고 하시길래 대충 흐름은 알겠어서 풀긴 풀었다.
근데 joinToString이 이름도 길고 수상하게 생겼길래

정체를 물어봤더니 확장 함수라는거 그래서 이 참에 오늘 그냥 확장 함수를 공부해야겠다 싶어서 공부를 시작했다.
결론
확장 함수를 학습하고 활용하는 것은 Kotlin을 마스터하는 데 매우 유용합니다. 공식 문서와 다양한 예제를 통해 기본 개념을 익히고, 실제 프로젝트에 적용하여 확장 함수의 강력한 기능을 경험해보세요. 이를 통해 더 읽기 쉽고 유지 보수하기 쉬운 코드를 작성할 수 있을 것입니다.
라고 한다. 일단 그래서 할 수 있는 방법들을 동원해서 공부했음
확장 함수 개념 정리
https://velog.io/@orinugoori_art/Kotlin-%ED%99%95%EC%9E%A5-%ED%95%A8%EC%88%98Extension-Function
TIL 에 정리해놓으면 나중에 찾아 읽기 힘들 수도 있기에 그냥 글을 따로 써서 정리함!
사전캠프 때에도 Array랑 Collection 에 대해서 공부를 해서 개념은 알고 있다고 생각했는데
막상 코드카타 문제를 풀면서 내가 Array 나 Collection을 직접 생성하려고 하니까 문법이 자꾸 헷갈려서
다시 공부하기로 함!
Array 랑 Collection을 선언하고 활용하는 문제를 GPT 한테 내달라고함
아래는 GPT 가 내준 문제와 내가 작성한 코드!
크기가 5인 Int 타입의 배열을 선언하고, 각 요소에 1부터 5까지의 값을 할당하세요.
Array를 선언하는 3가지 방법이 있다.
1. arrayOf 함수 사용
val intArray = arrayOf(1,2,3,4,5)
2. Array 클래스 생성자 사용
val intArray2 = Array(5){i->i+1}
3. 특정 타입의 배열 생성 함수 사용
val intArray3 = IntArray(5){it+1}
배열의 요소를 모두 출력하세요.
println("intArray : ${intArray.joinToString()} ")
// intArray 를 그대로 출력하면 배열의 내용을 출력하지 않고 배열 객체의
// 참조 정보를 출력하기 때문에 joinToString 함수를 사용해서 배열의 요소를
// 문자열로 변환하도록 만들어줘야함
배열의 모든 요소를 2배로 만든 새로운 배열을 생성하고 출력하세요.
val doubledArray= intArray.map { it * 2}.toTypedArray()
// map 함수를 사용해서 배열의 각 요소를 변환(*2) 해줌
println("doubledArray : ${doubledArray.joinToString()}")
1부터 10까지의 숫자를 포함하는 불변 리스트를 선언하세요.
fun main() {
val intList = listOf(1,2,3,4,5,6,7,8,9,10)
println (intList)
}
리스트의 요소 중 짝수만 필터링하여 새로운 리스트를 생성하고 출력하세요.
fun main() {
val intList = listOf(1,2,3,4,5,6,7,8,9,10)
val evenList = intList.filter { it % 2 == 0}.map{it}
println (evenList)
}
리스트의 각 요소에 3을 곱한 값을 가지는 새로운 리스트를 생성하고 출력하세요.
fun main() {
val intList = listOf(1,2,3,4,5,6,7,8,9,10)
val evenList = intList.filter { it % 2 == 0}.map{it}
println (evenList)
val timesthree = evenList.map{it*3}
println (timesthree)
}
빈 MutableList를 선언하고 1부터 5까지의 숫자를 추가하세요.
fun main() {
val intList = mutableListOf<Int>()
intList.add(1)
intList.add(2)
intList.add(3)
intList.add(4)
intList.add(5)
println(intList)
}
리스트에서 3번째 요소를 제거하고 리스트를 출력하세요.
fun main() {
val intList = mutableListOf<Int>()
intList.add(1)
intList.add(2)
intList.add(3)
intList.add(4)
intList.add(5)
println(intList)
intList.removeAt(2)
println(intList)
}
리스트의 모든 요소를 제곱한 값을 가지는 새로운 리스트를 생성하고 출력하세요.
fun main() {
val intList = mutableListOf<Int>()
intList.add(1)
intList.add(2)
intList.add(3)
intList.add(4)
intList.add(5)
println(intList)
intList.removeAt(2)
println(intList)
val doubledIntList = intList.map{it.toDouble().pow(2.0).toInt()}
println(doubledIntList)
}
"apple", "banana", "cherry"를 포함하는 불변 Set을 선언하세요.
fun main() {
val fruitSet = setOf("apple","banana","cherry")
println (fruitSet)
}
"banana"가 집합에 포함되어 있는지 확인하고, 포함되어 있으면 "Found", 아니면 "Not Found"를 출력하세요.
fun main() {
val fruitSet = setOf("apple","banana","cherry")
println (fruitSet)
if (fruitSet.contains("banana")){
println("Found")
}
else {
println ("Not Found")
}
}
집합에 "orange"를 추가한 새로운 집합을 생성하고 출력하세요.
fun main() {
val fruitSet = setOf("apple","banana","cherry")
println (fruitSet)
if (fruitSet.contains("banana")){
println("Found")
}
else {
println ("Not Found")
}
val newFruitSet = fruitSet.plus("orange")
println(newFruitSet)
}
"a" to 1, "b" to 2, "c" to 3을 포함하는 불변 Map을 선언하세요.
fun main() {
val map = mapOf("a" to "1", "b" to "2", "c" to "3")
println(map)
}
키가 "b"인 값을 출력하세요.
fun main() {
val exMap = mapOf("a" to "1", "b" to "2", "c" to "3")
println(exMap)
println(exMap.get("b"))
}
각 키의 값을 2배로 만든 새로운 Map을 생성하고 출력하세요.
지금 적으면서 깨달았는데 3번 문제 고민중에 프로젝트 수정하러 가야해서 마지막을 안풀어버렸다.
내일 풀어야징
역시 직접 이렇게 문제를 풀어야 금방 익힐 수 있는 것 같다
앞으로도 뭐 배울 때마다 GPT 한테 문제 내라고 해야겠음
1. ConstraintLayout을 사용하는 이유
튜터님의 피드백으로 ConstraintLayout을 LinearLayout 보다 권장하는 이유를 찾아봤음
1. 더 유연한 레이아웃 배치
- 복잡한 레이아웃을 더 쉽게 만들 수 있게 해준다.
2. 성능 최적화
- 단일 레이아웃 트리로 배치함으로 Linear를 중첩하는 것보다 성능이 좋다.
3. 레이아웃 플렉서빌리티
- 뷰를 상대적으로 배치할 수 있기 때문에 다양한 화면 크기와 방향에 맞게 쉽게 조정 가능하다.
4. 더 나은 UI 디자인 도구 지원
- Constraint에서 더 강력한 도구와 시각적 편집 기능을 제공한다.
결론
LinearLayout은 뷰를 단순 수평 수직 배치 할 때는 직관적이고 간단하다는 장점이 있지만 퍼포먼스 최적화와 추가적인 유연성을 고려했을 때 Constraint를 사용하는 것이 유리할 수 있다.
2. Git 을 빨리 익혀야 겠다
팀 단위 프로젝트이다보니 GIt을 활용해야 코드를 더 편하게 합치고 할 것 같음
아직은 자꾸 git올리려는데 방법도 잘 모르고, 일단은 어떻게 검색해서 하긴하는데 이해를 못하고 있음
그냥 내배캠에서 특강을 마련해줘서 들으러감 어차피 매일 써야하니깐
TIL을 잘쓰면 취업에 유리하게 작용할 수도 있겠다.
하지만 나는 취업 목적이 아니긴한데 그래도 인생 어떻게 될지 모르는거니까 열심히 써야겠다.
나는 그냥 TIL쓰는게 재밌긴 함.
초딩 때 방학 숙제로 일기쓰기 맨날 안해가서 개학날마다 손바닥맞고 손들고 서있고 했었는데
이제 일기가 재밌어진걸까?
지금도 퇴실시간 (9시) 넘었는데 1시간 넘게 TIL 쓰고있음
나는 확장함수가 그냥 코틀린에서 기본으로 제공하는 것만 쓰는 건 줄 알았는데
그냥 함수 만드는것처럼 확장 함수도 직접 만들어서도 사용할 수 있다는 걸 알았다.
확장함수 종류가 엄청나게 많구나를 깨달음..나는 오늘 공부하면 코틀린에 있는 확장 함수를 정복한다거나
적어도 한번씩 다 훑어본다거나 아니면 반절이라도 정복한다거나 할 수 있을 줄 알았는데 어림도 없음
클래스들이 각각 확장 함수를 가지고 있다는걸 알았다. String,Collection,Sequence,Map,Array.. 등
클래스들이 확장함수를 가지고 있었다.
Iterable 인터페이스, 인터페이스의 존재를 알았다. map 함수에 대해서 찾아보다가 인터페이스라는게 있다는걸 발견함
컬렉션의 Map 과 map 함수가 별개의 존재라는걸 인지했다
Stirng, Int 등 단순 데이터 타입이라고만 생각한 애들이 사실은 클래스였음 충격 전혀 몰랐음
이제 12시간 공부하다보니까 TIL 적는것도 진짜 오래걸린다.
아직은 이틀밖에 안돼서 그런가 신기하게 12시간 앉아있는게 그렇게 힘들지 않음
시간이 금방 가는 느낌
나 사실 공부 체질이였나? 그럴리가 없는데
아니면 게임 12시간씩 하던 짬에서 나오는 바이브인가?
근데 아침에 일어나는건 좀 힘들긴 함.
더 정확히는 아침에 일어나는 것보다 일찍 일어나야해서 밤에 일찍 자야되는게 힘듬
늦개 자고싶다.
공부하는데 chatGPT 없었으면 큰일날뻔함 서포터 출신이라 그런가 도구랑 잘맞음 ?