2016년 4월 25일 월요일

kotlin programming language - 기초타입

코틀린에서는 모든것이 다 객체이며 numbers, characters, booleans and arrays.

Numbers
kotlin은 자바와 비슷하게 number를 취급하지만 정확하게 같지는  않다. 

TypeBit width
Double64
Float32
Long64
Int32
Short16
Byte
8

Literal Constants
-decimal:123
-long : 123L
-double : 123.5, 123.5e10
-float : 123.5f or 123.5F
-10진수 : 0x0F
-바이너리 :  0b00001011
#8진수는 지원하지 않습니다.

nullable 변수와 일반 변수 값 비교
값을 비교할 때 '=='과 '==='으로 비교할 수 있습니다.
'=='은 자바에서의 사용법과 다르게 equal()과 같습니다. 값만 비교합니다.
물론 equal()도 사용할 수 있습니다. 단 nullable로 선언된 변수는사용할 수 없습니다.
'==='은 자바의 '=='과 같습니다. 비교할 두 변수가 같은 값과 같은 오브젝트인지 체크합니다.
val a: Int = 10000print(a === a) // Prints 'true'val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!print(boxedA == anotherBoxedA) // Prints 'true'

타입 캐스팅 
자바에서는 (변환할 타입)변환할 변수 이런 형식으로 다음과 같이 변환했다
Object obj = "hello";String str = (String) obj;//Object에서 String으로 타입 변환((String) obj).toCharArray();//String 타입의 메소드 사용 

kotlin에서는 'as' 키워드를 사용하여 변환한다 
val obj: Any = "hello"val str:String = obj as String //String 타입으로 변환(obj as String).toCharArray() //String 클래스의 메소드 사용

kotlin에는 wrapper 클래스가 없으므로 자바에서 처럼 boxing/unboxing/autoboxing 이 이루어지지 않습니다.
int a =1000;long b = a;
자바에서는 별다른 구현없이 자동으로 됐지만
val a: Int = 1val b: Long = a.toLong()
 이런식으로 명시해줘야 함 
아래와 같이 수학연산할 때만 묵시적으로 캐스팅없이 가능
val l = 1L // Long + Int => Long

Characters
캐릭터(Char)는 홅따옴표로 'a' 표시하고 특수기호의 이스케이프는 역슬레시'\'로  
fun decimalDigitValue(c: Char): Int {
    if (c !in 'a'..'z')
        throw IllegalArgumentException("Not a lowercase alphabet")
    return c.toInt() // 캐릭터 코드 리턴}

Boolean
true 및 false로 표현할 수 있고 논리합연산자 '||' 이나 논리곱연산자 '&&', 논리부정연산자  '!'으로 연산을 할 수 있다.
하지만 자바와 다르게 '|'와 '&'는 사용할 수 없습니다.

Array
kotlin에는 객체생성을 위해 new 키워드를 사용하지 않는다. 때문에 array 객체 생성이나 초기화에 불편함을 느낄 수도 있겠다.
array 객체 생성비교
[자바]
String[] strArr= null;String[] strArr1= {"a","b","c"};String[] strArr2= new String[]{};String[] strArr3= new String[]{"a","b","c"};
[kotlin]
val array nullval array2 arrayOf("a","b","c") // arrayOf()메소드를 통해 초기화 해야 한다

기본타입+arrayOf로 특정타입의 배열을 생성할 수 있다. 이 클래스들은 Array()클래스와 상속관계가 없는 독립적인 클래스이다. ex)intArrayOf(..),byteArrayOf(..)
또 Array클래스를 생성하며 람다식을 활용하여 배열을  생성할 수도 있다.
val limitedArray = Array(5,i->(i*i)}) //index를 이용하여 초기화한다
Array클래스의 생성자를 보면
public inline constructor(size: Intinit: (Int) -> T)
처럼 되어 있다. 사이즈와 초기화 메소드를 제공하면 배열을 생성해 준다.
생성한 후 출력해 보면 [0, 1, 4, 9, 16]의 결과를 확인할 수 있다.

String
Kotlin에서 String은 자바와 같이 불변성을 갖는다. 
String 리터럴: 이스케이프된 스트링과 줄바꿈기호가 포함된 raw 스트링 두가지종류가 있다.
이스케이프된 스트링은 자바와 매우 흡사하다. 
val s = "Hello, world!\n"
raw 스트링은 쌍따옴표 3개의 블럭으로 선언한다. (""" ...""")
기본 스트링("" "")은 줄바꿈시 +기호로 연결 안하면 오류 raw 타입 스트링은 """안에서 줄바꿈이 자유롭다. intellij에서는 엔터키 입력하면 자동으로 텍스트 블럭 닫고 + 기호로 연결해 준다.
val text = """|Tell me and I forget.|Teach me and I remember.|Involve me and I learn.|(Benjamin Franklin)"""
어쨌든 위의 텍스트를 출력해 보면 다음과 같이 처음과 마지막줄에 한줄씩 추가되어 있고 각 줄의 시작에 공백이 있는걸 볼수 있다.

(공백)
    |Tell me and I forget.
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
(공백)

이것은 String 클래스의  trimMargin()함수를 사용하면 해결된다. 파라미터로 마진 prefix를 입력할 수 있는데 기본값은 "|"이다. 무슨말인고 하니 각줄의 시작에 "|"을 추가하고 해당 함수를 호출하면 공백을 없애준다는 것이다.

Tell me and I forget.
Teach me and I remember.
Involve me and I learn.
(Benjamin Franklin)


문장 첫머리의 "|" 기호가 사라지고 공백도 함께 사라졌다. prefix값은 편의대로 입력하면 된다.ex) trimMargin(">")

댓글 없음:

댓글 쓰기