본문 바로가기

전체 글

(50)
docker로 tomcat 설치하고 실행하기 docker hub 에 있는 tomcat 이미지 받아오기 docker pull tomcat:9.0 실행하기 docker run --name [이름] -p [호스트포트]:[컨테이너포트] tomcat:9.0 docker run --name tomcat -p 8888:8080 tomcat:9.0 결과
Compose Tutorial : 기본 레이아웃 Compose Tutorial 6 Compose의 기본 레이아웃 | Android Developers 이 Codelab에서는 Compose에서 즉시 제공되는 컴포저블과 수정자를 통해 실제 디자인을 구현하는 방법을 알아봅니다. developer.android.com 슬롯 기반 레이아웃 슬롯 기반 레이아웃은 개발자가 원하는 대로 채울 수 있도록 UI에 빈 공간을 남겨 둡니다. 컴포즈 UI 재사용성을 위한 레이아웃 방식으로 이 방식을 활용하는 대표적인 예는 TopAppBar, Scaffold 등이 있다. 특정 영역을 추상화하여 사용하는 곳에서 해당 부분을 채우도록 레이아웃을 구성할 수 있다. 추상화 영역을 컴포저블 람다 타입(content: @Composable () -> Unit)으로 받으면 된다. 컴포즈가..
코루틴 4장 : 코루틴의 실제 구현 Continuation 객체는 중단이 되었을 때의 상태와 함수의 지역변수와 파라미터, 그리고 중단 함수를 호출한 함수가 재개될 위치 정보를 가지고 있다. 하나의 컨티뉴에이션 객체가 다른 하나를 참조하고, 참조된 객체가 또 다른 컨티뉴에이션 객체를 참조한다. 중단함수는 실행도중 중단될 경우 COROUTINE_SUSPENDED 라는 마커를 반환한다 상태는 컨티뉴에이션 객체에 저장되며, 중단을 처리하기 위한 과정이 있어야 한다. 중단된 함수가 재개했을 때 컨티뉴에이션 객체로부터 상태를 복원하고, 얻을 결과를 사용하거나 예외를 던진다. Continutation 의 구성 예시 suspend fun myFunction() { println("Before") var counter = 0 delay(1000) coun..
m1 터미널 설정 1. brew 설치 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 2. zshell 설치 ## terminal > brew install zsh > open ~/.zshrc ## zshrc 파일 설정 export PATH=/opt/homebrew/bin:$PATH 3. syntax highlighting, auto suggestion 설치 > brew install zsh-syntax-highlighting > brew install zsh-autosuggestions > open ~/.zshrc ## zshrc 파일 설정 후 저장 source /opt/homebrew/share/..
3장 재사용성 : 23 ~ 25 Item 23. 타입 파라미터의 섀도잉을 피하라 섀도잉이란 // 섀도잉 예시 class Person(val name: String) { fun addName(name: String) { // something } } 코틀린에서는 동일한 이름을 여러번 사용하는 것이 가능하다 addName에서 name은 생성자로 받은 name이 아닌 파라미터로 받은 name을 가리킨다 addName() 내부에서 생성자에 선언된 name을 사용하기 위해서는 this.name으로 명시하여 어느 범위의 name인지 알려줘야 한다 이처럼 같은 이름을 가진 요소에 의해 값이 가려지는 것을 섀도잉이라고 한다 섀도잉은 읽는 사람을 혼란스럽게 하기 때문에 피하는게 좋을 것 같다 혼란스러워지는 예시😱 interface Tree class ..
2장 가독성 : Item 14 - 16 Item 14 : 변수 타입이 명확하지 않은 경우 확실하게 지정하라 코틀린에는 타입 추론 시스템이 있지만, 타입이 명확하지 않은 경우 남용하면 좋지 않다 예시 val data = getSomeData() 코드 정의로 쉽게 이동할 수 없는 깃허브 등의 환경에서 코드를 읽는 사람도 고려해야 한다 이는 가독성을 위함도 있지만, 안전을 위해서도 타입을 지정하는 것이 좋다 Item 15 : 리시버를 명시적으로 참조하라 스코프 내부에 둘 이상의 리시버가 있는 경우 리시버를 명시적으로 나타내면 좋다 apply, with, run 등의 스코프함수를 사용할 때가 대표적인 예시이다. 잘못 사용한 예시 class Node(val name: String) { fun makeChild(childName: String) = cr..
item 6~10 안정성에 관련된 내용 이어서 Item 6 : 사용자 정의 오류보다는 표준 오류를 사용하라 직접 오류를 정의하기 보다는 표준 라이브러리 오류를 사용하는 것이 좋다 당연한 이야기지만 문제가 발생했을 때, 그게 잘 알려진 문제라면 해결한 사람도 많을 것이기 때문에 도움받기 쉽다 Item 7 : exception의 대체, null과 failure를 사용하라 exception을 남발해선 안된다 단순히 정보 전달의 목적으로 사용해선 안되고 정말 예외적인 상황이 발생했을 때 사용하여 적절한 처리가 이루어지도록 해야 한다 예외를 던지지 않고 예측할 수 있는 범위의 오류를 표현하는 방법 1. null 리턴 getOrNull : 리스트에서 값이 있으면 값을 반환하고 없으면 null을 반환하는 함수. IndexOutOfBo..
1장 : item 2, 3, 4, 5 Item 2 : 스코프가 좁을 수록 코드 분석과 관리가 쉽다 _변수의 스코프를 최소화하라 코드 분석할 때 스코프 범위가 좁을수록 추적과 관리가 쉬워진다 프로퍼티보다 지역변수 사용하기 스코프는 최대한 좁게 사용하기 반복문 내부에서만 사용되는 변수는 반복문 내부에 작성하기 여러 프로퍼티를 한번에 설정할 경우 구조분해 선언 활용하기 반복문 내부에서만 사용되는 변수를 반복문 내부에 작성한 예시 for((i, user) in users.withIndex()) { print("User at $i is $user") } Item 3 : 플랫폼 타입은 위험하다 _최대한 플랫폼 타입을 사용하지 말라 플랫폼 타입의 위험성 플랫폼 타입 : 다른 언어에서 넘어온 타입 코틀린은 null-safety 매커니즘이 있어 타입이 nu..