923 posts
[자바스크립트] var를 사용할 때 발생하는 문제들

[자바스크립트] var를 사용할 때 발생하는 문제들

많은 자바스크립트 강좌에서 가급적 var 대신에 let이나 const 키워드를 사용하여 변수를 선언하라고 가이드하고 있는데요. 본 포스팅에서는 var의 어떤 문제점 때문에 그런건지 알아보도록 하겠습니다. 아리송한 코드 먼저 다음 코드를 살펴보도록 하겠습니다. 무엇이 출력이 될지 예상이 되시나요? 첫번째 console.log(n)에서 오류가 발생할 것 같기도 하고, 1과 2가 출력될 것 같기도 한데요. 의외로 정답은 다음과 같습니다. 왜 이런 예상치못한 결과가 얻어지는 걸까요? 원인은 var 키워드를 사용할 경우, 변수 Hoistin

AssertJ 소개

AssertJ 소개

멋진 테스트 코드를 작성하도록 돕는 AssertJ 라이브러리에 대해서 알아봅시다. AssertJ의 장점 메소드 체이닝을 지원하기 때문에 좀 더 깔끔하고 읽기 쉬운 테스트 코드를 작성할 수 있습니다. 개발자가 테스트를 하면서 필요하다고 상상할 수 있는 거의 모든 메소드를 제공합니다. 라이브러리 의존성 설정 Java8 이상 기반 프로젝트는 3.x 버전을, Java7 이하 기반 프로젝트는 2.x 버전을 사용하셔야 합니다. Gradle Java8 Java7 Maven AssertJ 메소드 임포트 다음과 같이 정적 임포트를 하면 Assert

자바8 Optional 3부: Optional을 Optional답게

자바8 Optional 3부: Optional을 Optional답게

Optional을 좀 더 Java8 API 설계자의 의도에 맞게 쓰는 방법에 대해서 알아봅시다. 이전 포스팅를 통해서 Optional에 대해서 소개드렸습니다. 또한 Optional을 Optional답지 않게 사용할 경우, 어떤 부작용이 발생하는지도 살펴보았는데요. 이 번 포스팅에서는 어떻게 코드를 작성해야 Optional을 Optional답게 쓸 수 있는지 알아보도록 하겠습니다. Stream처럼 사용하기 Optional을 제대로 사용하려면, Optional을 최대 1개의 원소를 가지고 있는 특별한 Stream이라고 생각하시면 좋습니

자바8 Optional 2부: null을 대하는 새로운 방법

자바8 Optional 2부: null을 대하는 새로운 방법

Java8의 Optional API를 통해 어떻게 null 처리를 할 수 있는지 알아봅시다. 이전 포스팅를 통해 Java8 이 전에는 얼마나 null 처리가 고통스러웠는지 살펴보았습니다. 그리고 문제의 본질이 null 참조를 통해 "값의 부재"를 표현하는 자바 언어의 초기 설계에 기인한다라는 것도 말미에 언급하였습니다. null 관련 문제 돌아보기 이 전 포스팅의 예제 코드를 통해 살펴본 null과 관련된 문제들을 크게 2가지로 요약됩니다. 런타임에 NPE(NullPointerException)라는 예외를 발생시킬 수 있습니다. N

자바8 Optional 1부: 빠져나올 수 없는 null 처리의 늪

자바8 Optional 1부: 빠져나올 수 없는 null 처리의 늪

Java8이 나오기 이 전에는 얼마나 힘들게 null 처리를 했었는지 살펴봅시다. null 창시자가 스스로 인정한 null 탄생의 실수 우선 null이라는 개념은 언제 누구에 의해 만들어졌을까요? null 참조는 1965년에 Tony Hoare라는 영국의 컴퓨터 과학자에 의해서 처음으로 고안되었습니다. 당시 그는 "존재하지 않는 값"을 표현할 수 있는 가장 편리한 방법이 null 참조라고 생각했다고 합니다. 하지만 나중에 그는 그 당시 자신의 생각이 "10억불 짜리 큰 실수"였고, null 참조를 만든 것을 후회한다고 토로하였습니다

