728x90
반응형

전체 글 889

2024.08.28-2024.09.05 스위스, 이탈리아 여행기 - 폼페이, 베수비오 화산, 나폴리, 쏘렌토, 포지타노, 아말피

첨부된 모든 사진은 직접 찍은 것으로, 저작권의 보호를 받습니다. ===================================== 이번에 가볼 곳은 폼페이입니다.베수비오 화산이 폭발할 때 많은 경고가 있었지만 미리 대피하지 않은 폼페이의 사람들이 죽었다는 이야기의 그 폼페이 입니다. https://maps.app.goo.gl/SAzNzPM75RQ2YZPc9 Pompeii (UNESCO) · Vicolo del Panettiere, 80045 Pompei NA, 이탈리아★★★★★ · 역사적 명소www.google.com 이곳에서 표를 매표한 다음 입장 합니다.  처음 들어가면 보이는 폼페이의 모습입니다. 아래와 같은 터널을 지나면 본격적으로 폼페이의 유적들이 보이기 시작합니다. 아래는 터널을 지나면 나..

인생이야기 2024.10.15

2024.08.28-2024.09.05 스위스, 이탈리아 여행기 - 피렌체, 산타 마리아 노벨라 성당, 시뇨리아 광장, 두오모 광장, 피렌체 대성당, 베키오 다리

첨부된 모든 사진은 직접 찍은 것으로, 저작권의 보호를 받습니다. ===================================== 코르티나 담페초를 다녀온 뒤로 이탈리아의 남쪽으로 더 내려 옵니다.이번에는 피렌체를 방문 합니다.피렌체는 여러 역사적인 유적지들이 많은 곳입니다만... 사실 저도 잘 모르는 곳이라... 그냥 구경만 하였습니다. 처음으로 방문한 곳은 산타마리아 노벨라 성당입니다.https://maps.app.goo.gl/8bp73eT2NLHAzmmQ6 산타 마리아 노벨라 성당 · P.za di Santa Maria Novella, 18, 50123 Firenze FI, 이탈리아★★★★★ · 바실리카www.google.com이 곳은 산타마리아 역 바로 뒷편에 위치해 있는 곳인데, 우리는 역까..

인생이야기 2024.10.02

2024.08.28-2024.09.05 스위스, 이탈리아 여행기 - 코르티나 담페초, 돌로미테, 이탈리아 알프스

첨부된 모든 사진은 직접 찍은 것으로, 저작권의 보호를 받습니다. ===================================== 오늘 가는 곳은 이탈리아 북동부 쪽에 있는 코르티나담페초 라는 마을입니다.알프스 산의 북쪽은 스위스이고 남쪽은 이탈리아인데, 지난번 마테호른과 달리 이탈리아의 알프스인 돌로미테는 어떤 모습을 보여줄지 기대를 앉고 출발 합니다.차량을 타고 한참을 가니 점점 더 험준한 산들이 모습을 들어 냅니다. 그런데 느낌은... 약간 설악산 울산바위 대자 느낌입니다 ^^  이렇게 차량을 타고 코르티나담페초에 도착을 하니 마을에서부터 웅장한 산의 모습을 볼 수 있네요.https://maps.app.goo.gl/j5S7ec6R8umfcQoi6 코르티나담페초 · 이탈리아 32043 벨루노 코르..

인생이야기 2024.09.27

2024.08.28-2024.09.05 스위스, 이탈리아 여행기 - 베네치아(베니스), 탄식의 다리, 두칼레 궁전, 산마르코 대성당, 카페 플로리안, 곤돌라, 수상택시, 리알토 다리

