앱 프로젝트 - 02 - 1 (로또 번호 추첨기) - Collection타입( List, Set, Map ), Shape Drawable

하이루·2021년 12월 25일
0

소개

6자리의 로또 번호를 랜덤으로 만드는 앱

드로버블에 대한 공식 설명 : https://developer.android.com/guide/topics/resources/drawable-resource?hl=ko

--> 이중에서 Shape Drawable을 사용할 것임


레이아웃 소개

노란 원의 숫자는 직접 선택한 것, 나머지 숫자는 자동생성으로 생성한 것


시작하기에 앞서 알고갈 것들

Shape Drawable

Drawable에 대한 간단 설명

안드로이드 스튜디오에 프로젝트 속에 resource폴더 안에 drawable폴더가 있는데, 여기에는
이미지나 화면을 그릴 수 있는 것들이 들어있음 --> 그것이 대한 부분임

--> 간단한 background를 만들 때 많이 사용됨

그 중에서 Shape Drawable이란?

아래와 같이 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형식으로 변환한 다음에 안드로이드 앱에서 그리게 됨

  • 이 경우 앱이 이미지파일을 하나하나 들고 있어야 하기 때문에 앱의 규모가 커짐
  • 또한 이 이미지파일을 수정하기 위해서는 새로운 이미지파일을 덮어쓰는 방법으로 넣어주는 수밖에 없음

이에 비해 Shape Drawable을 사용하여 이미지를 그릴 경우의 장점

  • 이미지가 xml형식으로 되어있기 때문에 크기가 크지 않음 --> 위에 비해 앱의 규모가 작아짐
  • 이미지를 수정해야할 일이 있을 때 xml형식으로 되어 있기 때문에 코드 수정만으로 대응 가능

--> 간단한 background를 만들 때 많이 사용됨

Shape Drawable 사용하기

1. res폴더에 drawable폴더에 우클릭 -> New에 Drawable Resource File 클릭

2. xml파일을 이름을 적은 후 생성
( 이번에는 노란 동그라미를 표현한 xml파일을 만들 것이므로 yellow_circle이라고 지음 )

3. 대략 이런 형식으로 코드가 만들어지는데, 우리는 ShapeDrawable을 이용해서 그릴 것이므로 selector태그를 지우고 shape태그를 넣음

( selector 태그 지우고 shape태그를 넣음 )

이후 shape속성을 넣으면서 자동으로 참조가 됨

4. 최종적으로 이런식으로 모양, 색, 크기 등등을 넣어서 구성함

5. 이렇게 생성한 Shape Drawable을 layout에 적용함

  1. 이런 식으로 kotlin코드 쪽에서 넣어줄 수도 있음

--> drawable 값을 가져오는 부분인데 drawable이 안드로이드 앱에 저장된 것이기 때문에 Context에서 가져올 필요가 있음

ContextCompat을 이용해서 Context에 접근
이후 접근한 Context에서 getDrawable함수를 이용해서 Drawable에 접근

getDrawable 함수첫번째 파라미터로 현재 위치를 받고, 두번째 파라미터로 DrawableResourceID 가 필요하므로 R에 drawable항목에 저장되어 있는 해당 ShapeDrawable의 주소를 넣어준다.


Collection 타입

Collection에 대한 kotlin 공식문서 : https://kotlinlang.org/docs/collections-overview.html

[ Collection타입의 상속 구조 ]

Kotlin에서 사용하는 3가지 Collection 타입 - set, list, map

List 자료구조

  • 목록의 의미

  • 데이터가 저장되거나 삭제가 될 때 순서를 지키는 자료구조

  • index(색인)을 이용해서 데이터를 가져오거나 집어넣거나 삭제하거나 등등의 작업이 순차적으로 가능하다

  • 항상 순서를 지키기 때문에 예를들어 10개의 데이터에서 4번째 데이터를 삭제한다고 해도 나머지 데이터들은 순서를 지킨다.

Set 자료구조

  • 집합의 의미

  • 동일한 데이터가 존재할 수 없는 집단인 자료구조

  • 순서보장은 되지 않지만, 중복된 데이터가 있을 순 없는 특징이 있음

Map 자료구조

  • 1대1로 맵핑하다의 의미

  • key : value 형식의 자료구조

  • 키를 통해 데이터에 접근하는 방식이기 때문에 키는 중복될 수 없음


Constructing Collection ( Collection 생성 )

--> listOf(), mutableListOf(), setOf(), mutableSetOf()

listOf()와 mutableListOf()

--> 파라미터의 내용을 가지는 list를 반환

--> 위쪽에 Collection 타입의 상속 구조를 보면 mutableList는 List를 상속받는다는 것을 알 수 있음 ( List와 MutableList는 부모 자식 관계 )

즉, List에 내용을 변경하는 기능을 추가한 것이 mutableList

또한 List로 선언된 변수에 MutableList를 넣을 수 있지만, MutableList를 요구하는 곳에 List를 넣을 수 없는 것도 추론할 수 있다.

[ listOf함수를 사용하여 list만들기 ] --> 일반 list반환

