묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Kotlin에서 필드 정의할때 질문드립니다.
안녕하세요. 강의 다시 보기 하다가 질문이 생겨서 글 남깁니다. @Entity class Book( val name: String, @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null, ) { } @Entity class Book( name: String, ) { var name: String = name private set @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L } 코틀린에서 필드를 기본생성자로 하는 방식과 클래스 본문으로 하는 방식으로의 차이가 궁금해서 질문드립니다! 감사합니다
-
해결됨자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
Java 코드를 Kotlin 코드로 가져올 때 Wrapping 한다는게 무슨 뜻일까요?
안녕하세요. 16:52초에 Java 코드를 보며, 맥락을 확인하고 Java 코드를 가져오는 지점을 Wrapping 한다고 설명을 해주셨는데 이 때 Wrapping에 대하여 좀 더 설명을 해주실 수 있을까요?코틀린으로 코드를 짜려고 하면 아무래도 자바로 짠 자료들이 많아서 자바 코드를 코틀린 코드로 옮길 때 컬렉션 타입을 어떻게 해야할 지 조금 고민이 되는 경우가 많아서 질문 드려봅니다!
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
화면 이동 시 css 적용 안 되는 문제
부트스트랩 파일을 그대로 사용하고 있는데 index화면은 css가 잘 적용되어 있으나 resume와 projects 로 페이지가 넘어갈 때 css 적용이 안 됩니다. <!DOCTYPE html> <html lang="ko" xmlns:th="http://www.thymeleaf.org"> <div th:replace="~{/presentation/fragments/fragment-head :: head}"></div> <body class="d-flex flex-column h-100"> <main class="flex-shrink-0"> <!-- 타임리프가 해당 경로에 있는 :: 뒤 이름을 찾아서 이자리에 교체해줌 --> <div th:replace="~{/presentation/fragments/fragment-navigation :: navigation}"></div> <header class="py-5"> <div class="container px-5 pb-5"> <div class="row gx-5 align-items-center"> <div class="col-xxl-5"> <!-- Header text content--> <div class="text-center text-xxl-start"> <div class="badge bg-gradient-primary-to-secondary text-white mb-4"><div class="text-uppercase">Kotlin · Spring · SQL</div></div> <div class="fs-3 fw-light text-muted">캐치프레이즈 넣어보기 </div> <h1 class="display-3 fw-bolder mb-5"><span class="text-gradient d-inline">자기소개 넣기</span></h1> <div class="d-grid gap-3 d-sm-flex justify-content-sm-center justify-content-xxl-start mb-3"> <a class="btn btn-primary btn-lg px-5 py-3 me-sm-3 fs-6 fw-bolder" href="../../../../../../../Downloads/startbootstrap-personal-gh-pages/startbootstrap-personal-gh-pages/resume.html">Resume</a> <a class="btn btn-outline-dark btn-lg px-5 py-3 fs-6 fw-bolder" href="../../../../../../../Downloads/startbootstrap-personal-gh-pages/startbootstrap-personal-gh-pages/projects.html">Projects</a> </div> </div> </div> <div class="col-xxl-7"> <!-- Header profile picture--> <div class="d-flex justify-content-center mt-5 mt-xxl-0"> <div class="profile bg-gradient-primary-to-secondary"> <!-- TIP: For best results, use a photo with a transparent background like the demo example below--> <!-- Watch a tutorial on how to do this on YouTube (link)--> <img class="profile-img" src="assets/profile.png" alt="..." /> <div th:replace="~{/presentation/fragments/fragment-dots :: dots1}"></div> <div th:replace="~{/presentation/fragments/fragment-dots :: dots2}"></div> <div th:replace="~{/presentation/fragments/fragment-dots :: dots3}"></div> <div th:replace="~{/presentation/fragments/fragment-dots :: dots4}"></div> </div> </div> </div> </div> </div> </div> </header> <!-- About Section--> <section class="bg-light py-5"> <div class="container px-5"> <div class="row gx-5 justify-content-center"> <div class="col-xxl-8"> <div class="text-center my-5"> <h2 class="display-5 fw-bolder"><span class="text-gradient d-inline">About Me</span></h2> <p class="lead fw-light mb-4"></p> <p class="text-muted" th:each = "introduction : ${introductions}"th:text ="${introduction.content}">Lorem ipsum dolor sit amet</p> <div class="d-flex justify-content-center fs-2 gap-4"> <a class="text-gradient" href="#!" th:each = "link : ${links}"th:href ="${link.content}"><i class="bi bi-github" th:class ="|bi bi-${link.name}|"></i></a> </div> </div> </div> </div> </div> </section> </main> <!-- Footer--> <div th:replace="~{/presentation/fragments/fragment-footer :: fooer}"></div> <!-- Bootstrap core JS--> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script> <!-- Core theme JS--> <script src="../../../../../../../Downloads/startbootstrap-personal-gh-pages/startbootstrap-personal-gh-pages/js/scripts.js"></script> </body> </html> css 파일 건드리지 않고 그대로 두었는데 무엇이 문제인지 궁금해 질문드립니다. 참고로 resume 화면상에서 href 설정을 <link th:href="@{/css/styles.css}" rel="stylesheet" /> 이와 같이 추가해주니 변경이 잘 되었습니다. 그렇다면 기존의 <link href="../../../../../../../Downloads/startbootstrap-personal-gh-pages/startbootstrap-personal-gh-pages/css/styles.css" rel="stylesheet" /> 이렇게 적용한 코드와 차이는 무엇인가요?
-
미해결[LV1] Jetpack Compose - UI 연습하기
CoupangEx 4 강에서
강사님 늘 건강하시고 부자되세요 Icon(imageVector = iconList[index % iconList.size],코드를 Icon(imageVector = iconList[index],로 바꾸어도 출력은 동일하게 나오는데 index % iconList.size코드가 의미하는 것을 무엇일까요 ???
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
코틀린에서 ModelMapper는 어떤지 궁금합니다.
안녕하세요! 강의를 모두 수강하고,최근 신규 프로젝트로 코틀린을 사용할 예정이라 강의를 다시 한번 곱씹어 보고 있습니다 궁금한 내용은 다름 아니라 java 프로젝트를 했을 때Entity > DTO 변환 시 필드의 추가/변경/삭제 시 누락을 방지하려고 ModelMapper를 자주 사용했던 기억이 있는데, 강사님 강의에서는 이러한 작업을 할 때 'of' 나, 'fixture' 와 같은 같은 팩토리 메서드를 주로 사용하시는 것을 보고궁금해서 찾아보니 코틀린은 매핑 관련 라이브러리를 잘 사용하지 않는다는 글도 있더라고요.. 혹시 이러한 부분은 어떻게 생각하시는지 궁금합니다!
-
미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Transformations import 안됨
androidx.lifecycle 패키지에 Transformations 가 없어서 참조가 안됩니다! Unresolved reference라고 하네용..Deprecated 된것 같진 않은데 사용방법이 달라진걸까요?val userLD : LiveData<User> = ...; val userFullNameLD: LiveData<String> = userLD.map { user -> user.firstName + user.lastName }공식문서에 보니 이것처럼 먼저 생성한 LiveData나 MutableLiveData 를 참조해서 map 을 사용하는데 이런식으로 사용해야할까요?+) 그리고 transformations 를 사용하는 이유나 언제 사용해야하는지? 이해가 잘 안되는데, 예시처럼 prefix나 suffix 가 필요할 때 사용하기 좋은가요?MainActivity 에서 myViewModel.liveCounter.value = myViewModel.liveCounter.value?.plus(1) 이건 원본 데이터를 조작한게 아닌건가요?
-
미해결[2023 코틀린 강의 무료제공] 기초에서 수익 창출까지, 안드로이드 프로그래밍 A-Z
추가링크는 어디에 있을까요?
객체부분 마지막 쯤 추가적인 공부를 할 수 있도록 링크를 올려주신다고 하셨는데, 링크는 어디서 볼 수 있을까요?
-
해결됨2시간으로 끝내는 코루틴
코루틴 Job 상속에 관하여 질문드려요
안녕하세요 강사님~ 좋은 강의 너무 감사드립니다. 덕분에 코루틴 입문을 쉽게 할 수 있었습니다.다름이 아니라 강사님 강의를 완강하고나서 코루틴 관련 책을 보고 있는데요,Job은 자식에게 상속되지 않는 유일한 코루틴 컨텍스트라는 내용이 있네요.이곳저곳 더 찾아보니 부모 코루틴을 기반으로 고유한 Job을 갖는다는 내용이 있는데 정확히 이게 어떤 의미인지 모르겠어서 질문을 드립니다!
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
강의 "데이터바인딩 gradle 설정에서 오류가 난다면?"에 잘못된 정보가 있습니다
와 같이 build.gradle에 작성을 했을 때 에러가 난다면dataBinding { enabled = true }이렇게 시도해보세요 :)라고 되어있는데 다음과 같이 수정하였으면 좋겠습니다.와 같이 build.gradle에 작성을 했을 때 에러가 난다면dataBinding { enable = true }이렇게 시도해보세요 :)(enabled = true -> enable = true로 수정을 해야 잘 작동하는 것으로 확인하였습니다 수정 부탁드립니다. 감사합니다 :) )
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
Binding
안녕하세요, ‘데이터 바인딩 설명’강의를 보고 따라하다가 MainActivity에 영상에 나온데로binding = DataBindingUtil.setContentView를 쳤는데 영상과 다르게 괄호가 두개 나와서요. 어떻게해야 할까요?
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
파이어베이스 회원가입 구현 부분에서 emailArea 와 passwordArea, passwordArea2 이 부분이 빨간색이에요
파이어베이스 회원가입 구현 부분에서 emailArea 와 passwordArea, passwordArea2 이 부분이 빨간색이며 Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.res.ParseLibraryResourcesTask$ParseResourcesRunnable이런 오류가 나요. ㅜㅜ 그리고 package com.juwon.mysolelife.auth import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.databinding.DataBindingUtil import com.google.firebase.Firebase import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.auth import com.juwon.mysolelife.R import com.juwon.mysolelife.databinding.ActivityIntroBinding class JoinActivity : AppCompatActivity() { private lateinit var auth: FirebaseAuth private lateinit var binding: ActivityIntroBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_join) setContentView(R.layout.activity_join) binding.joinBtn.setOnClickListener { val email = binding.emailArea.text.toString() val password1 = binding.passwordArea.text.toString() val password2 = binding.passwordArea2.text.toString() if(email.isEmpty()) { Toast.makeText(this, "이메일을 입력 해 주세요", Toast.LENGTH_LONG).show() } } auth = Firebase.auth // auth.createUserWithEmailAndPassword(email, password) auth.createUserWithEmailAndPassword("sjw9179@kakao.com", "tlswndnjs1!") .addOnCompleteListener(this) { task -> if (task.isSuccessful) { Toast.makeText(this, "성공", Toast.LENGTH_LONG).show() } else { Toast.makeText(this, "실패", Toast.LENGTH_LONG).show() } } } }이런식으로 코드가 짜여있습니다.
-
미해결냉동코더의 알기 쉬운 Modern Android Development 입문
moshi관련 질문입니다.
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-kapt") id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") } android { namespace = "com.example.booksearchapp" compileSdk = 34 defaultConfig { applicationId = "com.example.booksearchapp" minSdk = 23 targetSdk = 34 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } buildFeatures { buildConfig = true viewBinding = true } } dependencies { implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.11.0") implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.legacy:legacy-support-v4:1.0.0") // Retrofit implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-moshi:2.9.0") // Okhttp // define a BOM and its version implementation(platform("com.squareup.okhttp3:okhttp-bom:4.12.0")) // define any required OkHttp artifacts without version implementation("com.squareup.okhttp3:okhttp") implementation("com.squareup.okhttp3:logging-interceptor") // Moshi implementation("com.squareup.moshi:moshi-kotlin:1.14.0") kapt("com.squareup.moshi:moshi-kotlin-codegen:1.14.0") // Lifrcycle implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.7.0") // Coroutines implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") // Coil implementation("io.coil-kt:coil:2.5.0") // RecyclerView implementation("androidx.recyclerview:recyclerview:1.3.2") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") } 위처럼 설정을 하고 빌드를 할때 아래와 같은 에러가 발생합니다.Execution failed for task ':app:kaptDebugKotlin'.> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction > java.lang.reflect.InvocationTargetException (no error message)jdk는 17을 사용하고 있습니다.11로 설정하면 아래와 같은 에러가 나옵니다.is project is configured to use an older Gradle JVM that supports up to version 11 but the current AGP requires a Gradle JVM that supports version 17. 어느 부분을 수정해야될 지 모르겠습니다.. ㅜㅜ
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
파이어베이스 SDK 구정이 또 달라져서 보라고 주신 문서들에도 안 나와있습니다.
파이어베이스 SDK 구정이 또 달라져서 보라고 주신 문서들에도 안 나와있습니다.
-
미해결[입문편] 안드로이드를 위한 코틀린(Kotlin) 문법
9:20초 쯤 나오는 init은 클래스안에서 공통으로 쓰이는 건가요?
안녕하세요 복치님!왕초보 강의듣고 기본기를 쌓고싶어서 입문강의도 듣고 있습니다initTest()안에 init은 클래스를 실행하면 무조건 실행되는 함수인건가요? 그리고 init이라는 함수가 실행 순서상 우선적으로 실행되는건지도 궁금합니다
-
미해결[입문편] 안드로이드를 위한 코틀린(Kotlin) 문법
int, string?
안녕하세요! 타입과 형변환을 보고있는데요, 제가 아예 쌩초보라 벌써 헷갈려서요..!fun main() { val test1 = "1234" val test2 = 1234 println(test1 + 1) println(test2 + 1)} 강의에서 test1은 문자니까 문자열이 합쳐지는 것이고, test2는 숫자니까 더해지는 거라고 말씀해 주셨는데,println(test1 + 1)에서 뒤에 더해주는 1은 (""없어도) string 타입이고, println(test2 + 1)에서 뒤에 더해주는 1은 int 타입인 건가요??
-
미해결[LV1] Jetpack Compose - UI 연습하기
HorizontalPagerIndicator 의 pagerState = pageState, 에서 빨간줄이 생깁니다
MainActivity.ktimport androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.runtime.getValue import androidx.compose.ui.text.font.FontWeight import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.material3.ExperimentalMaterial3Api import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.HorizontalPagerIndicator class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ShopEx() } } } @Composable fun ShopEx() { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { Column() { TopLogo() TopSearchBar() TopBanner() } } } @Composable fun TopLogo(){ Box(){ Box( modifier = Modifier .fillMaxWidth() .height(60.dp), contentAlignment = Alignment.Center ){ Row(){ Text("C", fontSize = 30.sp, color= Color(0xff964b00)) Text("O", fontSize = 30.sp, color= Color(0xff964b00)) Text("U", fontSize = 30.sp, color= Color(0xff964b00)) Text("P", fontSize = 30.sp, color= Color.Red) Text("A", fontSize = 30.sp, color= Color.Yellow) Text("N", fontSize = 30.sp, color= Color.Green) Text("G", fontSize = 30.sp, color= Color.Blue) } Icon( imageVector = Icons.Default.ShoppingCart, // ImageVector 아이콘지정 contentDescription = "쇼핑", modifier = Modifier .align(Alignment.CenterEnd) .padding(end = 20.dp) ) } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun TopSearchBar(){ var inputText by remember { mutableStateOf("") } Box( modifier = Modifier .fillMaxWidth() .border(1.dp, Color.Gray, shape = RoundedCornerShape(10.dp)) .padding(start = 20.dp, end = 20.dp), contentAlignment = Alignment.Center ){ TextField( value = inputText, onValueChange = { inputText = it }, leadingIcon = { Icon(imageVector = Icons.Default.Search, contentDescription = null)}, placeholder = { Text(text = "쿠팡에서 검색하세요")}, modifier = Modifier.fillMaxWidth(), colors = TextFieldDefaults.textFieldColors( containerColor = Color.White, focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent ) ) } } @OptIn(ExperimentalFoundationApi::class, ExperimentalPagerApi::class) @Composable fun TopBanner(){ val pageCount = 5 val pageState = rememberPagerState() val textList = listOf( "광고 문구1", "광고 문구2", "광고 문구3", "광고 문구4", "광고 문구5" ) Box( modifier = Modifier.padding(top = 20.dp) ) { HorizontalPager( pageCount = pageCount, state = pageState, modifier = Modifier .fillMaxSize() .height(200.dp) .background(Color.LightGray), ) { page -> Text( text = textList[page], fontSize = 30.sp, fontWeight = FontWeight.ExtraBold, ) } HorizontalPagerIndicator( pagerState = pageState, modifier = Modifier .align(Alignment.BottomCenter) .padding(15.dp) ) } } @Preview(showBackground = true) @Composable fun GreetingPreview() { ShopExTheme { ShopEx() } } build.gradle.kts dependencies { implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") implementation("androidx.activity:activity-compose:1.8.2") implementation(platform("androidx.compose:compose-bom:2023.03.00")) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") testImplementation("junit:junit:4.13.2") implementation ("com.google.accompanist:accompanist-pager:0.20.2") implementation ("com.google.accompanist:accompanist-pager-indicators:0.20.2") implementation ("com.google.accompanist:accompanist.pager.PagerState") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") }
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
트와이스 사진첩 강의에서
원래 기기에 따라 이미지가 찌그러져 나오는 경우도 있나요?
-
미해결냉동코더의 알기 쉬운 Modern Android Development 입문
searchBooks() 에서 북 검색 입력을 너무 빨리 할 경우 마지막 글자로 검색이 안돼요.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 아래 코드를 private fun searchBooks() { var startTime = System.currentTimeMillis() var endTime: Long binding.etSearch.text = Editable.Factory.getInstance().newEditable(searchViewModel.query) binding.etSearch.addTextChangedListener { text: Editable? -> endTime = System.currentTimeMillis() if (endTime - startTime >= SEARCH_BOOKS_TIME_DELAY) { text?.let { val query = it.toString().trim() if (query.isNotEmpty()) { searchViewModel.searchBooksPaging(query) searchViewModel.query = query } } } startTime = endTime } }아래처럼 바꿔봤는데 입력 시마다 runnable을 매번 생성하는데 문제 되진 않을까요? 코틀린에 익숙치 않아서 더 좋은 방법이 있다면 알고 싶습니다. private var handler: Handler = Handler(Looper.getMainLooper()) var runnable: Runnable? = null private fun searchBooks() { binding.etSearch.addTextChangedListener { text: Editable? -> if (runnable != null) { handler.removeCallbacks(runnable!!) } // 텍스트 입력 후 N 초 간 입력 없으면 검색 실행 runnable = Runnable { text?.let { Log.d(TAG, "text:$it"); val query = text.toString().trim() if (query.isNotEmpty()) { bookSearchViewModel.searchBooks(text.toString()) bookSearchViewModel.query = query } } } handler.postDelayed(runnable!!, Constants.SEARCH_BOOKS_TIME_DELAY) } }
-
미해결2시간으로 끝내는 코루틴
코루틴 취소 관련 질문
fun main(): Unit = runBlocking { val job = launch { var i = 1 var nextPrintTime = System.currentTimeMillis() while (i <= 5) { if(nextPrintTime <= System.currentTimeMillis()){ printWithThread("${i++}번째 출력!") nextPrintTime += 1_000L } } } delay(100L) job.cancel() }수업 때 예시로 보여주신 코드인데 이 코드는 "5번째 출력!"까지 출력하고 끝이 나는데요. 반면에 아래 코드는 한번만 출력하고 끝이 납니다.fun main(): Unit = runBlocking { val job = launch { var nextPrintTime = System.currentTimeMillis() repeat(5) { if (nextPrintTime <= System.currentTimeMillis()) { printWithThread("${it + 1}번째 출력!!") nextPrintTime += 1_000L } } } delay(100L) job.cancel() }이는 단순히 repeat문이 무한루프가 아니어서 나오는 차이일까요?
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
타이틀바
저 앱실행시킬때 타이틀바를 없애는 부분을 보고있는데요. 저는 앱실행시키면 처음부터 타이틀 바가 안나오고 theme.xml도 영상과는 다르게 되어 있는데 그럼 굳이 안해도 상관 없는건가요?버전은 androidstudio hedgehog입니다.