첨부된 모든 사진은 직접 찍은 것으로, 저작권의 보호를 받습니다. ===================================== 셋 째 날부터는 이탈리아로 넘어 옵니다.체르마트에서 베네치아까지는 꽤 먼 거리라서 한 번에 넘어오지 못합니다. 일단은 체르마트를 떠나서 이탈리아로 넘어와서 밀라노에서 잠을 청합니다. 이탈리아로 넘어오면서 느낀 점은... 스위스에 비해 건물들이 오래되고 낡아 보인다는 느낌이 확 듭니다. (유적지가 아닌 일반 집들이...)그리고 스위스가 도로 사정이 너무 좋아서 그런가, 도로의 노면이 안 좋아진다는 느낌이 바로 오네요. 뭐 좋은 곳은 좋고 안 좋은 곳은 안 좋겠지만... 전반적으로 한국이랑 비슷한 정도라고 느껴 집니다. 어째든 그렇게 밀라노로 넘어 왔는데... 밀라노는 순전히..

인생이야기 2024.09.23

2024.08.28-2024.09.05 스위스, 이탈리아 여행기 - 태쉬, 체르마트, 고르너그라트 전망대, 마테호른

첨부된 모든 사진은 직접 찍은 것으로, 저작권의 보호를 받습니다. ===================================== 스위스 이탈리아 여행기 두 번째 날 입니다.첫 번째 날에 루체른에서 빈사의 사자상과 카펠교를 보고나서 마흐띠니로 와서 잠을 청했습니다. 조식을 먹은 다음 마테호른을 보기 위한 입구인 태쉬로 향합니다.https://maps.app.goo.gl/cH9qkpxTpt9RRYDk9 Täsch · 3929 스위스3929 스위스www.google.com 정확히 어디부터인지는 모르지만... 태쉬부터는 아마도 내연기관 차가 들어가지 못하는 것 같았습니다.그래서 태쉬에서 내려서 체르마트까지 가는 기차를 탑니다. 기차는 빨간색 모양의 전철입니다. ^^체르마트는 마테호른과 고르너그라트로 올라가..

인생이야기 2024.09.11

2024.08.28-2024.09.05 스위스, 이탈리아 여행기 - 출발, 루체른, 빈사의 사자상, 카펠교, 크루즈

시작하기 전에아래 첨부 된 모든 사진은 제가 직접 찍은 것으로 저작권의 보호를 받습니다. =================================================== 내 인생에 있어서 유럽이란 나라는 방문해 보지 못하고 죽을 것 같았다.비용도 비용이지만 시간이 나지 않았고 그래서 아시아 대륙을 벗어나지 못할 것 같았는데, 이번에 이렇게 살다간 나중에 후회할지도 모른다는 생각에 지르게 되었다.자유여행으로 다녀와도 좋겠지만, 아직 가보지 못한 유럽에 대한 막연한 두려움에 패키지로... 패키지를 선택하는 과정에서도 재미있는 일들이 많았다.평소에 여행 상품은 티몬을 통해 구매를 하곤 했는데, 이번에 구매를 하고 여행만 기다리다가 갑자기 티몬, 위메프 사태가 터지게 되면서 상품 구매 비용 550만..

인생이야기 2024.09.06

AI 시대의 개발 지식 습득

오랜기간 개발을 해 오면서 개발 지식을 습득하는 방법도 많은 변화를 거쳐서 바뀌는 것 같네요.요즘은 chatgpt를 통해 ai 와 대화를 하면서 개발 지식을 습득하고 이해하게 되는 것 같은데 너무나도 이해하기 쉽고 빠르게 지식을 습득할 수 있는 것 같아서 너무나 좋네요. 제가 개발을 시작한 것이 2001년도에 2개월짜리 Linux + php 학습 과정을 들었던 것이였는데...그 당시만 하더라도 개발 지식 습득은 거의 대부분 선 경험자에게 물어보거나... 아니면 커뮤니티를 통해 Q&A를 통해 답을 찾는 것이 다였습니다.아니라면 여러가지 삽질을 통해 실수와 실패를 거듭하면서 알게 된 내용을 정리하고 공유하는 팁을 많이 읽어보는 수 밖에 없었죠.phpschool의 Q&A, tip&tech 등을 많이 보았던 것..

Develop? 2024.08.21

회식비 모아서 소고기 먹은 날...

