๋ชฉ๋ก์ ์ฒด ๊ธ (162)
EEALL@ONCE
`Charset`์ Java์์ ๋ฌธ์ ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ์ ๋ด๋นํ๋ ํด๋์ค์ ๋๋ค. ์ด ํด๋์ค๋ ๋ฌธ์์ ๋ฐ์ดํธ ๊ฐ์ ๋ณํ์ ์ ์ดํ๋ฉฐ, ๋ค์ํ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ง์ํฉ๋๋ค. ๐์ฃผ์ ๋ฉ์๋ - `forName(String charsetName)`: ์ฃผ์ด์ง ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ด๋ฆ์ผ๋ก `Charset` ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. - `encode(String str)`: ์ฃผ์ด์ง ๋ฌธ์์ด์ ํ์ฌ `Charset`์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํธ ๋ฒํผ๋ก ์ธ์ฝ๋ฉํฉ๋๋ค. - `decode(ByteBuffer byteBuffer)`: ์ฃผ์ด์ง ๋ฐ์ดํธ ๋ฒํผ๋ฅผ ํ์ฌ `Charset`์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฒํผ๋ก ๋์ฝ๋ฉํฉ๋๋ค. - `availableCharsets()`: ํ์ฌ ์คํ์ค์ธ Java ๊ฐ์ ๋จธ์ ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฌธ์์ ์ ๋ฐํํฉ๋๋ค. - `default..
`Scanner` ํด๋์ค์ `nextInt` ๋ฉ์๋๋ ์ ๋ ฅ์์ ๋ค์ ์ ์๋ฅผ ์ฝ์ด์ต๋๋ค. ์ด ๋ฉ์๋๋ ๊ณต๋ฐฑ, ํญ, ์ค ๋ฐ๊ฟ ๋ฑ๊ณผ ๊ฐ์ ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ๊ตฌ๋ถ ๊ธฐํธ๋ก ์ฌ์ฉํ์ฌ ์ ์๋ฅผ ์ธ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ ๋ค์์ ๊ณต๋ฐฑ ๋ฌธ์๊ฐ ์ค๋ฉด ๊ทธ ์์น์์ ์ฝ๊ธฐ๋ฅผ ์ค์งํ๊ณ ์ ์๋ฅผ ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ `"123 456"`์ ์ ๋ ฅํ๋ฉด ์ฒซ ๋ฒ์งธ `nextInt` ํธ์ถ์ `123`์ ๋ฐํํ๊ณ , ๋ ๋ฒ์งธ `nextInt` ํธ์ถ์ `456`์ ๋ฐํํฉ๋๋ค. ํ์ง๋ง ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ `nextInt`๊ฐ ์ค ๋ฐ๊ฟ ๋ฌธ์๋ฅผ ์ฝ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ `nextInt` ํธ์ถ ํ์ `nextLine`์ ํธ์ถํ๋ฉด ์ค ๋ฐ๊ฟ ๋ฌธ์๊ฐ ๊ทธ๋๋ก ๋จ์ ์์ด ์๋ํ์ง ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด `nextIn..
`for each`๋ ํ๋ก๊ทธ๋๋ฐ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฃจํ ๊ตฌ์กฐ๋ก, ์ปฌ๋ ์ ์ ๊ฐ ์์์ ๋ํด ์์ฐจ์ ์ผ๋ก ๋ฐ๋ณต ์์ ์ ์ํํฉ๋๋ค. ์๋ฐ์์์ `for each` ๋ฃจํ์ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: for (Type variableName : collection) { // code to be executed for each element in collection } ์ฌ๊ธฐ์ `Type`์ ์ปฌ๋ ์ ์ ์์ ์ ํ์ด๊ณ , `variableName`์ ํ์ฌ ์์๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์ ์ด๋ฆ์ ๋๋ค. `collection`์ ๋ฐ๋ณตํ๋ ค๋ ์ปฌ๋ ์ (์: ๋ฐฐ์ด ๋๋ ArrayList)์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ ๋ฆฌ์คํธ์ ๋ํด ๊ฐ ์์๋ฅผ ์ถ๋ ฅํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค: int[] numbers = {10, 20, 30, 40..
`COALESCE` ํจ์๋ SQL์์ ์ฌ์ฉ๋๋ฉฐ, ์ธ์ ๋ชฉ๋ก ์ค์์ ์ฒซ ๋ฒ์งธ NULL์ด ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค. ๋ง์ฝ ๋ชจ๋ ์ธ์๊ฐ NULL์ด๋ผ๋ฉด, `COALESCE` ์ญ์ NULL์ ๋ฐํํฉ๋๋ค. ์ด ํจ์๋ ์ฃผ๋ก NULL ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋์ฒดํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ์ฟผ๋ฆฌ์์: COALESCE(SUM(...), 0) ๋ง์ฝ `SUM(...)`์ ๊ฒฐ๊ณผ๊ฐ NULL์ด๋ผ๋ฉด, `COALESCE`๋ 0์ ๋ฐํํฉ๋๋ค. ๋ง์ฝ `SUM(...)`์ ๊ฒฐ๊ณผ๊ฐ NULL์ด ์๋๋ผ๋ฉด ๊ทธ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๋ ํน์ ์ง๊ณ ํจ์์ ๊ฒฐ๊ณผ๊ฐ NULL์ผ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ๊ณ ์ถ์ ๋ ์ ์ฉํ ํจํด์ ๋๋ค.
`java.nio.file.Files` ํด๋์ค๋ Java์์ ํ์ผ๊ณผ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ค๋ฃจ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ ํธ๋ฆฌํฐ ํด๋์ค์ ๋๋ค. Java 7๋ถํฐ ์๊ฐ๋ NIO(Non-blocking I/O) API์ ์ํ๋ ํด๋์ค ์ค ํ๋๋ก, ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ฝ๊ณ ์ฐ๋ ๋ฑ ๋ค์ํ ํ์ผ ๊ด๋ จ ์์ ์ ์ํํ ์ ์์ต๋๋ค. `java.nio.file.Files` ํด๋์ค๋ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ํ์ผ์ ์ฝ๊ฑฐ๋ ์ฐ๋ ๋ฐ์ ๋ง์ด ํ์ฉ๋ฉ๋๋ค. ์ฃผ์ ๋ฉ์๋์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์์ต๋๋ค: 1. `readAllLines(Path path, Charset cs)`: ์ง์ ๋ ํ์ผ์์ ๋ชจ๋ ๋ผ์ธ์ ์ฝ์ด ๋ฆฌ์คํธ๋ก ๋ฐํํฉ๋๋ค. ํ์ผ ์ธ์ฝ๋ฉ์ ์ง์ ํ์ฌ ํน์ ๋ฌธ์์ ์ผ๋ก ์ฝ์ ์ ์์ต๋๋ค. 2. `readAllBytes(Path pat..
SUBSTRING(string, start, length) ์ฌ๊ธฐ์ string์ ์ถ์ถํ ๋์ ๋ฌธ์์ด์ด๊ณ , start๋ ์ถ์ถ์ ์์ํ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ ๋๋ค. length๋ ์ถ์ถํ๊ณ ์ ํ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๋ํ๋ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์์ด "Hello, World!"์์ "World"๋ฅผ ์ถ์ถํ๋ ค๋ฉด: SELECT SUBSTRING('Hello, World!', 8, 5) AS result;
CONCAT์ ๋ ๊ฐ ์ด์์ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ๋ ํจ์์ ๋๋ค. SQL์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์ฌ๋ฌ DBMS์์ ์ง์๋ฉ๋๋ค. SELECT CONCAT('Hello', ' ', 'World'); Result : Hello World ๋๋ถ๋ถ์ ๊ฒฝ์ฐ CONCAT ํจ์๋ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํฐ ๋ฐ์ดํฐ ์ธํธ์์ ๋ง์ ๋ฌธ์์ด์ ์ฐ๊ฒฐํด์ผํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ํนํ ๋ฌธ์์ด์ ํฌ๊ธฐ๊ฐ ํฐ ๊ฒฝ์ฐ์ ๋๋ค. ์ด๋ฌํ ์ํฉ์์๋ ๋ค๋ฅธ ๋ฐฉ์์ ๊ณ ๋ คํ ํ์๊ฐ ์์ ์ ์์ต๋๋ค. SIDE EFFECT: CONCAT์ NULL ๊ฐ์ ํฌํจํ๋ ๋ฌธ์์ด๊ณผ ์ฐ๊ฒฐํ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ฅผ NULL๋ก ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด, CONCAT(NULL, 'test')๋ NULL์ ๋ฐํํฉ๋๋ค. ๋ฌธ์์ด ์ฐ๊ฒฐ ์ฐ์ฐ์ด ๋ง์์ง์๋ก ์ฑ๋ฅ์ด..
์ ์ฝ๋์์ `FileInputStream`, `InputStreamReader`, `BufferedReader`๋ ํ์ผ์ ์ฝ๊ธฐ ์ํด ์๋ก ๋ค๋ฅธ ์ญํ ์ ์ํํฉ๋๋ค. ๊ฐ๊ฐ์ ์ญํ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: 1. `FileInputStream`: - ์ด ํด๋์ค๋ ํ์ผ๋ก๋ถํฐ ๋ฐ์ดํธ ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ต๋๋ค. ์ฆ, ํ์ผ์ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ์ด์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์ญํ ์ ํฉ๋๋ค. - ํ์ผ์ ๋ด์ฉ์ ๋ฐ์ดํธ ๋จ์๋ก ์ง์ ์ฝ๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ๋ ๋ฎ์ ์์ค์ I/O ํด๋์ค์ ๋๋ค. 2. `InputStreamReader`: - ์ด ํด๋์ค๋ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ๋ฌธ์ ์คํธ๋ฆผ์ผ๋ก ๋ณํํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. - `FileInputStream`์ผ๋ก ์ฝ์ ๋ฐ์ดํธ๋ฅผ ๋ฌธ์๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, UTF-8 ์ธ์ฝ๋ฉ์ผ๋ก ๋ณํํ๋ฉด ..