728x90

- 어느날 PC카톡을 접속하려 하니 갑자기 10060 오류를 띄우면서 로그인이 아예 막혀버렸다.

- 구글링으로 찾아본 가장 첫번째 해결법은 윈도우 방화벽에 카카오톡을 허용으로 바꾸는 것.

 

- 헌데 구글링 대부분의 해결책이 이런 방법이었는데, 아무리 해봐도 로그인이 안되더라, 재설치를 해봐도 안돼서 골머리를 썩다가 카카오톡에 직접 문의를 해본 답변이 이거였다.

- 다행히 운영자쪽 답변이라 그랬는지 이 방법으로 문제가 한번에 해결됐다(괜히 재설치했네...). 다음에도 문제 생기면 이 방법으로 해결보면 될듯.

728x90
728x90
728x90
728x90

 - 링크 : Marp for VS Code - Visual Studio Marketplace

 

Marp for VS Code - Visual Studio Marketplace

Extension for Visual Studio Code - Create slide deck written in Marp Markdown on VS Code

marketplace.visualstudio.com

마크다운을 ppt 양식으로 바꾸게 해주는 플러그인이다.

간단히 말해 일반 마크다운의 가로줄(---) 기능을 페이지 나누는 기능으로 쓰는 느낌.

마크다운을 이용한 타이핑 필기는 편하긴 하지만 개행 등을 잘 못하면 가독성이 극악이 된다는 단점이 있었는데,
이런식으로 PPT 양식으로 만들면 한 칸 내에 정보가 제한되는(?) 효과를 발휘하면서 굉장히 읽기 편한 자료를 만들 수 있었다.

다만 아직 개발중인 건지, 불완전한 모습이 간간히 보이고 있다. 어느 정도는 자동 맞춤을 해주지만, 글이 너무 많아지면 내용이 아예 잘려버린다던가(축소에 한계치가 있는걸까?) PPT 변환을 해봤더니 첫페이지 내용으로만 변환되는 문제도 있었고, 아쉽게도 이미지 파일 역시 첫 페이지만 변환이 가능하다. 어서 기능개선을 통해 불편한 점이 해결되었으면 좋을 듯.

728x90
728x90
728x90
728x90
Kaggle 데이터분석 캠프 3주차 - 모델과 앙상블

Kaggle 데이터분석 캠프 3주차 - 모델과 앙상블

  • 빅데이터 / 4차 산업혁명 시대에 가장 중요한 것 ? : Data

  • Data가 중요한 이유

    • 기존의 결정 방식에 영향을 주던 것 : 경험과 직관
    • 최근에는 결정에 데이터가 중요한 비중을 차지
  • Data Driven Approach : '패턴' 이 중요

    • 어떻게 전처리를 해서
    • 어떻게 분석한 후(EDA, feature engineering)
    • 좋은 모델을 만들어낼 것인가?
  • 머신러닝 : 데이터 속의 pattern recognition

    • 목표(최소 오차)를 위해
    • 일반적인 함수(조건)을 만드는 것
    • feature - feature / feature - target 사이의 상관관계를 학습
  • 데이터의 분석 과정

    1. 문제 설정
    2. 데이터 수집, 전처리
    3. EDA
    4. 인사이트 얻기
    5. feature engineering
    6. 모델 개발
    7. 모델 평가
    8. kernel 참고
    9. 3~8 무한반복…
    • 보통 Kaggle에서는 3~8의 과정만을 다루게 됨
  • 머신러닝을 공부하려면 : 데이터와 사람(=자료) 이 많은 곳으로!