소켓이란 무엇인가?

소켓이란 무엇인가?

본 포스팅는 오라클 자바 튜토리얼의 What Is a Socket?를 번역하였습니다. 소켓 통신 일반적으로 서버는 특정 포트가 바인딩된 소켓를 가지고 특정 컴퓨터 위에서 돌아갑니다. 해당 서버는 클라이언트의 연결 요청을 소켓을 통해 리스닝하면서 그냥 기다릴 뿐이죠. 클라이언트는 서버가 떠 있는 머신의 호스트네임과 서버가 리스닝하고 있는 포트 번호를 알고 있습니다. 따라서 클라이언트는 이 호스트 네임과 포트를 통해서 서버와 연결을 시도하게 됩니다. 또한 클라이언트는 서버 상대로 자신을 식별시켜주기 위해서 연결동안 사용될 로컬 포트에

프로세스 종료 코드(Exit Code) 정리

프로세스 종료 코드(Exit Code) 정리

CI 로그에서 exit code 137을 보고 "이게 뭐지?" 싶었던 적이 있는데요. Docker 컨테이너가 OOM으로 죽었을 때, Ctrl+C로 스크립트를 끊었을 때, 명령어 오타가 났을 때, 매번 다른 숫자가 떠도 잘 보지 않으면 의미를 잊기 쉽습니다. 사실 이 숫자들에는 나름의 규칙이 있고, 한 번만 정리해두면 다음에 로그를 볼 때 훨씬 빠르게 원인을 짚을 수 있습니다. 이번 글에서는 종료 코드가 만들어지는 원리부터 자주 마주치는 코드의 의미, 셸과 Node.js, Python에서 다루는 방법까지 정리해보겠습니다. 종료 코드란

자바8: 반복문에서 벗어나기

자바8: 반복문에서 벗어나기

본 포스팅는 Dead Code Rising의 Java 8: No more loops를 번역하였습니다. 이전 포스팅통해 자바의 판도를 바꿀 자바8의 새로운 함수형 기능들에 대해서 살펴보았습니다. 자바 개발자들에게는 새로운 세상이 열렸으며, 이제 우리가 그 새로운 세상에 적응해야 할 때 입니다. 이번 포스팅에서는 전통적인 반복문에 대한 몇가지 대안들에 대해서 알아보겠습니다. 자바8의 새로운 함수형 기능의 훌륭한 점은 어떻게 실행하는지 대신에 무엇이 실행되야 할지를 명시할 수 있다는 것입니다. 이런 측면에서 반복문이 탈락되게 됩니다. 물

자바8: 람다 1부 - 메소드 참조, 가상 확장 메소드, 결론

자바8: 람다 1부 - 메소드 참조, 가상 확장 메소드, 결론

본 포스팅는 오라클 웹사이트에 Ted Neward가 기고한 Java 8: Lambdas, Part 1를 번역하였습니다. 메소드 참조 (Method Reference) 지금까지 다룬 모든 람다는 사용 시점에 람다를 정의하는 익명 리터럴이였습니다. 이는 1회성 행위를 위해서는 훌륭하지만, 이 행위가 여러 곳에서 사용되어야 하는 상황에서는 별로입니다. 예를 들어 다음 Person 클래스를 생각해봅시다. (지금은 부적절한 캡슐화에 대해서는 무시하시죠.) Person 객체를 SortedSet에 저정하거나 어떤 형태로든 리스트 내에서 정렬될

자바8: 람다 1부 - 람다식, 타입 추론, 어휘 범위

자바8: 람다 1부 - 람다식, 타입 추론, 어휘 범위

본 포스팅는 오라클 웹사이트에 Ted Neward가 기고한 Java 8: Lambdas, Part 1를 번역하였습니다. 자바8은 그런한 코드 블록을 쉽게 작성하게 하기위해 설계된 몇몇 새로운 언어 기능들을 도입합니다. 그 중에서 가장 중요한 기능은 구어체로 클로저또는 익명 함수라고 일켣는 람다식입니다. (클로저라고 불리는 이유는 잠시 후 논의할 것입니다.) 이것들에 하나 씩 다뤄봅시다. 람다식 람다식은 기본적으로 나중에 실행하는 메서드의 구현을 간결하게 기술하는 방법에 불과합니다. 예를 들어 그러므로 일람 2와 같이 Runnable

