MainActivity.kt

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DefaultTheme {
                CalendarApp()
            }
        }
    }
}

@Composable
fun CalendarApp(){

    // 시간에 대한 정보
    val calendarInstance = Calendar.getInstance()
    val time = remember {
        mutableStateOf(calendarInstance)
    }

    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(20.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        CalendarHeader(time)
        CalendarHeaderBtn(time)
        CalendarDayName()
        CalendarDayList(time)
    }

}

@Composable
fun CalendarHeader(date: MutableState<Calendar>) {

    // xxxx년 00월
    val resultTime = SimpleDateFormat("yyyy년 MM월", Locale.KOREA).format(date.value.time)

    Text(
        text = resultTime,
        fontSize = 30.sp
    )

}

@Composable
fun CalendarHeaderBtn(date: MutableState<Calendar>) {

    Row(
        modifier = Modifier
            .fillMaxWidth()
            .padding(top = 30.dp, bottom = 30.dp),
        horizontalArrangement = Arrangement.SpaceBetween
    ) {

        Button(onClick = {
            val newDate = Calendar.getInstance()
            newDate.time = date.value.time
            newDate.add(Calendar.MONTH, -1)
            date.value = newDate
        },
        colors = ButtonDefaults.buttonColors(
            containerColor = Color.Black
        )
        ) {
            Text(
                text = "<",
                color = Color.Green
            )
        }

        Button(onClick = {
            val newDate = Calendar.getInstance()
            newDate.time = date.value.time
            newDate.add(Calendar.MONTH, +1)
            date.value = newDate
        },
        colors = ButtonDefaults.buttonColors(
            containerColor = Color.Black
        )
        ) {
            Text(
                text = ">",
                color = Color.Green
            )
        }
    }

}

@Composable
fun CalendarDayName() {

    val nameList = listOf("일", "월", "화", "수", "목", "금", "토")

    Row() {
        nameList.forEach {

            Box(
                modifier = Modifier.weight(1f),
                contentAlignment = Alignment.Center
            ) {
                Text(
                    text = it,
                    fontSize = 18.sp,
                    fontWeight = FontWeight.ExtraBold
                )
            }

        }

    }

}

@Composable
fun CalendarDayList(date: MutableState<Calendar>){

    // 2023년 7월

    // 달력 그리는 공식 -> Jetpack Compose로 달력 모양 그리는지

    date.value.set(Calendar.DAY_OF_MONTH, 1)

    val monthDayMax = date.value.getActualMaximum(Calendar.DAY_OF_MONTH) // 현재 달의 max
    val monthFirstDay = date.value.get(Calendar.DAY_OF_WEEK) - 1 // 1일이 무슨 요일부터인지
    val monthWeeksCount = (monthDayMax + monthFirstDay + 6) / 7 // 현재 달의 week 갯수

    Log.d("monthDayMax", monthDayMax.toString())
    Log.d("monthFirstDay", monthFirstDay.toString())
    Log.d("monthWeeksCount", monthWeeksCount.toString())

    Column() {
        repeat(monthWeeksCount) {week ->

            Row() {
                repeat(7) { day ->

                    // 날짜 구하는 공식
                    val resultDay = week * 7 + day - monthFirstDay + 1

                    if(resultDay in 1 .. monthDayMax) {

                        Box(
                            modifier = Modifier
                                .weight(1f)
                                .padding(10.dp)
                            ,
                            contentAlignment = Alignment.Center
                        ) {
                            Text(
                                text = resultDay.toString(),
                                fontSize = 25.sp
                            )
                        }

                    } else {
                        Spacer(modifier = Modifier.weight(1f))
                    }

                }
            }

        }
    }

}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    DefaultTheme {
        CalendarApp()
    }
}