기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

코틀린 자료형

자료의 참조방식

코틀린에서 코딩 시 객체에 자료를 입력하는 것은 기본적으로 참조를 기본으로 합니다. 그러나 코드의 컴파일 단계에서는 기본형으로 대체됩니다.

기본형(Primitive data type)과 참조형(Reference Data Type)을 어떤 차이가 있을까요?

기본형: 프로그램밍 언어에 내장되어 있는 형태로서 int, long, Double, Float등

참조형: String, Date와 같이 기본형을 조합하여 생성한 자료형태

그러나 위에서 소개한 것과 같이 코틀린은 코딩시 모든 자료를 참조형식으로 사용하지만 컴파일 단계에서 int, long, Double, float등은 기본형으로 전환되므로 이 참조형의 최적화를 별도로 고려할 필요는 없습니다.

자료형이 저장되는 메모리는 임시메모리인 stack과 동적메모리인 heap으로 구분됩니다.
참조 방식의 경우 생성된 객체의 값들은 heap에 저장되고 stack에는 그 값들이 저장된 주소만이 존재합니다. 그러므로 그 객체를 호출할 경우 값은 heap에 있는 부분을 호출하여 나타내게 됩니다.


x=3 이라는 객체를 선언하면 임시메모리인 stack에 이 객체를 위한 자리가 마련되지만 값(실제객체) 3은 동적메모리인 heap에 저장되고 stack에는 heap에 저장된 그 값의 주소가 저장됩니다. 그러므로 객체가 사용될 경우는 주소에 위치한 값을 소환하여 사용합니다.
코틀린에서 객체의 선언은 위와 같은 참조형식을 취하지만 일단 그 객체가 컴파일 되면 기본형으로 변환되어 값을 직접이용하게 됩니다. 결과적으로 자료의 저장 방식을 고려할 필요는 없습니다.

자료형의 종류 

정수형

양수, 음수, 0을 포함하며 부호가 있는 자료와 부호가 없는 자료로 구분합니다.

형식 자료형 크기 범위
부호있는 정수형 Long 8바이트(64비트) -263 ~ 263-1
Int 4바이트(32비트) -231 ~ 231-1
Short 2바이트(16비트) -215 ~ 215-1
Byte 1바이트(8비트) -27 ~ 27-1

각 자료형은 클래스로 구성되어 있으며 클래스의 멤버함수 즉, 메서드가 존재합니다.
각 자료형의 최대값과 최소값은 다음 메소드로 확인할 수 있습니다.

.MAX_VALUE: 최대값
.MIN_VALUE: 최소값

val bigByte: Byte=Byte.MAX_VALUE
val smallByte: Byte=Byte.MIN_VALUE
println("bigByte: $ {bigByte}  and  smallByte: $ {smallByte}")
     bigByte: 127 and smallByte: -128

변수를 선언할 경우 자료형은 명시하지 않아도 됩니다. 이 경우 변수에 전달된 값으로 자료형을 추론합니다.
일반적으로 정수형은 Int로 추론하기 때문에 Long형을 생성하기 위해서는 자료형을 명시하거나 값과 함께 L을 같이 입력해 주어야 합니다.
자료형이 명시되지 않은 상태에서 입력되는 숫자가 Int의 범위를 초과할 경우 Long으로 인식합니다.

val c: Long= 123
c is Long
     true

val b=123
b is Long
     Incompatible types: Long and Int

val b=123L
b is Long
     true

변수에 16진법이나 2진법으로 값을 전달할 경우 각각 값의 접두어로 0x, 0b를 붙여 줍니다.
val c = 0x0F //16진법으로 전달
c
     15

val b=0b1011 //2진법으로 전달
b
     11

실수자료형


형식 자료형 크기 범위
실수형 Double 8바이트(64비트) 약 4.9E-324~ 1.8E308
Float 4바이트(32비트) 약 1.4E-45 ~ 3.4E+38
실수를 입력할 경우 기본형은 Double형입니다. 그러므로 Float 자료형으로 실수를 입력할 경우 값 마지막에 F를 입력해주어야 합니다.

val a:Float=0.123F
a
     0.123


실수의 갯수는 무한하지만 메모리 공간은 유한하기 때문에 모든 실수를 표현할 수 없습니다.
그러므로 많은 자리수를 가지는 경우 다음과 같이 표현됩니다.
다음은 3.14E+16의 표기에 대해 설명한 것입니다.
3.14 E +16
가수 부분, 소수점(없을 수도 있음) E or e 지수부분, + 또는 -로 +는 일반적으로 생략
위는 컴퓨터에서 실수 즉, 부동소수점을 표현하는 방식으로 점의 위치는 고정된 것이 아닙니다,
예를 들어 0.00314는 3.14e-3 또는 0.314e-2와 같이 다양하게 나타낼 수 있습니다. 단지 소수점(.)의 위치가 바뀌고 있습니다. 그러므로 이러한 소수점을 부동소수점이라고 합니다.
 
val a=3.14e-3
a
     0.00314

위 표현은 부호, 가수, 지수 부분으로 구성되며 각각의 메모리에 저장되는 위치와 용량이 다릅니다.
예로 float의 경우 메모리의 크기는 32 bit로서 다음과 같이 분할되어 저장됩니다.

부호(1bit) + 지수(8bit) + 가수(23bit)
부호는 0 또는 1 → 1은 음수를 의미

논리형

참(true)과 거짓(false)을 표현하며 조건을 검사할 경우에 많이 사용됩니다. 


형식 자료형 크기
논리형 Boolean 1비트 true, false

val a=3.1
val b=5.4
a > b
     false

문자자료형

문자(Char)를 표현하기 위한 자료형으로서 작은 따옴표(' ')로 값을 전달합니다. 

형식 자료형 크기
문자 Char 2바이트(16비트) 0 ~ 215

val ch='a'
ch
     a

문자형의 값은 정수입니다. 그 정수 값이 아스키코드, 유니코드 표에 대응되는 문자를 표현합니다.
예를들어 문자 a는 문자로 저장되지 않고 정수 65로 저장됩니다.
그러므로 위 코드의 a 다음의 값은 b이며 이 값은 66입니다. 이것은 다음 표현과 같습니다.
66=65+1  →  b=a+1 
 
ch+1
b

또한 문자의 근원은 정수이므로 다음 메소드를 사용하여 숫자를 문자로 전환할 수 있습니다.

정수.toChar() 메소드를 적용합니다.

for(i in 65..90){
print("$ {i.toChar()}, ")
}
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,

이와같이 문자와 숫자는 상호연결이 되어 있지만 문자형에 숫자를 직접 전달 할 수는 없습니다. 
 
val code: Char=67
code
     The integer literal does not conform to the expected type Char

문자열 자료형

Char은 문자 하나만을 나타냅니다. 하나 이상의 문자와 문장등을 나타내기 위해서 String(문자열)을 사용합니다. 
String은 여러문자를 결합한 형태로 여러 값들을 하나의 그룹에 담는 collection과 유사합니다. 즉, 문자열 객체는 여러 문자를 결합한 것으로 구성하는 각 문자가 원소가 됩니다. 
Char은 기본자료형인데 반해 String은 참조자료형입니다. 
문자열을 전달하기 위해서는 큰따옴표(" ")를 사용합니다. 

val str="Kotlin"
str
     Kotlin

for (i in str) {println(i)}
     K 
     o 
     t 
     l 
     i 
     n

str[1]
     o


댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...