티스토리

Silver
검색하기

블로그 홈

Silver

silvergal.tistory.com/m

♪(v^_^)v

구독자
2
방명록 방문하기

주요 글 목록

  • [JAVA] String.matches() vs String.contains() 알고리즘 문제를 풀다가 정규표현식 문제를 만났다. String.matches()를 사용해서 푸는 문제였는데 contains()와 무엇이 다를까? 둘다 공통점은 반환값이 특정 값이 문자열에 포함되어있으면 true 아니면 false를 반환한다는 점이다. String.matches() matches()는 인자로 정규표현식을 받는다. 만약에 인자로 정규표현식이 아닌 문자열이 온다면 '포함'이 아니라 '정확히' 일치해야 한다. public class MatchesTest{ public static void main(String[] args){ String str = "my java test"; //정규표현식 사용 안할때 정확히 일치해야 한다 System.out.println( str.matches("java") .. 공감수 0 댓글수 0 2022. 5. 2.
  • [JAVA] replace와 replaceAll의 차이점 replace와 replaceAll이 결과값이 똑같이 나오는데 무엇이 다르냐? - replace함수의 첫번재 매개변수는 바꿀 문자열을 넣는다. - replaceAll함수의 첫번재 매겨변수는 정규식을 넣는다. 따라서, 특수문자가 포함된 문자열을 바꿀 경우에는 replaceAll을 사용해야한다. 공감수 0 댓글수 0 2022. 4. 20.
  • [JAVA] String.format을 이용한 문자열 형식 설정 프로그래머스 문제를 풀다가 String함수에 대한 것을 정리하고 익히기 위해 포스팅을 하기로 결심! String의 format 메서드는 문자열의 형식을 설정하는 메소드이다. 1. %d (10진수) 2. %s (문자열 형식) 3. %f (실수형 형식) 4. %t (날짜시간 형식) 5. %c (유니코드 문자 형식) 6. %o, %x(8진수, 16진수) 간단하게 10진수, 문자열, 실수형까지만 다뤄보겠다. 예시) 1. %d int i = 23; System.out.println(String.format("%d", i)); System.out.println(String.format("%5d", i)); System.out.println(String.format("%-5d", i)); System.out.prin.. 공감수 0 댓글수 0 2022. 4. 20.
  • [안드로이드] Fragment위에 Fragment 올리기 (TabLayout & BottomNavigation) 이번 포스팅은 BottomNavigation 위에 프래그먼트를 올리고, 그 프래그먼트에 탭 레이아웃을 적용하여 또 프래그먼트를 올리는 것을 정리할 것이다. 우선 필요한 준비물은 BottomNavigationView이니 만들어보자. 1. activity_main.xml activity_main.xml에 BottomNavigationView와 탭레이아웃을 올릴 FrameLayout을 만들어준다. 2. menu_bottom_navi.xml 그리고 bottomNavigation에 들어갈 각각의 item을 만들어준다. 3. 각각 item에 대한 Fragment.kt 만들기 class MyPageFragment : BaseFragment(FragmentMyPageBinding::bind, R.layout.fragm.. 공감수 0 댓글수 0 2022. 3. 18.
  • [안드로이드] No type arguments expected for class Call 에러 제목과 같은 오류를 발견한다면 import를 먼저 확인해보자. import android.telecom.Call 라고 되어있으면 지우고 import retrofit2.Call 를 추가해주자. 그러면 빨간줄이 없어진 것을 확인할 수 있따. 공감수 0 댓글수 0 2022. 3. 15.
  • [안드로이드] Recyclerview footer 사용 안드로이드 Recyclerview footer 사용법에 관한 포스팅이다. Header도 마찬가지로 같은 방법을 적용하면 된다. 1. footer.xml 추가 2. Adapter에 Footer에 대한 처리 구현 getItemCount에 헤더,풋터 개수 포함 (지금 포스팅은 풋터만 해당되므로 +1만 해줌) getItemViewType에 position에 따른 타입 반환 추가 각 타입에 따른 ViewHolder class 추가 onCreateViewHolder에서 각 타입에 따른 ViewHolder Class 반환 추가 onBindViewHolder에 각 ViewHolder에 따른 처리 추가 package com.example.api_practice.src.main.today.now import android.. 공감수 0 댓글수 0 2022. 3. 15.
  • [안드로이드] RecyclerView Drag & Drop 구현 (GridLayout) 그리드레이아웃을 가진 리사이클러뷰 드래그앤드롭을 구현하였는데, 까먹기 전에 정리하려고 한다. 필요한 준비물은 MyTouchHelperCallback 코틀린파일과 DragAndDropAdapter 구현해야한다. (당연히 RecyclerView는 다 구현이 되어있어야겠죠?) MyTouchHelperCallback.kt ItemTouchHelper를 사용하기 위해서 ItemTouchHelper.CallBack을 구현해야한다. import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView class MyTouchHelperCallback( private val itemMoveListener: O.. 공감수 0 댓글수 0 2022. 2. 27.
  • [안드로이드] TabLayout + Fragment 사용하기 1. activity_main.xml에 TabLayout 추가 2. activity_main.xml 에 fragment 태그 추가하기 3. fragment.xml, Fragment.kt 만들기 4. MainActivity 탭 메소드, 프래그먼트 객체화해주기 1. activity_main.xml에 TabLayout 추가 2. activity_main.xml 에 fragment 태그 추가하기 태그안에 name을 꼭 지정해주어야한다. 3. fragment.xml, Fragment.kt 만들기 탭을 두개 만들었으니 xml과 코틀린 파일도 각각 두개 만들어야한다. 위에는 랭킹 xml 아래는 즐겨찾기 코틀린 파일. package com.example.rc_4.Fragment data class Shoppingmal.. 공감수 0 댓글수 0 2022. 2. 27.
  • [안드로이드] 스크롤 시 체크박스 해제되는 문제 해결 RecyclerView를 사용하다보면 좋아요 등 체크박스가 들어가 있는 레이아웃을 볼 수 있는데, 스크롤을 하면 체크박스가 유지되지 않고 풀려버리거나 생뚱맞게 다른 체크박스가 눌려져있는 것을 확인할 수 있다. 이것을 또 까먹기 전에 정리하려 한다. 우선, 체크박스가 왜 갑자기 해제되냐? RecyclerView는 뷰 객체를 한번에 생성하는 것이 아니라 계속 재활용해서 사용하기 때문에 스크롤했다가 다시 돌아오면 새로 초기화되어서 보여주기 때문이다. 그렇다면 어떻게 해결하면 좋을지 차근차근 살펴보자! 순서 1. 데이터 클래스 추가 (체크한 객체에 대한 현재값 저장) 2. 데이터 리스트 생성 3. 어댑터 수정 1. 데이터 클래스 추가 (체크한 객체에 대한 현재값 저장) 따로 체크박스에 대한 클래스를 만들어준다... 공감수 0 댓글수 0 2022. 2. 27.
  • [안드로이드] RecyclerView 사용하기 ( + ViewBinding, Fragment) 이번 포스팅은 RecyclerView를 사용법을 정리해볼건데, 인터넷에 나와있는 방법은 ViewBinding을 사용한 코드는 별로 없는 것 같아서 정리해보고자 한다. 이번에도 지그재그 어플을 본따서 만들예정. 순서 1. activity_main.xml에 RecyclerView추가 2. item.xml 만들기 3. DataClass 생성 4. Adapter 생성 5. MainActivity에 Adapter와 RecyclerView를 연결하기 1. fragment_main.xml에 RecyclerView추가 지금 저 스크롤뷰는 무시해주시고,,, RecyclerView를 붙여줍니다. 2. item.xml 만들기 리사이클러뷰에 들어갈 아이템 레이아웃을 만들어줍니다. 3. DataClass 생성 데이터클래스를 만.. 공감수 0 댓글수 0 2022. 2. 27.
  • [안드로이드] ListView 사용하기 순서 1. activity_main.xml에 listview 추가 2. listview_item.xml 만들기 3. data class 만들기 4. MainActivity에 ArrayList 만들기 5. ArrayList 만들어서 add로 데이터 넣기 6. Adapter 만들기 (BaseAdatper 상속) 7. MainActivity에 Adapter 셋팅하고, ListView에 셋팅한 Adapter 넣기 어휴 굉장히 복잡한게 하나씩 까먹기 전에 해보자! 나같은 경우는 Activity위에 ListView를 올리는 작업은 인터넷에 많이 있기도 하고,, Fragment에 ListView를 사용해보았다. 그리고 지그재그 클론코딩 중이다! 1. activity_main.xml에 listview 추가 위의 화면은.. 공감수 0 댓글수 0 2022. 2. 27.
  • [안드로이드] 둥근 모서리 배경 만들기 darkgray.xml를 생성하고 위의 코드를 넣는다. 모서리의 둥근 정도를 조절하고 싶으면 태그의 radius값으로 조절하면 된다. 높으면 높을수록 둥근 형태. 공감수 0 댓글수 0 2022. 2. 25.
  • [안드로이드] RecyclerView, ListView 어플리케이션을 사용하다보면 가장 많이 볼 수 있는 형태가 리스트형태이다. ListView와 recyclerView로 구현할 수 있는데, 이것이 어떻게 다른지 알아보자 ListView 사용자가 정의한 데이터 목록을 세로 방향으로 나열하여 화면에 표시하는 뷰 그룹의 한 종류이다. 간단하게 리스트를 만드는 부분에 있어서 장점을 가지고 있다. 간단한 아이템 형태를 만드는 경우에는 빠르게 적용이 가능한 ArrayAdapter를 제공한다. 아이템 클릭 리스너가 인터페이스로 존재한다. 하지만 아이템을 재사용하지 못함. 따라서 아이템을 생성할 때마다 뷰 바인딩을 계속해주어 성능저하가 일어남 RecyclerView 리사이클러뷰는 목록을 화면에 출력해주고 동적으로 편하는 컨테이너이다. RecyclerView는 ListVI.. 공감수 0 댓글수 0 2022. 2. 25.
  • [안드로이드] statusbar(상단바) 변경 어플을 구현하다보면 핸드폰 위의 배터리와 시계 등을 표시하는 상단바의 색깔이 굉장히 촌스러워서 바꾸고 싶어질때가 있다. 다음번에 또 써먹기 위해 작성을 해보겠다. 우선 프로젝트의 res - values - colors.xml 을 열어준다. 그리고 자신이 적용하고 싶은 색깔을 지정해준다. 그 다음 res - themes - themes.xml 을 열어준다. 그 다음에 item을 추가해주는데 원래 안드로이드 스튜디오가 가지고 있던 statusBarColor는 주석처리 또는 없애야한다. 그러면 깔끔하게 자신이 지정한 색으로 statusBar로 변경할 수 있다 😀 공감수 0 댓글수 0 2022. 2. 23.
  • [안드로이드] kotlin.NotImplementedError: An operation is not implemented: Not yet implemented 오류 탭레이아웃과 프래그먼트를 붙이는 과정에서 생긴 오류... 알고보니 이건 implement members를 통해 자동으로 구현된 메소드에 있던. todo의 문제였다. 이것을 지우면 해결... ^^;; 공감수 0 댓글수 0 2022. 2. 21.
  • [2주차/과제] 생명주기를 활용 + BottomNavigation, Fragment 당근마켓 로그인 화면 (당근마켓은 id,pw를 사용하는 다른 어플들과 달리 휴대폰 번호로 바로 로그인 가능) onCreate() : 당근마켓 휴대폰 번호 sharedpreferences에 저장 onStart() : 로그인을 했다면 바로 메인 화면으로 UI 설정 onPause() : 앱 최소화하고 다시 들어오면 EditText hint속성을 ‘다시 입력해주세요’ 로 변경 onPause(), onResume() : 앱을 최소화하고 다시 들어와도 EditText 유지 onResume() : EditText 유지는 원래 있는 기능이라 작성중인 EditText를 초기화해주는 걸로 변경 onCreateView : 로그아웃 버튼을 누르면 SharedPreferences에 유저정보 지우고 로그인 화면으로로 이동 → H.. 공감수 0 댓글수 0 2022. 2. 19.
  • [안드로이드] startActivityForResult()와 registerForActivityResult() startActivityForResult()를 썼는데 안드로이드 스튜디오에서 밑줄이 쳐져있어서 궁금해서 찾아봤다. 옛날에는 썼던 기억이 있는데 지금은 왜 deprecated 됐는가? startActivityForResult 호출한 액티비티로부터 결과를 받아오기 위해 startActivityForResult를 사용했다. 하지만 2020년 5월 기준으로 사용되지않고 registerForActivityResult 메소드가 생겨났다. 위 코드는 클릭했을 때 REQUEST_CODE_CATEGORY_ACTIVITY라는 request 코드를 가지고 CategoryActivity로 이동하는 코드이다. CategoryActivity에서 작업을 마치고 돌아올 때 그대로 requestCode가지고 원래 액티비티로 돌아오게 .. 공감수 0 댓글수 0 2022. 2. 18.
  • [2주차] 안드로이드 Frament 생명주기 Activity에 이어서 Frament까지 생명주기가 존재한다. 따라서 Fragment의 Lifecycle에 대해서도 알아보도록 하자. Fragment 란? 프래그먼트(Fragment)란 하나의 액티비티가 여러 개의 화면을 가지도록 만들기위해 고안된 개념이다. 여러 개의 레이아웃을 보여주기 위해 액티비티를 사용할 수 있는데, 액티비티의 경우 생명주기 관계나 여러 구조적인 문제들때문에 프래그먼트라는 개념이 나오게 되었다. Fragment를 사용하는 이유 액티비티는 프래그먼트보다 비교시 상대적으로 무겁다. 하지만 Fragment는 단독으로 존재할 수 없기에 Activity의 존재는 필수적이다. 액티비티에 비해 가볍게 추가/제거가 가능하다. 액티비티 스택에 액티비티를 쌓아두기보다 프래그먼트백스택에서 프래그먼트.. 공감수 0 댓글수 0 2022. 2. 18.
  • [2주차] SharedPreferences 사용법 개발을 하다보면 앱의 데이터들을 저장하여 관리해야한다. 데이터의 양이 많거나 중요한 데이터라면 DB나 서버를 통해 저장을 하면 되지만 간단한 문자열이나 설정 값은 DB에 저장하기보다는 안드로이드에서 기본적으로 제공하는 SharedPreferences를 사용하여 데이터를 관리하면 편리하다. 주로, 초기 설정 값이나 자동 로그인을 제어할 때 사용한다. SharedPrefernces 데이터를 파일 형태로 저장하며 앱 폴더 내에 저장되므로 앱을 삭제하면 당연히 데이터도 삭제된다. 파일의 위치는 다음과 같다. data/data/(package_name)/shared_prefs/SharedPreference SharedPreferences 클래스 작성하기 데이터를 타입에 따라 관리하기 때문에 따로 클래스를 만들어서.. 공감수 0 댓글수 0 2022. 2. 15.
  • [2주차] 안드로이드 생명주기 액티비티는 안드로이드 4대 컴포넌트 중에 하나이다. 4대 컴포넌트 중에서도 가장 중요하다. 생명주기 생명주기는 액티비티가 생성, 정지 재생, 종료 등 일어나는 상태 변화와 그에 따른 콜백 메소드를 총칭한다. 액티비티는 활동이 상태변화를 알아차릴 수 있는 여러 콜백을 제공한다. 예를 들어서 카카오톡을 실행시켰다가 유튜브를 실행시켰을 경우, 유튜브를 실행시켰다가 카카오톡을 실행시키면 처음부터 보이는 것이 아닌 진행상태를 다시 보여주는 경우, 화면이 가로 방향과 세로 방향으로 회전할 경우, 앱을 실행하다가 전화왔을 경우 등등.. 이러한 상태변화를 알려주는 여러 메소드들이 있다. 해당 메소드는 아래에서 설명한다. 생명주기가 필요한 이유? 액티비티가 변화할 때 발생하는 문제들을 사전에 방지할 수 있다. 1. 앱 .. 공감수 0 댓글수 0 2022. 2. 14.
  • [1주차/피드백] 레이아웃 클론 코딩 (추가 과제) 1주차 피드백 전체적으로 조사가 미흡함 (palette, layout..) Layout 활용을 다 하지 못함 1주차 추가 과제 인스타 레이아웃 클론 코딩 완성화면 레이아웃 구조 코드 어려웠던 점 인스타 스토리에서 볼 수 있는 그라데이션 테두리, 회색 테두리를 어떻게 구현할 지 헤맸음 내 스토리에서 볼 수 있는 플러스 이미지(오른쪽 하단밑)와 내 이미지의 중첩을 위해서 프레임레이아웃안에 내 프로필 이미지를 넣고 리니어레이아웃안에 플러스 버튼 이미지를 넣었다. 여기에 위에서 언급한 회색 테두리를 넣어야 했다.. bottomNavigationView에서 클릭했을 때 색 변하게 하는 것을 조금 헤맸다. 인스타 블랙모드로 하면 밑에바도 블랙이기때문에 background를 black을 주고 아래 코드를 넣었더니 아.. 공감수 0 댓글수 0 2022. 2. 12.
  • [안드로이드] Manifest merger failed: Apps targeting Android 12 오류 해결 manifest.xml에 아래코드를 삽입하면 해결되었다. android:exported="true" 전체 코드 - 참고 공감수 0 댓글수 0 2022. 2. 11.
  • [1주차/과제] Layout 구축 연습 완성화면 완성 코드 레이아웃 요약 굉장히 레이아웃을 많이 썼다.. 이게 맞는걸까 구축하다가 생긴 문제점 해결과 의문점 안에 맨 왼쪽에는 글씨를 넣고 맨 오른쪽에는 사진을 넣고 싶을 때 가운데 를 넣는 행위 글씨는 layout_gravity="left"를 하고 사진은 layout_gravity="right"를 했는데 양 쪽으로 움직이지 않았다. 하지만 가운데에 아래 코드를 삽입하니 해결하였다. TextView를 넣을 때 textSize로 크기를 조절해주는 것이 좋을지 width, height로 조절해주는 것이 좋을지 scrollView는 자식View가 하나만 존재해야한다. scrollView안에 리니어레이아웃과 렐러티브레이아웃을 두었다가 오류가 생겼음. 를 써서 이미지를 넣을 때 크기를 match_pare.. 공감수 0 댓글수 0 2022. 2. 11.
  • [안드로이드] Layout 종류 안드로이드 앱을 개발하기 위해서는 화면이 반드시 필요하고 화면에 보이는 구성 요소를 모두 뷰(VIEW)라고 한다. Button, Text, Image 등 뷰들을 화면에 배치해야한다. 그러나 뷰 자체로는 자신이 어디에 배치되어야하는지 정보를 가지고 있지 않다. 따라서 뷰를 화면에 배치하는 무언가가 필요하고 그 무언가가 View Group 이다. 안드로이드에서는 이러한 View Group을 상속받는 여러 Layout 클래스를 제공한다. 레이아웃의 종류도 여러가지고 쓰임새가 다 다르기때문에 성질을 파악해야 한다. 1. LinearLayout (리니어 레이아웃) linear(선의, 선형의)의 뜻처럼 가로나 세로 방향으로 일열로 나열할 때 사용한다. 뷰의 위치를 지정하지 않아도 중첩되지않고 나열된다. 2. Rel.. 공감수 0 댓글수 0 2022. 2. 8.
  • [안드로이드] Button 속성 Button Button은 TextView를 상속하기에 TextView의 대부분의 옵션을 그대로 사용 가능하다. Button 예시 속성 Button 텍스트가 있는 버튼은 Button 클래스를 사용한다. ImageButton 아이콘이 있는 버튼은 ImageButton을 사용한다. 만약, 텍스트와 아이콘이 둘 다 있는 버튼을 사용하고 싶으면 Button 클래스의 drawableLeft 속성을 사용하면 된다. Style 버튼의 스타일을 지정해준다. 만약, 테두리가 없는 버튼을 만들고 싶다면 borderlessButtonStyle을 사용하면 된다. - 참고 버튼 | Android 개발자 | Android Developers 버튼 버튼은 사용자가 터치할 때 어떤 작업이 발생하는지 알려주는 텍스트나 아이콘 또는 텍.. 공감수 0 댓글수 0 2022. 2. 8.
  • [안드로이드] EditText 속성 EditText 란? 사용자에게 입력받는 View. TextView를 상속받고 있다. Edit Text 예시 속성 lines 화면에서 입력창이 차지하는 줄 수를 의미한다. 3으로 지정했을 경우 3줄의 입력창이 보이나 그 이상을 입력하면 크기는 고정이고 스크롤이 생긴다. gravity 입력할 글자의 위치를 지정한다. left, top, center, right로 위치 정렬이 가능하다 ems edit Text의 최초 기본 너비를 설정한다. inputType 입력값의 종류를 설정한다. 입력값의 종류에 따라 키보드의 종류가 달라진다. 속성값 설명 none 디폴트 값. 모든 문자 입력 가능하며 줄 바꿈 가능 text none과 동일하고 줄 바꿈만 불가능합니다.(정해진 라인수 이상 입력은 불가능) textCapCh.. 공감수 0 댓글수 0 2022. 2. 8.
  • [안드로이드] ImageView 속성 TextView에 이어서 ImageView에 대해서도 공부해보자. ImageView View의 상속을 받는다. ImageView 예시 backgroud 화면에 표현할 이미지를 설정한다. 이미지의 padding이 적용이 되지 않는다. 즉, ImageView 전체를 덮는다. src 화면에 표현할 이미지를 설정한다. 이미지의 padding이 적용된다. maxwidth, maxHeight 화면에 출력되는 이미지의 최대 크기를 지정한다. adjustViewBounds 이미지 크기를 변경할 때 해당 속성을 true로 설정하면 가로세로 비율을 유지한다. tint 이미지의 색 필터를 입힐 때 사용한다. RGB 컬러 코드를 입력하면 된다. - 참고 공감수 0 댓글수 0 2022. 2. 8.
  • [안드로이드] TextView 속성 지난번에 안드로이드 팔레트 컴포넌트에 대해서 살펴보았다. 이번에는 TextView, ImageView, EditText, Button 속성에 대해서 살펴볼 것! 해당 포스팅은 TextView에 대해서 전부는 아니지만 중요한 것을 알아볼 것이다. TextView View의 상속을 받는다. TextView 예시 속성 text textView에 표시할 내용이다. 사진에는 "Hello World"가 입력되어있으니 화면에도 Hello World가 보여질 것이다. typeface 출력할 텍스트의 폰트 종류를 정하는 옵션이다. 네 개의 옵션(nomal, sans, serif, monospace)이 기본적으로 주어진다. 만약 커스텀 폰트를 사용하려면 폰트파일(.ttf)를 assets 폴더 안에 복사한 후에 자바 코드에.. 공감수 0 댓글수 0 2022. 2. 8.
  • [안드로이드] 팔레트 (palette) 총정리 - 마지막 3편에 이어서 진짜 마지막!! 컴포넌트를 정리할 것이다. 5. Helpers Group ConstraintLayout에서 제공하는 helper 중 하나로 여러 뷰들의 visibility를 그룹으로 묶어 관리하기 편하게 해준다. Barrier (Horizontal) 가상장벽(가이드라인)을 만들어 해당 Barrier에 연관된 뷰들이 크기/위치가 Barrier에 맞게 변경된다. 즉, 동적으로 뷰의 크기가 변경된다는 것. Barrier (Vertical) Barrier를 수직으로 설정할 수 있다. Flow Flow는 기존에 ConstraintLayout에서 CSS의 Flexbox와 비슷한 형태의 동작을 가능하게 하는 VirtualLayout이다. Guideline (Horizontal) 가로축 방향을 가진 가상.. 공감수 0 댓글수 0 2022. 2. 7.
  • [안드로이드] 팔레트 (palette) 총정리 - 3 2편에 이어서 이어서 작성하도록 할 것이다. 원래 위젯다음이 레이아웃인데 레이아웃은 다룰 내용이 많아서 별도로 빼기로 하고 그 다음 순서인 Containers에 대해서 알아보자. 4. Containers 컨테이너는 상당히 다룰 내용이 많다.... 휴 Spinner 여러개의 값 중 1개를 선택하기 위해 사용하는 안드로이드에서 제공해주는 기본 위젯 중의 하나이다. Radio Button도 여러개 중 1개를 선택하는 위젯인데, 위의 사진과 같이 밑에 선택지가 주르륵 뜬다는 점에서 Radio Button과 차이점을 보인다. RecyclerView 사용자가 관리하는 많은 수의 데이터 집합 (Date Set)을 개별 아이템 단위로 구성하여 스크롤이 가능한 컨테이너에 여러 개의 뷰를 담아서 화면에 출력하는 뷰그룹(V.. 공감수 0 댓글수 0 2022. 2. 7.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

    티스토리는 카카오에서 사랑을 담아 만듭니다.

    © Kakao Corp.