754 posts
[자바] 리스트를 순회하는 방법

[자바] 리스트를 순회하는 방법

자바에서 리스트를 순회하는 4가지 방법에 대해서 알아봅시다. 다음와 같이 5가지 과일 문자열을 담고 있는 리스트를 순회하면서 원소를 하나씩 출력해보겠습니다. 전통적인 For 루프 그냥 평범한 For 루프문을 사용하여 마치 배열을 순회하는 것과 동일한 방식으로 순회할 수 있습니다. 하지만 이 방법은 E get(int index) 메소드를 가지는 List 타입의 객체 대상으로만 사용할 수 있습니다. 상위 타입인 Collection이나 Set과 같은 이종 타입의 객체 대상으로는 사용이 불가한 방법입니다. Iterator 위의 대안 중 하

[자바] 컬렉션에서 원소 삭제하기 (ConcurrentModificationException 피하면서)

[자바] 컬렉션에서 원소 삭제하기 (ConcurrentModificationException 피하면서)

리스트를 순회하면서 특정 원소를 삭제하고 싶을 때가 있습니다. 예를 들어, 다음과 같이 알파벳과 숫자가 섞여있는 리스트가 있다고 가정해봅시다. 저는 이 리스트에서 숫자인 원소들은 모두 삭제하고 싶습니다. ConcurrentModificationException 발생 가장 먼저 떠오르는 방법은 boolean remove(Object o) 메소드를 사용하는 것입니다. for 루프를 돌면서 해당 원소가 숫자인지 체크 후에 숫자이면 remove 메소드를 호출합니다. 하지만 위 코드는 다음과 같은 ConcurrentModificationEx

[자바] NavigableSet 사용법

[자바] NavigableSet 사용법

자바6에서 추가된 NavigableSet에 대해서 알아보도록 하겠습니다. NavigableSet은 SortedSet을 확장한 인터페이스입니다. 따라서 기존 SortedSet 대비 추가된 기능 위주로 살펴보는 게 좋을 것 같습니다. 객체 생성 자바에서 제공하는 NavigableSet 인터페이스의 대표적인 구현 클래스는 TreeSet 입니다. 따라서 TreeSet 객체를 생성 후에, NavigableSet 타입 변수에 할당하기면 하면 됩니다. 역순 접근: descendingIterator, descendingSet SortedSet을

[자바] SortedSet 사용법

[자바] SortedSet 사용법

SortedSet 사용법에 대해서 알아보록 하겠습니다. SortedSet은 원소들이 정렬되어 있는 Set입니다. 따라서 SortedSet 하여금 객체 간 대소 비교가 가능한 상황을 만들어줘야 합니다. 여기서 "객체 간 대소 비교가 가능한 상황"이란 다음 2가지로 생각해볼 수 있습니다. Comparable 인터페이스를 구현하고 있는 클래스의 객체를 원소로 사용 Comparator 인터페이스를 구현한 대소 판단을 위한 로직을 SortedSet 객체 생성 시에 넘김 본 포스팅에서는 Comparable 인터페이스를 구현하고 있는 Strin

자바스크립트의 btoa와 atob로 Base64 다루기

자바스크립트의 btoa와 atob로 Base64 다루기

자바스크립트로 Base64 인코딩을 다뤄야 할 일이 생기면 가장 먼저 마주치게 되는 함수가 btoa()와 atob()인데요. 이름이 워낙 짧고 비대칭적이라 어느 쪽이 인코딩이고 어느 쪽이 디코딩인지 헷갈리기 십상입니다. 이번 포스팅에서는 두 함수가 무엇이고 어디에 자주 쓰이는지부터 짚어보겠습니다. 그리고 한글이 들어갈 때의 함정과 현대적인 대안도 함께 살펴보겠습니다. btoa와 atob는 무엇일까요? btoa()와 atob()는 자바스크립트에 내장된 Base64 인코딩과 디코딩 함수입니다. 이름의 의미를 풀어서 외워두면 헷갈리지 않

