반응형

오늘은 코틀린을 사용해서 매주 부자를 만들어주는 로또 랜덤 번호 생성기를 구현해보겠습니다.

로또 번호는 45개의 번호 중 6개의 번호를 선택하는 규칙입니다.

로또 랜덤 볼을 개발하기 위해서는 먼저 로또 볼이 어떻게 구성되어 있는지 확인을 해야 합니다.

최종 로또 랜덤 볼 프로그램은 하단 버튼을 눌러 난수를 발생하여 겹치지 않는 6개의 번호를 생성하는 모습입니다.

로또 볼 이미지를 만들기 위해서 파워포인트를 사용해서 원형을 만들고 색상은 로또 사이트에서 확인하였습니다.

각 볼 이미지는 숫자는 자릿수가 2자리 이므로 위치를 45번 기준으로 정했습니다.

이미지는 아무렇게나 만들어 주세요. 중요한 건 45개의 이미지를 분리해야 합니다.

안드로이드 프로젝트는 "빈 프로젝트"로 설정하고,  코트린(Kotlin)을 선택해주세요.

"res -> drawable"를 선택하고 우클릭하여 "Show in Explorer"을 선택해서 폴더로 이동해주세요.

위에서 만든 45개의 이미지를 "drawable" 폴더에 복사해주십시오.

"drawable" 폴더에 이미지를 복사 후 Android Studio에서 "drawable" 하위에 자동으로 이미지가 등록됩니다.

자 그럼 이제 준비는 모두 완료되었습니다.

먼저 UI를 만들기 위해서 "layout" 하위 "activity_main.xml" 파일을 클릭합니다.

생성된 "<androidx.constraintlayout.widget.ConstraintLayout"를 삭제하고 "LinearLayout"를 새로 생성해줍니다.

ImageView, Button을 세로로 배치하기 위해서입니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

orientation 속성은 "vertical"로 변경해주세요.

이제 볼을 저장하기 위한 ImageView를 6개 생성해줍니다.

ImageView는 위치를 고정하기 위해서 "layout_margin" 속성을 30px 정도 주었습니다.

<LinearLayout
        android:id="@+id/ll"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/ballView1"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
        <ImageView
            android:id="@+id/ballView2"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
        <ImageView
            android:id="@+id/ballView3"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
        <ImageView
            android:id="@+id/ballView4"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
        <ImageView
            android:id="@+id/ballView5"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
        <ImageView
            android:id="@+id/ballView6"
            android:layout_width="100px"
            android:layout_height="100px"
            android:gravity="center"
            android:layout_margin="30px"
            />
    </LinearLayout>

ImageView를 하나의 View로 고정하기 위해서 LinearLayout 내부에 구현했습니다.

가장 중요한 내용은 ImageView 속성 ID를 순차적으로 입력해야 합니다.

즉 "@+id/ballView1", "@+id/ballView2", "@+id/ballView3"~ "@+id/ballView6"순으로 지정해주세요.

마지막으로 랜덤 실행을 하기 위해서 버튼을 설정합니다.

 <Button
        android:id="@+id/btStart"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="시작"
        android:textSize="20sp" />

코드가 정상적으로 등록되었다면 Design에서 사진과 같은 것을 확인할 수 있습니다.

상단에 볼을 구현하기 위한 6개의 이미지가 있고 아래쪽에 실행 버튼이 위치합니다.

자 이제 "java" 폴더 하위에 있는 MainActivity.kt 파일을 클릭합니다.

먼저 볼을 저장할 수 있는 전역 변수를 선언합니다.

val BallList = ArrayList<Bitmap>()

BallList는 전역으로 사용하기 위해서 onCreate 위쪽에 선언해주세요.

"drawable"에 저장된 45개의 이미지를 한 번에 로드해서 BallList에 등록하는 코드입니다.

getResources()를 사용해서 저장된 정보 ID를 추출할 수 있습니다.

처음 저장된 이름을 순차적으로 저장하면 for문을 사용해서 한번에 ID를 추출해서 BITMAP을 생성할 수 있습니다.

생성된 BITMAP은 크기를 지정해서 BallList에 "add"함수를 사용해서 저장합니다.

 

 

 

