728x90 전체 글138 Kotlin - 다양한 함수 1. 확장함수 확장하려는 클래스.함수이름(파라미터): 리턴타입 { // this 를 이용해 실제 클래스 안의 값에 접근 } fun String.lastChar(): Char { return this[this.length - 1] } 확장 함수명과 맴버 함수명이 같은 시에는 멤버 함수를 출력한다. 확장 함수가 오버라이딩 된다. 정적메소드를 부르를 것 처럼도 사용이 가능합니다. 확장함수 라는 개념은 확장프로퍼티와도 연결됩니다. 확장 프로퍼티의 원리는 확장함수 + customgetter와 동일하다. 2. infix 함수 중위함수, 함수를 호출하는 새로운 방법!! downTo, step 도 함수이다! (중위 호출 함수) 변수.함수이름(argument) 대신 변수 함수이름 argument fun main() { .. 2023. 5. 6. Kotlin - 컬렉션 코틀린에서 배열은 없다. 컬렉션의 다양한 표현 방식 fun main() { val array = arrayOf(100, 200) array.plus(300) for (i in array.indices) { println("$i ${array[i]}") } for ((index, value) in array.withIndex()) { println("$index $value") } for (i in 0 until array.size) { println(array[i]) } for (element in array) { println(element) } } 컬렉션의 불변인지, 가변인지를 설정해야함. 가변 컬렉션: 컬렉션에 element 를 추가, 삭제할 수 있다. 불변 컬렉션: 컬렉션에 element 를 추가.. 2023. 5. 6. 코틀린 - Object 함수(Companion) Companion Object companion object 에 유틸성 함수들을 넣어도 되지만, 최상단 파일을 활용하는 것을 추천 드립니다! 자바에서 코틀린에 있는 static field 나 statice 함수를 사용하고 싶을 때는 @JvmStatic 어노테이션을 씁니다. Person.Companion.newBaby("ABC"); 로 접근 가능 Person.newBaby("ABC"); 로 접근 가능 반면 컴파니언 명이 있는 경우 class Person private constructor ( var name: String, var age: Int, ) { companion object Factory { private const val MIN_AGE = 1 @JvmStatic fun newBaby(name:.. 2023. 5. 1. 코틀린 - 접근 제어자 생성자 접근 제어자 생성자에 접근 지시어를 쓰려면 constructor 를 써야한다. java 에서 유틸성 코드를 만들때 abstract class + private constuctor 를 사용해서 인스턴스화를 막았음. public abstract class StringUtils { private StringUtils() {} public boolean isDirectoryPath(String path) { return path.endsWith("/"); } } 파일 최상단에 바로 함수를 만들면, static final 함수로 생성됩니다. fun isDirectoryPath(path: String): Boolean { return path.endsWith("/") } 프로퍼티 접근 제어자 두가지 방법 c.. 2023. 5. 1. 코틀린 - 클래스 생성자와 상속 다양한 생성자 선언 class Person constructor(name: String, age: Int) { var name: String = name var age: Int = age init { if (age = 20 } } 자바로 변환 시 함수 앞에 final 이 붙습니다. 모두 동일한 기능이고 표현 방식만 다릅니다. 객체의 속성이라면, custom getter를 쓴다. 그렇지 않다면 함수를 씁니다. custom getter, setter 선언 방법 var name: String = name get() = field.uppercase() set(value) { field = value.uppercase() } abstract class Animal( protected val species : St.. 2023. 5. 1. Kotlin - 기본 문법2 Primitive Type 과 Reference Type 을 구분하지 않아도 된다. Null 이 들어갈 수 있는 변수는 타입 뒤에 ?를 붙여주어야 한다. - 아예 다른 타입으로 간주된다. 객체를 인스턴스화 할 때 new 를 붙이지 않아야 한다. 코틀린에서 null 을 다루는 방법 1. 코틀린에서 null 체크 2. Safe Call 과 Elvis 연산자 val str: String? = "ABC" (nullable 타입) str?.length // 가능!! => null 아니면 실행되고 null 이면 null 반환한다. str?.length ?: 0 null 이면 0 반환한다. 3. 널 아님 단언!! nullable 타입이지만, 아무리 생각해도 null 이 될 수 없는 경우 str!!.startsWith.. 2023. 4. 17. Kotlin - 기본 문법1 1. 함수 선언 함수를 선언하려면 fun이라는 키워드를 이용 반환 타입을 선언할 수 있으며 생략하면 자동으로 Unit 타입이 적용 함수의 매개변수에는 var나 val 키워드를 사용할 수 없으며 val이 자동으로 적용 => 매개변숫값은 변경 불가능하다. 함수의 매개변수에는 기본값 선언 가능 fun main() { fun some(data1: Int, data2: Int = 10): Int { return data1 * data2 } } 매개변수명을 지정하여 호출하는 것을 명명된 매개변수라고 하며, 이렇게 하면 함수 선언문의 매개변수 순서에 맞춰호출하지 않아도 됩니다. some(date2 = 20, data1 = 10) 2. 컬렉션 타입 List, Set, Map List: 순서가 있는 데이터 집합으로 데이.. 2023. 3. 27. Kotlin - 변수 선언 자바는 파일명과 클래스명이 맞아야한다. 하지만 코틀린은 그럴 필요가 없다. val 특징 1. 데이터 타입 Int, Short, Long, Double, Float, Byte, Boolean ― 기초 타입 객체 Char, String ― 문자와 문자열 String 타입의 데이터는 문자열을 큰따옴표(“)나 삼중 따옴표(“””)로 감싸서 표현 Any ― 모든 타입 가능(변수에 붙임) val data1: Unit = Unit Unit ― 반환문이 없는 함수(함수에 붙임, 반환 타입 생략가능)(void 느낌) // Unit 타입 사용 예 - 반환문이 없는 함수 fun some(): Unit { println(10 + 20) } // 반환 타입을 생략한 예 fun some() { println(10 + 20) } .. 2023. 3. 1. Java - 람다 스트림 예제 람다 중복 체크 예시 코드 list.stream() .collect(Collectors.groupingBy(HQStoreOrderUploadDto::getGdsCd, Collectors.toList())) .entrySet() .stream() .filter(e -> e.getValue().size() > 1) .map(Entry::getValue) .flatMap(Collection::stream) .forEach(e -> e.setErrCont("gdsCd 중복")); MapKey 를 활용한 컬랙션 그룹핑 List datas = (List) list; datas.stream() .collect( Collectors.groupingBy( e -> new MapKey(e.getStkoutCntrCd(),.. 2023. 2. 10. Redis - 캐싱(Caching) 캐싱(Caching) 이란?Cache: 성능 향상을 위해 값을 복사해놓는 임시 기억 장치Cache에 복사본을 저장해놓고 읽음으로서 속도가 느린 장치로의 접근 횟수를 줄임Cache의 데이터는 원본이 아니며 언제든 사라질 수 있음컴퓨터 공학에서는 CPU와 RAM 사이의 성능 차이를 완충하기 위한 장치로 쓰인다.CPU 가 속도가 빠름 반면에 RAM은 상대적으로 느리다. 그래서 CPU에 캐시 저장소를 두어 RAM의 데이터를 저장한다.Cache는 비용이 비싸기 때문에 RAM 내부에서 사용할 수 없다. 캐시의 적용장점: 네트워크 지연 감소, 서버 리소스 사용 감소, 병목현상 감소원칙: 더 빠르고 값싸게 가져올 수 있다면 캐시를 사용한다. 캐싱 관련 개념들캐시 적중(Cache Hit): 캐시에 접근해 데이터를 발견함.. 2023. 1. 24. Docker - 도커 명령어 OS Virtualization vs Container Virtualization 비교OS Virtualization - 운영체제 가상화Host OS 위에 Guest OS 전체를 가상화자유도가 높으나, 시스템에 부하가 많고 느려짐.Hypervisor 위에 Guest OS 를 설치함. Container VirtualizationHost OS 가 가진 리소스를 적게 사용하며, 필요한 프로세스 실행.최소한의 라이브러리와 도구만 포함.Container 의 생성 속도 빠름.Container Image - Image 를 가지고 실체화 DockerFileDockerFile 이란Docker Image 를 생성하기 위한 스크립트 파일 자체 DSL(Domain-Specific language) 언어 사용 -> 이미지 생.. 2022. 6. 12. Spring Cloud - Spring Cloud Config Server 와 github 연동 안녕하세요. 2021년 8월 이후 변경된 github 정책으로 인해 변경된 Spring Cloud Config Server와 github 연동방식을 포스트하려합니다. 간략하게 Spring Cloud Config Server를 소개하고 github의 Personal access tokens 설정 방법을 다루겠습니다. Spring Cloud Config Server Spring Cloud Config Server는 MSA 를 구성하는 서버 중 하나로 다른 마이크로 서버의 공통으로 사용하는 프로퍼티 값들을 공유하는 역할을 하는 서버입니다. 하드코딩해서 공통으로 사용하는 값을 yml 파일에 저장하여 관리 합니다. yml 파일을 Spring Cloud Config Server에서 호출하고, 또 다시 다른 마이크로.. 2022. 5. 26. Java - Thread 동시성 문제3 (Synchroized) 안녕하세요. Thread 동시성 문제 3편 시작하겠습니다. 동시성 문제 개념과 원인은 앞서 다룬 포스트를 참고하시면 좋을 것 같습니다. https://getthismoment.tistory.com/155 Synchroized 동시성 문제를 해결하는 방법으로 synchroized를 활용하면 됩니다. synchroized 를 사용해서 스레드에 lock 을 걸어 동기화를 시킵니다. lock을 얻은 스레드의 synchroized가 진행되는 동안 다른 스레드는 대기 상태에 놓입니다. lock을 거는 방식을 사용하기 때문에 당연히 성능은 떨어지게 됩니다. 대신 동기화를 통해 스프링에서 객체 주입 받아온, 싱글톤으로 구현된 객체가 멀티 스레드 내에서 Thread Safe를 보장받을 수 있게 됩니다. 동기화에 관한 용.. 2022. 5. 4. Java - Thread 동시성 문제2 (ThreadLocal ) 이전 글에 이어서 계속해서 Thread 동시성 문제를 보겠습니다. 이번에는 동시성 해결방법을 다루어보겠습니다. https://getthismoment.tistory.com/155 Thread 동시성 문제 해결 방법으로 우선 ThreadLocal 을 살펴보겠습니다. ThreadLocal ThreadLocal 사용방법은 주입해서 사용할 서비스 로직에 구현하면 됩니다. ThreadLocal은 여러 스레드가 실행되어도 각 스레드에서 독립된 실행을 보장하는 방법입니다. public class BankBook { private int balance = 500; // 남은 금액 private ThreadLocal threadLocal = new ThreadLocal(); // 입금 public void deposit.. 2022. 5. 4. Java - Thread 동시성 문제1 이전 포스트와 이어서 이번에도 스레드를 다루어보겠습니다. https://getthismoment.tistory.com/152 스레드의 정의는 알겠는데 그런데 왜 스레드를 배워야할까요? Thread를 왜 배워야할까? 스레드를 배워야하는 이유는 크게 다음과 같습니다. 1. 우리는 멀티 스레드를 지원하는 자바를 사용하고 있습니다. 2. 스프링의 객체관리 기능(빈 등록 및 빈의 모든 생명주기 관리)이 싱글톤 패턴을 베이스로 하고 있습니다. 3. 객체 주입을 통해 가져온 객체를 수정하게 된다면 그 객체는 멀티 스레드에서 동기화를 보장할 수 없습니다. Thread Safe 멀티 스레드의 서로 다른 스레드에서 같은 메소드를 호출해도 동일한 결과를 보장하는 것. 즉, 스프링에서 Rest api를 통해서 함수를 호출하게.. 2022. 5. 4. 이전 1 2 3 4 5 ··· 10 다음 728x90