Base64가 무엇이고 왜 쓰일까?

Base64가 무엇이고 왜 쓰일까?

이메일 첨부 파일이나 JWT 토큰, Data URI 같은 곳에서 빠지지 않고 등장하는 글자가 있는데요. 바로 끝에 =가 붙는 영문과 숫자가 뒤섞인 그 문자열, Base64입니다. 이번 포스팅에서는 Base64가 무엇이고 왜 만들어졌는지부터 짚어보겠습니다. 어떤 원리로 동작하는지, 그리고 오늘날 어디에 자주 쓰이는지도 함께 살펴보겠습니다. Base64란? Base64는 임의의 이진 데이터를 64가지 ASCII 문자로만 표현하는 인코딩 방식입니다. 이름 그대로 "기수(base) 64"의 표기 체계인데요. 우리가 평소에 쓰는 10진수가

유니코드와 UTF-8은 어떻게 다르고 한글은 왜 가끔 깨질까?

유니코드와 UTF-8은 어떻게 다르고 한글은 왜 가끔 깨질까?

웹 페이지나 데이터베이스에서 멀쩡하던 한글이 다른 사람에게서는 검색이 안 된다거나, macOS에서 만든 파일을 윈도우에 올렸더니 같은 이름인데도 다른 파일로 인식되는 경험이 있으실 텐데요. 이런 문제 대부분의 뿌리에는 유니코드(Unicode)와 정규화(normalization)라는 개념이 자리잡고 있습니다. 이번 포스팅에서는 UTF-8과 자주 헷갈리는 유니코드의 정체부터 짚어보겠습니다. 한글이 유니코드에서 어떻게 표현되는지, 같은 글자가 왜 두 가지 방식으로 저장될 수 있는지도 함께 살펴보겠습니다. 유니코드는 인코딩이 아닙니다 유니

UTF-8이 어떻게 전 세계 문자를 담아낼까?

UTF-8이 어떻게 전 세계 문자를 담아낼까?

웹 페이지에서 갑자기 한글이 ���처럼 깨져 보인 경험이 한 번쯤은 있으실 텐데요. 파일을 메모장에서 다른 에디터로 열었더니 모든 글자가 외계어로 변하거나, JSON API에서 받은 한글이 전혀 다른 모양으로 나오는 경우 말입니다. 이런 문제 대부분의 뿌리에는 UTF-8이라는 문자 인코딩이 자리잡고 있습니다. 이번 포스팅에서는 UTF-8이 어떻게 전 세계 모든 문자를 담아내는지부터 짚어보겠습니다. 한글이 어떻게 바이트로 변환되는지, 그리고 글자가 깨질 때 무슨 일이 벌어지는지도 함께 살펴보겠습니다. UTF-8이란? UTF-8은 Un

ASCII가 무엇이고 왜 중요할까?

ASCII가 무엇이고 왜 중요할까?

컴퓨터로 텍스트를 다루다 보면 "ASCII 코드"라는 용어를 종종 마주치게 됩니다. URL 인코딩을 설명할 때나 한글이 깨지는 문제를 디버깅할 때마다 ASCII가 빠지지 않고 등장하는데요. 이번 포스팅에서는 ASCII가 무엇이고 왜 만들어졌는지부터 짚어보겠습니다. 문자표가 어떻게 구성되어 있는지, 오늘날 UTF-8과는 어떤 관계를 가지는지도 함께 살펴보겠습니다. ASCII란? ASCII는 American Standard Code for Information Interchange의 약자로, 영문자와 숫자, 그리고 일부 특수 문자를 0

macOS security 명령어로 키체인 다루기

macOS security 명령어로 키체인 다루기

