- OOP, Object Oriented Programming
- ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๋ช ๋ น์ด์ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์ ๋ฒ์ด๋ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ๋ ๋จ์, ์ฆ "๊ฐ์ฒด" ๋ค์ ๋ชจ์ ์ผ๋ก ํ์ ํ๊ณ ์ ํ๋ ๊ฒ์ด๋ค. ๊ฐ๊ฐ์ ๊ฐ์ฒด ๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.(ํ๋ ฅ)
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋จ์ ์ ์ฐ ํ๊ณ ๋ณ๊ฒฝ ์ด ์ฉ์ดํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋๊ท๋ชจ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ง์ด ์ฌ์ฉ๋๋ค. (์ ์ง๋ณด์, ์ฌ์ฌ์ฉ์ฑ)
- ์ญํ , ํ๋ ฅ, ์ฑ ์
-
์บก์ํ(Encapsulation)- ์ ๋ณด ์๋(information hiding)
- ๋ณ์์ ๋ฉ์๋๋ฅผ ํ๋๋ก ๋ฌถ๋๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ์์ ์ง์ ์ ๊ทผํ์ง ์๊ณ ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ ๊ทผ
- ์ ๊ทผ์ ์ด์(public, protected, default, private)
-
์ถ์ํ(Abstraction)- ์ธํฐํ์ด์ค๋ก ํด๋์ค๋ค์ ๊ณตํต์ ์ธ ํน์ฑ(๋ณ์,๋ฉ์๋)๋ค์ ๋ฌถ์ด ํํํ๋ ๊ฒ
-
์์(Inheritance)- ์์ ํด๋์ค์ ํน์ฑ์ ํ์ ํด๋์ค์์ ์์ํ๊ณ ๊ฑฐ๊ธฐ์ ํ์ํ ํน์ฑ์ ์ถ๊ฐํ๋ค.(
ํ์ฅํด์ ์ฌ์ฉ) - ์์์ ์บก์ํ ์ ์ง, ํด๋์ค์ ์ฌ์ฌ์ฉ์ฑ์ ์ฉ์ดํ๊ฒ ํด์ค๋ค.
- ์์ ํด๋์ค์ ํน์ฑ์ ํ์ ํด๋์ค์์ ์์ํ๊ณ ๊ฑฐ๊ธฐ์ ํ์ํ ํน์ฑ์ ์ถ๊ฐํ๋ค.(
-
๋คํ์ฑ(Polymorphism)-
์ด๋ค ๋ณ์, ๋ฉ์๋๊ฐ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ๊ฒ
-
์ค๋ฒ๋ผ์ด๋ฉ(Overriding): ๊ฐ์ ๋ฉ์๋ ์ด๋ฆ,๊ฐ์ ์ธ์ ๋ชฉ๋ก์ผ๋ก ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ์ฌ์ ์ -
์ค๋ฒ๋ก๋ฉ(Overloding): ๊ฐ์ ๋ฉ์๋ ์ด๋ฆ,๋ค๋ฅธ ์ธ์ ๋ชฉ๋ก์ผ๋ก ๋ค์์ ๋ฉ์๋๋ฅผ์ค๋ณต ์ ์(์์ฑ์๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๋ ์ ์ฉํจ)
cf. ํท๊ฐ๋ฆฌ๋ฉด ์ค๋ฒ๋ผ์ด๋ฉ์ ๋ง๋์ด ์ฐ๋ค(=> ์ฌ์ ์)/ ์ค๋ฒ๋ก๋ฉ์ load(์ ์ฌํ๋ค)=>์ค๋ณต ์ ์
-
- ํ๋์ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค.
- ํ๋์ ์ฑ ์์ด๋ผ๋ ๊ฒ์ ํด ์ ์๊ณ , ์์ ์๋ ์์ผ๋ฉฐ, ๋ฌธ๋งฅ๊ณผ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
์ค์ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ์ด๋ค.๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธํจ๊ณผ๊ฐ ์ ์ผ๋ฉด SRP๋ฅผ ์ ๋ฐ๋ฅธ ๊ฒ.
-
์ํํธ์จ์ด ์์์๋
ํ์ฅ์๋ ์ด๋ ค์์ผ๋๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค.- ํ์ฅ์๋ ์ด๋ ค ์๋ค : ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋ ๋ ์๋ก์ด ๋์์ ์ถ๊ฐํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ค.
- ๋ณ๊ฒฝ์๋ ๋ซํ ์๋ค : ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
-
OCP๋ฅผ ์งํค๊ธฐ ์ํด์๋ ์ถ์ํ์ ์์กดํด์ผ ํ๋ค.(๋คํ์ฑ)
-
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค์ด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค. (์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ)
-
๊ฐ์ฒด๊ฐ ์์์ผ ํ๋ ์ง์์ด ๋ง์ผ๋ฉด ๊ฒฐํฉ๋๊ฐ ๋์์ง๊ณ , ๊ฒฐํฉ๋๊ฐ ๋์์ง์๋ก ๊ฐ๋ฐฉ-ํ์์ ์์น์ ๋ฐ๋ฅด๋ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ค.
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository(); // ๊ธฐ์กด์ฝ๋
private MemberRepository memberRepository = new JdbcMemberRepository(); // ๋ณ๊ฒฝ์ฝ๋
}์์ ๊ฒฝ์ฐ ์คํ๋ง ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ์ฝ๋์ด๋ค. ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ธฐ์, ๋ถ๋ช
๋คํ์ฑ์ ์ฌ์ฉํ์ง๋ง OCP ์์น์ ์ด๊ธ๋๋ค.
์คํ๋ง์์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์ค์ ์๋ฅผ ์ฌ์ฉํด์ OCP๋ฅผ ์ค์ํ๊ณ ์ ํ๋ค.(์ด๋
ธํ
์ด์
, ์์กด๊ด๊ณ ์ฃผ์
, config ํ์ผ ๋ฑ)
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
- ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผ ํ๋ค๋ ๊ฒ, ๋คํ์ฑ์ ์ง์ํ๊ธฐ ์ํ ์์น, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ค๋ฉด, ์ด ์์น์ด ํ์ํ๋ค.
- ๋จ์ํ ์ปดํ์ผ์ ์ฑ๊ณตํ๋ ๊ฒ์ ๋์ด์๋ ์ด์ผ๊ธฐ
- eg. ์๋์ฐจ ์ธํฐํ์ด์ค์ ์์
์ ์์ผ๋ก ๊ฐ๋ผ๋ ๊ธฐ๋ฅ, ๋ค๋ก ๊ฐ๊ฒ ๊ตฌํํ๋ฉด LSP ์๋ฐ, ๋๋ฆฌ๋๋ผ๋ ์์ผ๋ก ๊ฐ์ผํจ.
- ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
- ์๋์ฐจ ์ธํฐํ์ด์ค๋ ์ด์ ์ธํฐํ์ด์ค, ์ ๋น ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ
- ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ๋ ์ด์ ์ ํด๋ผ์ด์ธํธ, ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ฆฌ
- ๋ถ๋ฆฌํ๋ฉด ์ ๋น ์ธํฐํ์ด์ค๊ฐ ๋ณํด๋ ์ด์ ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ์ธํฐํ์ด์ค๊ฐ ๋ช
ํํด์ง๊ณ , ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
- ํ๋ก๊ทธ๋๋จธ๋ "์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค." ์์กด์ฑ ์ฃผ์ ์ ์ด ์์น์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ค.
- ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป
์ญํ (Role)์ ์์กดํ๊ฒ ํด์ผ ํ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค.๊ฐ์ฒด ์ธ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ๊ตฌํ์ฒด์ ์์กดํ๊ฒ ๋๋ฉด ๋ณ๊ฒฝ์ด ์์ฃผ ์ด๋ ค์์ง๋ค.
MemberRepository m = new MemoryMemberRepository();- ์์ ์์ ๋ MemberService ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํํ๋ค.
- MemberRepository ์ธํฐํ์ด์ค์ ์์กดํ์ง๋ง, MemoryMemberRepository ๊ตฌํ ํด๋์ค๋ ๋์์ ์์กดํ๋ค.
- DIP ์๋ฐ
[ref] inflearn ๊น์ํ๋์ ์คํ๋ง ๊ฐ์ ์๋ฃ
- Java์์ ๋ฌธ์์ด์ ๋ค๋ฃจ๋ ๋ํ์ ์ธ ํด๋์ค๋ค
- ๏ธ ์ฐ์ฐ์ด ๋ง์ง ์์ ๋๋ ์ด๋ค ํด๋์ค๋ฅผ ์ฌ์ฉํด๋ ์ด์๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๋ค.
- ๊ทธ๋ฌ๋ ์ฐ์ฐํ์๊ฐ ๋ง์์ง๊ฑฐ๋, ๋ฉํฐ์ค๋ ๋, Race condition ๋ฑ์ ์ํฉ์ด ์์ฃผ ๋ฐ์ํ๋ค๋ฉด, ๊ฐ ํด๋์ค์ ํน์ง์ ์ดํดํ๊ณ ์ ์ ํ ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
String
-
immutation(๋ถ๋ณ)
String str = "hello"; String str = new String("hello"); str = str + "world"; // [hello world]
- String ํด๋์ค์ ์ฐธ์กฐ๋ณ์์ธ str์ ๊ธฐ์กด์ "hello"๋ฅผ ๊ฐ๋ฆฌํค๋ค๊ฐ,
"hello world"๋ผ๋ ๊ฐ์ ๊ฐ์ง๊ณ ์๋
์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ๋ฆฌํค๊ฒ ๋ณ๊ฒฝ๋๋ค. - ์ฒ์ ์ ์ธํ๋ "hello"๋ก ๊ฐ์ด ํ ๋น๋์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ GC(garbage collection)์ ์ํด ์ฌ๋ผ์ง๊ฒ ๋๋ค.
- String ํด๋์ค๊ฐ ๋ถ๋ณํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด์ ์์ ํ๋ ์์ ์ ์๋ก์ด String ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๊ฒ.
- String ํด๋์ค์ ์ฐธ์กฐ๋ณ์์ธ str์ ๊ธฐ์กด์ "hello"๋ฅผ ๊ฐ๋ฆฌํค๋ค๊ฐ,
"hello world"๋ผ๋ ๊ฐ์ ๊ฐ์ง๊ณ ์๋
-
String ๋ฌธ์์ด์ ์ฐ์ฐํ๋ ๊ณผ์ ์์ ๋ถ๋ณ ๊ฐ์ฒด์ ๋ฐ๋ณต ์์ฑ์ผ๋ก ํผํฌ๋จผ์ค๊ฐ ๋ฎ์์ง.
-
๋ณํ์ง ์๋ ๋ฌธ์์ด์ ์์ฃผ ์ฝ์ด๋ค์ด๋ ๊ฒฝ์ฐ String์ ์ฌ์ฉํ๋ฉด ์ข์ ์ฑ๋ฅ์ ๊ธฐ๋ํ ์ ์๋ค.
โ๏ธ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Java์์ ๊ฐ๋ณ์ฑ(mutable)์ฑ์ ๊ฐ์ง๋ StringBuffer/StringBuilder ํด๋์ค๋ฅผ ๋์
!
StringBuilder/StringBuffer ๊ณตํต์
- mutation(๊ฐ๋ณ)
- .append(), .delete() ๋ฑ์ API๋ฅผ ์ด์ฉํ์ฌ
๋์ผ ๊ฐ์ฒด ๋ด์์ ๋ฌธ์์ด์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค. - ๋ฌธ์์ด์ ์ถ๊ฐ, ์์ , ์ญ์ ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ ๊ฒฝ์ฐ๋ผ๋ฉด String ํด๋์ค๋ณด๋ค StringBuffer/StringBuilder๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
StringBuffer sb = new StringBuffer("hello"); // hello
sb.append("world"); // hello world (๋์ผํ ๊ฐ์ฒด ์์ )๏ธStringBuffer vs String Builder
- ๋์ ์ฐจ์ด์ ์
๋๊ธฐํ์ ์ ๋ฌด StringBuffer๋ ๋๊ธฐํ ํค์๋๋ฅผ ์ง์ํ์ฌ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ๋ค.(thread-safe)StringBuilder๋ ๋๊ธฐํ๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํฉํ์ง ์์ง๋ง, ์ฑ๊ธ์ค๋ ๋์์ ์๋๊ฐ ๋น ๋ฅด๋ค.
cf. String๋ ๋ถ๋ณ์ฑ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ๋ค.(thread-safe)
[ref] tuandevnotes.com
- public : ๋ชจ๋๊ฐ ์ ๊ทผ ๊ฐ๋ฅ
- protected :
์์๋ฐ์ ํด๋์ค /๊ฐ์ ํจํค์ง๋ด์ ํด๋์ค์์ ์ ๊ทผ ๊ฐ๋ฅ - default : ๊ธฐ๋ณธ ์ ํ์, ๊ฐ์ ํจํค์ง ๋ด์ ํด๋์ค์์ ์ ๊ทผ ๊ฐ๋ฅ
- private : ์ธ๋ถ ์ ๊ทผ ๋ถ๊ฐ๋ฅ /
๊ฐ์ ํด๋์ค๋ด์์๋ง ์ฌ์ฉ
- ๊ฐ๋ฐ์๊ฐ ์๋ฐ ์์ค์ฝ๋(.java)๋ฅผ ์์ฑํ๋ค.
- ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ
์๋ฐ ์์ค ์ฝ๋(.java) -> ์๋ฐ ๋ฐ์ดํธ ์ฝ๋(.class)๋ก ๋ณํํ๋ค. [์ปดํ์ผ ํ์ ํ๊ฒฝ] - ์ปดํ์ผ๋
์๋ฐ ๋ฐ์ดํธ ์ฝ๋(.class)๋ฅผJVM์ ํด๋์ค๋ก๋(Class Loader)์๊ฒ ์ ๋ฌํ๋ค. ํด๋์ค ๋ก๋๋๋์ ๋ก๋ฉ(Dynamic Loading)์ ํตํดํ์ํ ํด๋์ค๋ค์ ๋ก๋ฉ ๋ฐ ๋งํฌํ์ฌ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data area), ์ฆ,JVM์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฐ๋ค.์คํ์์ง(Execution Engine)์ JVM ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ์จ ๋ฐ์ดํธ ์ฝ๋๋ค์ ๋ช ๋ น์ด ๋จ์๋ก ํ๋์ฉ ๊ฐ์ ธ์์ ์คํํ๋ค.
์ด ๋, ์คํ ์์ง์ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ๋ค.์ธํฐํ๋ฆฌํฐ: ๋ฐ์ดํธ ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ํ๋์ฉ ์ฝ์ด์ ํด์ํ๊ณ ์คํํ๋ค. ํ๋ํ๋์ ์คํ์ ๋น ๋ฅด๋, ์ ์ฒด์ ์ธ ์คํ ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๋จ์ ์ ๊ฐ์ง๋ค.JIT ์ปดํ์ผ๋ฌ(Just-In-Time Compiler): ์ธํฐํ๋ฆฌํฐ์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋์ ํ ๋ฐฉ์. ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผํ์ฌ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ๋ณ๊ฒฝํ๊ณ ์ดํ์๋ ํด๋น ๋ฉ์๋๋ฅผ ๋์ด์ ์ธํฐํ๋ฆฌํ ํ์ง ์๊ณ , ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ์ง์ ์คํํ๋ ๋ฐฉ์์ด๋ค. ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๊ฐ ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ธ ์คํ์๋๋ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๋ค.
JVM์ ํฌ๊ฒ 4๊ฐ์ง๋ก ๊ตฌ์ฑ๋๋ค.
- Class Loader
- Execution Engine
- Garbage Collector
- Runtime Data Area
- Java ์ปดํ์ผ๋ฌ๊ฐ .java ์์ค ํ์ผ์ ๋ชจ๋ JVM์ด ์ฌ์ฉํ ์ ์๋ .class ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผํ๋ค. (์ปดํ์ผ ํ์)
- JVM์ ์คํํ๋ฉด์ ๋ฐํ์ ์์ ์ด ์์๋๋ค.
- JVM ๋ด๋ถ์์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ธฐ ์ํด Execution Engine์ด ํ์ํ ํด๋์ค๋ค์ Class Loader์ ์์ฒญํ๊ณ , Class Loader๊ฐ ๋ฐ์ดํธ์ฝ๋์ .class์์ ๊ฐ์ ธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฐ๋ค.
(๋ก์ปฌ ๋์คํฌ์์ .class ํ์ผ์ ๊ฐ์ ธ์ฌ ์๋ ์์ง๋ง ๋คํธ์ํฌ๋ฅผ ํตํด์ ๊ฐ์ ธ์ฌ ์ ์๋ค. - URLClassLoader) - ๊ฐ์ ธ์ค๋ ํด๋์ค๋ค์ ๋ฐ์ดํธ ์ฝ๋๋ค์ด ์ด์์ด ์๋์ง, ์๋ฐ์ ๋ณด์ ๊ท์น์ ์๋ฐฐํ์ง ์๋์ง ๊ฒ์ฌ๋ฅผ ํ๋ค.
(์๋ฐ๋ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์ก๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์ปดํจํฐ๋ฅผ ํผ์์ํค๋ ๊ฒ์ ๋ฐฉ์ง ํ๊ธฐ ์ํด ์๊ฒฉํ ๋ณด์ ๊ท์น์ ๊ฐ์ง๊ณ ์๋ค.) - Execution Engine์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ์จ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๋ฉด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ค.
- ๊ณ์ ์ด๋ฐ ๋ฐฉ์์ด ๋์์ ํ๋ฉด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ํ๋ค.
- ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๊ธฐ ์ ์ Java ์ปดํ์ผ๋ฌ๊ฐ Java ์์คํ์ผ์ .class ํ์ผ(๋ฐ์ดํธ ์ฝ๋)๋ก ์ปดํ์ผํ๋ค.
- ๊ทธ ์ดํ ์์ฑ๋ ํด๋์ค ํ์ผ๋ค ์ ์ฎ์ด์
JVM์ด ์ด์์ฒด์ ๋ก๋ถํฐ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ธ Runtime DataArea๋ก ์ ์ฌํ๋ ์ญํ์ Class Loader๊ฐ ํ๋ค. - ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ ์ค ์ผ ๋ ์ด๋ฐ ์์ ์ด ์ํ๋๋ค.
Class Loader์ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ๋ฐ์ดํธ ์ฝ๋์ .class ํ์ผ๋ค์ ๊ธฐ๊ณ์ด๋ก ๋ณํํด ๋ช
๋ น์ด ๋จ์๋ก ์คํํ๋ ์ญํ ์ ํ๋ค.
์๋ฐ๋ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ฐ, ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ํ์ค ํ์ค ์ฝ์ด๋ค์ฌ์ผ ํ๋ ๋ฐฉ์์ด๋ผ ์ปดํ์ผ ๋ฐฉ์์ ๋นํด ๋๋ฆฌ๋ค.
-> ๊ทธ๋์ ์๋ฐ๋ ์ปดํ์ผ๊ณผ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ๋ชจ๋ ์ฌ์ฉํ๋ค.
-
์ธํฐํ๋ฆฌํฐ- ๋ฐ์ดํธ ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ํ๋์ฉ ์ฝ์ด์ ์คํํ๋ค.
- ํ๋ํ๋์ ํด์์ ๋น ๋ฅด์ง๋ง ์ ์ฒด์ ์ธ ์คํ์๋๊ฐ ๋๋ฆฌ๋ค.
- JVM ์์์ ๋ฐ์ดํธ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
-
JIT ์ปดํ์ผ๋ฌ(Just-In-Time Compiler)- ์ธํฐํ๋ฆฌํฐ์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋์ ๋ ๋ฐฉ์
- ๋ฐ์ดํธ ์ฝ๋(.class) ์ ์ฒด๋ฅผ ์ปดํ์ผํ์ฌ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ๋ณ๊ฒฝํ๋ค.
- ์ดํ์๋ ํด๋น ๋ฉ์๋๋ฅผ ๋์ด์ ์ธํฐํ๋ฆฌํ ํ์ง ์๊ณ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ์ง์ ์คํํ๋ ๋ฐฉ์
- ํ๋์ฉ ์ธํฐํ๋ฆฌํ ํ์ฌ ์คํํ๋ ๊ฒ์ด ์๋๋ผ ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๊ฐ ์ปดํ์ผ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ธ ์คํ ์๋๋ ์ธํฐํ๋ฆฌํ ๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๋ค.
- ๋ค์ดํฐ๋ธ ์ฝ๋๋ ์บ์์ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ์ปดํ์ผ๋ ์ฝ๋๋ ์บ์์์ ๋ฐ๋ก ๊บผ๋ด์ด ์คํํ๊ธฐ์ ๋น ๋ฅด๊ฒ ์ํ๋๋ค.
- ํ์ง๋ง JIT ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํ๋ ๊ณผ์ ์ ์ธํฐํ๋ฆฌํ ๋ณด๋ค ํจ์ฌ ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ JVM์ ๋ด๋ถ์ ์ผ๋ก ํด๋น ๋ฉ์๋๊ฐ ์ผ๋ง๋ ์์ฃผ ํธ์ถ๋๊ณ ์คํ๋๋์ง ์ฒดํฌํ๊ณ , ์ผ์ ๊ธฐ์ค์ ๋์์ ๋๋ง JIT ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ์ปดํ์ผํ์ฌ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- GC๋ Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์์ฑ๋ ๊ฐ์ฒด๋ค ์ค์ ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ค์ ์ ๊ฑฐํ๋ ์ญํ ์ ํ๋ค.
- Garbage๋ ์ ํจํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋งํ๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ์ด๋ฐ ๊ฐ๋น์ง๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์์ผ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ํ๋ก๊ทธ๋จ
- GC์ ๋ฐ์์ ์ผ์ ํ๊ฒ ์ ํด์ ธ ์์ง ์๊ธฐ ๋๋ฌธ์ ์ธ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฆฌํ ์ง๋ ์ ์ ์๋ค.
- C/C++ ๊ฐ์ ์ธ์ด๋ ์ฌ์ฉํ์ง ์์ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ํด์ ํด์ฃผ์ด์ผ ํ์ง๋ง, ์๋ฐ์์๋ GC๊ฐ ์ก์์ฃผ์ด ํธ๋ฆฌํ๋ค.
JVM์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก Java ์ ํ๋ฆฌ์ผ์ด์
์คํ์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ๋ ์์ญ์ด๋ค.
ํฌ๊ฒ 5๊ฐ์ง ์์ญ์ผ๋ก ๊ตฌ๋ถ๋๋ค.
- Heap
- Method
- Stack
- PC register
- Native Method Stack
- ์ธ์คํด์คํ๋ ๋ชจ๋ ํด๋์ค ์ธ์คํด์ค์ ๋ฐฐ์ด์ ์ ์ฅ์ ํ๋ ๊ณต๊ฐ
- ๋ชจ๋ JVM ์ค๋ ๋์ ๊ณต์ ๋๋ ๊ณต์ ์์
- Heap์ ์ ์ฅ๋ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ํ์ ๊ถํ์ ๋ฌด์กฐ๊ฑด GC์ ์ํด์๋ง ํ์๊ฐ ๊ฐ๋ฅํ๋ค.
- ํด๋์ค ์์ค์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
- ๋ชจ๋ JVM ์ค๋ ๋์ ๊ณต์ ๋๋ ๊ณต์ ์์
- ๋ ผ๋ฆฌ์ ์ผ๋ก Heap ์์ญ์ ํฌํจ๋๋ ์์ญ
- ์ค๋ ๋๊ฐ ์์ฑ๋ ๋๋ง๋ค ์์ฑ๋๋ ์์ญ, Program Counter
- ํ์ฌ ์ค๋ ๋๊ฐ ์คํ๋๋ ๋ถ๋ถ์ ์ฃผ์์ ๋ช ๋ น์ ์ ์ฅํ๊ณ ์๋ ์์ญ, ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ ์ดํ ์ ์๋ค.
- CPU์ ์ง์ Instruction์ ์ํํ์ง ์๊ณ Stack์์ Operand๋ฅผ ๋ฝ์๋ด ์ด๋ฅผ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ทจํ๋ค.
- ์ด๋ฌํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ PC register๋ผ๊ณ ํ๋ค.
- ์๋ฐ ์ธ ์ธ์ด๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค.
- ๋ณดํต C/C++ ๋ฑ์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ํ ์คํ
[ref] https://err0rcode7.github.io/java/2021/05/16/JVM%EA%B3%BC%EC%9E%90%EB%B0%94%EC%9D%98%EC%8B%A4%ED%96%89.html
[ref] https://d2.naver.com/helloworld/1230
- Lambda ํํ์
- Functional ์ธํฐํ์ด์ค
- Steam
- Optional
- ์ธํฐํ์ด์ค์ Default method
- StringJoiner
- ๋ ์ง ๊ด๋ จ ํด๋์ค๋ค ์ถ๊ฐ
- ๋ณ๋ ฌ ๋ฐฐ์ด ์ ๋ ฌ
- ์ต๋ช ํด๋์ค๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ ์ฑ ๋ฑ์ ๋ถํธํจ์ ๋ณด์ํ๊ธฐ ๋ง๋ค์ด์ง ๋๋ค ํํ์
- ์ด ํํ์์ ์ธํฐํ์ด์ค์ ๋ฉ์๋๊ฐ ํ๋์ธ ๊ฒ๋ค๋ง ์ ์ฉ ๊ฐ๋ฅํ๋ค. (default method๊ฐ ์๊ธด ์ด์ )
- ๋๋ค ํํ์๊ณผ ์ต๋ช ํด๋์ค๋ ์๋ก ์ ํ ๊ฐ๋ฅํ๋ค.
- ํ๋์ ๋ฉ์๋๋ง ์ ์ธ๋์ด ์๋ interface.
- ์ธํฐํ์ด์ค ์ ์ธ์ @FunctionalInterface ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ํด๋น ์ธํฐํ์ด์ค๋ ๋ด์ฉ์ด ์๋ ํ๋์ ๋ฉ์๋๋ง ์ ์ธํ ์ ์๋ค.
- ๋ ๊ฐ ์ ์ธ ์ ์ปดํ์ผ ์ค๋ฅ ๋ฐ์
-
์๋ฐ์ ์คํธ๋ฆผ์ ์ฐ์๋ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉํ๋ค.
-
Stream()์ ์์ฐจ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. (index ์)
-
์คํธ๋ฆผ์์ ์ ๊ณตํ๋ ์ฃผ์ ์ฐ์ฐ์
- filter(Predicate predicate) : ๋ฐ์ดํฐ๋ฅผ ์กฐ๊ฑด์ผ๋ก ๊ฑฐ๋ฅผ ๋ ์ฌ์ฉ
- map(Function<T,R> mapper) : ๋ฐ์ดํฐ๋ฅผ ํน์ ๋ฐ์ดํฐ๋ก ๋ณํ
- forEach(Consumer <? super T> action) : for ๋ฃจํ๋ฅผ ์ํํ๋ ๊ฒ์ฒ๋ผ ๊ฐ๊ฐ์ ํญ๋ชฉ์ ๋ผ ๋
- reduce(BinaryOperator accumulator) : ์ฒ์ ๋ ์์๋ฅผ ๊ฐ์ง๊ณ ์ฐ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ๊ทธ ๋ค์ ์์์ ์ฐ์ฐํ๋ค.
-
null ์ฒ๋ฆฌ๋ฅผ ๋ณด๋ค ๊ฐํธํ๊ฒ ํ๊ธฐ ์ํด์ ๋ง๋ค์ด์ก๋ค.
-
Optional ๊ฐ์ฒด ์์ฑํ๊ธฐ
- Optional.empty() : ๋ฐ์ดํฐ๊ฐ ์๋ Optional ๊ฐ์ฒด ์์ฑ
- Optional.ofNullable(data): null์ด ์ถ๊ฐ๋ ์ ์๋ ์ํฉ
- Optional.of(data) : ๋ฐ๋์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ ์ ์๋ ์ํฉ
-
Optional ๊ฐ์ฒด ๊บผ๋ด๊ธฐ
get(): ๋ง์ฝ ๋ฐ์ดํฐ๊ฐ ์์ ๊ฒฝ์ฐ์๋ null ๋ฆฌํดofElse(): ๊ฐ์ด ์์ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ ์ ์๋ค.
-
interface ์์ ๊ตฌํ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ผ ํ ๋
defaultํค์๋๋ฅผ ๋ถ์ฌ์ค๋ค. -
default method ๋ง๋ ์ด์ ?
- 'ํ์ ํธํ์ฑ'
- ๋ง์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๊ณ ์๋ ์ธํฐํ์ด์ค์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๋ ๊ธฐ์กด ๋ฐฉ์๋๋ก ์ถ๊ฐํ๋ฉด ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ์ฌ๋๋ค์ ์ ๋ถ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์์ ํด์ผํ๋ฏ๋ก ์ด๋ด ๋ ์ฌ์ฉํ๋ค.
- Lambda ํํ์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค.
(lambda ํํ์์ ๋ฉ์๋๊ฐ 1๊ฐ์ฌ์ผ ํ๋๋ฐ ๊ทธ ์ธ์ ๋ฉ์๋๋ default method๋ก ์ฒ๋ฆฌ!)
-
๋ฌธ์์ด ์ฒ๋ฆฌ class
- String / StringBuilder / StringBuffer / Formatter /
StringJoiner
- String / StringBuilder / StringBuffer / Formatter /
-
StringJoiner๋ ์์ฐจ์ ์ผ๋ก ๋์ด๋๋ ๋ฌธ์์ด ์ฌ์ด์ ํน์ ๋ฌธ์์ด์ ๋ฃ์ด์ค์ผ ํ ๋ ์ฌ์ฉํ๋ค. (prefix(์ ๋์ฌ), suffix(์ ๋ฏธ์ฌ) ์ค์ ๋ ๊ฐ๋ฅ)
-
StringJoiner์์ Delimiter(๊ตฌ๋ถ์), ์ ๋์ฌ(Prefix), ์ ๋ฏธ์ฌ(Suffix)๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
@Test
public void testDelimiterPrefixSuffix() {
int[] source = {1, 2, 3, 4};
StringJoiner strJoiner = new StringJoiner(",", "[", "]");
for (int el : source) {
strJoiner.add(Integer.toString(el));
}
assertThat(strJoiner.toString()).isEqualTo("[1,2,3,4]");
}- java.time.ZoneDateTime / java.time.LocalDate
- java.time.format.DateTimeFormatter
- java.time.DayOfWeek(enum) : ์์ผ
- Java 8์์๋ parallelSort() ์ ๋ ฌ ๋ฉ์๋๊ฐ ์ ๊ณต๋๋ค.
- ์ผ๋ฐ์ ์ธ sort()์ ๊ฒฝ์ฐ ๋จ์ผ ์ค๋ ๋๋ก ์ํ
- parallelSort()๋ ํ์์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ก ๋๋์ด ์์ ์ด ์ํ๋๋ค.
- CPU๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๊ฒ ์ง๋ง ์ฒ๋ฆฌ์๋๊ฐ ๋ ๋น ๋ฅด๋ค.
- ์ ๋ ธํ ์ด์ ์ ์ฃผ์์ด๋ ์๋ฏธ (JDK 1.5 ๋ฒ์ ์ด์์์ ์ฌ์ฉ ๊ฐ๋ฅ)
- ์ปดํ์ผ๋ฌ์๊ฒ ์ฝ๋ ์์ฑ ๋ฌธ๋ฒ ์๋ฌ๋ฅผ ์ฒดํฌํ๋๋ก ์ ๋ณด ์ ๊ณต
- ์ํํธ์จ์ด ๊ฐ๋ฐํด์ด ๋น๋๋ ๋ฐฐ์น ์ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์๋๋ก ์ ๋ณด ์ ๊ณต
- ์คํ ์(๋ฐํ์ ์) ํน์ ๊ธฐ๋ฅ์ ์คํํ๋๋ก ์ ๋ณด๋ฅผ ์ ๊ณต
- @Override
- ์ ์ธํ ๋ฉ์๋๊ฐ ์ค๋ฒ๋ผ์ด๋ ๋์๋ค๋ ๊ฒ์ ๋ํ๋ธ๋ค.
- ์์ ํด๋์ค(or interface)์์ ํด๋น ๋ฉ์๋๋ฅผ ์ฐพ์ ์ ์๋ค๋ฉด ์ปดํ์ผ ์๋ฌ ๋ฐ์
- @Deprecated
- ํด๋น ๋ฉ์๋๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์์ ํ์
- ๋ง์ฝ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ปดํ์ผ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์
- @FunctionalInterface
- Java8 ๋ถํฐ ์ง์, ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ํ๋ ์ด๋ ธํ ์ด์
- ๋ง์ฝ ๋ฉ์๋๊ฐ ์กด์ฌํ์ง ์๊ฑฐ๋, 2๊ฐ ์ด์์ ๋ฉ์๋(default ๋ฉ์๋ ์ ์ธ)๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์ปดํ์ผ ์ค๋ฅ ๋ฐ์
- ๋ณ์, ๋ฉ์๋, ํด๋์ค ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ฌด์ธ๊ฐ๋ฅผ ์ ํํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค๋ ๊ฒ์ด ๊ณตํต์
-
๋ณ์์ final์ ๋ถ์ด๋ฉด ์ด ๋ณ์๋ ์์ ํ ์ ์๋ค๋ ์๋ฏธ
-
์์ ๋ ์ ์๊ธฐ์ ์ด๊ธฐํ ๊ฐ์ ํ์์
-
๊ฐ์ฒด ์์ ๋ณ์๋ผ๋ฉด ์์ฑ์, static ๋ธ๋ญ์ ํตํ ์ด๊ธฐํ๊น์ง๋ ํ์ฉ
-
๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ํ ๋ ์ฐธ์กฐํ๋ ๊ฐ์ฒด์ ๋ด๋ถ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์๋ฏธ
...ing
[ref] https://sabarada.tistory.com/148


