2023의 게시물 표시

Kotlin Enum (열거형)

안녕하세요! 이번 포스팅에서는 코틀린에서 제공하는 열거형(Enum)에 대해 알아보겠습니다. 열거형은 상수를 선언하고 사용하기 위한 편리하고 간결한 방법을 제공하여 코드의 가독성을 높이고 안전성을 강화하는데 도움을 줍니다. 열거형(Enum) 프로그램 개발 시 특정 그룹 안의 구성 요소를 정의하는 값이 필요하고자 할 때 사용한다. 열거형은 단어 자체가 프로그램에서 사용하는 값이 된다. 열거형(Enum)이란? 열거형은 서로 연관된 상수들의 집합을 정의하는 특별한 데이터 타입입니다. 예를 들어, 요일(월요일, 화요일 등)이나 계절(봄, 여름, 가을, 겨울)과 같이 고정된 값들을 나타내는 경우에 유용하게 사용됩니다. 코틀린에서는 enum 키워드를 사용하여 열거형을 정의할 수 있습니다.  아래는 enum 키워드를 통해서 요일에 대해서 열거형을 정의해보았습니다. enum class Weekday { MONDAY , TUESDAY , WEDNESDAY , THURSDAY , FRIDAY , SATURDAY , SUNDAY } 아래는 enum 키워드를 통해서 방향에 대해서 열거형을 정의해보았습니다. enum class Direction { NORTH , SOUTH , WEST , EAST } fun main () { printDiection (Direction. EAST ) printDiection (Direction. SOUTH ) } enum class Direction { NORTH , SOUTH , WEST , EAST } fun printDiection (a1: Direction) { when (a1) { Direction. NORTH -> println ( " 북쪽입니다 ." ) Direction. SOUTH -> println ( " 남쪽입니다 ." ) Direction. WEST ->...

Android Studio Tabnine 사용해 보기

AI Coding 안드로이드 스튜디오에서 사용할 수 있는 안드로이드 코드를 AI 로 쉽게 작성할 수 있는 Plugin 에 대한 검토를 해보자 AI Coding Assistant Tools 1. GitHub Copilot 2. Amazon CodeWhisperer 3. Tabnine 4. Replit 5. Sourcegraph Cody 6. AskCodi 7. Codiga 8. Bugasura 9. CodeWP 10. AI Helper Bot 11. Android Studio Bot 12. SinCode 13. WPCode GitHub Copilot https://onlyfor-me-blog.tistory.com/721 개인사용자 기준으로 60일 무료이며, 신용카드 등록 및 선 구독 후 취소해야하는 시스템. 10$/달 Amazon CodeWhisperer https://mobikul.com/amazon-code-whisperer-android-studio/ 개인 무료, AWS 계정 필요 Amazon CodeWhisperer는 Python, Java, JavaScript, TypeScript, C#, Go, Rust, PHP, Ruby, Kotlin, C, C++, Shell 스크립팅, SQL, Scala 등 다양한 프로그래밍 언어를 위한 인공 지능(AI) 기반 코드 제안을 제공합니다. JetBrains IDE(IntelliJ IDEA, PyCharm, WebStorm, 및 Rider), Visual Studio(VS) Code, AWS Cloud9, AWS Lambda 콘솔, JupyterLab 및 Amazon SageMaker Studio를 포함하여 여러 IDE에서 서비스를 사용할 수 있습니다. CodeWhisperer는 Amazon Elastic Compute Cloud(Amazon EC2), AWS Lambda 및 Amazon Simple Storage Service(Amazon S3)를 비롯한 AWS API에 최적화된 코드 제안을 제공하여 개발자가 AWS...

null safety through type conversion (null 안정성을 위한 형변환)

null 안정성을 위한 형변환 null 값이 담긴 객체에 대해 보다 안정한 형 변환 방법을 제공하고 있다. null 을 허용하는 변수가 null 값이 들어있지 않다는것을 보장해주면, null 을 허용하지 않는 타입으로 스마트 캐스팅이 발생한다. null 을 허용하는 타입  null 을 허용하는 타입으로 선언했을 경우, 해당 타입에서 메서드를 호출하게 될 경우 아래와 같은 에러가 발생한다. fun testMethod1 (str: String?) { println (str. length ) } Kotlin: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?  str 이 null 일 경우, length 를 구할 수 없으므로 이를 safe call 연산자(?.) 을 사용하던지, non-null asserted (!!.) 를 사용하여 null 허용 타입으로 부터 예외처리를 해야 한다. Safe Call (?.): Safe call은 Kotlin에서 null 안정성을 보장하기 위한 기능 중 하나로, 변수가 nullable하면서 null일 수 있는 경우에만 사용됩니다. Safe call 연산자인 ?.을 사용하면, 해당 변수가 null인 경우에도 프로그램이 중단되지 않고 null을 반환합니다. 즉, 호출된 메서드나 프로퍼티가 null인 경우, 그냥 null을 반환하고 뒤따라오는 연산은 수행되지 않습니다. fun main () { testMethod1 ( " 안녕하세요 " ) testMethod1 ( null ) } fun testMethod1 (str: String?) { println (str?. length ) } 결과값 > 5 null testMethod1(null): 두 번째 호출은 null을 전달하고 있습니다. 이 경우 str은 nullable이며 null을 가지고 있기 때문에, safe ...

Android.bp

Android.bp Android.bp 파일에 대해서 파악해보고, APP 빌드시에 사용되는 옵션에 대해서 살펴보자. 안드로이드 7.0 이전 버젼에서는 Android.mk 파일을 빌드로 사용하였는데, 이후 버젼에서는 Soong 빌드 시스템을 이용한 Android.bp 시스템으로 변경되었다. 참고자료 https://source.android.com/docs/setup/build?hl=ko https://ci.android.com/builds/submitted/10510886/linux/latest/view/soong_build.html android_app 모듈 android_app은 Android Build System에서 사용되는 Android.bp 파일의 한 유형입니다. 이 모듈은 Android 애플리케이션을 빌드하기 위해 필요한 설정과 지침을 제공합니다. android_app 모듈을 사용하면 애플리케이션의 리소스, 매니페스트 파일, 네이티브 코드 등을 포함하는 전체 패키지를 빌드할 수 있습니다. android_app 모듈은 일반적으로 다음과 같은 필드를 포함합니다: name: 애플리케이션 모듈의 이름을 지정합니다. srcs: 애플리케이션에 포함되는 Java 소스 파일을 지정합니다. manifest: 애플리케이션의 Android 매니페스트 파일을 지정합니다. resource_dirs: 애플리케이션의 리소스 디렉토리를 지정합니다. static_libs 또는 shared_libs: 애플리케이션이 종속하는 라이브러리 모듈을 지정합니다. package_name: 애플리케이션의 패키지 이름을 지정합니다. privileged: 시스템 권한이 있는 프라이빌리지드 애플리케이션 여부를 지정합니다. platform_apis: true: 플랫폼 API에 액세스할 수 있는지를 나타내는 플래그입니다. android_app 모듈은 cc_module 모듈과 상호작용할 수도 있습니다. 예를 들어, 애플리케이션에 C/C++ 네이티브 코드가 포함되어 있는 경우, cc_module 모듈을 정...

Android mm Build

Android mm Build 아래는 안로드이드 풀 소스코드가 받아진 상황에서, 풀 빌드를 수행하고, 내가 원하는 package 에 대해서 부분 빌드를 하고 싶을 때 사용하는 방법이다. 안드로이드 공식빌드 개요  안드로이드의 "mm 빌드"는 안드로이드 소스 코드를 빌드하는 방법 중 하나로서, 소스 코드의 일부를 수정하고 해당 변경 사항만을 빌드하는 방법을 의미합니다. 이렇게 하면 전체 안드로이드 시스템을 다시 빌드하는 것보다 시간을 절약할 수 있습니다. 서버 풀 빌드 우선 부분 빌드 (mm 빌드) 를 수행하고자 하는 서버가 풀 빌드가 되어있어야 한다. 전체 빌드가 성공적으로 된 이후 수행 할 수 있다. 빌드 환경 설정 $ cd /DATA/workspace/PROJECT_NAME/LINUX/android $ source build/envsetup.sh $ lunch aosp_arm-eng  위와 같이 envsetup.sh 스크립트로 환경을 초기화합니다.    lunch를 사용하여 빌드할 타겟을 선택합니다. lunch product_name-build_variant는 빌드할 제품으로 product_name을 선택하고 빌드할 변형으로 build_variant를 선택하며, 이러한 선택항목을 이후의 m 및 기타 유사한 명령어 호출에서 읽을 수 있도록 환경에 저장합니다.  원하는 형태에 맞게 lunch 옵션에서 선택하여 지정할 수 있습니다. mm 빌드 실행 user:/DATA/source/PRODUCT/LINUX/android$ source build/envsetup.sh user:/DATA/source/PRODUCT/LINUX/android$ lunch aosp_arm-eng user:/DATA/source/PRODUCT/LINUX/android$ cd vendor/XXXX/packages/apps/PACKAGE_NAME user:/DATA/source/PRODUCT/LINUX/android/vendor/XXXX/package...

Kotlin Primitive Type Casting (기본 타입의 형 변환)

Primitive Type Casting (기본 타입의 형 변환) Kotlin 에서는 기본 타입을 관리하는 객체의 타입을 변경하는 메서드를 제공한다. 참조 변수의 타입이 변경되는 것이 아닌 새로운 객체가 생성되어 반환된다. toByte(), toShort(), toInt(), toLong(), toFloat(), toDouble(), toChar() 소개 코틀린에서 데이터 타입은 기본 타입과 참조 타입으로 분류됩니다. 기본 타입에는 Byte, Short, Int, Long, Float, Double, Char 등이 포함되며, 참조 타입은 클래스와 인터페이스를 포함합니다. 기본 타입을 다룰 때는 서로 다른 타입 사이에서 변환하거나 형변환하는 방법을 이해하는 것이 중요합니다. 코틀린은 이러한 변환을 위한 다양한 메서드를 제공합니다. 기본 타입(Primitive Type)  Byte, Short, Int, Long, Float, Double, Char, Boolean 등 기본적인 데이터 타입으로, Java와 비슷하게 동작합니다. 기본 타입은 자바의 원시 타입과 유사하지만, 코틀린에서는 모든 것이 객체이므로 기본 타입도 내부적으로 객체로 취급됩니다. 참조 타입(Reference Type) 클래스, 인터페이스 등과 같이 사용자가 직접 정의한 타입으로, 기본 타입이 아닌 모든 타입을 참조 타입으로 간주합니다. 메모리 할당 기본 타입은 값(value) 자체를 저장하기 위해 스택(stack) 메모리에 직접 할당됩니다. 따라서 빠르고 메모리 사용이 효율적입니다. 참조 타입은 객체를 표현하는 참조(reference)를 스택 메모리에 할당하고, 실제 객체는 힙(heap) 메모리에 저장됩니다. 이로 인해 객체의 크기가 크거나 복잡한 구조를 가질 때 더 많은 메모리를 차지하고, 메모리 할당 및 해제에 일정한 오버헤드가 발생할 수 있습니다. 기본 타입 형변환 예제 fun main () { val intValue: Int = 42 val longValue: Long...

Kotlin Any Type

Any Type Kotlin은 모든 클래스가 직접 혹은 간접적으로 Any 클래스를 상속받는다. 따라서 모든 객체의 주소 값은 Any 타입 참조 변수에 담을 수 있다. Any 타입과 is 연산자를 활용하여 다양한 타입의 객체에 대응할 수 있는 코드를 만들 수 있다. Any 코틀린에서 any는 모든 타입의 상위 타입(슈퍼 타입)이며, 모든 클래스의 공통 조상입니다. 즉, 모든 코틀린 클래스의 인스턴스를 저장할 수 있는 공통의 타입을 말합니다. Any는 자바의 Object와 유사한 역할을 합니다. 코틀린의 클래스들은 기본적으로 Any 클래스를 상속받기 때문에, 모든 클래스의 인스턴스는 Any 타입으로 취급될 수 있습니다. fun main () { val obj1:SubClass1 = SubClass1() val obj2:SubClass2 = SubClass2() anyMethod (obj1) anyMethod (obj2) anyMethod ( 100 ) anyMethod ( " 문자열 " ) } open class SuperClass1 interface Inter1 class SubClass1: SuperClass1() { fun subMethod1 () { println ( "SubClass1 의 subMethod1 입니다 " ) } } class SubClass2: Inter1 { fun subMethod2 () { println ( "SubClass2 의 subMethod1 입니다 " ) } } fun anyMethod (obj : Any){ println (obj. javaClass ) if ( obj is SubClass1 ) { obj .subMethod1() } else if ( obj is SubClass2 ) { obj .subMethod...

Kotlin is 연산자

Kotlin is 연산자 형 변환이 가능하면 변환을 하고 true를 반환한다. if 문으로 구성하여 사용하며, if 문 내에서만 변환된 타입을 사용하고 if 문을 나가게 되면 변환되기전의 타입으로 다시 변경된다. fun main () { val obj1:SubClass1 = SubClass1() val chk1 = obj1 is SuperClass1 println ( "chk1 : $ chk1 " ) } open class SuperClass1 class SubClass1: SuperClass1() 결과값 > chk1 : true SubClass1 이 SuperClass1 을 상속받았으므로, SubClass1 으로 만들어진 obj1 은 SuperClass1 으로 형변환이 가능하다. 따라서 Boolean 타입 변수인 chk1 은 true 로 리턴이 된다. fun main () { val obj1:SubClass1 = SubClass1() val chk1 = obj1 is SuperClass1 val chk2 = obj1 is Int // 에러 발생 println ( "chk1 : $ chk1 " ) } open class SuperClass1 class SubClass1: SuperClass1() Kotlin: Incompatible types: Int and SubClass1  obj1 은 Int 타입으로 할당 할 수 없기 때문에 위와 같은 오류메시지가 발생한다. 오류 메시지는 일반적으로 Kotlin에서 SubClass1의 인스턴스를 Int 타입의 변수에 할당하려고 할 때 발생합니다. 이는 호환되지 않는 타입이기 때문에 허용되지 않습니다. fun main () { val obj1:SubClass1 = SubClass1() val super1:SuperClass1 = obj1 val chk1 = super1 is SubClass1 ...

Android Studio 에서 Signature APP 만들기

이미지
  Android Studio 에서 Signature APP 만들기 Android Studio , 에뮬레이터환경에서 Signature App을 만드는 방법에 대해서 기술한다. Android 권한과 관련하여 시스템적으로 중요 정보를 얻기 위해서는 Protection Level 이 Signature 이상이여야 한다. 즉, 시스템 권한이 필요한 경우 pre-built된 앱 혹은 동일한 플랫폼 사이닝키로 인증된 경우 사용 가능하다. 아래는 Android Studio 를 통해서 에뮬레이터 환경에서 플랫폼 사이닝키로 인증하는 방법에 대해서 알아보자. AOSP 퍼미션 정책 AOSP Permision Protection Level Protection Level 선언부 접근 권한 서드파티 앱 normal  "normal" 각 앱에서 <use-permission/> 선언 후, 사용자 동의 없이 사용 가능 사용 가능 dangerous  "dangerous" 각 앱에서 <use-permission/> 선언 후, 사용자 동의 하에 사용 가능 (유저 퍼미션 팝업 및 동의 필요) 사용 가능 signatureOrSystem  "signature|privileged " 아래 signature에 해당되거나, system/priv-app/ 경로에 프리빌트된 앱에서 사용 가능 사용 불가 (플랫폼 사이닝 키 필요) signature  "signature" <permission/> 선언한 앱과 <use-permission/> 선언한 앱이 동일한 인증서로 사인된 경우 사용 가능 사용 불가 (플랫폼 사이닝 키 필요) *signature → certificate: "platform" *system → privileged: true *privileged → allowlist → required: ["allowed_privapp_com.android.car.rotary...