기본 콘텐츠로 건너뛰기

3월, 2020의 게시물 표시

통계관련 함수와 메서드 사전

A B C d E F G H I K L M N O P Q R S T U V W Z A statsmodels.ap.stats.anova_lm(x) statsmodels.formula.api.ols 에 의해 생성되는 모형 즉, 클래스 인스턴스(x)를 인수로 받아 anova를 실행합니다. np.argsort(x, axis=-1, kind=None) 객체 x를 정렬할 경우 각 값에 대응하는 인덱스를 반환합니다. Axis는 기준 축을 지정하기 위한 매개변수로서 정렬의 방향을 조정할 수 있음(-1은 기본값으로 마지막 축) pandas.Series.autocorr(lag=1) lag에 전달한 지연수에 따른 값들 사이의 자기상관을 계산 B scipy.stats.bernoulli(x, p) 베르누이분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 p: 단일 시행에서의 확률 scipy.stats.binom(x, n, p) 이항분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 n: 총 시행횟수 p: 단일 시행에서의 확률 C scipy.stats.chi2.pdf(x, df, loc=0, scale=1) 카이제곱분포의 확률밀도함수를 계산 $$f(x, k) =\frac{1}{2^{\frac{k}{2}−1}Γ(\frac{k}{2})}x^{k−1}\exp\left(−\frac{x^2}{2}\right)$$ x: 확률변수 df: 자유도 pd.concat(objs, axis=0, join=’outer’, …) 두 개이상의 객체를 결합한 새로운 객체를 반환. objs: Series, DataFrame 객체. Axis=0은 행단위 즉, 열 방향으로 결합, Axis=1은 열단위 즉, 행 방향으

[pyton]진수변환 프로그램

진수 변환 10진수를 각 진수로 전환하기 위해 나머지를 연결합니다. 예를들어 7를 2진수 (binary)로 전환하는 과정은 다음과 같습니다. x=7 1) x를 2로 나누어 몫과 나머지를 계산합니다. q, r=divmod(x, 2)#2로 나눈 몫과 나머지 q, r (3, 1) 2) 위 결과의 몫을 다시 나눕니다. q2, r2=divmod(q, 2) q2, r2 (1, 1) 3) 2)과정을 몫이 0이 될때까지 반복합니다. q3,r3=divmod(q2, 2) q3, r3 (0, 1) 4) 각 과정에서 나머지를 순서적으로 결합합니다. result: 111 2진수 -> 10진수는 2진수의 각자리의 값x2 자리수수 와 같이 계산한 값들의 합입니다. y=111 위 수의 각각을 분리하기 위해 문자열로 전환합니다. y=str(y) for i in y: print(i) 1 1 1 위 결과 문자열의 길이가 3입니다. 그러므로 첫 원소부터 2 2 , 2 1 ,2 0 을 곱하여 모두 합해 줍니다. 1*2**2 + 1*2**1 + 1*2**0 7 8진수와 16진수 변환도 같은 과정으로 진행됩니다. 단지 16진수의 경우는 10, 11, ..., 15를 a, b, ..., f로 나타냅니다. 그러므로 다음의 변화 코드가 필요합니다. ref={'a':10, 'b':11, 'c':12, 'd':13, 'e':14, 'f':15} ref['b'] 11 ref.get("b") 11 ref1={10:'a',11:'b', 12:'c', 13:'d', 14:'e', 15:'f'} ref1.get(15)#==ref1[15] '

변수(variable), 상수(constant), 리터럴(literal) 그리고 컬렉션(collection)

