ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Deep in to Kotlin(feat .android)
    etc/코틀린_안드로이드 2022. 9. 27. 17:28

     

    코틀린을 배우기 전 다음과 같은 질문들이 있을거다.

     

    1. Compile 순서

    2. kotlin 의 자료구조, 자료형 생성 원리

     

     

    https://diqmwl-programming.tistory.com/115

    - > Kotlin 에서 Java @프로세서로 생성되는 코드를 사용 하면 문제가 발생합니다.

    -> 컴파일 순서가 (코틀린 컴파일)   ->  ( 자바, 컴파일,어노테이션 프로세싱이다)

     

    ------------------------------------------------------------------------------------------

    2. kotlin 의 자료구조 자료형 .

     

    코틀린의 자료형은 참조형만 사용을 한다.

    ------------------------------------------------------------------------------------------

    자바는 int,long,flot 와 같은 기본형과, String ,Date 와 같은 참조형을 사용을 하지만,

    코틀린의 자료형은 참조형만 사용을 한다.  이것이 뭐냐 하기전에 아키텍처를 먼저 보자

     

    기본형 (Primitive Data) :  가공되지 않은 순수 한 자료형 프로그래밍 언어에 내장이 되어 있다.

    참조형 (Reference Data) :  객체를 생성하고 동적 메모리 영역에 데이터를 둔 다음 이것을 참조하는 자료형이다.

    객체 :  같은 혹은 비슷한 데이터나 로직의 집합

     

    동적 메모리 영역의 구조

    여기서 메모리는 Ram 이다 8,16,32 etc,,

     

     

    Stack ,Heap 에서 객체가 어디서 만들어 지는 걸까?

     

     

    (: kotlin에서 Java 의, null 을 호출 하면 다음 에러가 뜬다.

    java.lang.NullPointerException: javaSample.name must not be null

    ) -> 기존 자바 코드 선언시:   null 이 기본으로 선언이 가능하지만 코틀린은 기본이 notnull 이다! 

    public class ~(){
    	public static void main(){
        // 변수 = stack ,객체 = 힙
        
        	int[] arr1; //선언만 했기 때문에 주소가 null 이다
            int[] arr2; // 선언만 했기 때문에 주소가 null 이다
            int[] arr3; // 선언만 했기 때문에 주소가 null 이다 == 메모리 주소가 저장 x
            
            arr1 = new int[]{1,2,3,};
            arr2 = new int[]{1,2,3,};
       		arr3 =arr2;
            
            
            String s1 =new String("1,2,3,4");
    		String s2 =new String("1,2,3,4");
            
            s1 == s2 // false
            s1.equals(s2) // true
            
        }
    }

     

    출처 : 이것이 자바다!

    Java

    int a = 77 ;
    Person person = new Pearson();

     

    변수 a는 stack 에 들어감 , 크기 고정됨, 참조형은 주소가 stack 에 들어가 있다.

    -> 참조형의 실제 객체는 동적 메모리인 Heap 에 있습니다.

     

    기본형이 참조형보다 수행시간이 빠릅니다.     (Feat c vs python)

    코틀린은 참조형으로 선언한 변수는  성능 최적화를 위해 코틀린 컴파일러에서 다시 기본형으로 대체됩니다.

    ====== >코틀린에서는 참조형을 기본형으로 고려하는 최적화를 신경 쓰지 않아도됨!!

     

    Kotlin 에서 String 비교

    var str1: String ="a"
    var str3 = "a"
    val a =String(StringBuilder("a"))
    val b =String(StringBuilder("a"))
    
    print(" ")
    print(str1 == str3) // t
    print(" ")
    print(str1 === str3) //t
    
    
    print(" ")
    print(a == b) // t
    print(" ")
    print(a === b) //f
        /// String Constant Pool 저장 안되게함

     

    -> Stack 에 Garbadge 문제 ?

    - > 람다형으로 사용하는 코틀린 언어는 인라인을 통해서 이루어지기 때문에 객체 증가로 이루어 지지 않기 때문에 가비지컬렉션(GC)가 늘어나는 일로 멈추지 않는다.

     

     

    ------------------------------------------------------------------------------------------

    구버전

     

    JAVA 는 정적 타입 프로그래밍입니다.

    - 자료형을 컴파일 타임에 결정 하는 프로그래밍언어 입니다.

    -> 컴파일 타임에 타입에 대한 정보가 결정되어 런타임(실행)에 메소드를 더 빨리 호출 합니다.

     

    코틀린에서 빌드 과정입니다.

     

     

     

     

     

     

     

     

     

     

    안드로이드 공식 문서 :

    https://developer.android.com/studio/build?hl=ko#build-process 

     

    빌드 구성  |  Android 개발자  |  Android Developers

    Android 빌드 시스템은 앱 리소스 및 소스 코드를 컴파일하고 개발자가 테스트, 구축, 서명 및 배포할 수 있는 APK로 패키징합니다.

    developer.android.com

     

     

     

     

    1. 컴파일러는 소스 코드를 DEX(Dalvik Executable) 파일로 변환하고 그 외 모든 것은 컴파일된 리소스로 변환합니다. 이 DEX 파일에는 Android 기기에서 실행되는 바이트 코드가 포함됩니다.
    2. APK Packager는 DEX 파일과 컴파일된 리소스를 단일 APK로 결합합니다. 그러나, 앱을 Android 기기에 설치하고 배포할 수 있으려면 먼저 APK에 서명해야 합니다.
    3. APK Packager는 디버그 또는 출시 키 저장소를 사용하여 APK에 서명합니다.b. 출시 버전의 앱(즉, 외부에 출시할 앱)을 빌드 중인 경우에는 패키저가 출시 키 저장소로 앱에 서명합니다. 출시 키 저장소를 생성하려면 Android 스튜디오의 앱 서명을 참조하세요.
    4. a. 디버그 버전의 앱(즉, 테스트 및 프로파일링 전용 앱)을 빌드 중인 경우에는 패키저가 디버그 키 저장소로 앱에 서명합니다. Android 스튜디오는 디버그 키 저장소로 새 프로젝트를 자동으로 구성합니다.
    5. 최종 APK를 생성하기 전에, 패키저는 앱이 기기에서 실행될 때 더 적은 메모리를 사용하도록 앱을 최적화하기 위해 zipalign 도구를 사용합니다.

     

     

     

    안드로이드에서 소스 코드는(자바 파일이든 코틀린 파일이든) 컴파일러에 의해 우선 DEX 파일로 변환되는데, 이 DEX 파일은 바이트 코드(.class 파일)들을 포함하고 있다.

     

     

    BUT!!!! IN ANDROID

    DVM 이다 현제는 사용 하지 않는다....

     

     

     

     

    Java class files compile to Java bytecode then translated to executable than runs in ART VM

    == JVM 느려,, ART 에서 돌린다!

    -> dvm은 JIT 방식을 사용하지만 ART은 AOT(Ahead Of Time)을 사용한다.

    안드로이드는 ART 가있다.

    Runtime : 프로그램을 실행시키는 엔진, 

     

     

     

    정리  : 자바컴파일 코틀린 컴파일 각 각 

     

     

     

     

     

     

     

Designed by Tistory.