자바8: 람다 1부 - 서문, 배경

자바8: 람다 1부 - 서문, 배경

본 포스팅는 오라클 웹사이트에 Ted Neward가 기고한 Java 8: Lambdas, Part 1를 번역하였습니다. 자바8의 람다 표현식 알아보기 자신이 선택한 프로그래밍 언어나 플랫폼의 새로운 출시 소식보다 소프트웨어 개발자를 흥분시키는 일이 있을까? 자바 개발자들도 예외는 아니다. 사실, 오히려 자바 개발지들 더욱 새로운 출시에 대해 간절했을지도 모릅니다. 왜냐하면 자바를 만들었던 Sun이 그랬던 것 처럼 자바도 쇠퇴의 길을 걷지 않을까 생각했던 게 그리 오래 전 일이 아니기 때문이죠. 죽을 고비를 겪고 나면 다시 주어진 삶

자바스크립트 배열 기본 사용법

자바스크립트 배열 기본 사용법

배열을 사용하는 이유? 3개의 과일 이름을 변수에 저장하려면 다음과 같이 3개의 변수를 사용할 것이다. 하지만 만약에 저장한 과일 이름이 300개라면? 위와 같이 일일이 하나 하나의 변수에 저장하기 힘들 것이다. 배열을 이용하면 하나의 변수에 여러 가지 값을 저장할 수 있고, 색인(Index)을 통해 이 값에 접근할 수 있다. 새로운 배열 생성 하기 기본적으로 대괄호 기호인 배열 리터럴(literal)을 이용해서 배열을 생성한다. 배열 리터럴 내에서는 공백이나 줄바꿈은 중요하지 않으므로 각 엘리먼트의 길이기 길 경우 가독성을 위해

mkdir 명령어 사용법: 디렉터리 만들기의 기본기

mkdir 명령어 사용법: 디렉터리 만들기의 기본기

터미널을 열고 새 프로젝트를 시작할 때 가장 먼저 치는 명령어가 뭘까요? 아마 mkdir일 겁니다. 이름 그대로 make directory, 뒤에 이름만 붙이면 끝이라 딱히 배울 게 없어 보이는데요. 그런데 막상 쓰다 보면 mkdir: project/src: No such file or directory 같은 메시지에 한 번쯤 막힙니다. 만들라고 시켰는데 없다니, 무슨 소리인가 싶죠. 🤔 셸 스크립트에 mkdir을 넣었다가 두 번째 실행부터 에러가 터지면서 스크립트가 죽는 경험도 흔합니다. 이 글에서는 mkdir의 기본 사용법에서

셸 설정 파일 총정리: .bashrc, .zshrc, .profile의 차이

셸 설정 파일 총정리: .bashrc, .zshrc, .profile의 차이

터미널 환경을 설정하다 보면 .bashrc에 넣으라는 곳도 있고, .bash_profile에 넣으라는 곳도 있고, .zshrc에 넣으라는 곳도 있습니다. 비슷비슷한 이름의 파일이 왜 이렇게 많은 건지, 도대체 어디에 뭘 넣어야 하는 건지 헷갈리죠. 사실 이 파일들은 각각 로드되는 시점이 다릅니다. 그래서 PATH 환경 변수를 설정하든, Oh My Zsh 플러그인을 추가하든, Starship 프롬프트를 초기화하든 적절한 파일에 넣어야 제대로 동작합니다. 이 글에서는 Bash와 Zsh의 설정 파일이 각각 언제 로드되는지, 어떤 파일에

PATH 환경 변수 완벽 이해하기

PATH 환경 변수 완벽 이해하기