개발하다 보면 API 키, 데이터베이스 비밀번호, 토큰 같은 민감한 정보를 다룰 일이 많은데요. 이런 값들을 .env 파일이나 설정 파일에 평문으로 저장해두면 실수로 Git에 커밋하거나 다른 사람에게 노출될 위험이 있습니다. macOS에는 이런 민감한 정보를 안전하게 보관할 수 있는 **키체인(Keychain)**이라는 시스템이 내장되어 있는데요. 보통은 키체인 접근(Keychain Access) 앱을 통해 GUI로 사용하지만, 터미널에서 security 명령어를 사용하면 키체인을 훨씬 효율적으로 다룰 수 있습니다. 이번 글에서는

[ES2015] 기본 매개변수 (Default Parameters)

[ES2015] 기본 매개변수 (Default Parameters)

ES2015는 자바스크립트의 근간이 되는 함수에도 여러 가지 변화를 가져왔습니다. 이번 포스팅에서는 그 중 기본 매개변수(Default Parameters)에 대해서 알아보도록 하겠습니다. 매개변수를 무시한 함수 호출 다음과 같이 사용자의 아이디의 배열을 매개변수를 받아서 사용자의 상세 정보를 돌려주는 함수가 있다고 가정해봅시다. 아래와 같이 정상적인 배열을 넘기면 함수는 예상하는 것처럼 잘 돌아갑니다. 하지만 다음과 같이 인자 없이도 위 함수를 호출하면 어떻게 될까요? 문법이 엄격한 다른 언어라면 분명히 함수 호출이 불가능했을텐데

[ES2015] const로 상수 선언하기

[ES2015] const로 상수 선언하기

이번 포스팅에서는 ES2015에서 let과 함께 자바스크립트에 추가된 const 사용법에 대해서 알아보도록 하겠습니다. let 사용법에 대해서는 아래 포스팅들을 참고바라겠습니다. let으로 변수 선언하기 1 let으로 변수 선언하기 2 매직 넘버 아래 코드에서 findUser 함수는 안자로 받은 id 값이 100보다 작은지 여부에 따라서 로직이 분기되어 있습니다. 그리고 id 값이 100보다 큰 경우, 가짜 사용자 객체를 생성 후, name 속성값의 길이가 50보다 큰지 여부에 따라 다시 한 번 로직이 분기되고 있습니다. 예제와 같

[ES2015] let으로 변수 선언하기 2

[ES2015] let으로 변수 선언하기 2

이전 포스팅에서 ES2015의 let 키워드에서 대해서 알아보았습니다. 이번 포스팅에서는 for 문에서 let이 어떻게 사용될 수 있는지 살펴보겠습니다. 예제 코드 다음 코드는 사용자 아이디를 받아 가짜 사용자를 담든 후 콜백 함수를 호출하는 비동기 함수입니다. 마치 DB 연동처럼 setTimeout 함수를 이용하여 1초의 지연을 주었습니다. setTimeout() 함수에 대한 좀 더 자세한 내용은 관련 포스팅을 참고바랍니다. 그리고 아래 코드는 사용자 아이디의 배열을 받아 여러 사용자의 정보를 출력해주는 함수입니다. findUse

[ES2015] let으로 변수 선언하기 1

[ES2015] let으로 변수 선언하기 1

본 포스팅에서는 ES2015를 통해 자바스크립트에 추가된 let 키워드에 대해서 알아보도록 하겠습니다. 문제의 코드 먼저 다음 예제 코드를 살펴보시죠. findUser 함수는 사용자 아이디가 0보다 크면 성공 메시지를 출력하고 아니면 실패 메시지를 출력합니다. 그리고 if-else 문을 빠져나온 후, 실패 메시지를 다시 한 번 출력하고 있습니다. 자, 그럼 다음과 같이 1을 인자로 이 함수를 호출하면 마지막에 출력하는 실패 메시지는 뭐라고 출력이 될까요? 다음과 같이 오류가 발생하지 않고 undefined가 출력이 됩니다! 첫 개발

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

Discord