기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

코틀린 자료형

자료의 참조방식

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

기본형(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' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b