들어가며

안드로이드 코드를 작성하다보면 view를 다룰 때 꼭 한번 context를 parameter로 요청하는 경우가 있다.

그냥 단어만 알고있던 이것에 대해서 한 번 알아보고 어떤 쓸모가 있는지 알아보고 다른 인스턴스에 접근하는 방법을 탐구해보자. ( 인스턴스 접근방법을 알고 싶다면 맨 아래 문단을 참고하기 바랍니다. )

Context의 정의

출처: https://developer.android.com/reference/android/content/Context

위는 Android Developers에 게시된 문서의 정의부분이다. 읽어보니 안드로이드의 시스템 요소와 자원에 접근하기 위한 추상 클래스라고 한다. 문서를 조금더 찾아보니 Activity, Application, Service의 base class로 사용된다고 한다. 이를 알고 나니 기본적인 시스템 추상클래스라는 느낌을 알겠다.

용례

  • 어플리케이션의 resource 획득
  • 새로운 activity 시작
  • view 생성
  • system service 획득

사용 예시에는 위와 같은 경우가 있는데 이는 getResource(), startActivity() 등의 함수를 어느정도 다루어봤다면 당연히 알 것이다. 이 정도로 끝났다면 나는 이번 포스팅을 작성하지 않았을 것이다. 생각해보니 이를 이용하면 CustomView를 만들때 해당 뷰가 속한 액티비티의 함수를 CustomView에서 자유롭게 호출할 수 있을것 같았다.

다른 액티비티에서 변수, 함수 호출

아래는 내가 만든 CustomButton이다. 우선 생성자를 호출할 때 뷰는 모든 Context를 인자로 받아야하는데 이를 MainActivity클래스로 캐스팅하여 변수로 저장했다.

그 다음 버튼을 클릭할 때 startForegroundService를 호출하도록 실험해봤는데.... 된다..... MainActivity는 싱글톤 클래스고 Context를 MainActivity으로 캐스팅해서 안 될줄 알았는데 된다....

다른 액티비티나 커스텀 뷰에서 메인 액티비티의 변수나 함수에 접근하는데 stack overflow에 서칭도 해보고 고민을 많이 했는데 너무 간단하게 된다.... 아무튼 오늘 좋은 지식을 하나 얻었다.

 

들어가며

코틀린의 패키지 호출은 파이썬과 동일하므로 이를 안다면 굳이 아래의 내용을 볼 필요가 없습니다.

1.Packages

 패키지는 다른 소스파일의 패키지를 호출하는 것을 의미합니다. 사용법은 간단하게 package로 호출하면 됩니다.

package org.example

fun printMessage() { /*...*/ }
class Message { /*...*/ }

// ...

2.Imports

import지시어를 통해서 패키지 내부의 클래스를 따로 호출 할 수 있습니다.

import org.example.Message // Message is now accessible without qualification

import org.example.* // everything in 'org.example' becomes accessible

만약 클래스명이 충돌할 경우 이를 대체 할 수 있습니다. 

import org.example.Message // Message is accessible
import org.test.Message as testMessage // testMessage stands for 'org.test.Message'

 

'Android > Kotlin' 카테고리의 다른 글

Calling Extension  (0) 2021.08.19
[Kotlin] Extension Function  (1) 2021.07.19
Kotlin - 1. 기본 타입(numbers, characters, booleans, arrays, and strings)  (0) 2020.03.27

들어가며

이번 글에서는 처음으로 코틀린을 공부해보는 만큼 코틀린에 쓰이는 기본타입(numbers, characters, booleans, arrays, and strings)에 대해서 알아보도록 하겠습니다. 

 

1. Numbers

1. 정수

1. 파이썬, javascript처럼 변수에 따로 타입을 선언하지 않음

2. 일반적인 정수를 저장하면 Int로 설정

3. Int의 범위 밖이나 뒤에 L을 추가하면 Long으로 설정

4. 변수이름 : 타입 = ? 구문을 통해서 직접 타입 설정 가능 

val one = 1 // Int
val threeBillion = 3000000000 // Long
val oneLong = 1L // Long
val oneByte: Byte = 1

2. 실수

