๐ซ Language/Java
Intro ๋ถ๋ณ ๊ฐ์ฒด๋ ๊ฐ์ฒด ์์ฑ ์ดํ, ๋ด๋ถ์ ์ํ๊ฐ ๋ณํ์ง ์๋ ๊ฐ์ฒด์ด๋ค. ๋ง์ ์ฑ
์ด๋ ๋ธ๋ก๊ทธ ๊ธ์์ ์ด๋ฌํ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์๋ ํฐ ์ด์ ์ด ์๋ค๊ณ ํ๋ค. ๊ทธ ์ด์ ๋ ๊ต์ฅํ ๋ค์ํ๊ณ ๋ง์ผ๋ฉฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋๋ ๊ฒ์ด ์ข๋ค. ๋ค์์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ๋์ดํ ๊ฒ์ด๋ค. Thread Safe ํ์ฌ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฉํ๊ณ , ๋๊ธฐํ๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค. ์คํจ ์์์ ์ธ(Failure Atomic) ๋ฉ์๋๋ฅผ ๋ง๋ค ์ ์๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ฉ์๋ ํธ์ถ ์ด์ ์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ๋๋ฌธ์ด๋ค. Cache๋ Map, Set๋ฑ์ ์์๋ก ํ์ฉํ๊ธฐ ์ข๋ค. ๋ถ์ ํจ๊ณผ(Side Effect)๋ฅผ ํผํด ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ถ ์ ์๋ค. ์์ ํจ์๋ค๋ก ๊ตฌ์ฑ๋์์ผ๋ฉฐ, ๊ฐ์ฒด์ ์ํ๊ฐ ์ ์ง๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐ..
๐ซ Language/Java
SOLID ์์น์ด๋? ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์ด ๋ฐ๋์ ์์์ผ ํ๋ SOLID ์์น์ ์๊ธฐ ์์ ํด๋์ค ๋ด๋ถ์ ์์ง๋๋ ๋์ด๊ณ , ํ ํด๋์ค์์ ๊ฒฐํฉ๋๋ ๋ฎ์ถ๋ ๊ฒ์ ์ด์ ์ ๋๋ค. ์ด๋ ํด๋์ค์๊ฒ ๋
๋ฆฝ๋ ์ญํ ์ ๋ถ์ฌํ๊ธฐ ์ํจ์ด๋ฉฐ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์ ์ํํธ์จ์ด๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๐ฒ SRP(Single Responsibility Principle) : ๋จ์ผ ์ฑ
์ ์์น - ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋๋ ์ด์ ๊ฐ ๋จ ํ ๊ฐ์ง์ฌ์ผ ํ๋ค ๐ฒ OCP(Open Close Principle) : ๊ฐ๋ฐฉ/ํ์ ์์น - ํ์ฅ์๋ ์ด๋ ค์๊ณ , ์์ ์ ๋ํด์๋ ๋ซํ์์ด์ผ ํ๋ค. ๐ฒ LSP(Liskov Substitution Principle) : ๋ฆฌ์ค์ฝํ ์นํ ์์น - ํ์ ํ์
์ ์์ ํ์
์ผ๋ก ๋์ฒดํ ์ ์์ด์ผ ํ๋ค ๐ฒ ISP..
๐ซ Language/Java
์ผ๊ธ ์ปฌ๋ ์
์ด๋(First Class Collection) ๐ฒ ์ผ๊ธ ์ปฌ๋ ์
: Collection์ Wrappingํ๋ฉด์, ๊ทธ ์ธ ๋ค๋ฅธ ๋ฉค๋ฒ ๋ณ์๋ ์๋ ์ํ๋ฅผ ๋งํ๋ค. public class GameRanking { private Map ranks; public GameRanking(Map ranks) { this.ranks = ranks; } } ์ผ๊ธ ์ปฌ๋ ์
์ ์ฅ์ ๐ถ ๋น์ฆ๋์ค์ ์ข
์์ ์ธ ์๋ฃ๊ตฌ์กฐ ์ผ๋ฐ์ ์ผ๋ก MVC ํจํด์์ Model์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ด๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ๊ณ ๋ํ๋จ์ ๋ฐ๋ผ Model์์ Service ๊ณ์ธต์ ์ถ๊ฐํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ด๋ฆฌํ๋๋ฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ์ฝ๋์์ ํน์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์ผ ..
๐ซ Language/Java
JUnit์ด๋? ๐ฒ Java ๊ฐ๋ฐ์์ 93%๊ฐ ์ฌ์ฉํ๋ ๋จ์ ํ
์คํธ ํ๋ ์์ํฌ ๐ฒ ์คํ๋ง ๋ถํธ 2.2๋ฒ์ ์ด์๋ถํฐ ๊ธฐ๋ณธ ์ ๊ณตํ๋ค. JUnit5๋? ๐ฒ Platform : ํ
์คํธ๋ฅผ ์คํํ๊ฒ ํด์ฃผ๋ ๋ฐ์ฒ๋ฅผ ์ ๊ณตํ๋ค. TestEngine API๋ฅผ ์ ๊ณต. ๐ฒ Jupiter : JUnit5๋ฅผ ์ง์ํ๋ TestEngine API ๊ตฌํ์ฒด ๐ฒ Vintage : JUnit4์ 3๋ฅผ ์ง์ํ๋ TestEngine ๊ตฌํ์ฒด JUnit5๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ ๐ฒ ์คํ๋ง๋ถํธ 2.2๋ฒ์ ์ด์๋ถํฐ๋ ๊ธฐ๋ณธ ํ์ฌ๋๋ค. ๐ฒ ๊ทธ ์ธ์๋ maven, ํน์ gradle ๋ฐฉ์์ผ๋ก ์ถ๊ฐํ ์ ์๋ค. gradle test { useJUnitPlatform() } dependencies { testImplementation 'org.junit.jupiter..
๐ซ Language/Java
๊ณต์ ์์๊ณผ ์๊ณ์์ญ ๐ฒ ๊ณต์ ์์ : ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ ์ ์๋ ์์ ๐ฒ ์๊ณ ์์ญ : ๊ณต์ ์์๋ค ์ค ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ์ ๋, ๋ฌธ์ ๊ฐ ์๊ธธ๋งํ ๋ถ๋ถ ๐ถ๊ฒฝ์ ์ํ? ๋ ์ด์์ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ๋ณํ์ ์ผ๋ก ์ฝ๊ฑฐ๋ ์ธ๋, ํ์ด๋ฐ์ด๋ ์ ๊ทผ ์์์ ๋ฐ๋ผ ์คํ ์์๊ฐ ๋ฌ๋ผ์ง๋ ์ํฉ(race ํ์) ๐ถRead - Modify - Write @RestController @RequestMapping("/race-condition") public class RaceConditionCotroller { public static Integer studentCount = 0; @PostMapping("/1/increase") public ResponseEntity increaseCount() { stud..
๐ซ Language/Java
๋๊ธฐ/๋น๋๊ธฐ๋? ๐ถ๋๊ธฐ๋(Synchronize)? ๐ฒ ์์ฒญ ์์
์ ๋ํ ์๋ฃ ์ฌ๋ถ๋ฅผ ๋ฐ์ ธ ์์๋๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งํ๋ค. ๐ถ๋น๋๊ธฐ๋(Asynchronize)? ๐ฒ ์์ฒญ ์์
์ ๋ํด ์๋ฃ ์ฌ๋ถ๋ฅผ ๋ฐ์ง์ง ์์, ์์ ์ ์์
์ ๊ทธ๋๋ก ์คํํ๋ค. ๋๊ธฐ์ ๋น๋๊ธฐ์ ํฐ ์ฐจ์ด์ ์ค ํ๋๋ ์์ฒญํ ์์
์ ๋ํด์ ์์
์์๊ฐ ์ง์ผ์ง๋, ์ง์ผ์ง์ง ์๋์ด๋ค. ๋๊ธฐ๋ ์์
์์๊ฐ ์ง์ผ์ง๊ธฐ ๋๋ฌธ์ A, B, C๋ผ๋ Task์ ๋ํด ๊ทธ ์์๋ฅผ ์งํค๋ฉฐ ์คํ๋์ง๋ง, ๋น๋๊ธฐ๋ ๊ทธ๋ ์ง ์๋ค. ๋ฌด์์๋ก ์คํ๋ ์ ์๋ ๊ฒ์ด๋ค. ๋ธ๋ญํน/๋
ผ๋ธ๋ญํน์ด๋? ๐ถ ๋ธ๋ญํน์ด๋? ๐ฒ ๋ค๋ฅธ ์์ฒญ์ ์์
์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ฌ ์์
์ Block(์ฐจ๋จ)ํ๋ ๊ฒ ๐ถ ๋
ผ๋ธ๋ญํน์ด๋? ๐ฒ ๋ค๋ฅธ ์์ฒญ์ ์์
์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ฌ ์์
์ Block(์ฐจ๋จ)ํ์ง ์๋ ๊ฒ ๐ค..
๐ซ Language/C
typedef์ ๊ตฌ์กฐ์ฒด typedef : ํ์
์ด๋ฆ์ ์ฌ์ฉ์๊ฐ ์ ํด์ค๋ค ์ด๋ค ๊ฒฝ์ฐ๋ ์ด๋ฆ์ด ๊ธธ์ด์ง๋ฉด ์์๋ณด๊ธฐ ํ๋ค๊ธฐ ๋ง๋ จ์ด๋ค. ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ๊ตฌ์กฐ์ฒด ํ์
์ ์๋ ค์ฃผ๊ณ ์ด๋ฆ์ ์ง์ด์ฃผ์ด ์ฌ์ฉํด์ผ ํ๋ค. ์ด๋ ์์ฝ๋ฉ ์ค๋
์๋ค์ธ ๊ฐ๋ฐ์๋ค ๋์ ์ฉ ์ข์ง ์์๋๋ณด๋ค. ๊ทธ๋์ ๊ตฌ์กฐ์ฒด์ ์ ์์ ์ฌ์ฉ์ ์ฝ๊ฒ ํด๋ณด๋ ค๊ณ ๋์
ํ ๊ฒ์ด typedef์ด๋ค. ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ด ์๋ค. struct point { int xpos; int ypos; }; typedef struct point Point Point p; ์์ฒ๋ผ ์์ฑํ๋ค๋ฉด ๋ณ์ ์ ์ธ์ด ์งง์์ง๋ค๋ ์ฅ์ ์ด ์๋ค. typedef struct point { int xpos; int ypos; } Point; Point p; ๋ ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ..
๐ซ Language/C
์ด์ ํฌ์คํ
์์ ์คํ ํ๋ ์ ๋ด์์ ์ฌ๋ผ์ง๋ ์ง์ญ ๋ณ์๋ฅผ ๋ณด์กดํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์คํ๊ณผ ํ์ ์์์ผ ํ๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ : Stack vs. Heap Stack์ ๋ฌด์์ ํฌํจํ๋ ๊ฐ? ์ง์ญ ๋ณ์, ์ธ์, ๋ฆฌํด ์ฃผ์ Heap์ด๋ ๋ฌด์์ธ๊ฐ? ๋ณ์์ ๋น์ทํ์ง๋ง ๋ณ์ ์ด๋ฆ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ (๋์ ๋ณ์, ๋ฌด๋ช
๋ณ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.) Heap์ ์๋ ๋์ ๋ณ์๋ ํจ์์ ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ค. ์ด๋ ์ ์ญ ๋ณ์์ ์ ์ฌํ๋ค. Heap์ ์๋ ๋์ ๋ณ์๋ ๋์ ์ผ๋ก ์์ฑ๊ณผ ์ ๊ฑฐ๊ฐ ๊ฐ๋ฅํ๋ค. ์ด๋ ์ ์ญ ๋ณ์์ ๋ค๋ฅธ ์ ์ด๋ค. ๋ฐ๋ผ์ ๋์ ์ผ๋ก ์์ฑํ๊ณ ์ ๊ฑฐํ๊ธฐ ํ๊ธฐ์ํ ํจ์๊ฐ ์กด์ฌํ๋ค. ์์ฑ ํจ์ malloc(), new() ์ ๊ฑฐ ํจ์ free() Stack ์ง์ญ ..
๐ซ Language/C
ํฌ์ธํฐ ๋ฐฐ์ด, ๋ฐฐ์ด ํฌ์ธํฐ ํผ์ฉํ์ฌ ์ฐ๋ค๋ณด๋ฉด ์ด๊ฒ ์ ํํ ๋ฌด์จ ๊ฐ๋
์ธ์ง ์ค์ค๋ก ๊นจ๋ซ์ง ๋ชปํ๊ณ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ํ๋ฒ ์ดํดํด๋ณด์. ํฌ์ธํฐ ๋ฐฐ์ด์ด๋? ํฌ์ธํฐ ๋ฐฐ์ด์ด๋ ๊ฐ ๋ฐฐ์ด์ ์์๊ฐ ํฌ์ธํฐ(์๋ฃํ์ด ์ฃผ์)์ธ ๊ฒ์ ๋ปํ๋ค. ๋ค์ ์์๋ฅผ ๋ณด์. char * strArr[3] = { "cat", "dog", "bird" }; printf("%s", strArr[0]); printf("%s", strArr[1]); printf("%s", strArr[2]); strArr๋ ํฌ์ธํฐ ๋ฐฐ์ด์ด๋ค. ๊ฐ ๋ฐฐ์ด์ ์์๊ฐ ํฌ์ธํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฌธ์์ด์ด ์ ํฌ์ธํฐ์ธ๊ฐ? ์ด๋ ๋ฐฐ์ด ์์ ๋ด๋ถ์ ์ผ๋ก ๋ฌธ์์ด์ ์์ ์ฃผ์๋ฅผ ๋ํ๋ด๋ ํฌ์ธํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ํฌ์ธํฐ ๋ฐฐ์ด๊ณผ ๋๋ธ ํฌ์ธํฐ ํฌ์ธํฐ ๋ฐฐ์ด์ ๋ ๋ค๋ฅธ ํํ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ธ ํฌ์ธํฐ๋ฅผ..
๐ซ Language/C
C์ธ์ด์ ๋ํด ๊ณต๋ถํ๋ค ๋ณด๋ ์ด์ํ ๋ฌธ๋ฒ๊ณผ ์ต์ํ์ง ์์ ๋ฌธ๋ฒ๋ค์ด ํผ์ฆ์ฒ๋ผ ๋ค๊ฐ์ค๊ณค ํ๋ค. ๊ทธ๋ผ์๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ์ธ์ด์ด๊ธฐ๋ ํ๊ณ , ๋ถ๋ช
๋์์ด ๋๋ ๋ถ๋ถ๋ ๋ง๋ค. ์ง๊ธ๋ถํฐ ๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ๋ฉฐ, ํท๊ฐ๋ ธ๋ ๊ฐ๋
์ ๋ํด ์ ๋ฆฌ๋ณด๊ณ ์ ํ๋ค. ์๋ ํ ๋น ๋ฌธ์์ด์ด๋? ํฐ ๋ฐ์ดํ๋ก ๋๋ฌ์ธ์ธ ๋ฌธ์์ด์ด๋ค. ๋จ, char ๋ฐฐ์ด ์ ์ธํ ๋ ์ด๊ธฐํ ๊ฐ์ผ๋ก ์ฐ์ด๋ ๊ฒฝ์ฐ๋ ์ ์ธํ๋ค. char * str = "Oh String"; ์ ๊ตฌ๋ฌธ ๊ฐ์ด ๋ฌธ์์ด์ ํํํ ๋ ์๋ ํ ๋น ๋ฌธ์์ด์ด ์ฐ์ธ๋ค. ์ด ๋ฌธ์์ด์ ๋ณํํ ์ ์๋ค(๋ถ๋ณ). ์ ๋ถ๋ณ์ธ๊ฐ? ์ด๋ Const์ ๋ํด ์ดํดํ ํ์๊ฐ ์๋ค. ํฌ์ธํฐ์ Const ์ ์ธ ํฌ์ธํฐ(*)์ const๋ ์์น์ ๋ฐ๋ผ ์ฌ์ฉ ์๋ฏธ๊ฐ ๋ค๋ฅด๋ค. 1. const int * ptr ํด๋น ํฌ์ธํฐ๋ฅผ ํตํด ๊บผ..