분류 전체보기 55

연산자 오버로딩(Operator Overloading)

연산자 오버로딩이란 객체끼리 '+' 나 '-' 같은 연산자를 사용할 수 있게 해주는 기능이다. 이는 자바에서는 지원하지 않는 기능이다. (일반적으로 add같은 함수 구현해서 사용) data class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { return Point(x + other.x, y + other.y) } } fun main() { val p1 = Point(1, 2) val p2 = Point(3, 4) val p3 = p1 + p2 // `plus` 연산자 함수를 호출합니다. println(p3) // 출력: Point(x=4, y=6) } 연산자라고 한다면 +, -, *, / 만 떠오를텐데

Kotlin 2024.03.05

영역 함수(scope functions)

코틀린의 영역 함수는 코드 블록( 중괄호로 감싸진 그거 )을 실행할 때 사용된다. 이 함수들은 코드를 더 간결하고 읽기 쉽게 만들어 줄 뿐만 아니라, 객체의 프로퍼티나 함수에 대한 접근을 임시적으로 제한할 수 있도록 해준다. 코틀린에서는 다섯 가지 영역 함수를 제공한다. let 사용법: object.let { it.doSomething() } 수신 객체: it (명시적으로 사용) 반환 값: 람다의 마지막 표현식 주 사용 사례: null이 아닌 객체에 대한 일회성 작업, 객체 변환 run 사용법: object.run { this.doSomething() } 수신 객체: this (암시적으로 사용) 반환 값: 람다의 마지막 표현식 주 사용 사례: 객체 초기화와 반환 값 계산 with 사용법: with(obj..

Kotlin 2024.02.29

수신 객체 지정 람다

클래스 내부가 아니더라도 this를 통해 해당 객체의 메서드나 프로퍼티에 직접 접근 할수있다. 람다식을 변수에 담고 함수처럼 호출 가능한데, 예제를 통해 알아보자. class Customer(val name: String) val me: (Customer.() -> String) = { // 해당 블록은 this == Customer "Hello, $name!" // Customer 클래스 외부지만 name이라는 프로퍼티에 접근 가능 } fun main() { val customer = Customer("John") me(customer) } 물론 변수에 굳이 담아서 활용할 필요는 없지만 처음보는 방식이라서 예제로 활용해봤다. (아마 Webflux 환경에서는 활용할지도..?)

Kotlin 2024.02.29

코틀린의 정적 타입

코틀린은 자바와 다르게 메서드나 필드 값이 클래스안에 존재 하지 않아도 된다. 클래스 외부에 코드를 작성하게 되면 자동으로 최상위 함수로 인식된다. 하지만 JVM은 최상위 함수라는 개념이 존재하지 않는다. 따라서, 파일명을 딴 클래스를 만들어서 그 안에 정적 메서드나 필드 값을 설정하는 방법으로 구현되었다. 파일명 대신 내가 원하는 클래스로 이름을 지정하고 싶다면 package 위에 @file:JvmName("name") 을 사용하면 된다. 하지만 해당 기능은 Java 코드와 Kotlin코드가 혼용된 경우에만 사용된다. object 코틀린의 object는 자바의 정적 클래스와 유사하다. 하지만 근본적인 차이점이 있는데 코틀린에서는 object로 구현된 코드를 싱글톤으로 관리한다. companion obj..

Kotlin 2024.02.19

자바에서 코틀린 컬렉션으로

자바의 컬렉션은 private final 로 선언하더라도 내부의 데이터를 변경할 수 있다. 이는 컬렉션을 매개변수로 넘길때 나타나는 문제인데, 일반적인 타입(String, Integer)와 다르게 컬렉션은 실제 값이 아닌 주소값을 매개변수로 넘긴다. 따라서, 함수내에서만 존재하는 지역변수로 컬렉션을 사용하였더라도 변경된 컬렉션은 영구적으로 적용된다. 옛날에는 가변 컬렉션이 더 큰 메리트가 있어서 이런식으로 개발되었지만 현재는 불변 컬렉션을 선호한다고 한다. 이런 추세에 맞춰서 Kotlin에서는 불변 컬렉션을 지원한다. Java : Collection -> List(가변) Kotlin : Collection -> List(불변) -> MutableList(가변) 우선, 가변 컬렉션과 불변 컬렉션에는 어떤 ..

Kotlin 2024.02.13

확장함수를 사용해 직관적으로 변경하기

확장함수의 예제를 위해 조금 극단적인 예시인 isLongerThan이라는 함수를 만들었다. (물론 compareTo 라는 함수명이 더 적절 할 것이다.) 두개의 문자열을 비교하는 isLongerThan 함수는 입력변수로 두개의 문자열을 받는다. 이 경우 함수를 사용할때 입력변수가 함수의 뒤쪽에 위치하므로 직관적이지 않다. class MyString { var text : String? = null } fun main() { fun isLongerThan (a:MyString, b:MyString): Boolean { return a.text?.length ?: 0 > b.text?.length ?: 0 } var a = MyString() var b = MyString() val longerThan = ..

Kotlin 2024.02.07

T?에 대해

Optional과 비교 Kotlin의 T?와 비교되는 Java코드는 Optional이다. Optional와 T?는 비슷해 보이지만 근본이 다르다. T는 T?의 하위 타입이지만 T와 Optional는 하위 타입 관계가 아니다. 간단하게 예제로 살펴보면 다음과 같다. val a : String = "test" val b : String? = null b = a String인 a는 String?인 b의 하위 타입이기 때문에 대입 가능하다. 반면 Optional은 대입 불가능하다. 간단하게 생각해보면 Optional은 null을 더 잘 관리하기 위해 나온 Class이고 '?'는 언어 차원에서 지원하는 연산자이기 때문에 다를 수 밖에 없다. 이러한 근본적인 차이점이 있기 때문에 Intellij에서 제공하는 Jav..

Kotlin 2024.02.07

무중단 배포 3가지 방법 (Rolling, Blue-Green, Canary)

무중단 배포 3가지 방법을 소개한다. 새로운 버전을 배포하는 방식으로 다운타임이 발생하지 않고 배포한다. 3개의 방식 모두 4개의 WAS가 가동중이고 v1 -> v2 로 업데이트 한다고 가정한다. Rolling Update 가장 기본적인 방식이다. 1. 2개의 WAS를 v2로 업데이트한다. 2. 2개의 WAS가 정상 동작하는지 확인한다. 3. 나머지 2개의 WAS도 v2로 업데이트 한다. 단점으로는 잠시 v1과 v2가 동시에 존재하므로 호환성 문제를 일으킬 수 있다. Blue-Green v1을 Blue, v2를 Green으로 가정한다. 1. Green에 4개의 WAS를 올린다. 2. Green이 정상 동작하는지 확인한다. 3. Green으로 트래픽을 전환한다. 4. Blue의 4개의 WAS를 내린다. 단..

CS 2024.01.28

동기 비동기, 블록킹 논블록킹

공통적인 상황으로 함수A가 함수B를 호출했다고 가정한다. 블록킹 (Blocking) 블록킹은 특정한 로직을 실행시켰을때 응답을 기다리는 것을 뜻한다. 예를 들어, B가 실행되는 동안 A는 대기상태에 있다면 블록킹이다. 논블록킹 (NonBlocking) 논블록킹은 특정한 로직을 실행시켰을때 응답을 기다리지 않는다. 예를 들어, B가 실행되는 동안 A는 대기상태에 있지 않고 다른 작업을 수행하면 논블록킹이다. 대기 상태에 있지 않도 다른작업을 수행해야 하기때문에 멀티 쓰레드 환경에서는 별도의 쓰레드에서 실행된다. 동기 (Synchronous) 동기는 블록킹과 유사하지만 응답값을 신경쓴다는 개념이 추가된다. 블록킹은 단순히 대기 상태와 관련이 있다면 동기는 '어떤식으로 응답을 주는가?' 까지 포함된 개념이다...

CS 2024.01.19

GSLB와 CDN

GSLB와 CDN 모두 현재 내가 접속한 위치를 기반으로 가장 가까운 서버로 사용자의 요청을 라우팅하는 역할을 한다. 두 기술은 정적 콘텐츠, 동적 콘텐츠 중 무엇을 다루느냐가 가장 큰 차이점이다. GSLB (Global Server Load Balancing) 동적인 콘텐츠 트래픽 분산 지리적으로 가까운 서버로 요청을 라우팅 할 뿐만 아니라 네트워크 트래픽을 균등하게 분산하는 역할도 한다. 안정성 만약 서버가 다운되더라도 최적의 서버로 요청을 라우팅하기 때문에 서비스 중단을 방지할 수 있다. CDN (Content Delivery Network) 정적인 콘텐츠 캐싱 이미지나 js파일 같은 정적인 콘텐츠를 캐싱해두고 빠르게 제공해 웹사이트의 로딩속도를 향상시킨다.

CS 2024.01.17