Deperecated/Kotlin

코틀린 - 기본

누알라리 2020. 2. 5. 13:47

0. Do it 코틀린

0-1) 코틀린의 막강 장점

- 기존 언어엔 없는 널검사 코루틴 고차함수 람다식 -> 안정성 bb

- 함수형 프로그래밍

- made by jet brains which makes IntelliJ IDEA

 

- 멀티플랫폼 ( Kotlin/ JVM,JS,NATIVE )

1. 자바앱, 안드로이드앱

2. 디비+서버+클라 -> 풀스택 웹개발

3. LLVM 컴파일러로 IOS, ANDROID, EMBEDDED, IOT, LINUX 타깃의 앱

 

0-2) 코틀린의 장점

 

1. 정적언어

- 프로그램이 컴파일될 때 자료형을 확정하는 정적언어. -> 자료형 오류를 미리 예방 가능

 

2. NPE 예방 가능

- Null Pointer Exception. 변수나 객체의 초기화가 이루어지지 않은 상태에서 그 변수에 접근할 때 발생하는 예외 오류.

 

3. 간결하고 쉬움

 

4. 함수형/객체지향 프로그래밍 둘 다 가능

- 함수형: 함수를 변수에 저장하거나 / 함수를 다른 함수의 매개변수로 넘길 수 있음

- 객체지향형: 클래스를 사용

 

5. 세미콜론 생략 가능

 

0-3) 코틀린 프로젝트 하나씩 뜯어보기

 

1. 코틀린의 main() 함수는 프로그램의 실행 진입점

 

- Kotlin/JVM 프로젝트를 기준으로 우리가 작성한 코틀린 코드는 JVM에서 실행되며, 클래스를 따로 만들지 않아도 main() 함수가 있는 파일이름을 기준으로 자바클래스가 자동으로 생성된다.

- 이는 Decompile버튼으로 확인해볼 수 있다.

 

기존 HelloKotlin 파일.

fun main() {
	println("Hello Kotlin!")
}
HelloKotlin.kt 파일을 기준으로 별도의 클래스 생성없이 main()을 선언 후 컴파일 했을 때,
디컴파일을 해보면 아래와 같은 소스 코드를 확인할 수 있다.


public final class HelloKotlinKt {
	public static final void main() {
    	String var0 = "Hello Kotlin!";
        system.out.println("var0");
        }
        
        public static void main(String[] var0_ {
         main();
         }
}

 

- JVM에서 실행되기 위해 문자열은 String var로 알아서 다시 선언되서 콘솔에 출력되게 하는거임.

- main함수가 static으로 선언되었기 때문에 정적 메모리 영역(Data영역)에 객체가 만들어진다. 따라서 객체의 생성 없이 호출해 사용할 수 있게 된다.

 

2. 프로그램의 데이터 영역

2-1) 코드영역 - 명령어들이 들어있는 영역

2-2) 데이터영역(메서드 정적 영역) - 프로그램이 컴파일되면 문자열이나 정적 변수나 문자열 등이 들어가는 영역

2-3) 힙 영역 - 실행 중 동적으로 생성되는 객체가 들어가는 영역

2-4) 스택 영역 - 코드 블록인 중괄호 안에 사용한 변수나 함수 호출 블록이 저장되는 임시 메모리 영역. 함수가 끝나면 스택에서 자동으로 제거된다.

 

 

코드

데이터

힙 (아래로 쌓임)

스택 (위로 쌓임)

 

힙과 스택이 데이터 쌓이는 방식이 반대기 때문에 프로그램이 동작하는 도중에 너무 많은 메모리를 할당하는 객체가 있으면 힙 영역에서 out of memory 오류를, 함수 재귀호출이 너무 많이 일어나면 stack overflow 오류를 발생시킨다.

 

 

1. 메인 함수
fun main(args : Array<String>)
{
	println("HelloWorld");
}

- 매개변수 args : Array<Sting>을 쓰면 자바에서는 String[] args 로 변환된다.


2. 기본 문법

세미콜론(;)을 안써도 되는데 개발자들의 편의를 위해 허용

println으로 변수 값 출력 시 $변수명 을 사용한다.

