본문 바로가기
반응형

전체 글395

Swift 불투명 타입 some은 왜 필요할까? SwiftUI를 접하다 보면,Opaque Type(불투명 타입)인 some과 만나게 됩니다.대체 이건 뭐고 왜 필요한 것일까요?실마리를 찾기 위해,Opaque Type(불투명 타입)과 SwiftUI에 대해 알아보겠습니다. 1. Opaque Type(불투명 타입) 과 SwiftUI불투명 타입이 어떤 건지 비유를 통해 알아보겠습니다. 만약 친구에게 "나 과일 하나 가져올게" 라고 말했다고 가정해 보겠습니다.어떤 과일을 가져올지 정확히 말하지 않았지만,분명한 것은 과일의 일종을 가져온다는 점입니다. "뭐가 될지는 모르겠지만,마트에 들려서,과일종류를 사올것이다" 이런 거죠.  SwiftUI에서도 마찬가지입니다.some을 사용하면 다음의 의미를 가지게 됩니다."이것은 View의 일종인데,Text일 수도, But.. 2025. 3. 8.
Kotlin BuildList 사용방법 정리 buildList는 Kotlin의 표준 라이브러리에서 제공하는 함수인데요.오늘은 이것에 대해 정리하겠습니다. 1. BuildListbuildList 함수를 사용하면,MutableList에 아이템을 추가하거나 제거하는 등의 변화를 준 후,변경 불가능한(immutable) List로 리턴해 줍니다.  예제를 보면서 이해해 보겠습니다.buildList블록안에서,x라는 리스트의 앞과 뒤에,아이템을 추가하였습니다. val x = listOf('김', '이')val y = buildList() { add('박') addAll(x) add('마')}println(y) // ['박', '김', '이', '마']  2. 실제 코드 실제로 사용하는 코드를 볼까요?예전코드와,buildList를 사용하는 코드.. 2025. 2. 20.
Paging 라이브러리와 RecyclerView 그리고 Room 구현하기 오늘은 Paging 라이브러리와 RecyclerView,그리고 Room을 이용해 대량의 데이터를 구현하는 방법에 대해 알아보겠습니다. 1. Paging1-1. Paging라이브러리Android Paging Library는,앱에서 대량의 데이터를 표시하는 데 도움을 주는 라이브러리입니다.책을 페이지별로 나누어 보는 것처럼,데이터를 작은 덩어리(페이지)로 나누어서,필요한 부분만 불러와 보여주는 방식입니다. Paging이 필요한 시기는 언제일까요?처음 로드해야하는 데이터가, 50개 정도를 넘어선다면,Paging을 고려해 보아야 합니다. 1-2. Paging 라이브러리를 사용해야 하는 이유Paging라이브러리가, 데이터를 덩어리로 나누어주는 것만 하는 것이 아니고요.아래와 같은 역할에 대한 코딩을 줄여주기도 합.. 2025. 2. 19.
SourceTree에서 방금 커밋한 메시지 수정하기(Amend) 커밋메시지를 작성하여 커밋한 직후,오타를 발견하면 당황스러운데요. 이럴 때 직전 커밋을 수정하는 방법이 있습니다.오늘은 이것에 대해 알아보겠습니다. 1. Amend 직전 커밋을 수정할 때 기억해야 할 키워드는,'amend'입니다.Source tree에는 아래와 같은 메뉴명을 찾으면 되는데요.Amend Last Commit 먼저, SourceTree에서 좌측상단의 Commit버튼을 눌러줍니다.아무것도 커밋할 것이 없어도,하단 커밋창을 클릭하고 나서,아래와 같이 2가지 방법으로 메뉴에 접근할 수 있습니다.   amend commit을 클릭하거나 체크하면,직전 커밋메시지가 나타나는데요.이것을 수정한 다음, commit버튼을 클릭해 주기만 하면 됩니다. 2. 주의할 점Amend명령어는 기존 커밋의 메시지를 바.. 2025. 2. 18.
Kotlin Lateinit var와 By Lazy 차이 이해하기 오늘은 Kotlin의 lateinit var에 대해서 이해해 보겠습니다. 1. lateinit var vs by lazy먼저, lateinit var와 by lazy를 표로 비교해 보겠습니다.가변적이면서도 초기화 시점을 컨트롤 하는 lateinit var와,불변적이면서 사용시에 자동으로 초기화 되는 by lazy의 차이점이 보이시나요?  lateinit varby lazy선언 방식가변적, 초기화 후 변경 가능불변적(val), 초기화 후 변경 불가초기화 시점원하는 시점에 대입해서 명시적으로 초기화(초기화 시점에 null이면 Exception)첫 사용 시 자동 초기화기본타입 사용기본 타입 사용 불가모든 타입 사용 가능스레드 안전성보장하지 않음보장초기화 여부 확인::propertyName.isInitializ.. 2025. 2. 17.
Android 카메라 동적 권한 얻는 방법 정리 오늘은 Android에서는 카메라기능을 사용할 경우,단순히 권한을 선언하는 것으로는 부족하고요.동적으로 유저에게 승인을 얻어야 하는데요.오늘은 동적으로 권한을 얻는 방법에 대해 알아보겠습니다. 1. ManifestManifest에 Camera권한을 설정하지 않으면,아무리 동적권한을 구현해도 카메라기능은 동작하지 않습니다.manifest에 아래와 같이 권한을 요청해 둡니다.   2. 동적 권한 요청 구현그럼 실제로 동적 권한을 요청하는 코드를 볼까요? 2-1. permissionLauncher작성하기가장 먼저 할 일은,Activity(혹은 Fragment) 내에 아래와 같이,아래와 같이 permissionLauncher를 작성하는 일입니다.권한이 거부되면,사용자에게 권한이 필요하다고 알리는 다이얼로그.. 2025. 2. 17.
Android Studio 에서 기억해야 하는 핵심 단축키 안드로이드 스튜디오를 사용할 때 코드사용에 큰 도움을 주는 단축키들이 많이 있습니다.이런 것들은 자주 사용하면서 기억해 두면 생산성이 높아지는데 큰 도움을 주는데요.이 글에서 정리해 보도록 하겠습니다. 1.  찾기1-1. 전체 파일에서 코드 찾기아래 단축키로 특정코드를 전체 파일에서 찾아볼 수 있습니다.Command + Shift + F1-2. 클래스 파일 이름으로 찾기아래 단축키를 사용하면 클래스 파일만 이름으로 찾을 수 있습니다. Cmd + O 1-3. 파일이름으로 찾기기준을 클래스 파일이 아니라,모든 파일이름으로 할 경우는,다음 단축키를 사용해 줍니다.Cmd + Shift + O1-4. 모든 것을 기준으로 찾기파일이름, 클래스이름, 심볼이름, 텍스트 이름 등,모든 것을 기준으로 찾을 때는 아래 단축.. 2025. 2. 13.
node-cron 이용한 작업 예약 방법 정리 오늘은 NodeJS의 node-cron 모듈을 이용한 작업 예약 방법에 대해 정리하겠습니다. 1. 모듈 인스톨과 require 해 주기가장 먼저해야할 것은 모듈을 인스톨 하는 것 이지요.아래 명령어로 node-cron 모듈을 설치해 줍니다. npm install --save node-cron  설치한 node-cron을,코드에서 사용하기 위해,아래와 같이 require()명령어로 불러와 줍니다. const cron = require('node-cron'); 3. Cron 표현식본격적으로 node-cron으로 job을 설정하기 전에 알아둘 것이 있는데요.예약할 작업의 실행시간을 설정하는,크론표현식입니다.6자리로 나와있지만,가장 앞의 초단위는 선택사항으로,거의 사용하지 않으니, 5자리라고 생각하시면 됩니다... 2025. 2. 6.
SQLite의 Coalesce 함수 총정리하기 오늘은 SQLite의 Coalesce 함수에 대해 정리해 보겠습니다. 1. Coalescecoalesce의 원래 뜻은 "합쳐지다" 또는 "병합하다"인데요.데이터베이스 나 SQL에서는,NULL 값을 다른 의미 있는 값으로 대체하는 데 주로 사용됩니다. SQL문에서는 여러개의 표현식 중,NULL이 아닌 첫 번째 값을 찾아서 반환합니다. COALESCE(expression1, expression2, ..., expressionN) 예를 들어,아래에서 쿼리는 첫번째 NULL이 아닌,'Hello'를 반환합니다. SELECT COALESCE(NULL, NULL, 'Hello', 'World');  2. 예제예제를 보면서 COALESCE를 좀 더 이해해 볼까요.먼저 직원 테이블을 아래와 같이 만듭니다. CREATE .. 2025. 1. 24.
Kotlin Smart Cast(스마트캐스트) 총정리 오늘은 Kotlin의 Smart Cast에 대해 정리하겠습니다. 1. Smart Cast(스마트 캐스트)Smart Cast(스마트캐스트)는 이름 자체에서 알 수 있듯이,컴파일러가 타입을 자동으로 추론해서,명시적으로 타입을 변환하지 않아도,사용하도록 해주는 기능입니다. 타입을 검사하고, 변환하는 것까지,자동으로 Smart하게 해주는 것 이지요. 이를 이용하면,코드가 짧아져 가독성이 좋아지고,유지보수성도 좋아집니다. 2. is를 사용한 Smart Cast2-1. is smart cast가장 기본적인 스마트 캐스트의 사용법은,is 키워드를 사용해,변수의 타입을 검사한 후,해당 타입으로 자동 캐스트하는 것 입니다. 아래는 'is'키워드를 사용해,any의 타입검사를 하고,String에 해당하면 String으로 변.. 2025. 1. 22.
StateFlow 정리 # Android Kotlin Coroutine getStateFlow StateIn 오늘은 Kotlin의 StateFlow 에 대해서 정리해 보도록 하겠습니다. StateFlow도 Flow API의 하나인데요.Flow에 대한 내용은 아래 글을 참조해 주세요.>> Kotlin Coroutine Flow 총정리 part3 # launchIn 이 글은 아래의 순서대로 정리되어 있습니다.StateFlowStateFlow 구현(학생 및 admin 등록과 조회)MutableStateFlow에 값을 변경하는 방법StateFlow의 값에 접근하는 방법Sealed Class와 함께 사용하기StateInsavedStateHandle과 같이 사용하기 1. StateFlowStateFlow는 업데이트가 가능한 데이터 값을 가지는 State라는 것을 가지고,collector에게 emit(전파)하는 인터페이스인.. 2025. 1. 22.
Gravity와 Layout_Gravity 의 구분법 정리 XML로 UI를 그리면서,헷갈리는 속성2가지가 있는데요.바로 gravity와 layout_gravity입니다. 이 둘은 같은 텍스트가 포함되어 있어,뭐가 다른건지 차이를 알기 어려운데요.오늘은 이 두 속성의 차이를 구분해 보겠습니다. 1. GravityGravity는 뷰 내부 콘텐츠의 위치를 지정합니다.해당하는 뷰의 자식뷰들을 어디에 배치할지를 결정합니다. 아래는 TextView인데요.TextView내부의 Text들의 배치를 center로 결정하였습니다.  아래에서 사용된 gravity="center_vertical|start"는,버튼 내부에서,아이콘과 텍스트를,세로방향에서는 중앙(center_vertical)에 위치시키고가로로는 시작 부분(start, 왼쪽)에 배치합니다    2. Layout_.. 2025. 1. 21.
NodeJS Handlebars helper 함수 사용 방법 총정리 오늘은 NodeJS에서는 뷰템플릿 엔진인 Handlebars에서,사용하는 helper 함수 사용방법에 대해서 정리해 보겠습니다. handlebars에 대해서는 아래 글을 참조해 주세요.>> Handlebars 사용방법의 모든 것: Nodejs 뷰 템플릿 엔진 Handlebars 사용방법의 모든 것: Nodejs 뷰 템플릿 엔진NodeJS와 함께 널리 사용하는 뷰템플릿 엔진인 Handlebars에 대해 정리하겠습니다. 1. Handlebars Handlebars는 JavaScript 템플릿 엔진입니다. 웹 애플리케이션에서 동적으로 HTML을 생성하는 데 사용되는데요.developer88.tistory.com 1. Helper함수헬퍼는 템플릿에서 호출할 수 있는 함수인데요.데이터와 템플릿 사이에서,내장함수만.. 2025. 1. 18.
Git 커밋 메시지 간결하게 작성하는 방법 정리 커밋 메시지는 프로젝트의 히스토리를 명확하게 하고,팀 협업을 원활하게 해 주는데요. 저는 소규모 개인프로젝트를 하기에,큰 단위로 작업하고 커밋을 정리해 올리기보다는,작은 작업단위로 자주 올리는 것을 선호합니다.그래서 커밋 메시지도 많이 고민해서 쓰는 방법보다는,간결하게 작성하는 법을 익혀,자주 커밋하는 방식을 취하는데요. 오늘은 간결하게 Git 커밋 메시지 작성하는 방법에 대해 알아보겠습니다. 1. 커밋 메시지 형식커밋 메시지를 작성하는 형식은 여러 가지가 있지만,아래의 형식이 주로 많이 사용됩니다. ():  위에서 사용된 요소들은 다음과 같은 의미를 가집니다.타입: 커밋의 종류 (예: feat, fix, docs 등)범위: 변경한 파일이나 변경사항의 범위(선택사항)제목: 변경사항을 간단히 요약위의 형식.. 2025. 1. 17.
SQLite NodeJS 모듈 이용해서 CRUD 구현하기 # DBBrowser SQLite3 오늘은 SQLite 데이터베이스에 대해 알아보고,NodeJS에서 SQLite3 모듈을 활용해,CRUD (생성, 읽기, 업데이트, 삭제) 작업을 구현해 보겠습니다.1. SQLite1-1. SQLiteSQLite는 C언어로 개발된 라이브러리입니다.크기가 작고 속도가 빠르며 상대적으로 안정적인 특성을 가진 SQL 데이터베이스 엔진인데요.이러한 장점 덕분에 전 세계에서 가장 널리 사용되는 데이터베이스 엔진 중 하나로 자리잡았습니다.  SQLite의 핵심 특징 중 하나는 모든 데이터베이스 정보를 단 하나의 파일에 저장한다는 점입니다. 이로 인해 여러 테이블, 인덱스, 스키마 등을 포함한 모든 데이터를 한 파일 안에 담을 수 있으며, 데이터베이스 서버를 별도로 구동할 필요 없이 파일 하나로 쉽게 데이터베이스를 전송.. 2025. 1. 16.
리눅스에서 자주 사용하는 스크립트 사용법 총정리 오늘은 리눅스에서 자주 사용하는 스크립트 문법에 대해서,총정리해 보겠습니다. 1. Bash shell 사용선언스크립트의 가장 첫 줄에는 아래와 같은 코드로,어떤 shell을 사용할지 선언해주는데요.이를 shebang이라고 부릅니다. 보통, 아래와 같이 bash쉘로 선언해 줍니다. #!/bin/bash 2. 변수 선언 방법변수를 선언할 때는 공백 없이 = 기호를 사용합니다. 대신 변수를 사용할 때는 $기호를 앞에 아래와 같이 붙입니다. #!/bin/bashname="홍길동"echo "안녕하세요, $name 님!"  위와 같이, echo 명령어를 이용하면 원하는 문구를 화면에 출력할 수 있습니다. 3.  read 명령어로 사용자 입력받기3-1. 입력받아 변수에 저장하기사용자로부터 입력을 받아서 변수에 저장할.. 2025. 1. 14.
Coroutine Async와 await 사용시 Exception Handling 방법 정리#Kotlin Coroutine에서 비동기 코드에서의 반환 값이 필요할 때,코루틴 빌더인 async와 await()함수를 사용합니다. 하지만 이 API들은 Exception을 핸들링 할 때 주의가 필요한데요.오늘은 async와 await() 사용시,Exception을 핸들링 하는 방법에 대해 알아보겠습니다. 1. async 예외 전파 이해하기코루틴 빌더인 async와 await함수를 사용시,Exception핸들링을 하려면,코루틴의 예외 전파방식에 대해 이해해야 하는데요. 먼저 보아야 할 것이,코루틴 빌더인 async의 리턴타입입니다.아래와 같이 Deferred타입인데요.이 타입은 아래 보이는 것처럼, Job을 상속받고 있습니다.  코루틴 빌더인 async는,Job을 통해 부모-자식 관계가 형성되구요.Exception.. 2025. 1. 13.
도메인의 모든 것: 이해부터 실제 등록까지 웹사이트 개설에는 도메인이 필수적입니다.도메인은 인터넷상의 주소로,등록을 통해 사용자들이 웹사이트에 접속할 수 있게 해 주는데요.오늘은 도메인과 관련된 용어들을 이해하고,실제 가비아에서 등록하는 과정까지를 알아보겠습니다. 1. 도메인1-1. 도메인인터넷은 수많은 컴퓨터들이 서로 연결되어 있는 거대한 네트워크인데,각 컴퓨터는 인터넷에 연결되 있는 동안,유일한 IP 주소를 가지도록 되어 있습니다. 이때 IP주소들은 모두 숫자로 구성되어 있는데요.예를 들면, '192.0.2.1'과 같습니다. 실제로 궁금하다면,주소창에, "ifconfig.me"를 입력해 보세요.여러분 컴퓨터의 ip주소가 나오는 것을 볼 수 있습니다.  그런데, 이런 숫자로 된 주소는 기억하기 매우 어렵습니다.그래서, 네트워크의 컴퓨터들의 구분.. 2025. 1. 10.