--> immutable( 불변적 )이므로 반환한 list의 내용을 변경할 수 없음

[ mutableListOf함수를 사용하여 list만들기 ] --> list를 상속받아 내용 변경기능을 추가한 mutableList를 반환

--> mutable( 가변적 )이므로 반환한 list의 내용을 변경할 수 있음

setOf()와 mutableSetOf()

--> 위의 List의 경우와 동일하다.
--> mutableSetOf로 생성되는 MutableSet의 경우 내용 변경이 가능하기 때문에 위와 같이 내용없이 만들기도 한다.
( 단, 제네릭으로 내용의 타입을 선언해줘야한다. )

setOf로 Set집합을 만들 경우, immutable이기 때문에 내용 변경이 불가능하다.

그리고 mutableSetOf로 MutableSet집합을 만들 경우, mutable이기 때문에 내용 변경이 가능해진다.

--> 그리고 이는 위의 list와 같이 MutableSet집합이 Set집합을 상속받은 것이며, 내용을 변경하는 기능을 추가한 것이기 때문에 그런 것이다.

mapOf()와 mutableMapOf()

--> 다른 Collection자료구조들과 비슷하게 이런 식으로 key와 value를 매핑하여 생성

Empty Collection - emptyList(), emptySet(), emptyMap()

--> 빈 Mutable계열 자료구조를 생성시 코드의 가독성을 높이기 위한 함수들

  • emptyList() --> 빈 MutableList를 만들 수 있다.

  • emptySet() --> 빈 MutableSet을 만들 수 있다.

  • emptyMap() --> 빈 MutableMap을 만들 수 있다.

--> 위에처럼 그냥 mutableListOf, mutableSetOf등의 함수를 사용해서 빈 자료구조를 만드는 것과 동일하지만,
이 함수를 사용하는 것으로 빈 Mutable계열 자료구조를 생성시 코드의 가독성을 높일 수 있다.


Collection을 다룰 때 자주 사용하는 것들

Collection.size --> 해당 자료구조의 데이터수를 리턴해줌

Collection.forEach {}
--> 해당 자료구조의 데이터를 하나하나 파라미터로 받아서 뒤의 {}블록( 람다함수 ) 실행 ( it 으로 파라미터에 접근 가능 )

Collection.forEachIndexed { index, i -> 람다함수내용 }
--> 바로 위의 forEach와 동일하지만 그 데이터의 순서까지 파라미터로 받아줌


Collection에서 사용하는 확장 함수들

Collection의 확장함수들에 대한 문서 : https://kotlinlang.org/docs/collection-operations.html#common-operations
--> 여기 정리되어 있으므로, 필요하면 볼 것
--> 아래에 있는 것 이외에도 수많은 확장함수들이 있음

--> kotlin은 확장함수를 기본적으로 제공하기 때문에 Java에 비해
Collection에서도 유용한 확장함수들이 다수 존재한다.

	확장함수? 
	--> "Collection.확장함수()" 처럼 뒤에 붙는 형식으로 사용되는 함수들 
    ( 확장되는 모양새 라고 하여 확장함수 라고 함 )
    
    예를 들어 ) 
    a가 리스트라고 할 때, 
    
    a.isEmpty() 
    
    와 같이 사용된다.

isEmpty()

해당 Collection이 비어있으면 True반환, 비어있지 않으면 False반환

orEmpty()

해당 Collection이 비어있으면 빈 Collection( list면 빈 list, map이면 빈 map 등 ) 반환,
비어있지 않으면 정상적으로 반환

list형.get( int index )

List의 index에 해당하는 순서의 데이터를 반환

list형.sorted()

List의 내용을 오름차순으로 정렬해줌

list형.takeLast( int number )

List의 마지막부터 number만큼의 숫자까지의 데이터를 반환

contains( 확인할 데이터 )

해당 Collection에 파라미터에 해당하는 데이터가 있으면 True반환, 없으면 False반환

list형.shuffle()

List의 내용의 순서를 섞어줌

clear()

해당 Collection을 빈 Collection으로 초기화해줌

subList(시작순서,끝순서)

List의 내용을 시작순서에서부터 끝순서 전까지 잘라서 반환해줌

Trainsformation

--> map으로 되어있는 것을 list로 바꾸거나, list로 되어있는 것을 set으로 바꾸거나 등등
이와 관련된 확장함수들이 있음
--> 자세한 것은 위의 확장함수 공식문서를 볼 것

plus 와 minus

--> list와 list를 더했을 때, 두 개의 list가 더해진 list가 반환되는 등의 확장함수
--> 자세한 것은 위의 확장함수 공식문서를 볼 것

Grouping

--> 자세한 것은 위의 확장함수 공식문서를 볼 것

Ordering

--> 자세한 것은 위의 확장함수 공식문서를 볼 것

filter( 조건 )

해당 Collection에서 데이터를 하나하나 가져와 조건에 맞는 데이터들을 모아 반환
--> 파라미터를 명시하지 않았을 경우 it으로 접근 가능

"three"와 "four"만이 length가 각각 5, 4 로 조건에 만족하므로 반환되었음

/////////

profile
ㅎㅎ

0개의 댓글