Programming Language 23

(참고) LazyThreadSafetyMode 란?

LazyThreadSafetyMode는 Kotlin에서 by lazy { ... } 지연 초기화가 여러 스레드에서 호출될 때 어떻게 안전성을 보장할지 정하는 열거형(enum) 입니다.1. SYNCHRONIZED (기본값)설명:락(lock)을 사용해서 단일 스레드만이 Lazy 인스턴스를 초기화하도록 보장합니다.초기화된 값은 모든 스레드에서 볼 수 있게 됩니다.사용하는 락은 플랫폼과 구현에 따라 세부사항이 다를 수 있습니다.특징:안전하게 초기화여러 스레드가 동시에 접근해도 단 한 번만 초기화가장 안전하지만 속도는 조금 느릴 수 있음val v by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { create() }2. PUBLICATION설명:초기화 함수가 여러 스레드에서 동시에 호..

06장-2 지연초기화와 위임

- 변수나, 객체의 값은 생성시 초기화 필요- 클래스에서는 기본적으로 선언하는 Property 자료형들은 Null 을 가질 수 없음- 객체의 정보가 나중에 나타나는 경우 나중에 초기화 할 수 있는 방법 필요- 지연 초기화를 위해 lateinit 과 lazy 키워드 사용 의존성이 있는 초기화나 unit 테스트를 위한 코드를 작성 시,예) Car 클래스의 초기화 부분에 Engine 클래스와 의존성을 가지는 경우,Engine 객체가 생성되지 않으면 완전하게 초기화 할 수 없는 경우.예) 단위 (Unit) 테스트를 위해 임시적으로 객체를 생성 시켜야 하는 경우 프로퍼티 지연 초기화- 클래스를 선언할 때 Property 선언은 null 허용하지 않음- 하지만, 지연 초기화를 위한 lateinit 키워드 사용시 ..

05장 클래스와 객체

class 클래스명 constructor(필요한 매개변수들..) { // 주 생성자의 위치 ... constructor(필요한 매개변수들..) { // 부 생성자의 위치 // 프로퍼티의 초기화 } [constructor(필요한 매개변수들..) { ... }] // 추가 부 생성자 ...} 2가지 예시를 통해 확인해보자먼저, Person Class constructor(...)는 부 생성자 선언할 때 사용함부 생성자에서는 반드시 : this(...)로 주 생성자 호출해야 함init {} 블록은 객체 생성 시 실행될 초기화 코드프로퍼티 초기화는 주로 init 안에서 하거나, var에 기본값 지정해서 처리 가능출력결과: 이름: Alice, 나이: 30, 직업: Un..

최상위 함수와 지역함수

global은 전역 변수임. 어디서든 접근 가능main() 내부에 local1, local2 정의돼 있음 → main 안에서만 유효nestedFunc()는 main() 안의 중첩 함수내부에서 또 local1 정의 → 기존 local1 = 20은 가려짐 (shadowing)local2는 바깥 main 블록의 값을 그대로 사용함global은 += 1 해서 11로 바뀜outsideFunc()는 main() 바깥에 있는 최상위 함수전역변수 global에 다시 += 1 해서 12 됨outVal은 함수 내부에서만 사용 가능main() 마지막에 출력문들 실행global은 12 출력local1은 20 (main의 값)local2는 21 출력 결과:nestedFunc local1: 30nestedFunc local2..

프로그램의 흐름 제어

람다식에서 Return 사용하기fun main() { retFunc()}inline fun inlineLambda(a: Int, b: Int, out: (Int, Int) -> Unit) { out(a, b)}fun retFunc() { println("start of retFunc") // ① inlineLambda(13, 3) { a, b -> // ② val result = a + b if(result > 10) return // ③ 10보다 크면 이 함수를 빠져 나감 println("result: $result") // ④ 10보다 크면 이 문장에 도달하지 못함 } println("end of retFunc") // ⑤} r..

고차함수와 람다식 활용

동기화: 변경이 일어나면 안되는 특정 코드를 보호하기 위한 잠금 기법동기화로 보호되는 코드는 임계 영역(Critical Section)Lock을 활용해 임계 영역을 보호 Lock lock = new ReentrantLock();lock.lock(); // 잠금try { // 보호할 임계 영역 코드 // 수행할 작업} finally { lock.unlock(); // 해제} ReentrantLock을 활용해 특정 함수 보호 Lock은 여러가지 Lock 관련 함수를 정의한 인터페이스이며, ReentrantLock은 Lock을 구현한 것으로 synchronized를 사용함 출처: Do it! 코틀린 프로그래밍

순수 함수(pure function), 람다식, 일급 객체의 이해

함수형 프로그래밍은 왜 사용하나?- 모듈화해 디버깅 및 테스트 용이- 람다식과 고차함수 사용하면서 다양한 함수 조합 가능 - 동일한 입력 인자에 대해서는 항상 같은 결과를 출력/반환해야함- 값이 예측이 가능해 결정적 (deterministic) 순수 함수의 조건- 같은 인자에 대하여 항상 같은 값을 반환- 함수 외부의 어떤 상태도 바꾸지 않는다. 순수함수가아님: 외부의 입력값에 따라 함수의 결과가 달라짐 람다식(Lambda Expression):익명 함수의 하나의 형태로 이름없이 사용 및 실행가능람다 대수로 부터 유래{x, y -> x+ y} //람다식의 예 (이름 없는 함수 형태) 아래는 람다함수 예시fun main(){ var result: Int //일반 함수에 람다식 할당 ..

동기vs비동기 방식에 관하여

동기(Synchronous)요청을 하나씩 순차적으로 처리하므로, 각 요청이 완료될 때까지 기다려야 됨. 이는 크롤링 속도를 느리게 만들 수 있지만, 한 번에 하나의 요청만 처리하기 때문에 코드가 단순해질 수 있음Request 한 부분에 대해서 Response를 기다리고 나서, 그 다음 요청(Request)을 보낼 수 있음순차적(Sequential) 예시로, 계좌이체 등 뱅킹시스템에서의 송금/출금 등이 포함됨.계좌이체는 하나의 트랜잭션으로 취급되며, 모든 단계가 완벽하게 완료되거나, 실패할 경우 전체가 취소되어야 함. 예를 들어, 돈이 한 계좌에서 출금되었지만 다른 계좌에 입금되지 않으면 안 되기 때문에, 이 모든 작업이 하나의 트랜잭션으로 묶여서 처리되어야 함. 동기 방식은 이와 같은 일관성을 유지하는 ..