-  println으로 표현식 출력 시 ${} 중괄호로 묶어서 쓰면 된다.

-  println으로 "" (큰 따옴표)를 쓰고 싶으면 백슬래시(\")로 사용해보자! -> "\"hello!\" => "hello!"

- 형식 다중 문자열 """

fun main(args : Array<String>)
{
	print("HelloWorld");
	println("HelloWorld with space");

	println("세미콜론을 사용하지 않음")
	println("숫자 ${100}");
}

3. 변수와 자료형

자료형 크기(Bytes)
Double(디폴트) 8
Float 4
Long 8
Int(디폴트) 4
Short 2
Byte 1

3-1) 코틀린의 자료형은 참조형 자료형을 사용한다.

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

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

 

참조형으로 선언한 변수는 성능 최적화를 위해 코틀린 컴파일러에서 다시 기본형으로 대체된다. 따라서 코틀린에서는 최적화한답시고 참조형을 기본형으로 고려하는 행위는 안해도 된다. -> 자동으로 최적화 수행

 

3-2) 언더스코어

실생활에서 쉼표(,)로 자릿수를 구분하듯이 코틀린에서는 언더스코어(_)로 자릿수를 구분할 수 있다.

 

3-3) 변수선언

fun main(args : Array<String>)
{
	var a2 = 100;
    
	var a3 : Int = 100;
	println("a3 : ${a3}");

	val a5 = 100 
}

 

1. var 키워드로 변수 선언 ( mutable , 가변 )

  • var 변수명 = 값과 같이 자료형 명시 안하면 처음 초기값에 따라 자료형이 자동으로 결정.
  • var 변수명 : 자료형 = 값
  • 코틀린 기본 변수 선언 var는 NULL 값을 담을 수 없다. NULL을 담으려면 뒤에 ?를 붙인다.
  • 값을 할당하지 않으면서 변수를 선언하려면 자료형을 반드시 지정해야한다.

 

2. val 키워드 ( immutable, 불변 ) 

-  읽기전용(JAVA의 final 변수)

- 최초로 지정한 변수의 값으로 초기화하고 더 이상 바꿀 수 없음.

 

var text2:TextView? = NULL

 

3-4) 자료형에 별명 붙이기

- typealias 키워드를 붙여서 자료형에 별명을 붙일 수 있다.

typealias Username = String // String을 Username이라고 부르도록 하자.
val user : Username = "Kildong"

 

4. 함수

- JAVA에서는 모든 코드를 Class 안에 작성해야 하는데, Kotlin은 Class가 아닌 Kt 파일에 코드를 작성할 수 있다.

 

fun TestMethod(a1 : Int)
{
	println(a1);
}

// 함수의 리턴타입을 정하는 경우
fun TestMethod2(a1 : Int) : Int
{
	return a1;
}


- Kotlin 에서는 함수의 매개변수값을 전달할 때 매개변수의 순서를 바꿔서 전달할 수 있다.

 

fun main(args : Array<String>)
{
    f3();
    f3(100, "사실 테스트용이 아님");
    f3("구라임", 200);
}

fun Testmethod3(a1 : Int = 0, a2 : String = "테스트용")
{
    println(a1);
    println(a2);
}

 

- 함수 오버로딩을 제공한다.

 


5. 연산자

- Kotlin은 연산자를 함수로도 제공한다.

연산자 함수
+(더하기) unaryPlus()
-(빼기) unaryMinus()
!(부호 변환) not()
++(증감연산자) inc()
--(증감연산자) dec()
a + b a.plus(b)
a - b a.minus(b)
a * b a.times(b)
a / b a.div(b)
a % b a.rem(b)
a..b a.rangeTo(b)

 

Tip. 항상 헷갈리는 증감연산자의 위치에 따른 차이
var a5 = 10

var a7 = a5++
var a8 = ++ a5

최종 value:
a7 = 10
a8 = 11


a5++ = a5를 a7에 대입한 뒤에 증가시킨다.
++a5 = a5을 먼저 증가시킨 후 a8에 대입한다.

 

자바에는 없지만 코틀린에는 있는 연산자는 삼중등호(===), 부정 이중 등호(!==)가 있다. 얘네는 참조주소를 비교한다.


6.  반복문

1. For 문

- Kotilin의 for문은 "배열에 있는 데이터를 처음부터 끝까지 순회하는 목적" 으로 사용된다.

- 기존의 for문의 목적(원하는 수 만큼 반복)은 while문으로 관리하도록.

 

fun main(args : Array<String>)
{
    var a1 = ArrayOf(10, 20, 30, 40);
    
    for(values in a1)
    {
    	println(values);
    }
    
    for((idx, value) in a1.withIndex())
    {
    	println(idx + value);
    }
}

2. While문

- Kotlin의 while문은 주어진 조건이 만족될 경우 반복되는 수행문.

 

3. Do ~ While문

- Kotlin의 Do~While문은 주어진 조건이 만족할 경우만 반복되는 반복문.

- 주어진 조건이 처음부터 거짓이라도 코드는 단 한번은 수행된다.

 


코틀린 실수 - 부동 소수점 방식

1) 부동소수점 방식

1-1. 실수를 가수 + 지수로 나누어 표현하는 방식

ex) 0.0314 / 3.14는 숫자 314는 그대로 두고 소수점만 둥둥 떠다니며 실수를 표현하는 것이다. 따라서 부동소수점.

 

코틀린에서 소수점의 이동은 숫자 오른쪽에 e나 E와 함께 밑수인 10을 제외하고 지수만 적으면 된다. 

val exp03 = 3.14E-2 // 3.14에서 왼쪽으로 소수점 2칸 이동 0.0314
val exp04 = 3.14E2 //  3.14에서 오른쪽으로 소수점 2칸 이동 314

1.2  일반 수학의 표현 

3.14 * 10^16

3.14 => 가수

10 => 밑수

16 => 지수

 

1.3 소스 코드 상의 표현

3.14E + 16

3.14 => 가수

E => 밑수

16 => 지수

 

2) IEEE 754표준의 방식

코틀린은 IEEE 754 표준의 부동 소수점 방식을 따르고 있다.

 

32비트 => 부호 + 지수(8비트) + 가수(23비트)

64비트 => 부호 + 지수(11비트) + 가수(52비트)

 

부호에는 0(양수) / 1 (음수) 가 들어간다.

지수에는 실수의 지수부분이 들어가며, 32비트에서는 -126~127 사이의 값을 사용한다.

가수는 표현하려는 수의 "정수" 부분이 1이 되도록 "정규화" 하여 저장한다.

-> 정수의 절대값을 2진법으로 표기하고, 그다음 정수부분(소수점 아닌부분)이 1이 되도록 정규화 한다.

-> 그러면 -12.375(10) -> 12.375 -> 1100.011(2) -> 1.10011 * 2^3 같이 표현할 수 있고, 1을 제외시키고 100011(2)에 대해서만 가수 부분인 23비트에 넣는다.

 

근데 부동소수점은 어떻게든 오차가 생기므로 주의해야한당

 


문자열 자료형 String 

(= String형 선언 및 할당에 사용되는 메모리는 힙 영역의 String Pool)

 

문자 자료형인 Char은 char와 같은 기본형으로 처리되지만, 문자열 자료형 String은 기본형에 속하지 않는 배열 형태로 되어있는 특수한 자료형이다.

fun main(){
 var str1:String = "Hello"
 var str2 = "World"
 var str3 = "Hello"
 
 println("str1 == str2 : ${str1 == str2}");
 println("str1 == str3 : ${str1 == str3)");
 
 출력: false / true
    

str1, str3에는 동일한 문자열이 들어있다.

이런 경우 "Hello"를 스택에 2번 저장하는것보다 이미 저장한 값을 활용하는것이 더 효율적이다.

따라서 코틀린은 힙 영역의 "String Pool"이라는 공간에 문자열인 "Hello"를 저장해 두고 이 값을 str1, str3이 참조하도록 만든다.

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

코틀린 - 중첩 클래스  (0) 2020.02.05
코틀린 - 제네릭  (0) 2020.02.05
코틀린 - 클래스  (0) 2020.02.05
코틀린 - 조건문, 분기문, 반복문  (0) 2020.02.05
코틀린 - 고차함수와 람다식(기본 3에 이어서..)  (0) 2020.02.05