📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page
  • 코틀린에서 컬렉션 만들기
  • 함수를 호출하기 쉽게 만들기
  • 확장 함수와 확장 프로퍼티
  • 문자열과 정규식 다루기
  • 로컬 함수와 확장

Was this helpful?

  1. Kotlin In Action

함수 정의와 호출

코틀린에서 컬렉션 만들기

코틀린에서는 of 이라는 키워드를 사용해서 컬렉션을 만드는 것 같다 전에 setOf 키워드도 사용해서 만드는 방법을 봤었다 이것 말고도 hashSetOf, arrayListOf 뭐 이렇게 리스트나 맵을 만들 수 있다 코틀린에서는 컬렉션을 코틀린 전용으로 만든 것이 아니라 자바에 있는 것 그대로 가져왔다 실제로 자바 컬렉션을 가져와서 사용하기 떄문에 .javaClass (자바에선 getClass())을 통해서 값을 출력해보면 java.util. ~~ 이렇게 나온다 이렇게 겹치게 사용해서 자바에서 코틀린으로 코틀린에서 자바로 서로 공유하는 것이 가능하다는 것이다

함수를 호출하기 쉽게 만들기

자바에는 여러가지 유틸 라이브러리들을 사용하기 위해서 구아바나 아파치 커먼즈와 같은 라이브러리를 받아서 사용하곤 하는데, 코틀린에는 생각보다 다양한 유틸 라이브러리들을 기본적으로 제공해준다 직접 유틸성 라이브러리를 만들어보자 joinToString 이라는 함수가 있다 -> 리스트를 넣으면 toString 처럼 원하는 구분자와 시작과 끝에 원하는 문자를 넣어서 리스트로 쭈루룩 출력할 수 있는 그러한 함수이다 실제로 구현하면 이러하다고 한다

fun<T> joinToString(
        collection: Collection<T>,
        seperator: String,
        prefix: String,
        postfix: String
    ): String{
        val result = StringBuilder(prefix)

        for((index, element) in collection.withIndex()){
            if(index > 0)
                result.append(seperator)
            result.append(element)
        }

        result.append(postfix)
        return result.toString();
    }

이렇게 구현하는 방식인데, 이렇게 사용하는 걸 보면 joinToString("", "", "") 이렇게 조금은 가독성이 떨어지는 형태가 나와버린다 그래서 코틀린에서는 조금은 가독성을 챙겨주는 방식이 있다 -> 원래 ide에서는 해당 함수의 파라미터를 슬쩍슬쩍 보여줘서 챙길 수 있도록 도와주는데, 코틀린에서는 직접 파라미터의 이름을 적어도 된다! joinToString(collection, separator="", prefix="", postfix="") 이렇게 쓰는데 명시할꺼면 다 명시해야하는 점을 주의하자

그리고 파라미터에 default 값을 넣어주고 싶으면 그냥 엔티티를 선언하는거 처럼

fun<T> joinToString(
        collection: Collection<T>,
        seperator: String="",
        prefix: String="",
        postfix: String=""
    ): String{
        val result = StringBuilder(prefix)

        for((index, element) in collection.withIndex()){
            if(index > 0)
                result.append(seperator)
            result.append(element)
        }

        result.append(postfix)
        return result.toString();
    }

default 값을 선언해주면 된다 그리고 특징으로는 만약 default로 잡아두었다면 해당 파라미터를 작성하지 않고도 해당 함수를 사용할 수 있는 것이 특징이다 joinToString(list) 이렇게 사용하면 위에서 임시 default으로 잡아둔 ""을 기준으로, 맨 앞과 맨뒤에 ""을 넣은 값이 출력된다

확장 함수와 확장 프로퍼티

확장 함수란 클래스 내부에 존재하는 메소드처럼 사용할 수 있지만 사실 그 클래스 밖에 선언되어 있는 함수이다 확장함수의 예시로 이런게 있다

fun String.lastChar(): Char = this.get(this.length-1)

확장 함수를 만들기 위해서는 추가하려는 함수 이름 앞에 그 함수가 확장할 클래스의 이름을 붙히기만 한다 클래스 이름에는 수신 객체 타입이라고 부르고 String.lastChar 요걸 의미한다 그리고 확장함수가 호출되는 대상이 되는 값을보고 수신객체라고 부르고 this 에 해당한다 즉, 수신 객체 타입은 확장이 정의될 클래스의 타입이며, 수신 객체는 그 클래스에 속한 인스턴스 객체이다 확장 함수 내부에서는 일반적인 인스턴스 메소드의 내부에서와 마찬가지로 바로바로 수신 객체의 메소드나 프로퍼티를 사용하는 것이 가능하다 그래서 호출하는 쪽에서는 확장 함수와 멤버 메소드를 구분할 수 없다