2023.3.18 월요일에... 그동안 이러 저러한 이유로 몇 달간 회식을 못가서 모이게 된 회식비를 탕진하게 되었다. 회식 장소는 하누비노 서현점... 근처에 있으면서도 가격이 상당해서 처음 와본... ㅎㅎ 얼마나 맛있을지 기대가 ^^ 그리고 주류는 싱글몰트 CS 류 중에 아벨라워 아브나흐와 Glenfarclas 105 중에 하나로 팀원들 투표를 받아본 결과 105로 결정... 뭐 나야 둘 다 먹어본 입장이라 아무거나 먹어도 되어서 중립입장 ㅎㅎ 하누비노 서현점은 콜키지 프리라서 마음놓고 주류샵에서 사서 가지고 들어감 ^^ 105는 풍미가 좋고 피니시까지 좋은... 더할나위 없이 가성비 좋은 CS 라고 생각 됨... 근데 자꾸 내가 좋다 좋다 하면 인플레이션 생겨서 말하기가 싫다 ㅎㅎㅎ 고기는 테이블당..

인생이야기 2024.03.22

마우스를 교환하였습니다.

기존에 사용하던 마우스의 스크롤에 문제가 생겨서 마우스를 교환 하였습니다. 기존에 사용하던 마우스는 micro soft의 아래와 같은 모델이였습니다. https://www.musinsa.com/app/goods/3428124/0 마이크로소프트(MICROSOFT) 스컬프트 에고노믹 인체공학 무선마우스 - 후기 | 무신사 제품분류 : 디지털/테크 > 컴퓨터 브랜드 : 마이크로소프트(MICROSOFT) 제품번호 : L6V-00006 제품 : 스컬프트 에고노믹 인체공학 무선마우스 - 59,000 원산지 : 중국 www.musinsa.com 처음 해당 모델을 구매 했는데 처음부터 마우스 스크롤이 반대로 되거나 잘 안되는 등 문제가 있어서 하나 더 받았는데 2개를 4년 정도 사용 했네요. 손목을 안 아프게 해 주는..

인생이야기 2023.10.20

고차함수, 리스트 조작 in Kotlin

함수를 다른 함수의 인자로 넘기거나, 함수가 반환값으로 함수를 돌려줄 수 있으면 언어가 고차함수를 지원한다고 말할 수 있다. 우선 람다를 저장한 변수의 예제를 살펴보면 아래와 같다. fun isPlus() { val isPlus: (Int) -> Boolean = { it > 0 } val result = listOf(1, 2, -3).any(isPlus) println(result) } 다음과 같은 방법으로 사용할 수 있다. (파라미터타입1, ..., 파라미터타입N) -> 반환타입 위에서는 Int 타입 1개가 넘어가고 Boolean 타입으로 반환 하는 것으로 정의 하였고, "1, 2, -3"의 값이 하나씩 들어가게 되면 0보다 큰지를 판단해서 boolean으로 응답하는 함수를 정의한 후 isPlus에 ..

Develop!/Kotlin 2023.10.04

멤버참조 in Kotlin