내용 변수와 상수 Literals(리터럴) 숫자형 리터럴 Int 형의 진법변환 format(x, 진수) String(문자형 리터럴) Boolean literals None literals 컬렉션(Collections) 변수, 상수, 그리고 literals 변수와 상수 변수 메모리에 할당된 데이터를 참조하기 위한 이름입니다. 변수의 내용은 수정이나 치환이 가능합니다. 실제로 참조경로가 수정되는 것입니다. 상수 변수와 같지만 수정이나 치환되지 않습니다. 변수나 상수에 값을 할당하기 위해 ' = ' 를 사용합니다. x="apple";x 'apple' x=32 #변수이므로 값의 수정이 가능함 x 32 여러 변수에 각 값을 동시에 할당할 수 있습니다. a, b, c=5, 3.14, "Python" a 5 b 3.14 c 'Python' python에서는 상수와 변수를 엄격히 구분하지 않습니다. 그러나 변형할 수 없는 수를 포함하는 파일을 작성하고 이 파일을 가져오기 하여 상수로 사용할 수 있습니다. 즉, 상수를 포함하는 파일을 모듈로 사용하는 것입니다. 특정한 수를 상수로 사용해야 할 경우 별도의 파일로 작성하여 모듈로 사용하는 방법을 적용할 수 있습니다. 다음 코드는 일정한 수준에서 반올림한 π 값을 상수로 사용하기 위해 python 파일(contant.py)을 작성한 후 모듈로 임포팅 하여 사용한 예입니다. 현 파이썬 인터프리터에 임포팅한 값을 수정하더라고 특정한 수를 포함한 원시파일(raw file)의 값을 변경되지 않습니다. import constant pi=constant.PI pi 3.14 constant.PI=3.

문(statements), 식(Expression), 블럭(block), 그리고 주석(comments)

문(Statements) Expressions(식) Block(블럭)과 들여쓰기(Indentation) Multi line 입력 주석(comments) 문(statements), 식(Expression), 블럭(block), 그리고 주석(comments) 문(Statements) 파이썬 인터프리터(해석기)가 실행할 수 있는 명령을 문 (statement)이라고 합니다. 문의 실행에 어떤 결과도 반환되지 않습니다. x=3 x라는 객체에 3을 할당하는 것으로 할당문(assignment statement)라고 하며 객체 x는 3을 참조한다는 것을 암묵적으로 선언하는 것입니다. 그러므로 이에 대한 결과는 반환되지 않습니다. x를 다시 호출하는 것으로 확인할 수 있습니다. x 3 위와 같이 문은 일반적으로 결과를 직접적으로 반환하지 않습니다. 그러나 print()문과 같이 결과를 출력하는 경우도 있습니다. 정확히 말하자면 명령에 의해 결과를 생성하고 그 결과를 다시 참조하여 반복적으로 사용할 수 있는 경우를 반환 (return)이라고 합니다. 다음 코드들에서 y는 3과 7의 더하기 연산의 결과로 객체 z이 참조할 수 있는 객체가 됩니다. 반대로 print()문의 결과를 객체 a에 할당하는 명령에서 a는 어떤 결과도 갖지 않습니다. 즉, print() 문에 의한 결과는 출력된 후에 메모리에 저장되지 않고 사라집니다. 이러한 결과의 발생을 출력 이라고 합니다. y=3+7 y 10 z=13+y z 23 a=print("이것은 출력입니다.") 이것은 출력입니다. a 결과적으로 문에 의한 결과의 반환은 명시적으로 이루어지지 않습니다. 반면에 식은 결과를 명시적으로 나타냅니다. Expressions(식) 문 중에 연산 등의 표현으로 단일한 값을 반환 하는 표현을 식 이라고 합니다. x="Hello" y="Python" z=x+" "+y z

[python] 다형성(polymorphism)

