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 |