6자리의 로또 번호를 랜덤으로 만드는 앱
드로버블에 대한 공식 설명 : https://developer.android.com/guide/topics/resources/drawable-resource?hl=ko
--> 이중에서 Shape Drawable을 사용할 것임
노란 원의 숫자는 직접 선택한 것, 나머지 숫자는 자동생성으로 생성한 것
안드로이드 스튜디오에 프로젝트 속에 resource폴더 안에 drawable폴더가 있는데, 여기에는
이미지나 화면을 그릴 수 있는 것들이 들어있음 --> 그것이 대한 부분임
--> 간단한 background를 만들 때 많이 사용됨
아래와 같이 xml형식으로 되어 있는 문법을 이용해서 drawable객체를 생성하는 방법을 말하는 것
[Shape Drawable 예시]
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle" | "oval" | "line" | "ring"] >
<corners
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer" />
<gradient
android:angle="integer"
android:centerX="float"
android:centerY="float"
android:centerColor="integer"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type=["linear" | "radial" | "sweep"]
android:useLevel=["true" | "false"] />
<padding
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer" />
<size
android:width="integer"
android:height="integer" />
<solid
android:color="color" />
<stroke
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer" />
</shape>
일반적으로 png와 같은 이미지파일을 앱에 넣고, 그 이미지파일을 bitmap형식으로 변환한 다음에 안드로이드 앱에서 그리게 됨
--> 간단한 background를 만들 때 많이 사용됨
1. res폴더에 drawable폴더에 우클릭 -> New에 Drawable Resource File 클릭
2. xml파일을 이름을 적은 후 생성
( 이번에는 노란 동그라미를 표현한 xml파일을 만들 것이므로 yellow_circle이라고 지음 )
3. 대략 이런 형식으로 코드가 만들어지는데, 우리는 ShapeDrawable을 이용해서 그릴 것이므로 selector태그를 지우고 shape태그를 넣음
( selector 태그 지우고 shape태그를 넣음 )
이후 shape속성을 넣으면서 자동으로 참조가 됨
4. 최종적으로 이런식으로 모양, 색, 크기 등등을 넣어서 구성함
5. 이렇게 생성한 Shape Drawable을 layout에 적용함
--> drawable 값을 가져오는 부분인데 drawable이 안드로이드 앱에 저장된 것이기 때문에 Context에서 가져올 필요가 있음
ContextCompat을 이용해서 Context에 접근
이후 접근한 Context에서 getDrawable함수를 이용해서 Drawable에 접근
getDrawable 함수는 첫번째 파라미터로 현재 위치를 받고, 두번째 파라미터로 DrawableResourceID 가 필요하므로 R에 drawable항목에 저장되어 있는 해당 ShapeDrawable의 주소를 넣어준다.
Collection에 대한 kotlin 공식문서 : https://kotlinlang.org/docs/collections-overview.html
[ Collection타입의 상속 구조 ]
목록의 의미
데이터가 저장되거나 삭제가 될 때 순서를 지키는 자료구조
index(색인)을 이용해서 데이터를 가져오거나 집어넣거나 삭제하거나 등등의 작업이 순차적으로 가능하다
항상 순서를 지키기 때문에 예를들어 10개의 데이터에서 4번째 데이터를 삭제한다고 해도 나머지 데이터들은 순서를 지킨다.
집합의 의미
동일한 데이터가 존재할 수 없는 집단인 자료구조
순서보장은 되지 않지만, 중복된 데이터가 있을 순 없는 특징이 있음
1대1로 맵핑하다의 의미
key : value 형식의 자료구조
키를 통해 데이터에 접근하는 방식이기 때문에 키는 중복될 수 없음
--> listOf(), mutableListOf(), setOf(), mutableSetOf()
--> 파라미터의 내용을 가지는 list를 반환
--> 위쪽에 Collection 타입의 상속 구조를 보면 mutableList는 List를 상속받는다는 것을 알 수 있음 ( List와 MutableList는 부모 자식 관계 )
즉, List에 내용을 변경하는 기능을 추가한 것이 mutableList임
또한 List로 선언된 변수에 MutableList를 넣을 수 있지만, MutableList를 요구하는 곳에 List를 넣을 수 없는 것도 추론할 수 있다.
[ listOf함수를 사용하여 list만들기 ] --> 일반 list반환
--> immutable( 불변적 )이므로 반환한 list의 내용을 변경할 수 없음
[ mutableListOf함수를 사용하여 list만들기 ] --> list를 상속받아 내용 변경기능을 추가한 mutableList를 반환
--> mutable( 가변적 )이므로 반환한 list의 내용을 변경할 수 있음
--> 위의 List의 경우와 동일하다.
--> mutableSetOf로 생성되는 MutableSet의 경우 내용 변경이 가능하기 때문에 위와 같이 내용없이 만들기도 한다.
( 단, 제네릭으로 내용의 타입을 선언해줘야한다. )
setOf로 Set집합을 만들 경우, immutable이기 때문에 내용 변경이 불가능하다.
그리고 mutableSetOf로 MutableSet집합을 만들 경우, mutable이기 때문에 내용 변경이 가능해진다.
--> 그리고 이는 위의 list와 같이 MutableSet집합이 Set집합을 상속받은 것이며, 내용을 변경하는 기능을 추가한 것이기 때문에 그런 것이다.
--> 다른 Collection자료구조들과 비슷하게 이런 식으로 key와 value를 매핑하여 생성
--> 빈 Mutable계열 자료구조를 생성시 코드의 가독성을 높이기 위한 함수들
emptyList() --> 빈 MutableList를 만들 수 있다.
emptySet() --> 빈 MutableSet을 만들 수 있다.
emptyMap() --> 빈 MutableMap을 만들 수 있다.
--> 위에처럼 그냥 mutableListOf, mutableSetOf등의 함수를 사용해서 빈 자료구조를 만드는 것과 동일하지만,
이 함수를 사용하는 것으로 빈 Mutable계열 자료구조를 생성시 코드의 가독성을 높일 수 있다.
Collection.size --> 해당 자료구조의 데이터수를 리턴해줌
Collection.forEach {}
--> 해당 자료구조의 데이터를 하나하나 파라미터로 받아서 뒤의 {}블록( 람다함수 ) 실행 ( it 으로 파라미터에 접근 가능 )
Collection.forEachIndexed { index, i -> 람다함수내용 }
--> 바로 위의 forEach와 동일하지만 그 데이터의 순서까지 파라미터로 받아줌
Collection의 확장함수들에 대한 문서 : https://kotlinlang.org/docs/collection-operations.html#common-operations
--> 여기 정리되어 있으므로, 필요하면 볼 것
--> 아래에 있는 것 이외에도 수많은 확장함수들이 있음
--> kotlin은 확장함수를 기본적으로 제공하기 때문에 Java에 비해
Collection에서도 유용한 확장함수들이 다수 존재한다.
확장함수?
--> "Collection.확장함수()" 처럼 뒤에 붙는 형식으로 사용되는 함수들
( 확장되는 모양새 라고 하여 확장함수 라고 함 )
예를 들어 )
a가 리스트라고 할 때,
a.isEmpty()
와 같이 사용된다.
해당 Collection이 비어있으면 True반환, 비어있지 않으면 False반환
해당 Collection이 비어있으면 빈 Collection( list면 빈 list, map이면 빈 map 등 ) 반환,
비어있지 않으면 정상적으로 반환
List의 index에 해당하는 순서의 데이터를 반환
List의 내용을 오름차순으로 정렬해줌
List의 마지막부터 number만큼의 숫자까지의 데이터를 반환
해당 Collection에 파라미터에 해당하는 데이터가 있으면 True반환, 없으면 False반환
List의 내용의 순서를 섞어줌
해당 Collection을 빈 Collection으로 초기화해줌
List의 내용을 시작순서에서부터 끝순서 전까지 잘라서 반환해줌
--> map으로 되어있는 것을 list로 바꾸거나, list로 되어있는 것을 set으로 바꾸거나 등등
이와 관련된 확장함수들이 있음
--> 자세한 것은 위의 확장함수 공식문서를 볼 것
--> list와 list를 더했을 때, 두 개의 list가 더해진 list가 반환되는 등의 확장함수
--> 자세한 것은 위의 확장함수 공식문서를 볼 것
--> 자세한 것은 위의 확장함수 공식문서를 볼 것
--> 자세한 것은 위의 확장함수 공식문서를 볼 것
해당 Collection에서 데이터를 하나하나 가져와 조건에 맞는 데이터들을 모아 반환
--> 파라미터를 명시하지 않았을 경우 it으로 접근 가능
"three"와 "four"만이 length가 각각 5, 4 로 조건에 만족하므로 반환되었음
/////////