Scikit-learn 분류 모델 만들기

  • logistic regression
    • 선형 회귀모델 (y = ax + b)의 변형
    • 확률 개념(odds)를 도입
    • ln[Y/(1Y)]=wx+b>>y=[1+exp[(wx+b)]]1ln [Y / (1-Y) ] = wx + b >> y = [ 1 + exp[ -(wx + b) ] ] ^-1
    • maximum likelihood estimation을 이용하여 학습
  • support vector machine
    • 주어진 데이터의 클래스 그룹 사이의 margin이 최대가 되는 support vector를 탐색
    • support vector와 수직인 경계(결정 경계, descision boundary)를 찾는 알고리즘
    • 경험적 위험 최소화(ERM)
      • 주어진 훈련 데이터에 대해서만 손실 최소화
      • 새로 추가된 데이터의 경우 오차가 발생할 수 있음
      • 신경망, 선형회귀 등
    • 구조적 위험 최소화(SRM)
      • 관찰하지 않은 데이터에 대해서도 손실 최소화
      • 일반화된 최소 오차를 계산
      • Support Vector Machine의 목표
    • soft margin
      • 유연한 경계면
      • 경계를 넘어가는 데이터를 감수하더라도 최선의 경계선 탐색
    • har margin
      • 데이터를 분명하게 가르는 경계선
    • Kernel Trick
      • 저차원에서는 분리가 안될 수 있지만, 고차원으로 보낼 경우 가능할 수 있음
      • Kernel 함수라는 매핑 함수를 이용 : 저차원 연산에서도 고차원 연산처럼 만들어주기 때문에 Kernel trick이라고 부름
      • ex. Linear, Poly, RBF(방사기저함수), Hyper-Tangent(쌍곡선)
  • decision tree
    • if-then 분류를 이용한 데이터 분류
      • greedy algorithm(최적의 트리 생성을 보장하지 않음)
      • 변수가 가진 정보량에 따라 분류
      • tree 깊이가 깊어지면 overfitting 가능성 존재
      • SVM 등 다른 모델 대비 빠른 편
  • random forest
    • 결정 트리를 여러 개 만들어 학습
    • 데이터 row, column의 일부를 샘플링하여 각 모델에 학습
    • 생성된 각 결정 트리를 앙상블
    • 간단하고 빠른 알고리즘
    • 변수 소거 없이 많은 입력 변수를 다룰 수 있음
    • 일반화 성능이 좋음 (참고 : 모델의 분산과 편향)
  • XGBoost
    • Extreme Gradient Boosting Tree 알고리즘
    • 균형 트리 분할로 인한 과적합 규제
    • 가지치기, 자체 교차 검증 기능 제공
    • 결측치를 자체 처리
    • Early Stopping : 검증 Score가 일정 수준에 도달하면 학습을 멈춤
    • LightGBM : XGBoost의 장점을 취하되, 리프 중심의 트리 분할로 가볍고 빠르면서 나은 성능 제공 / But 적은 데이터에서는 과적합 우려

k-Fold Cross Validation

  • 기존의 데이터 학습 과정
    • 샘플된 데이터로 모델 학습
    • 나머지 데이터로 모델 검증
  • k-fold cross validation
    • 데이터를 k개 그룹(fold)으로 나눔
    • 임의의 1개 그룹은 검증에, 나머지 데이터는 모델 학습에 사용, 총 k회 반복
    • 각 fold에 대한 score 계산
    • 검증 횟수를 늘려 다소 일반화된 모델을 생성 가능

Out-of-Fold / Stacking 앙상블

  • Out-of-Fold
    • K-Fold에서 추론 과정을 추가
    • 모델 출력은 label 대신 확률로 나타냄
    • 각 모델의 확률값의 평균 계산
  • Stacking 앙상블
    • 추가 모델 구성 없이 기존 모델 성능을 극대화
    • 학습 데이터 외에 검증용으로 쓰는 fold 데이터 역시 추론 과정에 활용
    • 학습 fold와 검증 fold의 추론 결과를 각각 저장
    • 충분한 모델이 생성되지 않으면 오히려 정확도가 낮아질 수 있음
      • 어느 정도 성능이 나오는 모델들을 합칠 때 효과가 나타나는 편
728x90
728x90
Overview
  • 성인 인구의 수입 분석 : 정형 데이터 분석
  • 학습 목표 : 차원 축소 / 스케일링 / 이상치, 범주형, 결측치 처리
  • 본 모델에 들어가기까지의 데이터 전처리(?)

Overview

  • 데이터 사이언스로 돈을 버는 법 : 흥미, 관심사 > 조회수를 높일 만한 결과 도출하기

  • 문제점 : 생각만큼 데이터 품질이 좋지 않다

    • Kaggle의 경우 매우 정제가 잘 된 편
    • 실제로는 데이터 '만' 많은 경우가 많음 : 쓸모가 없거나, 품질이 좋지 않거나
  • 데이터 분석의 약 70% 가량이 전처리

  • 왜?

    • 데이터 수집/처리기가 불안정하거나
    • 데이터의 수집, 가공, 저장 비용
    • 데이터 형태가 너무 많아짐(시계열, 음성, 영상 등등...)
    • 수집된 데이터와 컴퓨터로 분석 가능한 형태 사이의 간극 존재
  • Data Science

    • 데이터의 수집, 가공, 서비스 적용, 다시 수집, ...
    • EDA 전에 전처리가 우선되어야 함 : EDA시 잘못된 데이터로 인한 오해가 있을 수 있기 때문