다형성은 어떤 형태가 다른 형태로 발생하는 조건을 의미합니다. 이 다형성은 프로그래밍에서 매우 중요한 개념으로 단일 유형의 연산자, 개체등을 다른 조건이나 시나리오에서 다른 형태로 사용하는 것을 의미합니다. 예를들어 덧셈 연산자인 '+'는 숫자형 뿐만 아니라 문자형에서도 사용될 수 있으며 각 사용처에 따라 그 용도 역시 차이가 납니다. 숫자 : 덧셈 문자 : 연결 x=2 y=3 x+y      5 str1="pyhton" str2="polymorphism" str1+" "+str2 str1="pyhton"...      'pyhton polymorphism' 위와 같이 동일 대상의 사용의 차이를 다형성(polymorphism)이라고 합니다. 거의 모든 python 객체에서 사용되는 len()함수는 대상의 길이를 반환합니다. 그러나 그 함수의 대상이 되는 인수가 문자열, 리스트, 사전에 따라 반환하는 결과에 차이를 나타냅니다. x="Hello World" #문자열을 구성하는 문자의 수를 반환 len(x)      11 y=[1, 2,"apple", "computer"] #리스트를 구성하는 원소 수를 반환 len(y)      4 z={"computer": 2, "apple":1} #사전 형식의 key:value의 pair의 수를 반환 len(z)      2 위와같이 다형성은 함수를 다양한 조건에서 사용할 수 있게 합니다. 이러한 용도는 클래스로 확대할 수 있습니다. class staff1:     def __init__(self, name, age, grade):         self.name=name         self.age=age         self.grade=grade     de

If ~ else 문

if 문 조건을 결정하기 위한 문(statement)입니다. if 문의 기본 형태는 다음과 같습니다. if 조건:      실행문 1 else:      실행문 2 if 문의 결정 구조는 다음 그림과 같습니다. x=29 if x % 3==0:     print(x,": 3의 배수입니다.") else:     print(x, ": 3의 배수가 아닙니다.") x=29... 29 : 3의 배수가 아닙니다. 물론 이 문은 if 문 만을 나타낼 수 있으며 여러개의 선택 사항을 표현할 수 있습니다. x=-7 if x > 0:     print(str(x)+"는 양수입니다.") else:     if x < 0:         print(str(x)+"는 음수입니다.")     else:         print("zero") -7는 음수입니다. 위와 같이 여러 조건들이 존재할 경우 python은 else 구문내에 또다른 분기를 만들기 보다는 'elif~' 문을 사용합니다. if 조건1 :      실행문 1 elif 조건 2:      실행문 2 elif 조건 3:      실행문 3      ፧ else:      실행문 n x=-7 if x > 0:      print(str(x)+"는 양수입니다.") elif x < 0:      print(str(x)+"는 음수입니다.") else:      print("zero") 또한 위의 조건문은 다음과 같이 If  문내에 다른 if 문을 포함하여 표현할 수 있습니다. 이러한 형식은 "nested if  문"이라 합니다. x=-7 if x >= 0:     if x>0:         print(str(

[python 클래스] 솟수찾기

솟수는 1과 자신외에 나눌 수 없는 정수입니다. 즉, 1과 자신의 수외에 인수가 없는 정수입니다. 어떤 수 x가 솟수인지를 결정하기 위해 다음 생각을 코딩할 수 있습니다. 1) x=1 → 솟수 2) [2, x-1] 사이에 x를 나눌 수 있는 수 즉, 인수가 없다면 → 솟수 def CheckPrimeNumber_fun(x):         if abs(x)>1:             for i in range(2,x):                 if x % i ==0:                     print(x,"는 소수가 아닙니다.")                     break             else:                 print(x,"는 솟수입니다.")         else:             print(x,"는 솟수입니다.") CheckPrimeNumber_fun(97)          97 는 솟수입니다. 위 함수(코드)를 사용하여 일정한 범위에서 솟수들을 결정하기 위한 다른 함수를 작성하기 위해서 위 코드를 class로 작성한 후 이 클래스를 상속받는 서브클래스를 작성합니다. 클래스 작성에서 초기값을 지정하기 위해 생성자(constructor)를 사용합니다. 생성자 __init__ : 클래스에 매개변수를 전달합니다. class CheckPrimeNumber:     def __init__(self, x):  #초기값등을 위한 생성자(__inti__)         self.x=x     def prime(self):         re=False         if abs(self.x)>1:             for i in range(2,self.x):                 if self.x % i ==0:                     re=False      

코틀린 연산자 (2)

