-
Deep in to Kotlin(feat .android)etc/코틀린_안드로이드 2022. 9. 27. 17:28
코틀린을 배우기 전 다음과 같은 질문들이 있을거다.
1. Compile 순서
2. kotlin 의 자료구조, 자료형 생성 원리
- > 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();
-> 참조형의 실제 객체는 동적 메모리인 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
- 컴파일러는 소스 코드를 DEX(Dalvik Executable) 파일로 변환하고 그 외 모든 것은 컴파일된 리소스로 변환합니다. 이 DEX 파일에는 Android 기기에서 실행되는 바이트 코드가 포함됩니다.
- APK Packager는 DEX 파일과 컴파일된 리소스를 단일 APK로 결합합니다. 그러나, 앱을 Android 기기에 설치하고 배포할 수 있으려면 먼저 APK에 서명해야 합니다.
- APK Packager는 디버그 또는 출시 키 저장소를 사용하여 APK에 서명합니다.b. 출시 버전의 앱(즉, 외부에 출시할 앱)을 빌드 중인 경우에는 패키저가 출시 키 저장소로 앱에 서명합니다. 출시 키 저장소를 생성하려면 Android 스튜디오의 앱 서명을 참조하세요.
- a. 디버그 버전의 앱(즉, 테스트 및 프로파일링 전용 앱)을 빌드 중인 경우에는 패키저가 디버그 키 저장소로 앱에 서명합니다. Android 스튜디오는 디버그 키 저장소로 새 프로젝트를 자동으로 구성합니다.
- 최종 APK를 생성하기 전에, 패키저는 앱이 기기에서 실행될 때 더 적은 메모리를 사용하도록 앱을 최적화하기 위해 zipalign 도구를 사용합니다.
안드로이드에서 소스 코드는(자바 파일이든 코틀린 파일이든) 컴파일러에 의해 우선 DEX 파일로 변환되는데, 이 DEX 파일은 바이트 코드(.class 파일)들을 포함하고 있다.
BUT!!!! IN ANDROID
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)을 사용한다.
Runtime : 프로그램을 실행시키는 엔진,
정리 : 자바컴파일 코틀린 컴파일 각 각
'etc > 코틀린_안드로이드' 카테고리의 다른 글
Kotlin if vs when 성능 비교 ? (0) 2022.09.29 Kotlin Nullable (0) 2022.09.29 코틀린 자바 장단점 비교, Kotlin vs Java (1) 2022.09.25 [코틀린 강의 정리]_loop section (0) 2021.09.28 uppercase(),버전 확인 문제 (0) 2021.09.27