함수, 프로퍼티, 생성자에 대해서 호출하는 뻔한 람다를 대신할 수 있다. 사용법은 클래스 이름과 콜론 2개를 연결시켜 사용하면 된다. 관련된 내용은 아래 예제를 통해 확인해 볼 수 있다. data class Message( val sender: String, val text: String, val isRead: Boolean ) fun propertyReferenece() { val messages = listOf( Message("Kitty", "Hey!", true), Message("Kitty", "Where are you?", false) ) val unread1 = messages.filterNot(Message::isRead) val unread2 = messages.filterNot { it..

Develop!/Kotlin 2023.09.27

컬렉션에 대한 연산 in Kotlin

람다가 가독성을 올려주는 이유 중의 하나는 컬렉션에 대한 연산을 한 번에 수행할 수 있어서이다. 이미 살펴본 map, filter, any, foreach 와 같은 것들도 이러한 연산을 해 주는 것들 중 하나이다. 우선 list 를 만드는 방법 부터 살펴보자 fun createList() { val list1 = List(10) { it } println(list1) val list2 = List(10) { 0 } println(list2) val list3 = List(10) { 'a' + it } println(list3) val list4 = List(10) { list3[it%3] } println(list4) val mutableList1 = MutableList(5, { 10 * (it + 1..

Develop!/Kotlin 2023.09.25

람다 in Kotlin

람다식을 Kotlin에서도 사용할 수 있다. 가장 많이 사용하는 람다로 map이 있다. mapping의 약자인 듯 보인다. 기존 값을 사용하여 새로운 값을 맵핑해 준다는 의미로 보이는데 아래와 같이 사용한다. fun map() { val list = listOf(1, 2, 3, 4) val result = list.map { n:Int -> "[$n]" } val result2 = list.map { n -> "[$n]" } val result3 = list.map { "[${it}]" } println(result) println(result2) println(result3) val listChar = listOf('a', 'b', 'c', 'd') val resultChar = listChar.map..

Develop!/Kotlin 2023.09.25

제네릭스 in Kotlin

Java에서도 제네릭 타입이 이다. 어떠한 값을 사용할지 몰라 선언 시에 제네릭으로 선언하고 사용할 때 해당 타입으로 사용하는 것이다. 코틀린에서도 이러한 사용은 가능하다. 다음의 예를 통해 확인해 볼 수 있다. data class Automobile(val brand: String) class GenericHolder(private val value: T) { fun getValue(): T = value } fun genericHolder() { val h1 = GenericHolder(Automobile("Ford")) val a = h1.getValue() println(a) val h2 = GenericHolder(1) val i: Int = h2.getValue() println(i) val ..

Develop!/Kotlin 2023.09.22

안전한 호출과 엘비스 연산자 in kotlin

Java를 쓰면서 가장 골치 아픈게 NPE 이다. null인 객체를 바로 사용하려면 Runtime 시에 NPE가 발생하기 때문에 사용 전에 항상 if로 null인지 여부를 검증해 주거나 Optional을 사용해야 하기 때문이다. 코틀린에서는 이러한 골치아픈 내용을 손쉽게 사용할 수 있도록 해준다. fun String.echo() { println(toUpperCase()) println(this) println(toLowerCase()) } fun safeOperation() { val s1: String? = "Howdy!" s1?.echo() val s2: String? = null s2?.echo() } 이렇게 하기 위해 사용하는 것이 '?.' 이다. null이 될 수 있는 객체 뒤에 '.' 대신에..

Develop!/Kotlin 2023.09.14

Null이 될 수 없는 타입 in Kotlin

Java에서 가장 큰 실수가 null 을 만든 것이라고 한다. 그래서 Kotlin에서도 null을 없애려고 하였지만 Java를 지원하기 위해서 null을 사용하기는 한다. Java에서는 null이 될 수 없을 경우에는 lombok의 @NonNull 어노테이션을 사용한다. 코틀린에서는 기본이 non-null 이다. Java와의 연동으로 인해 null을 허용하고 싶으면 '?'를 사용하면 된다. 다음의 코드를 통해 사용법을 확인해 볼 수 있다. fun nullableType() { val s1 = "abc" // compile error // val s2: String = null val s3: String? = null val s4: String? = s1 // compile error // val s5: ..

Develop!/Kotlin 2023.09.06

구조 분해 선언 in Kotlin

사실 구조 분해라는 말은 코틀린에서 처음 들어 봤다. 어떠한 값을 여러 컴포넌트로 분해해서 나눠 준다는 의미 같다. 말로 설명하기 쉽지 않으니 소스 코드를 보자 fun compute(input: Int): Pair = if (input > 5) Pair(input * 2, "High") else Pair(input * 2, "Low") fun compute2(input: Int): Triple = if (input > 5) Triple(input * 2, "High", "Dummy") else Triple(input * 2, "Low", "Dummy") fun pair() { println(compute(7)) println(compute(4)) val result = compute(5) println(..

Develop!/Kotlin 2023.09.06

Data Class in Kotlin

값을 담는 Data class를 Java에서는 VO, DTO 등으로 부르고 @Value 또는 @Data 등의 어노테이션을 쓰면서 롬복을 활용한다. 뭐 기본적으로 그냥 getter, setter 등을 일일히 다 만들어 줘도 되긴 한다. 어째든 이러한 클래스를 별도로 분리하여 코틀린에서는 별도로 만들 수 있는데 data라는 키워드를 사용하여 만들 수 있다. data class Simple(val arg1: String, var arg2: Int) fun simple() { val s1 = Simple("Hi", 29) val s2 = Simple("Hi", 29) println(s1) println(s2) if (s1.equals(s2)) { println("eqauls") } else { println("..

Develop!/Kotlin 2023.09.04

when in kotlin

kotlin에서도 when 문을 쓸 수 있다. 다음은 독일어의 기수를 서수로 바꿔주는 when 문이다. val numbers = mapOf( 1 to "eins", 2 to "zwei", 3 to "drei", 4 to "vier", 5 to "fuenf", 6 to "sechs", 7 to "sieben", 8 to "acht", 9 to "neun", 10 to "zehn", 11 to "elf", 12 to "zwoelf", 13 to "dreizehn", 14 to "vierzehn", 15 to "fuenfzehn", 16 to "sechzehn", 17 to "siebzehn", 18 to "achtzehn", 19 to "neunzehn", 20 to "zwanzig" ) fun ordina..

Develop!/Kotlin 2023.08.23

오버로딩(OverLoading) in Kotlin

Java에서도 overloading을 사용하게 되면 같은 이름으로 다른 파라미터를 받으면서 사용할 수 있게 된다. 이렇게 함으로 추상화가 가능하게 되고 코드를 읽는 사람에게는 더 쉽게 읽히는 순 기능이 있다. 코틀린에서는 다음과 같이 사용 하게 된다. class Overloading() { fun f() = 0 fun f(n: Int) = n + 2 } fun overloading() { val o = Overloading() println(o.f()) println(o.f(11)) } 실행 결과는 아래와 같다. f라는 함수에 n이라는 파라미터를 받는 경우와 아닌 경우를 만들었다. 함수 이름과 파라미터 목록, 반환 타입을 다 합쳐서 함수의 시그니쳐 라고 하는데 함수의 파라미터를 다르게 만들면 overlo..

Develop!/Kotlin 2023.08.18

이름 붙은 인자, 가변인자 in kotlin

어떤 함수에 인자값을 전달할 때 인자의 개수들이 많다면 지금 넘기는 값이 어떤 인자에 해당하는지 알 기 어려운 경우가 많다. 그래서 클린 코드를 위해 가능하면 인자의 개수를 줄이는 행동들도 많이 한다. 이러한 어려움을 해결하기 위해 코틀린에서는 인자의 이름을 명시적으로 붙여서 전달할 수 있도록 만들어 둔 것 같다. fun color (red: Int, green: Int, blue: Int) = "($red, $green, $blue)" fun nameArgument() { println(color(1, 2, 3)) println( color( red = 76, green = 89, blue = 0, ) ) println(color(52, 34, blue = 0)) } color라는 함수에 red, gr..

Develop!/Kotlin 2023.08.16

확장함수 in kotlin

Java에서 기존에 만들어진 Class를 상속받아 메소드를 추가하고 사용하는 것을 보면서 좋은 아이디어라고 생각하고 그닥 불편하다는 생각을 못했는데 kotlin에서 하는 것을 보고 'Wow'라는 생각이 든다. 확장함수와 관련된 내용은 매우 짧다. 아래와 같이 간단하게 사용할 수 있다. fun String.singleQuote() = "'$this'" fun String.doubleQuote() = "\"$this\"" fun main() { println("Hi".singleQuote()) println("Hi".doubleQuote()) } String이란 Class를 상속 받아 새로운 함수를 넣고 싶으면 바로 정의해서 사용 하면 된다. 별도의 Class를 만들어 정의할 필요도 없다. 위의 내용을 실행..

Develop!/Kotlin 2023.08.14

Property in kotlin

Class 안에 있는 member 변수, 그리고 그 값을 get, set 하는 것과 관련하여 코틀린에서는 어떻게 처리되는지 확인할 수 있다. class Default { var i: Int = 0 get() { println("get ${field}") return field } set(value) { println("set(${value})") field = value } } fun defaultGetSet() { val d = Default() d.i = 2 d.i } fun main() { defaultGetSet() } kotlin에서는 get, set을 할 때 Java처럼 getXXX 식으로 하는게 아니라 해당 멤버변수(프로퍼티) 아래에 get, set 함수를 작성해 주면 된다. 그리고 해당 멤..

Develop!/Kotlin 2023.08.07

Set in Kotlin

Java에서도 중복된 값을 허용할 땐 List, Unique한 값만을 허용할 땐 Set을 사용한다. Kotlin에서도 그와 동일하게 사용할 수 있다. fun sets() { val intSet = setOf(1, 1, 2, 3, 9, 9, 4) println(intSet) println(9 in intSet) println(99 in intSet) println("9 contains : " + intSet.contains(9)) println("99 contains : " + intSet.contains(99)) print("[1, 9, 2] containsAll : ") println(intSet.containsAll(setOf(1, 9, 2))) print("[1, 9, 5] containsAll :..

Develop!/Kotlin 2023.08.02

가변인자 목록 in Kotlin

Java에서도 인자 값의 개수를 정해 놓지 않고 받을 경우 사용하는 문법이 있다. 가령 "String...str"와 같은 방식이다. Kotlin에서는 varargs 라는 예약어를 사용하면 된다. fun v(s: String, vararg d: Double) { println("String : $s") for (n in d) { print("$n ") } println(); } fun main() { v("abc", 1.0, 2.0) v("def", 1.0, 2.0, 3.0, 4.0) v("ghi", 1.0, 2.0, 3.0, 4.0, 5.0, 6.0) } varargs로 정의 된 인자값은 Array로 인식된다. kotlin에서 Array는 Java에서의 array와 같다. varargs로 정의하여 Arr..

Develop!/Kotlin 2023.08.02

list int kotlin

kotlin에서 list를 만들 때는 listOf 함수를 사용한다. listOf로 만들어진 list는 기본적으로 immutable 객체이다. mutable로 생성하려면 mutalbeListOf을 사용하면 된다. mutable list를 변할 수 없는 val 변수에 담으면 어떻게 될까? fun listTest() { val list1 = mutableListOf('A') list1 += 'A' list1.plusAssign('A') println(list1) val list2 = listOf('B') // list2 += 'B' // list2 = list2 + 'B' println(list2) var list3 = listOf('C') list3 += 'C' val newList = list3 + 'C'..

Develop!/Kotlin 2023.07.31

생성자 in kotlin

Kotlin에서 생성자는 Class의 이름과 소괄호만 적어 주면 된다. Java 처럼 new를 적지 않아도 된다. class Wombat { } fun main() { val wombat = Wombat() } 생성자에 파라미터를 전달할 수도 있다. class Alien(name: String) { val greeting = "Poot $name" } fun main() { val alien = Alien("Mr. Meeseeks") println(alien.greeting) } 파라미터 name은 생성자 밖에서는 접근할 수 없다. 생성자 밖에서도 접근이 가능하려면 var or val을 붙여주면 된다. class MutableNameAlien(var name: String) { fun printName(..

Develop!/Kotlin 2023.07.27

'in' in kotlin

제목이 이상하다. 코틀리에서 사용하는 in 키워드에 대해 말 하다 보니 이렇게 될 수 밖에 없다. in은 해당 값이 범위 안에 있느지 체크할 때 사용한다. fun booleanIn() { val percent = 35 println(percent in 1..100) } 해당 값이 있으면 true, 없으면 false를 반환한다. 1 ~ 100 사이에 값이 있으니 위의 메소드의 실행 결과값은 true 이다. in 키워드는 값이 있는지 없는지 뿐 아니라 for iteration에서도 사용할 수 있다. fun iterationIn() { val values = 1..3 for (v in values) { println("iteration $v") } val v = 2 if (v in values) { print..

Develop!/Kotlin 2023.07.26
728x90
반응형