비트 연산자 연산자 의미 and, .and(bits)       and, 모두 true일경우만 true or, .or(bits)        or, 모두 false일경우만 false xor, .xor(bits)         배타적 OR, 두 값이 다르면 true .inv(bits)          not,  보수 연산으로 반전 .shr(bits)          not,  지정한 비트수 만큼 오른쪽으로 이동 .shl(bits)          not,  지정한 비트수 만큼 왼쪽으로 이동 .ushr(bits)          not,  부호 고려하지 않고 지정한 비트수 만큼 오른쪽으로 이동 fun main() {     val a = 1     val b = 0     println("and: ${a and b},  or: ${a or b}, xor: ${a.xor(b)}, inv: ${a.inv()}") }       and: 0,  or: 1, xor: 1, inv: -2 1 shl 2  //1을 왼쪽으로 2 비트 이동  res1: kotlin.Int = 4 4 shr 2 //4를 오른쪽으로 2비트 이동 res2: kotlin.Int = 1 10진수를 2진수로 변환하기 위해 다음 메소드를 적용합니다. 객체.toString(2) : 10 진수인 객체를 2진수로 변환 다음과 같이 1과 4를 이진수로 변환하면 다음과 같습니다. 1.toString(2) res3: kotlin.String = 1 // ....001 4.toString(2) res4: kotlin.String = 100 // ....100 위에서 하나의 수는 1비트를 나타내며 1을 왼쪽으로 2비트 이동시키면 4가 됩니다. 이와같이 비트를 이동시키기 위해 shr(shift right) 또는 shl(shift left) 연산자를 적용합니다. or, and 연산

Gram-Schmidt 과정

Gram-Schmidt 과정  그람 슈미트 과정은 0이 아닌 R n 의 부분공간에서 직교 또는 정규직교 기저를 생성하는 단순한 알고리즘입니다. import numpy as np import numpy.linalg as LA from sympy import * def coefS(x, y):       x=np.dot(x.T, y)       y=np.dot(y.T, y)       return(x/y) 예 1) W=Span{$x 1 , x 2 }일 때 W에서 직교 기저인 {v 1 , v 2 }? $x_1 =\left[\begin{array}{r}3\\6\\0\end{array}\right],\; x_2=\left[\begin{array}{r}1\\2\\2\end{array}\right]$ 이 예에 대한 그림은 다음과 같습니다. 위 그림에서 공간 W의 직교기저는 v 1 , v 2 로 나타낼 수 있으며 벡터 x 2 은 벡터 $x 1 위에 직교 투영됩니다. 그러므로 v 1 =x 1 관계를 가정할 수 있습니다. 그러므로 x 2 는 다음과 같이 분해 할 수 있습니다. x 2 = v 2 +p 위 식에서 p는 직교 기저인 x 1 =v 1 을 사용하여 다음과 같이 계산됩니다. ( 직교 투영 의 Eq. 1 참조) $p=\frac{x_2 \cdot x_1}{x_1 \cdot x_1}x_1$ 그러므로 $v_2=x_2-\frac{x_2 \cdot x_1}{x_1 \cdot x_1}x_1$ p=coefS(x2,x1)*x1; p      array([[1.],                    [2.],                    [0.]]) v2=x2-p; v2      array([[ 0.],                    [ 0.],                    [ 2.]]) x 2 =Span{v 1 , v 2 }가 성립합니다. 즉, v 1 , v 2 의 선형결합으로 x 2 가 생성되며 선형

코틀린 연산자(1)