터미널에 git이라고 치면 Git이 실행되고, python이라고 치면 Python이 실행됩니다. 그런데 이 프로그램들이 디스크 어딘가에 파일로 존재할 텐데, 운영체제는 어떻게 그걸 찾아서 실행하는 걸까요? 🤔 이걸 가능하게 해주는 게 바로 PATH 환경 변수입니다. 개발 환경을 셋업하다 보면 "PATH에 추가하세요"라는 안내를 자주 보게 되는데, 정확히 뭘 어디에 추가하라는 건지 모호하게 느껴질 때가 있죠. Homebrew를 설치할 때도, Mise를 설정할 때도, pyenv나 nvm을 쓸 때도 PATH 설정이 빠지지 않습니다. 이

macOS 디렉토리 구조 이해하기

macOS 디렉토리 구조 이해하기

macOS로 개발하고 계신 분들, 터미널에서 ls /를 실행해보신 적 있으신가요? Linux를 써봤다면 어딘가 익숙하면서도 좀 다르다는 느낌을 받으실 텐데요. bin, usr, etc 같은 친숙한 이름들 사이에 Applications, Library, System 같은 macOS만의 디렉토리가 섞여 있기 때문입니다. macOS가 BSD Unix를 기반으로 만들어진 운영체제라서 그런 건데요. Unix의 전통적인 디렉토리 구조를 계승하면서도 GUI 중심의 사용자 경험을 위해 Apple만의 디렉토리를 추가한 거죠. Unix/Linux 디

Unix/Linux 디렉토리 구조 이해하기

Unix/Linux 디렉토리 구조 이해하기

터미널을 열고 ls /를 입력해본 적 있으신가요? bin, etc, usr, home 같은 디렉토리들이 주루룩 나오는데, 처음 보면 이게 다 뭔지 좀 막막하죠. Windows에서는 C:Program Files, C:Users 같은 이름만 봐도 대충 뭘 하는 폴더인지 짐작이 가는데, Unix/Linux의 디렉토리 이름들은 /etc니 /usr니 하는 약어투성이라 직관적이지 않습니다. 사실 이 디렉토리 구조는 1970년대 Unix 시절부터 내려온 것인데요. 수십 년간 다듬어지면서 나름의 논리적인 체계를 갖추고 있습니다. 이 글에서는 Li

동기화 (Synchronization)

동기화 (Synchronization)

본 포스팅는 오라클 자바 튜토리얼의 Synchronization와 Thread Interference, Memory Consistency Errors, Synchronized Methods, Intrinsic Locks and Synchronization, Atomic Access를 번역하였습니다. 스레드는 주로 필드들이 가리키고 있는 객체 참조를 공유함으로써 서로 통신합니다. 이는 굉장히 효율적 통신 방법이지만, 스레드 간섭(thread interference)과 메모리 일관성 오류(memory consistency errors)

자바 스레드 Sleep & Intterupt & Join

자바 스레드 Sleep & Intterupt & Join

본 포스팅는 오라클 자바 튜토리얼의 Pausing Execution with Sleep와 Interrupts, Joins, The SimpleThreads Example를 번역하였습니다. Sleep으로 실행 중지하기 Thread.sleep() 메소드는 현재 스레드가 일정 기간동안 실행을 중지시킵니다. 이것은 해당 애플리케이션 또는 시스템 상에서 돌고 있는 다른 애플리케이션 내의 다른 스레드들에게 프로세서를 이용 가능하도록 만들기 위한 효율적인 방법입니다. sleep() 메소드는 다음 예제와 같이 속도 조절을 위해서도 사용될 수 있습

자바 스레드

자바 스레드

본 포스팅는 오라클 자바 튜토리얼의 Thread Objects와 Defining and Starting a Thread를 번역하였습니다. 스레드 객체 모든 스레드는 Thread 클래스의 인스턴스와 관계를 갖습니다. 동시 애플리케이션(concurrent application)을 개발하기 위해서 스레드 객체를 사용하는데는 두 가지 기본 전략이 있습니다. 스레드의 생성과 관리를 직접 제어하기 위해서, 애플리케이션이 비동기 작업이 필요할 때 마다 단순히 Thread 클래스의 인스턴스를 만들 수 있습니다. 응용 프로그램으로 부터 스레드 관리

Discord