val pi = 3.14 // Double
val e = 2.7182818284 // Double
val eFloat = 2.7182818284f // Float, actual value is 2.7182817

1. 일반 실수 입력시 Double로 설정

2. 뒤에 F또는 f 추가시 float으로 설정되고 범위 밖의 데이터는 소멸

3. 독립성

코틀린은 일반적인 언어처럼 숫자 파라미터가 포괄적인게 아니라 해당 파라미터만 수용가능, 그렇지 않을 경우 에러 발생

fun main() {
    fun printDouble(d: Double) { print(d) }

    val i = 1    
    val d = 1.1
    val f = 1.1f 

    printDouble(d)
//    printDouble(i) // Error: Type mismatch
//    printDouble(f) // Error: Type mismatch
}

4.. 리터럴 상수(Literal constants)

  • 10진수, Decimals: 123
    • Longs are tagged by a capital L: 123L
  • 8진수,  Hexadecimals: 0x0F
  • 2진수, Binaries: 0b00001011

NOTE: Octal literals are not supported.

 

  • Doubles by default: 123.5, 123.5e10
  • Floats are tagged by f or F: 123.5f

5. 가독성을 위한  언더스코어 사용가능

val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

6. 변환

val b: Byte = 1 // OK, literals are checked statically
val i: Int = b // ERROR

타입은 명백히 독립적이므로 바로 대입하는것은 불가(java와 다름)

변환하기 위해선 toInt,toLong등의 메서드 사용필요

val i: Int = b.toInt() // OK: explicitly widened
print(i)
  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

*오퍼레이터 오버로딩

val l = 1L + 3 // Long + Int => Long

서로 다른 두 데이터의 수학적 계산 결과의 타입은 자동으로 최적화됨

 

*나눗셈으로 인한 타입 결정은 java와 같음

7.비교(Floating point numbers comparison)

The operations on floating point numbers discussed in this section are:

  • Equality checks: a == b and a != b
  • Comparison operators: a < b, a > b, a <= b, a >= b
  • Range instantiation and range checks: a..b, x in a..b, x !in a..b

2.Characters

Characters are represented by the type Char. They can not be treated directly as number

fun check(c: Char) {
    if (c == 1) { // ERROR: incompatible types
        // ...
    }
}

특수문자사용 : \t, \b, \n, \r, \', \", \\ and \$

유니코드 인코딩 : '\uFF00'

 

Convert a character to an Int number

fun decimalDigitValue(c: Char): Int {
    if (c !in '0'..'9')
        throw IllegalArgumentException("Out of range")
    return c.toInt() - '0'.toInt() // Explicit conversions to numbers
}

 

3.Booleans

The type Boolean represents booleans, and has two values: true and false.

Built-in operations on booleans include

  • || – lazy disjunction
  • && – lazy conjunction
  • ! - negation

4.Arrays

Arrays in Kotlin are represented by the Array class

메서드 : set,get( that turn into[] by operator overloading conventions )

특성 : size

 

사용법

1. arrayOf(1, 2, 3) creates an array [1, 2, 3]

2. arrayOfNulls() library function can be used to create an array of a given size filled with null elements.

3. Array constructor

it takes array size and the function that can return the initial value of each array element given its index

// Creates an Array<String> with values ["0", "1", "4", "9", "16"]
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { println(it) }

Primitive type arrays

ByteArray, ShortArray, IntArray등 Kotlin에는 특수한 배열들이 있습니다. 각 배열은 Array에 상속되지 않지만 동일한 메서드를 사용하며 []를 통해 접근이 가능합니다.

val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]
// Array of int of size 5 with values [0, 0, 0, 0, 0]
val arr = IntArray(5)

// e.g. initialise the values in the array with a constant
// Array of int of size 5 with values [42, 42, 42, 42, 42]
val arr = IntArray(5) { 42 }

// e.g. initialise the values in the array using a lambda
// Array of int of size 5 with values [0, 1, 2, 3, 4] (values initialised to their index value)
var arr = IntArray(5) { it * 1 }

5.Strings

Strings are represented by the type String

특성

1.Strings are immutable

2.Elements of a string are characters that can be accessed by the indexing operation: s[i]