연산자  코틀린에서는 +, * 등의 일반적인 연산자 구현이 가능하며 dot(.) 연산자의 형태로 적용 될 수 있습니다. dot 연산자들은 operator 함수를 사용하여 재정의(overloading) 할 수 있습니다. 단항 연산자 연산자 dot 연산자 내용 +a a.unaryPlus() a*(+1) -a a.unaryMinus() a*(-1) fun main() {      val a = -3      println("a.unaryPlus(): "+a.unaryPlus())      println("a.unaryMinus(): "+a.unaryMinus()) }       a.unaryPlus(): -3       a.unaryMinus(): 3 dot 연산자의 동작은 operator 함수를 사용하여 재정의된 것입니다. operator fun Double.unaryMinus():Double=-this -3.0.unaryMinus()       res11: kotlin.Double = 3.0 증감 연산자 연산자 dot 연산자 내용 a++ a 자체 1 증가 (a값 변화) ++a a.inc() 1증가(a값은 변화 없음) a-- 1감소 (a값 변화) --a a.dec() 1 감소(a값은 변화없음) a++, a--의 경우는 a 자체가 1증가 또는 감소를 의미하는 것에 반해 ++a, --a의 경우는 증가 또는 감소된 값들이 반환되지만 객체 a 자체의 변화는 없습니다. fun main() {      var a =1      println("a++: $\$${++a}")      println("a 자체 증가:  $\$$a")          var b=a.inc()      println("a=++a:  $\$${b}")    

코틀린의 자료형(2)

두 값의 비교  비교는 이중등호(==)와 삼중 등호(===)를 사용합니다. 이중등호(==): 값을 비교합니다. 삼중등호(===): 참조 주소를 비교합니다. 코틀린의 자료형은 기본적으로 참조형이며 Int, Double 등의 기본 자료형은 컴파일 단계에서 기본형을 전환됩니다. val a: Int = 128 val b: Int = 128 println(a == b)      true //위 두 객체의 값이 같으므로 true println(a === b)      true 컴파일 후 두 객체 a와 b는 기본형으로 전환되어 stack 메모리에 저장된다. 그러므로 그들의 저장위치는 같습니다. val a: Int = 128 val c: Int? = 128 println(a == c)      true println(a === c)      false 위의 두 객체 a, c의 자료형은 각각 Int과 nullable Int입니다. 컴파일 단계에서 Int는 기본형으로 전환되지만 nullable Int는 참조형으로 유지됩니다. 그러므로 Int는 stack 메모리에, nullable  Int는 heap에 저장됩니다. 즉, 둘의 참조주소는 다릅니다. 다음 코드는 참조형과 기본형의 구분을 위한 것입니다. fun main() {     val a: Double = 1e15     val b = a     println(a === b) // 자료형이 기본형인 int가 되어 값이 동일 true     val c: Double? = a     val d: Double? = a     val e: Double? = c     println(c == d) // 값의 내용만 비교하는 경우 동일하므로 true     println(c === d) // 값의 내용은 같지만 참조를 비교해 다른 객체(주소 다름)이므로 false     println(c === e) // 값의 내용도 같고 참조된 객체도 동일(주소 동일)하므로 tr

코틀린 자료형 null 타입 선언과 검사

Nullable 자료형 선언  코틀린에서 선언된 변수는 사용전에 반드시 값이 할당되어야 합니다. 값이 할당되지 않은 변수를 사용하면 오류가 발생됩니다. 코틀린에서는 변수 선언시 값이 없음을 지정하여 이러한 예외를 방지할 수 있습니다. 값이 없는 상태를 null이라고 하며 변수선언시 '?'를 사용하여 선언할 수 있습니다. val 변수명: 자료형? var 변수명: 자료형? 일반적 변수 선언은 null 값을 허용하지 않습니다. var obs="Kotlin" obs=null println(obs)       Null can not be a value of a non-null type String var obs1:String?="Kotlin" obs1=null println(obs1)       null Safe Call 또는 non-null(!!) 기호사용 null을 허용하는 변수에는 null을 허용하지 않은 속성이나 함수는 사용할 수 없습니다. 사용할 경우 예외(NullPointerException, NPE)를 발생합니다. 다음 코드에서 사용된 속성 .length: 문장열 길이를 반환하는 속성  obs1.length Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? 위의 경우 obs1은 null을 허용하는 변수(nullable variable)입니다. 반면에 속성.length는 null이 아닌 문자열 속성입니다. 그러므로 에러가 발생합니다. 이 과정은 전달하는 문자열이 nullable인지 아닌지를 먼저 검사한 후 null이 아니면 속성을 실행하고 아니면 null 값을 반환하도록 할 수 있습니다. 이러한 과정을 safe call 이라고 합니다. println(obs1?.length)       null saf

코틀린 자료형 표현과 변환

Underscore의 적용 큰수를 표시할 경우 일반적으로는 100단위로 구분하여 나타냅니다. 1000,000,000 그러나 코딩시 위와 같은 표시는 에러를 발생합니다. 대신에 코틀린은 underscore를 사용합니다. val a=1000_000_000 a      res4: kotlin.Int = 1000000000 자료의 변환  자료형은 자료가 저장되는 크기를 지정하는 것입니다. 이것은 작은 자료형은 큰 자료형의 포함된다는 의미는 아닙니다. 그러므로 자료형이 다르면 개별적으로 취급됩니다. 즉, 다른 자료형 사이의 연산이나 교환은 일어날 수 없습니다. 물론 자바, 파이썬등 다른 언어에서는 자동 변환이 일어나지만 코틀린의 경우 반드시 자료들의 연산을 위해서는 자료형을 일치시켜야 합니다. 예를들어 정수형인 변수값이 long 형인 변수에 직접적으로 할당되지 않습니다. val a: Int=1 val b: Int?=a println("a:$a, b:$b")      a:1, b:1 a == b      res8: kotlin.Boolean = true val c: Long=a c      error: type mismatch: inferred type is Int but Long was expected val c: Long=a 위 결과와 같이 정수형과 long 형은 자료형이 다르기 때문에 에러가 발생합니다. 그러므로 위와 같은 과정은 자료형의 변환이 우선되어야 합니다. val b: Byte = 1 val i: Int = b.toInt() b      res16: kotlin.Byte = 1 i      res17: kotlin.Int = 1 //큰 자료형에서 작은 자료형으로 변환 val b: Int = 1 val i: Byte = b.toByte() b       res18: kotlin.Int = 1 i       res19: kotlin.Byte = 1 큰 자

코틀린 변수정의

변수정의  자료형은 저장되는 데이터의 크기를 구분하는 기준이 되므로 변수를 정의할 때 자료형을 함께 선언합니다. 그러나 코틀린의 경우 변수를 선언할 때 최초로 정된 값에 따라 자료형을 유추합니다. 이를 변수의 초기화(initialiation)이라고 합니다. 코틀린은 이 초기값에 따라 변수의 자료형을 유추하므로 자료형의 지정은 생략가능합니다. 그러므로 변수 할당시 초기값 할당 즉,변수의 초기화는 반드시 이루어져야 합니다. 코틀린에서 변수를 선언하는 방법은 두 가지로 구분됩니다. 즉, 키워드 val, var을 사용하여 변수를 지정하는데 그 내용은 다음과 같습니다. val: 한번만 할당 가능한(읽기전용) 로컬 변수정의 키워드 (변수를 재이용할 수 없음) val 변수명:자료형 = 값 var: 변경가능한 변수 정의 키워드 (변수를 재이용할 수 있음) var 변수명:자료형 = 값 val a:Int=1  // 즉시 할당 a 1 val b=2 // “Int” 타입으로 추론 b 2 var x=5//'int'타입으로 추론 x +=1 x 6 val에 의한 변수는 정의 후에 값을 할당할 수 있습니다. val x=3 var re:String if (x%2==0){re="짝수"} else {re="홀수"} re       홀수 위의 경우 조건문을 직접 변수의 초기값으로 지정할 수 있습니다. 즉, 표현에 의해 값이 생성되는 expression(식)은 변수의 값으로 직접 할당할 수 있습니다. val x=3 var re:String =if (x%2==0){"짝수"}else {"홀수"} re       홀수 val에 의한 변수정의에서 그 값은 변할 수 없다고 했습니다. 그러나 수정할 수 없는 것은 값이라기 보다는 객체입니다. val arr=arrayOf(1, 2,3) f

코틀린 람다함수와 고차함수

Lambda 함수  함수의 이름이 없는 익명함수(anonymous function)이라고 합니다. {매개변수 → 실행 코드(몸체)} 위 함수의 구조와 같이 람다(익명)함수는 중괄호 내에 실행문을 입력합니다. 다음은 간단한 예로 문자열을 출력하는 함수입니다. 이 함수를 실행하기 위해서는 함수다음에 인수를 전달하기 위한 ()를 같이 나타내야 합니다. 다음은 전달하는 인수가 별도로 존재하지 않는 경우입니다. {println("Hello")}()       Hello 람다함수 역시 개체이므로 변수에 저장할 수 있습니다. 이 경우 변수명은 함수이름과 같은 역할을 합니다. 그러므로 객체를 호출할 경우 함수와 같이 적용해야 합니다. 즉, 변수명() val swim={println("swim \n")} swim()       swim 다음은 매개변수가 존재하는 경우입니다. var dirty = 20 val waterFilter = {dirty: Int -> dirty/2} waterFilter(dirty)       10 위 람다는 함수를 간단하게 표현하는 방법으로 나타낼 수 있습니다. fun waterFilter(dirty:Int) = dirty+10 waterFilter(dirty)       30 람다 함수는 실제로 고차함수(함수를 인수로 취하는 모든 함수)를 사용할 때 강력합니다. fun updateDirty(dirty: Int, operation: (Int)->Int):Int{     return operation(dirty) } updateDirty(dirty){dirty -> dirty+50}       70 고차 함수(Higher-Order Functions) 일반적으로 함수는 매개변수와 반환값이 데이터인데 반해  고차 함수(고계도 함수)는 전달받는 매개변수나 반환물이 함수인 경우입니다.  즉, 다음 중 하나를

코틀린 함수의 종류(1)

단일 표현(Single expression)의 함수   fun max(a:Int = 3, b:Int = 6):Int{        return if(a>b) a else b      } 위 max함수의 본문은return() 문내에 값을 나타내는 단일 표현(single expression)을 전달하는 구조 입니다. 이와같이 단일 표현으로 구성된 함수의 경우 중괄호({ })를 삭제하고 함수에 결과를 직접적으로 할당할 수 있습니다. 즉, 할당연산자(“=”)를 사용하여 본문을 직접 함수의 헤드와 연결하는 방식입니다. fun max1(a:Int = 3, b:Int = 6):Int=if(a>b) a else b max1(10, 12) 12 위의 경우는 결과형을 명시하였지만 컴파일 동안 유추할 수 있으므로 결과형(return type)은 생략할 수 있습니다. fun max1(a:Int = 3, b:Int = 6)=if(a>b) a else b max1(10, 12) 12 그러나 중괄호로 시작되는 본문 내에 return문 존재하는 함수의 경우 결과형(return type)은 반드시 명시하여야 합니다. Infix 함수 두개의 변수 가운데 오는 함수입니다. map이라는 자료구조를 생성할 경우 사용되는 ‘to’역시 infix함수입니다. 이 함수는 다음의 형식으로 직접 정의할 수 있습니다. infix fun 매개변수1자료형.함수이름(매개변수2): 반환형 {   본문 } 두개의 매개변수 중 매개변수1은 ‘this’라는 키워드로 본문에 호출됩니다. 다음은 두 정수의 합을 반환하는 함수입니다. infix fun Int.Total(x: Int): Int {   return this+x //this는 매개변수 1을 의미 } 12.Total(3)//dot(.) 연산자 적용      15 12 Total 3 // dot 연산자 없이 적용        15 이 infix 함수의

코틀린 자료형

자료의 참조방식 코틀린에서 코딩 시 객체에 자료를 입력하는 것은 기본적으로 참조를 기본으로 합니다. 그러나 코드의 컴파일 단계에서는 기본형으로 대체됩니다. 기본형(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비트) -2 63 ~ 2 63 -1 Int 4바이트(32비트) -2 31 ~ 2 31 -1 Short 2바이트(1

코틀린 함수의 형식

함수  함수의 형식 함수는 특정한 일을 수행하는 것과 관련된 문들(statements)과 표현들(expressions)의 블럭입니다. 이 블럭은 서로 연관된 많은 코드들을 보다 체계적으로 하나의 그룹으로 구성할 수 있으며 재사용을 편리하게 합니다. 코들린에서 함수는 두가지 종류가 존재합니다. 1) 표준라이브러리 함수 2) 사용자 정의 함수 kotlin의 함수의 정의는 fun 예약어를 사용하여 정의합니다. <함수 형식> fun 함수이름(입력인자와 자료형): 출력자료형{         함수내용(표현식들, 본문)         } 위 형식에서 함수이름 선언부를 head라고 하며 함수내용은 중괄호(‘{ }’)내에 입력된 구조로 중괄호 내의 내용들을 블럭(block body, 본문)라고 합니다. 입력인자는 이 함수의 매개변수(parameter)가 됩니다. 함수의 결과를 return()문을 사용하여 반환할 경우 결과의 자료형은 명시해야 합니다. 그러나 그 결과를 println(),또는 print()등의 함수를 사용하여 출력할 경우 자료형을 명시할 필요가 없습니다. fun printlnEx(a: String){ println(a) } printlnEx("test") test 다음은 두 개의 정수중에서 큰 것을 선택하는 함수입니다. fun max(a:Int, b:Int): Int{     return if(a>b) a else b } max(3, 10) 10 위 max 함수는 두 수에서 큰 값을 반환하는 함수로서 두개의 매개변수를 가지고 있습니다. 그 함수의 return 문은 결과값을 반환하는 함수로서 이 함수의 인수는 객체, if~, for~와 같은 다양한 표현(expression)등이 전달될 수 있습니다. 또한 return이 포함된 블럭의 종료를 의미합니다. return 키워드를 사용할 경우 반환(결과)의 자료형을 반드시 명시되어야 합니다. 함수의 매개변수

Sequence- kotlin

for loop문에서 객체를 반복할 경우 각 단계마다 그 결과를 반환합니다. val lst=listOf("rock","pagoda","plastic plant","alligator","flowerpot") for(i in lst){println(i)}      rock      pagoda      plastic plant      alligator     flowerpot 위와 같이 for 문으로 하나의 객체에 여러 원소를 반복하여 제출할 수 있는  객체를 iterable 객체(반복자)라고 합니다. List, Map등의 collection이나 range 객체는 이러한 반복자로 사용할 수 있습니다. 이와 유사한 객체로 코틀린 표준라이브러리에서 제공하는 시퀀스(Sequence )가 있습니다. 이 객체의 여러단계 처리는 전체 단계가 처리된 결과가 요구될 때 실제 연산이 일어납니다. 동작 수행의 순서 또한 다릅니다. Sequence는 각각 하나의 원소(element)에 대해 모든 단계를 수행한다. Iterable 은 전체 collection 에 대해 각 단계의 수행을 완료하고 다음 단계로 넘어간다. 따라서, sequence 는 중간 단계의 결과에 대한 처리를 피할 수 있게 해주며, collection 전체 처리에 대한 수행 성능이 향상된다. 하지만 크기가 작은 collection 이나 단순한 연산 동작에 대해서는 오히려 불필요한 오버헤드가 생길 수 있다. 그러므로 어느 경우에 Sequence 나 Iterable 중에 적절한 선택을 해야 한다. 다음은 iterable의 예입니다. String 객체.split: 문자열을 메소드에 전달한 인수를 기준으로 분리합니다. val words1 = "The quick brown fox jumps over the lazy dog" words1.split(" "

blog에 css 적용

blog에 CSS를 적용하기 위해서는 두가지 방법이 있습니다. 블로그 홈에서 1) 직접 HTML의 코드를 조정하는 방법입니다. 테마 → 화면의 우측 상단의 $vdots$를 클릭하여 HTML창으로 이동          →  이동후 Ctrl+f를 클릭하여 search 창을 활성화 합니다.          → </b:skin>을 찾아 이동 후 바로 직전에 입력합니다. 예를들어 .box{padding:10px;border:1px solid} ]]></b:skin> 2) CSS  첨가 창에서 붙이기 맞춤설정 클릭 →  좌측 상단에 글상자 중 고급을 선택                            →  css 추가 클릭후                            →  추가