임포트와 확장함수 확장함수를 만들어서 사용할 떄 문제는 똑같은 이름이 있으면 충돌이 일어나서 번거롭다.. 그래서 임포트할 때 풀패키지명을 적어주고 맨 끝에 as ~~ 이렇게 별칭을 사용해서 충돌을 해결해서 사용하자

확장함수는 override 할 수 없다 -> 코틀린은 호출될 확장함수를 정적으로 결정하기 때문에 할 수 없다 추가로 인자를 숫자 프리하게 넣는 방법도 존재한다. 그리고 그걸 스프레드 연산자라고 하고 *args 이렇게 사용한다

문자열과 정규식 다루기

코틀린에서 사용하는 문자열은 자바에서 사용하는 것과 동일하다 하지만 장점으로는 역시 코틀린 답게 다양한 확장 함수를 제공함으로써 문자열을 더욱 다양하게 사용할 수 있도록 도와준다

문자열 나누기 split 함수라는 문자열을 배열로 찢어주는 함수에 이게 구분자를 넣어서 어떠한 구분자를 기준으로 나눈다 근데 문자열을 나누는 과정에서 구분자에다가 . 을 넣으면 에러가 난다 -> 그 이유는 split 내부적으로는 정규표현식을 통해서 구분되는데 . 은 정규표현식에서 모든 문자를 의미하기 때문이다 이런 면에서는 코틀린에서는 다양한 함수를 제공해주기 때문에 단 하나의 문자를 받는 자바와는 다르게 원하는대로 다양한 문자로도 사용할 수 있다

여러 줄 3중 따옴표 문자열 3중 따옴표 문자열에는 아무런 이스케이프가 적용되지 않는다 모든 문자열이 문자 그대로 표현이된다 상당히 긴 문자열을 표현하고 싶다면 사용하기 딱 좋다고 볼 수 있다 그래서 변수 같은 것을 사용하고 싶다면 조금은 귀찮다.. 이렇게 다양한 함수들이 존재하니 필요할 때 찾아서 사용하자

로컬 함수와 확장

코틀린에서는 함수에서 추출한 함수를 원함수 내부에 중첩시키는 것이 가능하다 간단한 인자 검증 후 저장하는 함수에서 중복을 줄여가며 어떻게 하는지 보자 처음으로 만든 함수는 이러하다

class User(val id: Int, val name: String, val address: String)

    fun saveUser(user: User){
        if(user.name.isEmpty()){
            throw IllegalArgumentException("[${user.id}] : name is Empty!")
        }

        if(user.address.isEmpty()){
            throw IllegalArgumentException("[${user.id}] : address is Empty!")
        }

        //userRepository.save(user);
    }   

여기서 보면 모든 사용자 필드를 각각 검사를 진행하는데 어떻게 보면 중복이라고도 볼 수 있는 것 같다

이럴 때 검증 코드를 로컬 함수로 분리하면 중복을 없애는 동시에 코드 구조를 깔끔하게 할 수 있다 그래서 이렇게 수정할 수 있다

fun saveUserVer2(user: User){
        fun validate(user: User, value: String, fieldName: String){
            if(value.isEmpty())
                throw IllegalArgumentException("[${user.id}] : $fieldName is Empty!")
        }
        
        validate(user, user.name, "name")
        validate(user, user.address, "address")
        
        //userRepository.save(user)
    }

요렇게 어떻게 보면 그냥 함수를 만들어서 빼는 방식이다. 근데 이렇게하면 검증 로직중복은 사라졌고 다른 필드에 대한 검증추가도 쉽게 할 수 있다 그래도 여전히 남아있는 불편한 점은 결국은 로컬 함수에 각각의 필드를 넣어서 만들어야 한다는 점? 이다 그래서 검증 로직을 User 클래스를 확장한 함수로 만드는 것이 가능하다

fun User.validateBeforeSave(){
        fun validate(value: String, fieldName: String){
            if(value.isEmpty()){
                throw IllegalArgumentException("[${this.id}] : $fieldName is Empty!")
            }
        }
        
        validate(name, "name")
        validate(address, "address")
    }
    
    fun saveUser3(user: User){
        user.validateBeforeSave()
        
        //userRepository.save(user)
    }

이렇게 코드를 확장 함수로 뽑아내는 기법은 아주 유용하다 이렇게 확장 함수를 로컬 함수로 정의할 수 있다. User.validateBeforeSave를 saveUser 내부에 로컬 함수로 넣을 수 있다 근데 한 단계 이상으로 함수를 중첩시키면 많이 복잡하기 때문에 일반적으로는 한 단계만 함수를 중첩해서 사용하곤 한다

Previous코틀린의 기초Next클래스, 객체, 인터페이스

Last updated 2 years ago

Was this helpful?