3. string can be iterated over with a for-loop:

for (c in str) {
    println(c)
}

4.  concatenate strings using the + operator, as long as the first element in the expression is a string

val s = "abc" + 1
println(s + "def")

String literals

1.특수 문자사용

val s = "Hello, world!\n"

2. """ 사용

val text = """
    for (c in "foo")
        print(c)
"""

String templates

$기호를 사용해서 템플릿으로 사용할 수 있음

val i = 10
println("i = $i") // prints "i = 10"

 

중괄호를 사용해서 임의의 표현까지 템플릿으로 사용 가능

val s = "abc"
println("$s.length is ${s.length}") // prints "abc.length is 3"

 

'Android > Kotlin' 카테고리의 다른 글

Calling Extension  (0) 2021.08.19
[Kotlin] Extension Function  (1) 2021.07.19
Kotlin - 2. Packages and Imports  (0) 2020.03.29

버튼으로 토스트 보여주기

버튼으로 토스트를 보여주기위해선 다음 3가지 단계가 필요합니다.

목차

1. 버튼 생성
2. 클릭시 실행할 함수 설정 및 생성
3. 클릭 함수에 토스트 메세지 설정

1. 버튼 생성

버튼을 생성하는 방법은 두가지 입니다.

첫번째는 간단하게 위젯 목록에 있는 버튼을 클릭후 배치하고싶은 화면으로 드레그합니다.
처음 접하는 분들은 이 방식이 아주 쉬울 것입니다.
(단 드레그하여 위치를 지정할때는 Component Tree에 있는 레이아웃이 ConstantLayout 또는 Absolute Layout이어야합니다)


두번째는 화면 아래에 있는 Text 버튼을 누르고 Button을 직접 타이핑하는 것입니다. 화면을 표시하는 xml파일을 사용하면 버튼의 속성을 더 자세히 설정 할 수 있습니다.



만약 첫번째 형식을 하면 자동으로 위치등이 설정되어 Text에 프로그램이 알아서 작성을 합니다.

2.클릭시 실행할 함수 설정 및 생성


이번에는 버튼을 클릭할때 실행되는 함수를 만들어보겠습니다.
Design 탭에서 버튼을 클릭하면 오른쪽이 properties창이 생깁니다. 여기서 버튼의 속성들을 설정할 수 있습니다.

여기서 아래쪽에 onClick 부분을 찾을수 있습니다.
여기에 입력한 값은 버튼일 클릭될 때 MainActicity.java 파일에 있는 버튼을 실행할 함수명이됩니다.
함수명을 onButton1Clicked로 설정하겠습니다.

이제 상단의 MainActivity.java를 클릭하여 창을 이동합니다.
.xml파일은 화면을 구성할 때 사용되는 파일이고 .java파일은 동작을 설정할때 사용되는 파일입니다.

여기서 클릭함수를 만들어봅시다.

아까 설정한 함수명을 그대로 써서 클릭할때 동작하는 기본적인 함수를 만듭니다.
버튼을 클릭하면 중괄호 안의 부분의 명령이 실행됩니다.
(만약 View 부분이 빨갛게 된다면 커서를 두고 alt+Enter를 누르시면 자동으로 헤더파일이 import되어 에러가 사라지게 됩니다.)

3.클릭함수에 토스트 메세지 설정

자 이제 클릭함수 안에 토스트 메세지를 넣어봅시다.
토스트메세지를 출력하는 함수는 상당히 깁니다.
우선 Toats클래스를 호출하고 .makeText를 통해서 토스트를 생성합니다. makeText함수의 인자는Context, 출력할 메세지, 출력시간 세가지로 구성되는데 모르신다면 무작정 따라하시면 됩니다.
마지막으로 .show를 통해서 만들어진 토스트를 보여주는 명령을 줍니다.

이렇게 하면

원하는 메세지가 아래에 출력됩니다!

이번에는 함수의 설명보다는 무작정 따라오는 방식으로 진행했는데 구체적인 구현 방식을 알고 싶다면 함수에서 쓰이는 요소들이 무엇을 뜻하는지 검색하고 공부해보는 것을 추천해드립니다.

+ Recent posts