Data

  • 데이터 : 정형 vs 비정형 / 수치형 vs 범주형

  • 정형 데이터 : Table 형태로 존재 (주로 SQL로 처리)

  • 비정형 데이터 : 이미지, text 등등

  • 수치형 데이터 : 양적 정보

  • 범주형 데이터 : Categorical data

  • 데이터 사이언티스트의 업무

    • 내가 다룰 데이터가 어떤 구조로 이루어지는가?
    • 데이터 변형 시 어떤 변화가 이루어지는가?
    • 이 데이터가 내가 원하는 목적과 얼마나 부합하는가?
  • 데이터 처리 시의 문제

    • 용량은 작은데 불러올때 메모리 사용량이 어마어마한 이유는?
    • 실제 데이터는 0, 1꼴의 작은 값이지만, 실제 계산 시에는 Int64/Float64형태로 불러옴, 이로 인해 차지하는 메모리 용량이 실제 값보다 더 커짐

Data Preprocessing

  • 데이터 전처리

    • missing value : 어떻게 해서 생기게 되었는지?버려도 되는 값인지?
    • outlier : 분포를 크게 벗어난 값
    • dependent / independet value : kaggle의 경우 target이 정해져 있음 - 현업의 경우 어떤 값을 target으로 할지 직접 정해주어야 함
    • train / test split
    • scaling
  • missing vlaue : 존재하지 않는 값 / 시스템 오류로 인한 비정상 값

    • '', '#N/A', 'NaN', 'NULL' 등
    • dataset의 ? : missing value인가? 무직인가? ...?
    • 다수 column에 ?가 있다면 서로 간의 상관관계가 있을 수 있을까?
    • 결측치의 처리 : 삭제 or 대치
      • 삭제 : 대부분이(ex. 80%) missing인 경우 / 기본 dataset이 많아서 몇 개 빠져도 상관 없는 경우
      • 대치 : 다른 sample 분포로 예측 가능한 경우 / 의미적 추론이 가능한 경우
  • Outlier : 동 feature 샘플들과 비교할 때 비정상적으로 떨어진 관측치

    • Outlie의 처리 : 삭제, 대치, 로그변환
      • 대치 : 의미상 다른 값(보통 최대/최소) 로 대체해도 무관한 경우
      • 삭제
        • 극단적인 Outlier의 경우 삭제하는 것이 유의미할 수 있음
        • 다른 cluster에 속하는 새로운 유의미한 data일 가능성 역시 있음 - 이 경우 scaler 등을 통해 처리하는 쪽이 더 나음
  • Scaling

    • 같은 수치형이라도 평균/최대/최소값은 서로 다름
    • 수치 데이터들의 range가 다를 경우, 각 feature를 그대로 학습시키면 결과값에 미치는 영향력이 서로 달라질 수 있음
    • min-max scaler : 정규화(normalization)
    • standard scaler : 표준화(standardization
    • Data Leakeage : test data는 일어나지 않은 일 > scale된 train과 다른 분포가 나타날 수 있지만, 같은 분포를 갖고 있음을 가정

Feature Engineering

  • Feature : 모델 예측에 사용될 수 있는, 데이터를 표현하는 모든 변수, 개체, 특성

  • Feature Engineering : 더 나은 모델 알고리즘을 위한 Raw data에서 Feature를 만들어내는 과정

  • 인코딩

    • 컴퓨터가 이해하기 힘든 형태의 데이터를 처리 가능한 형태로 변환하는 과정
    • one-hot encoding : 범주형 변수를 독립적 feature로 변환
    • label encoding : 순서가 있는 변수를 숫자 형태로 numbering
    • mean encoding : 분포를 바탕으로 값 mapping - 학습은 빠르나 overfitting 위험
  • 차원의 저주

    • feature수가 늘어남에 따라 해당 target을 설명하는 data 수가 줄어드는 현상
    • 차원이 낮을수록 모델 성능이 높아짐
    • 모델 복잡도 감소 / overfitting 회피 : 특성 선택 vs 추출
      • 특성 선택 : 높은 성능을 나타내는 feature를 선택 (with greedy algorithm)
      • 특성 추출 : feature를 바탕으로 새 feature 구성 (with PCA, LDA)
  • PCA(주성분 분석)

    • 고차원 feature 중 중요 몇 가지를 추출
    • 비지도 학습의 일종
    • 큰 분산 = 많은 정보
    • 데이터 분산을 표현하는 벡터 > 표현력이 큰 벡터 선별 후 원본 데이터 투영 > k (k < d)인 데이터 셋으로 재구성
    • 단점 : 새로 만들어진 feature가 갖는 의미는 불확실해짐

Before Modeling

  • Kaggle조사에서

    • 가장 좋아하는 ML/DL method: 딥러닝, 인공신경망, 시계열 분석, ...
    • But 실무에서 사용되는 DL Method : 데이터 시각화, Logistic Regression, Cross-Validation, 결정 트리, Random Forest, ...
    • 의외로 고전적 분석법들이 잘 동작하는 경우가 많음
  • 이렇게 배운 걸 모두 활용해야 하는가?

    • 모든 도구들이 항상 필요한 건 아니지만, 배워 두면 언젠가 쓸 일이 생긴다
    • 사용법을 숙지하면 다른 작업에 활용될 여지도 있다
728x90
728x90
1주차의 목적

  • 4차 Kaggle 대회를 맞이하며 다시 시작하는 kaggle 입문 수업
  • 총 4회에 걸친 커리큘럼
    • 1주차 : kaggle 맛보기
    • 2주차 : kaggle feature engineering - 기술적 노하우
    • 3주차 : 모델링 검증 & 앙상블 해보기
    • 4주차 : 마무리

1주차의 목적

  • 머신러닝/딥러닝/라이브러리 강의는 넷 상에 매우 좋은 자료가 많음
  • 이번 주의 주된 목표
    • 캐글 소개
    • 대회(Competition) 소개
    • 캐글에서 어떻게 공부하는지

  • 캐글이란?
    • 데이터 사이언스 / 머신러닝 학습자들의 커뮤니티
    • 컴피티션(대회), dataset, Notebook(일종의 Code), Discussion의 크게 4가지로 활동 가능
  • 캐글러의 목표?
    • 재미, 성취, 공부, 상금, 취업 등 복합적
    • 나의 경우 : 공부나 취업 정도가 될 듯....
    • 이번 수업에서 임의로 설정한 목표 : 메달, 그리고 티어
  • Kaggle의 Tier
    • 가장 많은 사람들이 Contributor에 속하고, Expert부터가 진짜 실력자라고 볼만 한 레벨
    • 예상과는 달리 오히려 Competition에서 티어 높이기가 쉽고, Notebook - Discussion으로 갈수록 어려움
    • upvote를 많이 받아야 메달을 따고 티어를 높이는데, 어지간한 내용이 아니고서야 잘 받기가 힘듬 + 나와 Novice tier는 집계에 들어가지 않기때문에 더더욱....

  • Data Science의 내용 전개
    • 정보 수집 및 구조화 - Kaggle에서는 어느 정도 제공
      • 데이터 수집
      • 구조화 : SQL, Big Query 등등...
      • 데이터 전송 : 분산 처리(하둡, 스파크 등등...)
    • 판단 - Kaggle의 주 목적
      • 분석 및 판단 - EDA 및 시각화를 통한 데이터 종류 분석 : 지도/비지도 학습 분류
      • 데이터의 종류 : 정형(보통 csv파일로 제공), 시계열, 이미지, 음성, txt 등등....

대회 살펴보기

  • Kaggle 대회의 Type
    • Featured : 대부분의 대회, 높은 예측 score를 받을수록 유리
    • Analytics : 분석 - 나만의 Notebook 만들기
    • Research : 연구
    • Getting Started : 튜토리얼 대회
    • Playground : 일종의 재미용 대회
  • 제출 방식
    • Simple Competition : csv 형태로 제출
    • Code Competition : 코드로 제출
    • Simple Competition은 개인의 Computing 자원에 따라 유/불리가 갈릴 수 있음
    • Code competition은 공통된 note북 환경을 이용하나, 사전에 개인이 학습시켰던 모델의 활용이 가능한 경우 개인 자원에 따라 유/불리가 갈릴 수 있음
  • 대회 접근 순서
    • 대회의 주제 확인
    • data 종류, 양 확인
    • Evaluation 기준, 참가자들의 leaderboard 확인
    • 기존의 Discussion 확인 : 빠른 Follow-Start를 위해
    • Upvote가 많은 Notebook 확인
  • 대회 스코어
    • Public Leaderboard : test 데이터 중 일부만을 이용해 점수 측정
      • 데이터는 임의로 선택되므로 항상 leaderboard가 높다고 최종 등수까지 높은 것은 아님
  • 대회 참여 시 참고하면 좋을 Notebook
    • EDA 관련 : 대회 초반
    • 전처리 및 모델링 : 대회 중 ~ 후반
  • 대회 진행에 따른 discussion
    • 대회 초반 : 설명의 부족, 개선 건의
    • 대회 중~후반 : 적용 시 좋을 라이브러리, 관련 논문 소개
    • 대회 후 : 자신의 솔루션 공개

Competition의 진행 순서

  • 이상적이라면 : 입력-모델링-출력
  • 실제
    • 입력 : 보통 pandas 라이브러리 사용
    • EDA : 데이터 시각화, 통계를 통한 좋은 feature 찾기
    • 전처리 : 모델에 맞게 수정
    • 모델링 : 모델- 결과 모델 사이의 반복을 통한 문제 개선
  • EDA : 데이터에서 무엇을 볼 것인가?
    • 어떤 문제를 해결할지(상관관계 등)
    • 어떤 데이터가 있고, 어떻게 처리할지
    • 누락(NULL)이 있는지, 있다면 어떻게 처리할지
    • 특이값(Outlier)이 있는지, 어떻게 처리할지
    • 데이터 활용을 위한 새 feature를 활용할지
  • EDA시 데이터의 분류
    • 수치형 데이터 : 이산형 / 연속형
    • 범주형 데이터 : 명목형 / 순서형
728x90
728x90
SQL 문법 정리하기

SQL 문법 정리하기

  • SELECT : 테이블에서 데이터를 불러옴
    • 여러개를 불러올 수 있음
    • column명 뒤에 이름을 붙여 결과 table의 column 이름 겸 SQL문 내의 변수로 쓸 수 있음
    • *을 쓸 경우 table의 모든 변수를 불러옴
select (column name) from table
  • WHERE : 조건 부여
    • AND, OR, NOT을 이용해 여러개의 조건을 한번에 사용 가능
    • IN : 조건을 부여하는 COLUMN에서 여러 개의 값을 찾고 싶을 때 사용
      • where col is a or col is b or ... 대신
      • where col in (a,b, ...)
    • BETWEEN A AND B : column이 A와 B에 해당하는 범위를 갖는 경우
    • NULL : SQL 테이블의 NULL값은 별도로 탐색해주어야 함 / COUNT되지 않는 값으로 처리
    • LIKE : 문자열 패턴 검색
      • "%" : 와일드카드(임의 길이의 문자)
      • "_" : 1자리를 차지하는 문자
      • ex. where col like "_5%" : 2번째 글자가 5인 col 데이터
    • HAVING : WHERE 사용이 불가한 경우(COUNT 등의 집계함수에 사용)
  • DISTINCT : 중복 제거
  • JOIN : 두 테이블을 결함
    • INNER JOIN : 교집합
    • LEFT/RIGHT JOIN : 먼저/나중에 호출하는 테이블을 메인으로 집합
    • FULL OUTER JOIN : 합집합
[INNER/LEFT/RIGHT/FULL OUTER] JOIN table1 on table1.col == table2.col
  • MIN/MAX(col) : 해당 col의 최소/최댓값
  • LIMIT : 제한된 개수만 리턴
    • LIMIT n : n개 리턴
    • LIMIT a, n : a번째부터 n개만 리턴
  • GROUP BY col : col 기준으로 묶음
  • ORDER BY col [ASC/DESC] : col 기준으로 오름/내림차순 정렬
728x90
728x90
컬렉션의 구조와 list 사용

컬렉션의 구조와 list 사용

  • 컬렉션(Collection) : 자주 쓰이는 기초적인 자료구조를 모아둔 프레임워크
  • 코틀린의 컬렉션
    • list : listOf(불변형) / mutableListOf, arrayListOf(가변형)
    • set : setOf(불변형) / mutableSetOf, hashSetOf, linkedSetOf, sortedSetOf(가변형)
    • map : mapOf(불변형) / mutableMapOf, hashMapOf, linkedMapOf, sortedMapOf(가변형)
  • Collection의 특징
    • Iterable에서 확장
    • Collection에서 확장된 Set, List는 읽기 전용
  • collection 멤버
    • size : 크기
    • isEmpty() : 빈 컬렉션인 경우 true
    • contains(E) : 특정 요소(E)가 있다면 true
    • containsAll(collection) : 인자로 받아들인 Collection이 있다면 true
  • MutableIterable, MutableCollection 클래스
    • 요소를 추가, 제거 기능을 수행 가능
    • add(E) : 인자를 추가 후 true 반환 / 요소가 있거나 중복 불허인 경우 false
    • remove(E) : 인자를 삭제 후 true 반환 / 삭제 요소가 없으면 false
    • addAll, removeAll : 컬렉션 인자를 모두 추가/삭제
    • retainAll : 컬렉션 인자를 받아 해당 요소만 보유
    • clear() : 컬렉션 모든 요소를 삭제
  • List
    • 순서에 따라 정렬된 요소를 갖는 컬렉션
    • 불변형 리스트는 listOf()로 생성
    • 가변형 리스트는 mutableListOf(), arrayListOf()로 생성
    • 함수 인자는 vararg로 선언되어 있으므로 원하는 만큼 지정 가능

list 멤버와 이해

  • 코틀린의 가변형 리스트
    • arrayListOf
      • 가변형 List를 생성하나 자바의 ArrayList를 반환함
    • mutableListOf
      • 가변형 List를 생성하여 코틀린 MutableList를 반환
    • add()와 removeAt()으로 추가/삭제 가능
    • toMutableList()로 불변형 리스트를 가변형으로 변환 후 반환할 수 있음
  • List vs Array
    • Array 배열은 내부 구조상 고정된 크기를 갖게 됨
    • List의 경우 인터페이스로 설계되어 하위에서 특정 자료구조로 구현함
    • Array는 제네릭 관점에서 무변성, List는 공변성

Set, Map 컬렉션의 이해

  • Set
    • 정해진 순서가 없는 요소의 집합
    • 동일 요소가 중복되지 않음
  • hashSetOf
    • 자바의 HashSet을 만듬
    • 테이블에 요소를 저장 및 삭제 가능
    • hash table : 내부적인 키와 인덱스로 검색 및 변경을 빠르게 수행 가능
    • 정렬이 없지만 해쉬값으로 검색하므로 검색 속도는 O(1)의 시간 복잡도
  • sortedSetOf
    • 자바 TreeSet으로 반환
    • java.util.* 패키지를 임포트해야 함
    • 이진 탐색, Red-black 알고리즘을 이용
    • hash보다 추가/삭제 시간은 더 걸리나 검색/정렬이 뛰어남
  • linkedSetOf
    • 자바의 LinkedHashSet으로 반환
    • 연결 리스트 형태로 자료구조를 구성
    • 다른 Set보다 느리나 포인터 연결로 메모리 공간이 효율적으로 사용됨
  • Map
    • 키-값으로 연결된 요소 저장
    • 키는 중복 가능하나 값은 중복 불가
      • 기존 키와 동일한 경우 새로운 값으로 대체

컬렉션의 확장함수 - 연산, 집계, 검사

  • 코틀린 확장 함수 : 연산자, 집계, 검사, 필터, 변환을 제공
  • 컬렉션 연산자
    • +, - : 요소의 추가 혹은 제거 / 맵의 경우 일치하는 값
    • +/- ListOf : 리스트 병합 / listOf 원소와 일치하는 요소 제거
    • +Pair(값, 키) : Map 요소 추가
    • mapOf(값 to 키) : Map의 요소 추가
  • 요소의 집계
    • forEach(forEachIndexed) : 요소(+인덱스) 순회
    • onEach : 각 요소를 순환 후 컬렉션 반환
    • fold : 초기값 및 정해진 식에 따라 값 반환
      • reduce : 초기값 없이 정해진 식에 따라 값 반환
    • foldRight, reduceRight : 역순으로 동작하며 값 반환
//컬렉션 연산 fun main() { val list1 = listOf(1, 2, 3) val list2 = listOf("one", "two", "three") println(list1+ 4 ) //[1, 2, 3, 4], 산술 연산자로 새 원소가 합쳐진 새로운 리스트를 반환 } //컬렉션 fold val list = listOf(1, 2, 3, 4, 5) println(list.fold(4){total, next -> total+next}) //4+1+2+...+5 println(list.foldRight(3){total, next -> total+next}) //3+5+4+...+1 println(list.reduce{total, next -> total+next})//1+2+3+4+5

컬렉션의 확장함수 - 필터, 변환, 시퀀스

  • map() : 컬렉션 요소를 일괄적으로 식 적용 후 새 컬렉션 반환
fun main() { val list = listOf(1,2,3,4,5) println(list.map({it*2})) //[2, 4, 6, 8, 10], it은 리스트 원소를 가리킴 val mapIndex = list.mapIndexed{index, it -> index*it} //mapIndexed : 인덱스와 컬렉션 멤버로 연산 //[0, 2, 6, 12, 20] }
  • flatMap() : 각 요소에 식을 적용 후 새 컬렉션 반환
println(list.flatMap{listOf(it, 'A')}) //[1, A, 2, A, ...]
  • groupBy() : 요소를 그룹화한 후 Map으로 반환
  • 정렬 연산
    • reversed() : 역순
    • sorted() / sortedDescending() : 오름/내림차순 정렬
  • 시퀀스 : toList(), count()같은 연산에 의해 크기가 결정되는 특수 컬렉션
    • 지속적으로 내용이 추가되는 로그 파일 등
    • generateSequence(seed) {람다식} : 시퀀스 정의
    • take() : 원하는 요소 개수 획득
    • toList() : 시퀀스를 리스트 컬렉션으로 반환
728x90
728x90
제네릭의 기본 사용

제네릭의 기본 사용

  • 제네릭 : 자료형을 다루는 메소드나 클래스를 컴파일 시점에서 검사하여 적절한 자료형을 선택
    • 앵글 브라켓(<>) 사이에 자료형을 선언
    • 자료형을 대표하는 형식 매개변수로 T를 사용
class Box(a : Int) //원래의 클래스 선언 /////////// class Box<T>(a:T) //제네릭 클래스 선언 - 모든 자료형을 받을 수 있음 fun main() { val box1 = Box(1) //Box<Int>로 초기화 val box2 = Box("kim") //Box<String>으로 초기화 }

제네릭 함수

  • 제네릭 함수 : 함수나 메소드 앞에 지정
fun <T> genericFun(arg : T) : T? { ... } //T는 순서대로 형식 매개변수, 매개변수 자료형, 반환 자료형 fun <K, V> genericFun(key : K, value : V) : Unit {...} //형식 매개변수가 여러개인 경우 //배열의 인덱스 찾기 fun <T> find(a:Array<T>, Target : T) : Int { for (i in a.indices) //a.indice : a의 인덱스 반환 (0..n) { if(a[i] == Target) return i } return -1 } fun main() { val arr1: Array<Int> = arrayOf(1,2,3,4) println(find(arr1, 2)) //1 반환됨 } //람다식을 이용한 반환형 연산식 결정 fun <T> add(a:T, b:T, op : (T,T)->T):T { return op(a,b) } fun main() { val result = add(2, 3, {a, b -> a+b}) //람다식으로 2+3 반환됨 println(result) //5 출력 }
  • 함수의 형식 매개변수 제한하기 : <T:자료형>으로 선언하여 제한 가능
    • 함수 호출 시 해당 자료형으로 선언해주어야 함(<자료형>) - 만족하지 않을 경우 오류 발생
  • 가변성
    • 형식 매개변수가 클래스 계층에 미치는 영향 정의
    • 상위 클래스가 하위 클래스를 수용할 수 있음
      • ex. Number(정수, 실수를 모두 포함) > Int, Int?(Nullable) > Int

가변성의 유형

  • 무변성 : C와 C<T'>는 무관
    • 코틀린에서는 별도 지정이 없으면 형식 매개변수는 무변성
  • 공변성 : T'이 T의 하위 자료형이면, C<T'>는 C의 하위 자료형
    • <Out T`>로 선언
    • 하위 자료형이 상위 자료형으로 캐스팅됨
  • 반공변성 : T'이 T의 하위 자료형이면, C<T'>는 C의 상위 자료형
    • <in T`>로 선언
    • 상위 자료형이 하위 자료형으로 캐스팅됨

자료형 프로텍션

  • 선언 지점 변성 : 클래스 자체에 가변성 지정 / 클래스 사용 시 자료형 지정 필요가 없음
  • 사용 지점 변성 : 클래스 생성 등 사용 위치에서 가변성을 지정
class Box<T>(var : item : T) { fun <T> printObj(box : Box<out Animal>) // Box를 사용할 때 가변성을 결정 { val obj : Animal = box.item //out이므로 getter가 동작 box.item = Animal() //out이므로 setter는 동작하지 않음 //자료형 프로텍션(out으로 선언)에 의해 안전성 보장 } }
  • 스타 프로젝션 : in/out 선언 없이 추후 겱정
    • <*>으로 선언
    • 자료형이 결정된 후에는 그 자료형만 사용 가능하도록 제한

배열

  • 데이터의 연속적 나열
    • arrayOf(), Array() 생성자로 생성
    • arrayOfNulls() : 빈 배열
    • 배열은 객체이므로 Heap에 저장됨
val numbers = arrayOf(1, 2, 3, 4) for (element in numbers) println(element)
  • 다차원 배열 : 배열의 배열
val array1 = arrayOf(1, 2, 3) val array2 = arrayOf(4, 5, 6) val array3 = arrayOf(7, 8, 9) val arr2d = arrayOf(array1, array2, array3) /* 1 2 3 4 5 6 7 8 9 */ //변수 선언 없이 2차원 배열 val arr2d = arrayOf(arrayOf(1, 2, 3), arrayOf(1, 2, 3), arrayOf(1, 2, 3)) /* 1 2 3 1 2 3 1 2 3 */
  • 자료형이 제한된 배열
    • arrayOf<자료형>(...)
    • charArrayOf(), booleanArrayOf(), ... 등 (자료형)ArrayOf()으로 작성
  • 배열 요소에 접근
    • 읽기
      • arr.get(인덱스) : 게터를 이용
      • arr[인덱스]
    • 쓰기
      • arr.set(인덱스, 값)
      • arr[인덱스] = 값
  • Array (요소 개수, 초기값) : 표현식을 이용한 배열 생성
    • 2씩 늘어나는 정수 배열 : Array(5, {i -> i*2}) (람다식으로 초기값 설정 가능)
    • 1000개의 null 배열 : arrayOfNulls(1000)
    • 1000개의 0배열 : Array(1000, {0})
  • 생성된 배열은 고정
    • 새롭게 할당 : arr.plus(요소)
    • 범위를 잘라내어 새 배열 생성 : arr.sliceArray(0..2)
  • 배열의 순환
    • forEach {element -> 식} : 요소별로 순환
    • forEachIndexed {i, e -> 식} : 인덱스, 요소를 배열에서 받아서 식 처리
    • Iterator 사용 : arr.iterator().next() (다음 index 반환)

배열의 정렬

  • 코틀린 Array는 기본적인 정렬을 제공
  • 정렬 배열 반환
    • sortArray() : 오름차순 정렬
    • sortArrayDescending() : 내림차순 정렬
  • 원본 배열 정렬
    • sort() : 오름차순
    • sortDescending() : 내림차순
  • 배열 필터링
    • filter(람다식) : 원하는 데이터를 선택 가능
    • minBy, maxBy, 필드보다 작은/큰 값
    • flatten : 다차원 배열을 평탄화

문자열의 기본

  • 문자열은 배열의 일종으로, 불변값으로 생성
    • 참조 메모리는 변경되지 않음
    • 새로운 문자열 대입 시 기존 문자열은 Garbage Collector에 의해 제거
  • 문자열 추출, 병합
    • String.substring(인덱스 범위) : 범위 내 문자를 String으로 반환
    • CharSequence.subSequence(인덱스 범위) : Charsequence로 반환
    • 병합 : 문자열은 덧셈을 통해 이어붙일 수 있음 ("ab"+"c" -> "abc")
  • 문자열 비교
    • a.compareTo(b) : a,b가 같으면 0, a가 작으면 양수, 그렇지 않으면 음수
      • 각 위치에 있는 문자열의 숫자값을 비교
    • a.compareTo(b, true) : 대소문자에 무관하게 비교
  • StringBuilder(문자열)
    • 문자열 공간을 더 크게 잡음
    • 작은 범위의 요소 변경이 용이 / 처리가 늦고, 변경이 없는 경우 메모리 낭비
    • 문자열 변경이 잦은 경우 사용
  • 그 외 메소드
    • append(문자열) : 문자열 뒤에 이어붙임
    • insert(인덱스, 문자열) : 해당 인덱스부터 문자열 이어붙임
    • delete(a, b) : [a, b-1]의 범위 문자 삭제
    • toLowerCase / toUpperCase : 소/대문자 변경
    • split(기준) : 기준 문자를 기준으로 한 문자열 분리
    • trim() : 앞뒤 공백 제거
728x90

+ Recent posts