Toast.makeText(this@MainActivity, "Create lottovall image.", Toast.LENGTH_SHORT).show()
        for( i in 0..44)
        {
            var bmp : Int = getResources().getIdentifier("lottoball" + (i + 1), "drawable", packageName )
            var bitmap:Bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), bmp),
                70,70, false)
            BallList.add(bitmap)
        }

상단 Toast 메시지는 실행 구간을 확인하기 위해서 추가했습니다.

이제 저장된 45개의 이미지를 랜덤 하게 생성해서 이미지를 저장해보겠습니다.

먼저 버튼 클릭 이벤트를 설정합니다.

코틀린은 JAVA와 다르게 매우 직관적으로 클릭 이벤트를 설정할 수 있습니다.

val btn : Button = findViewById<Button>(R.id.btStart)

        btn.setOnClickListener{
            Toast.makeText(this@MainActivity, "button start.", Toast.LENGTH_SHORT).show()

            var set: TreeSet<Int> = TreeSet()

            while(set.size < 6){
                val random = Random()
                val num = random.nextInt(45)
                set.add(num)
            }

버튼 ID를 확인하고 setOnClickListener 함수를 설정해줍니다.

랜덤 번호는 겹치면 안 되기 때문에 TreeSet 이진 검색을 사용해서 저장해주세요.

코틀린은 JAVA와 동일한 알고리즘 클래스를 사용할 수 있습니다. 

마지막으로 랜덤으로 설정된 6개의 번호를 ImgView와 연결해줍니다.

Toast.makeText(this@MainActivity, "ball check.", Toast.LENGTH_SHORT).show()

            var nCount = 0
            for( i in set )
            {
                var tmpID : Int =  getResources().getIdentifier("ballView" + (nCount + 1),
                    "id", packageName )
                val imgView = findViewById<ImageView>(tmpID)
                imgView.setImageBitmap(BallList.get(i))
                nCount++
            }

            Toast.makeText(this@MainActivity, "button end.", Toast.LENGTH_SHORT).show()

for문을 사용해서 저장된 Treeset 이미지 번호를 전역 저장된 BallList에서 확인합니다.

ImageView 호출은 nCount를 사용해서 6번 반복하게 설정했습니다.

로또 랜덤 볼 생성 프로그램 실행 사진입니다.

하단 버튼을 클릭하면 새로운 번호가 출력되는 것을 확인할 수 있습니다.

코틀린과 JAVA를 두 개다 구현해보니 확실하게 코틀린이 더 편리합니다.

문법적으로도 매우 깔끔해서 가독성이 좋습니다.

오늘은 코틀린을 사용해서 로또 랜던 볼 생성 프로그램을 만들어 보았습니다.

감사합니다.

반응형
반응형

오늘은 코틀린 형식 확인 및 null에 대해서 알아보겠습니다.

코틀린(Kotlin)은 형식을 유추하기 위해서 굳이 지정하지 않아도 변수 선언 시점에 알아서 확인을 합니다.

하지만 코드가 길어지면 변수 형을 짐작하기 쉽지 않을 수 있습니다.

코틀린(Kotlin) 형식 확인

기본적으로 "text" 변수를 선언하고 텍스트 및 숫자를 대입하면 형식을 자동으로 확인합니다.

즉 "text" 변수에 텍스트를 지정하면 숫자 대입이 불가능합니다.

사진처럼 "text" 변수에 숫자 대입 시 오류를 확인할 수 있습니다.

더욱 정확한 표기를 하기 위해서 코틀린은 자바와 다르게 변수 뒤쪽에 형식을 지정합니다.

var text:String

var intValue:Int

지정된 형식은 처음 선언된 변수로만 대입이 가능합니다.

처음 선언 시점 변수 타입을 저장 후 대입 시 확인하여 오류를 발생합니다.

안드로이드 스튜디오를 사용할 경우 변수 대입 시점에 오류를 바로 확인할 수 있습니다.

하지만 String과 Int를 공통으로 지정할 수 있는 방식이 있습니다.

변수 선언 시점에 "Any"로 지정하면 됩니다.

"Any"는 자바 객체 형식과 동일하며 코틀린에 모든 클래스는 "Any"를 명시적으로 상속하고 있습니다.

"Pair"를 사용해서 변수를 초기화할 경우도 2가지 형태로 가능합니다.

"to"를 사용해서 지정하는 방법과 Pair 생성자를 사용하는 방법입니다.

상기 방법은 map 형태에도 동일하게 사용됩니다.

코틀린(Kotlin) null 사용법

코틀린(Kotlin)은 자바 시스템에서 가장 흔한 버그 패턴 "NullPointerException"을 방어하게 설계되어 있습니다.

기본적으로 null 초기화를 허용하지 않습니다.

자바 시스템에서는 null 확인 코드 구조를 확인하기 위해서 일종의 보일러 플레이트 코드로 사용합니다.

코틀린에서는 null로 초기화할 경우 컴파일 오류가 발생합니다.

코틀린에서는 null을 사용하기 위해서는 "?"를 좌측에 선언해 줘야 합니다.

"?"를 사용하면 컴파일 오류가 발생하지 않는 것을 확인할 수 있습니다.

"?"를 사용해서 함수 호출 시 리턴 값 또한 "?" 적용하여 null 허용을 지정해야 합니다.

즉 "?" 사용 후 리턴 값을 확인하기 위해서는 동일한 "?"를 지정해야 정상적으로 컴파일 됩니다.

null 적용 함수 리턴되는 변수 확인이 조금 불편하다면 엘비스 연산자 "?:"를 사용하면 됩니다.

엘리스 연산자를 사용하게 되면 null일 경우 선언된 값을 리턴합니다.

이상으로 코틀린 변수 확인 및 null에 대해서 마치겠습니다.

감사합니다.

believecom.tistory.com/entry/20200902Kotlin-2?category=1109462

 

코틀린(Kotlin) 안드로이드 배우기 (변수)

오늘은 코틀린(Kotlin) 변수에 대해서 알아보겠습니다. 코틀린에서 변수는 var, val로 구분할 수 있습니다. var, val 사용법에 따라서 코드를 안전하게 개발할 수 있습니다. VAR 먼저 var에 대해서 알아��

believecom.tistory.com

 

반응형
반응형

오늘은 코틀린(Kotlin) 변수에 대해서 알아보겠습니다.

코틀린에서 변수는 var, val로 구분할 수 있습니다.

var, val 사용법에 따라서 코드를 안전하게 개발할 수 있습니다.

VAR

먼저 var에 대해서 알아보겠습니다.

var은 기본적으로 변수값을 변경하고 싶을 경우 사용하는 변수입니다.

기본적으로 var을 선언 후 초기화를 진행하면, 이후 재 초기화가 가능합니다.

소스에서 같이 "cpu" 변수를 처음 "AMD"로 초기화하고, 이후 "INTEL"로 재 초기화해도 문제가 되지 않습니다.

컴파일 후 Toast를 사용해서 출력하면 "intel"이 잘 출력됩니다.

VAL

두 번째 변수는 val입니다.

val은 기본적으로 읽기 전용 참조이며, 초기화 후 재 할당이 불가능합니다.

즉 "cpu1" 변수에 "intel" 할 당 후 "AMD"로 초기화할 경우 오류가 발생합니다.

val 변수는 final 한정자 자바 변수와 동일한 기능을 합니다.

val 선언 후 재 초기화하면 error를 확인할 수 있습니다.

val은 기본적으로 변경은 불가능하지만, 참조된 객체의 상태는 변경할 수 있습니다.

배열을 사용해서 재 초기화할 경우는 오류가 발생합니다.

 

 

 

하지만, val로 선언된 배열에 함수를 사용해서 변경은 가능하다는 뜻입니다.

배열에 선언된 "list"에 remove를 사용해서 변경할 경우 정상적으로 아이템이 삭제됩니다.

변경된 변수를 for 문을 사용해서 출력했습니다.

코틀린(Kotlin) 변수는 var, val로 구분해서 오류를 최소화할 수 있어 매우 편리합니다.

정확한 변수의 개념을 이해해고 사용하면 더욱더 안전한 코드를 개발할 수 있습니다.

이상으로 코틀린 변수에 배우기를 마치겠습니다.

감사합니다.

https://believecom.tistory.com/entry/Kotlin-1-ClickEvent-when?category=1109462

 

코틀린(Kotlin) 안드로이드 배우기 #1 - ClickEvent, when

오늘은 코틀린(Kotlin) 안드로이드 배우기 #1 - ClickEvent, when에 대해서 알아보겠습니다. 코틀린(Korlin)을 사용하기 위해서는 기본적으로 안드로이드 스튜디오를 설치하면 바로 사용이 가능합니다. ��

believecom.tistory.com

 

반응형
반응형

오늘은 코틀린(Kotlin) 안드로이드 배우기 #1 - ClickEvent, when에 대해서 알아보겠습니다.

코틀린(Korlin)을 사용하기 위해서는 기본적으로 안드로이드 스튜디오를 설치하면 바로 사용이 가능합니다.

안드로이드 설치는 다음 시간에 다루고 이번 시간에는 코틀린을 사용해서 버튼 이벤트 연결에 대해서 알아보겠습니다.

안드로이드 스튜디오 설치 상태에서 "NewProject"를 선택 후 EmptyActivity를 선택해 줍니다.

Project 설정에서 원하는 폴더에 Name, Package 명을 입력해 주세요.

가장 중요한 "Language"는 Kotlin을 선택해 줍니다.

 

 

 

이번 강좌에서는 MainActivity, activity_main.xml 두 개 파일만 사용하겠습니다.

먼저 정렬을 하기 위해서 activity_main.xml 파일에서 레이아웃을 변경해 주십시오.

레이아웃 변경 후 컨트롤을 등록하기 위해서 아래 코드를 입력해 주세요.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="7dp"
        android:onClick="onClick"
        android:id="@+id/btnStart"
        android:text="Start"
        tools:ignore="MissingConstraints"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:layout_gravity="center"
        android:layout_margin="25dp"
        android:id="@+id/MainText"/>

</LinearLayout>

세로 정렬을 사용하기 위해서 LinearLayout 속성 android:orientation="vertical"을 추가하고

이벤트를 사용하기 위해서 버튼, 텍스트 뷰를 추가해 줍니다.

"Shift" + F10을 클릭하면 컴파일 되면서 안드로이드가 실행됩니다.

버튼 이벤트 속성 중 android:onClick="onClick"은 Listener를 사용해서 이벤트를 연결하기 위해서 설정이 반드시 필요합니다.

이제 MainActivity로 이동합니다.

코틀린 확장자는. kt로 생성됩니다.

코틀린은 자바와 다르게 NULL 대한 처리를 명확하게 처리하여 오류를 최소화해 줍니다.

버튼 이벤트를 연결하기 위해서 View.OnClickListerner을 상속받습니다.

코틀린은 NULL을 구분하기 위해서'?'를 사용합니다.

즉 변수 뒤에'?' 가 있을 경우 NULL을 허용한다는 뜻입니다

'?'가 없을 경우는 NULL을 허용할 수 없어 컴파일이 안됩니다.

when문은 자바에서 사용하는 switch 문과 동일합니다.

버튼에 설정한 onClick를 연결하기 위해서 상속된 Listener 가상 함수 onClick을 override 합니다.

onClick 함수에서는 코틀린 when을 사용해서 버튼 ID를 구분해서 텍스트 뷰를 변경하는 로직을 추가합니다.

override fun onClick(v: View?) {
       when(v?.id)
       {
           R.id.btnStart->{
               var tView = findViewById<TextView>(R.id.MainText)
               if( bCheck) {
                   tView.setText("Click Button")
                   bCheck = false
               }
               else
               {
                   tView.setText(R.string.sRString1)
                   bCheck = true
               }
           }
       }
    }

코틀린은 형 변환을 자유롭게 하기 위해서 생성 시 만 설정해 줍니다.

findViewById<형변환Class>

코드를 추가하고 컴파일 하면 버튼을 클릭하면 텍스트 뷰가 변경되는 것을 확인할 수 있습니다.

이상으로 코틀린(Kotlin) 안드로이드 배우기 #1 강좌를 마치겠습니다.

감사합니다.

#코틀린, #안드로이드, #Kotlin, #안드로이드강좌, #onClick, #when

반응형

+ Recent posts