Python ๊ด๋ จ ๋ด์ฉ ์ ๋ฆฌ
Basic [[Python_Distilled]]
Basic [[Python_Distilled]]
๋ง์ณ๋ฒ๋ฆฐ ์ํํธ์จ์ด ํ๋ก์ ํธ์ ๋ฌด์ฉ๋ด โ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ํํธ์จ์ด๋ ์ ๋ง ์ข์๋๋ฐ, ์์ฅ์ด ๋ฌด๋ฅด์ต์ง ์์์ดโ -> ์๋น์ ์๊ตฌ๋ฅผ ํ์ ํ์ง ๋ชปํ๋ค. โ์ํํธ์จ์ด๋ ์ ๋ง๋ค์๋๋ฐ ์์ ํ๋งค๊ฐ ์ ๋์ง ์์์ดโ -> ์๋ฌด๋ ๊ทธ๋ฐ ์ํํธ์จ์ด๋ฅผ ์ํ์ง ์์๋ค. โ์ ํ์ ๋๋ด์คฌ๋๋ฐ ์ ๋๋ก ์ข ํด๋ณด๋ ค๋ ๋ง๋น์ ์์ ์์ ์๋ ธ์ดโ -> ์์ต์ ์ฐฝ์ถํ๊ธฐ๊น์ง ๋๋ฌด ์ค๋๊ฑธ๋ ธ๋ค. โ์ข์ ์ํํธ์จ์ด๋ ๊ทธ ์ํํธ์จ์ด๊ฐ ์ฑ์๋ ์ฌ์ดํด์์ ์ด๋์ ์๋์ง, ์ด๋ค ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ๋์ง, ์ด๋ป๊ฒ ์งํํ๊ณ ์ฑ์ฅํ๊ธฐ๋ฅผ ์ํ๋์ง ๋ฑ์ ๋ฐ๋ผ ๋งค์ฐ ๋ค๋ฅผ ์ ์๋ค. ์ํํธ์จ์ด์์ ๊ณ ๊ฐ์ด ์ง์ ๋ฌด์์ ํ์๋ก ํ ์ง, ๊ทธ๋ฆฌ๊ณ ์ ๊ฐ์์ ๊ณ ๊ฐ์ด ๋ชจ๋ ์ ํ ์ฑ์๋ ์ฌ์ดํด๊ณผ ๋ฆฌ์คํฌ ํ์ฉ๋ ๋ฉด์์ ์ด๋ค ์์น์ ์๋์ง์ ๋ํด ์ง์งํ๊ฒ ๊ณ ๋ฏผ์ ์์ํด ๋ณด๋ฉด ๋ ๋์ ์ ๋ต ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๊ณ , ์์ฅ์ ์ง์ ํ๋ฅญํ ์ํํธ์จ์ด๋ฅผ ๋ด๋์ ์ ์๋ค....
ํธ๋์ญ์ ๊ด๋ฆฌ ์คํ๋ง์ ๋น์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค์ด๋ค. ์ฆ, ํ๋์ ์๋น์ค ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ์ฌ๋ฌ ์ค๋ ๋์์ ๊ณต์ ๋์ด ์ฌ์ฉ๋๋ค. ํ์ง๋ง ํธ๋์ญ์ ์ ์ค๋ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋์ด์ผ ํ๋ค. ๊ทธ๋์ ThreadLocal๋ก ๊ด๋ฆฌํ๋ค. TransactionSynchronizationManager ์คํ๋ง์ TransactionSynchronizationManager ํด๋์ค๋ฅผ ํตํด ํธ๋์ญ์ ๋ฆฌ์์ค์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค. ์ด ํด๋์ค๋ ThreadLocal ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ค๋ ๋๋ณ๋ก ๋ ๋ฆฝ์ ์ธ ํธ๋์ญ์ ์ปจํ ์คํธ๋ฅผ ์ ์งํ๋ค. // TransactionSynchronizationManager์ ์ผ๋ถ (๊ฐ๋ตํ๋จ) public abstract class TransactionSynchronizationManager { // ๋ฆฌ์์ค๋ฅผ ์ค๋ ๋๋ณ๋ก ์ ์ฅํ๋ ThreadLocal ๋งต private static final ThreadLocal<Map<Object, Object>> resources = new NamedThreadLocal<>("Transactional resources"); // ํธ๋์ญ์ ๋๊ธฐํ ํ์ฑํ ์ํ private static final ThreadLocal<Boolean> actualTransactionActive = new NamedThreadLocal<>("Actual transaction active"); // ํ์ฌ ํธ๋์ญ์ ์ด๋ฆ private static final ThreadLocal<String> currentTransactionName = new NamedThreadLocal<>("Current transaction name"); // ์ฝ๊ธฐ ์ ์ฉ ํ๋๊ทธ private static final ThreadLocal<Boolean> currentTransactionReadOnly = new NamedThreadLocal<>("Current transaction read-only status"); // ๊ฒฉ๋ฆฌ ์์ค private static final ThreadLocal<Integer> currentTransactionIsolationLevel = new NamedThreadLocal<>("Current transaction isolation level"); // ํธ๋์ญ์ ๋๊ธฐํ ์ฝ๋ฐฑ ๊ฐ์ฒด private static final ThreadLocal<List<TransactionSynchronization>> synchronizations = new NamedThreadLocal<>("Transaction synchronizations"); // ๋ฆฌ์์ค ๋ฐ์ธ๋ฉ ๋ฉ์๋ public static void bindResource(Object key, Object value) { Map<Object, Object> map = resources....
์ฌ์ค ๊ฐ์ฒด์ ์ฐธ์กฐ๊ณผ ์๋ก ์๋ ๊ฐ์ฒด๋ผ๋ฉด ๋ฐ์ํ์ง, JPA์ ์ง์ ์ ์ธ ์ฐ๊ด์ ์๋ค. ์๋ฐฉํฅ ์ฐธ์กฐ 1. toString() ๋ฉ์๋ ๊ตฌํ ์ ๋ฌดํ๋ฃจํ @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent") private List<Child> children = new ArrayList<>(); @Override public String toString() { return "Parent{id=" + id + ", name='" + name + "', children=" + children + "}"; } } @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne private Parent parent; @Override public String toString() { return "Child{id=" + id + ", name='" + name + "', parent=" + parent + "}"; } } ์ด ๊ฒฝ์ฐ Parent์ toString()์ด Child์ toString()์ ํธ์ถํ๊ณ , Child์ toString()์ด ๋ค์ Parent์ toString()์ ํธ์ถํ๋ ๋ฌดํ๋ฃจํ๊ฐ ๋ฐ์ํฉ๋๋ค....
์ฑ ์ ๋ด์ฉ์ ์ผ๋ถ โ๋ฐ์ทโํด์ ์ ๋ฆฌ ๊ฐ ์ฅ๋ณ ๊ฐ๋จํ ๊ฐ์๋ ์์ฑํ์ง๋ง, ์ค์ง์ ์ผ๋ก๋ ๋ด๊ฐ ์กฐ๊ธ ๋ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ๋ง ์ผ๋ถ ๋ฐ์ทํด์ ๊ธฐ๋ก 1์ฅ ์ฌ์ฉ์ ์์ ๋ฐ๋ฅธ ๊ท๋ชจ ํ์ฅ์ฑ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ์ดํ๋ฆฌ์ผ์ด์ ์ค๊ฒ์ ๋งค์ฐ ์์ฃผ ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ ํน์ ๊ตฌํํด์ผํ๋ ์๊ตฌ์ฌํญ์ ๋ํด์ ์๊ฐํด ์ฃผ๋์ฅ ์๋ฅผ๋ค์ด ์๋์ ๊ฐ์ ๊ฒ๋ค์ ๊ฐ๋ ์ ๊ฐ๋ต์ ์ผ๋ก ์ค๋ช ํด์ค๋ค. ๋ฐ์ดํฐ ์ ์ฅ์ ์์ง์ ํ์ฅ,์ํ์ ํ์ฅ ๋ค์คํ ์บ์ ์์ ์ฑ๊ณผ, ๊ฐ์ฉ์ฑ๊ณผ๊ฐ์ ์์คํ ์ ์ธก์ ํ ์ ์๋ ์์๋ค๋ ์ค๋ช ํด์ค๋ค. ๋ด์ฉ ์บ์ ์ฌ์ฉ์ ์ ์ ํ ์ ์ด๋ค ์ํฉ์ ๋ฐ๋์งํ์ง ์๊ฐํ๊ธฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์บ์ํ ์ง ์๊ฐํ์ง ๋ง๋ฃ๊ธฐํ์ ์ ์ค์ ํ๊ธฐ ์ผ๊ด์ฑ์ ์ ์ง ํ ์ ์๋๋ก ์๊ฐํ๊ธฐ ์ ์ฅ์์ ์๋ณธ์ ๊ฐฑ์ ํ๋ ์ฐ์ฐ๊ณผ ์บ์๋ฅผ ๊ฐฑ์ ํ๋ ์ฐ์ฐ์ด ๋จ์ผ ํธ๋์ญ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์๋ ๊ฒฝ์ฐ?...
JVM JVM ๊ตฌ์ฑ์์ ์ ์ ๋ชจ๋ ์ดํ๋ฆฌ์ผ์ด์ ํ๋ก์ธ์ค, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์ฉ, ๋จธ์ ์ผ๋ก์ ์ฐ์ฐ, os์ ์ผ๋ถ๊ธฐ๋ฅ jvm ๊ตฌ์ฑ์์ ํด๋์ค ๋ก๋(Class Loader) ์๋ฐ ํด๋์ค ํ์ผ(.class)์ ๋ก๋ํ๊ณ ๋งํฌํ๋ ์ญํ ๋ก๋ฉ, ๋งํน, ์ด๊ธฐํ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋จ ๋ถํธ์คํธ๋ฉ ํด๋์ค ๋ก๋, ํ์ฅ ํด๋์ค ๋ก๋, ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค ๋ก๋๋ก ๊ตฌ์ฑ ํด๋์ค ๋ก๋ฉ ๋งํน๋ฑ์ด ๋ฐํ์์ ์ผ์ด๋ ์ ์๋ค. ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ(Runtime Data Area) ๋ฉ์๋ ์์ญ(Method Area): ํด๋์ค ๊ตฌ์กฐ, ๋ฉ์๋ ๋ฐ์ดํฐ, ์์, ์ ์ ๋ณ์ ๋ฑ ์ ์ฅ ํ(Heap): ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ณ์๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ ์คํ(Stack): ์ค๋ ๋๋ง๋ค ๋ณ๋๋ก ์กด์ฌํ๋ฉฐ ์ง์ญ ๋ณ์, ๋งค๊ฐ๋ณ์, ๋ฆฌํด ๊ฐ ๋ฑ ์ ์ฅ PC ๋ ์ง์คํฐ(Program Counter Register): ํ์ฌ ์คํ ์ค์ธ ๋ช ๋ น์ด ์ฃผ์ ์ ์ฅ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ(Native Method Stack): ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ํ ์คํ ์คํ ์์ง(Execution Engine) ์ธํฐํ๋ฆฌํฐ(Interpreter): ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ ์ค์ฉ ํด์ํ๊ณ ์คํ JIT ์ปดํ์ผ๋ฌ(Just-In-Time Compiler): ์์ฃผ ์ฌ์ฉ๋๋ ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์ปดํ์ผํ์ฌ ์ฑ๋ฅ ํฅ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(Garbage Collector): ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ์๋ ์ ๋ฆฌ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์ธํฐํ์ด์ค(JNI, Java Native Interface) ์๋ฐ ์ฝ๋๊ฐ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ C, C++ ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํธ์์ฉํ ์ ์๊ฒ ํจ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Native Method Libraries) C, C++ ๋ฑ์ผ๋ก ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ์ ํด๋์ค๋ก๋ ....
JVM ๋ฐ๋ฐ๋ฅ๋ถํฐ ํํด์น๊ธฐ์ฑ ์ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ฉฐ, ๋ชจ๋ ๋ด์ฉ์ ํด๋น ๋์ ๊ธฐ๋ฐ์ ๋๋ค. 1๋ถ ์๋ฐ์ ์นํด์ง๊ธฐ 1์ฅ ์๋ฐ ๊ธฐ์ ์์คํ ์๊ฐ 1.1 ๋ค์ด๊ฐ๋ฉฐ ํ๋์จ์ด ํ๋ซํผ ์กฑ์ ์ ๊ฑฐ ์์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์คํ ๋ฐํ์ ํซ์ฝ๋ ๊ฐ์ง, ์ปดํ์ผ ์ต์ ํํ๋ฉฐ ์ต์์ ์ฑ๋ฅ ๋์ ํ์ค api๋ ํ๋ถํ๊ณ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง๋ค. ์ด๋ฒ ์ฅ์๋ ์๋ฐ ์์คํ ์ ๊ตฌ์ฑ์์, ์ญ์ฌ, ์๋ฐ์ ํ์ฌ์ ๋ฏธ๋๋ฅผ ๋ค๋ฃฌ๋ค. 1.2 ์๋ฐ ๊ธฐ์ ์์คํ ํฌ๊ฒ๋ ์๋๋ฅผ ํฌ๊ดํ๋ค ์๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๊ฐ์ ๋จธ์ ๊ตฌํ ํด๋์ค ํ์ผ ํฌ๋งท ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ api (ํ์ค api) ์คํ์์ค ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ์ด, vm, ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฌถ์ด jdk๋ผ๊ณ ํ๋ค, ๋ํ java se api, vm, ๋ฐฐํฌ๊ธฐ์ ๊น์ง๋ฅผ ๋ฌถ์ผ๋ฉด jre๋ผ๊ณ ํ๋ค....
25 ๋ณํ์ฑ์ ๊ดํ ๋ํ ์ฌ๋ฌ์ฌ๋์ด ๋์์ ๋ณต์ญ์๋ฅผ ์ง์ ์ ์๋๋ก ํ์๋๋ ๋นจ๋์ด์, ๋ฐ๋ฉด์ ์ ๋ฐฉ๋ฒ์ ํ๋ฒ์ ํ๋ช ์ฉ ์ง๊ธฐ ๋๋ฌธ์ ์ ํํ๊ฒ ์ง๋ง ๊ฝค ๋๋ฆฌ๊ฒ ๊ตฐ์. ๋ฉํฐ ์ฐ๋ ๋ ํ๋ก๊ทธ๋จ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ํ๋ก๊ทธ๋จ๋ค์ด ์๋ค, ๊ฐ ์ฐ๋ ๋๋ ๋ ๋ฆฝ๋ ๊ฐ์ฒด๋ก์ ํ๋ก๊ทธ๋จ ๋ด์์ ํ๋ก๊ทธ๋จ์ ๋์ ํ์ฌ ์ผ์ผ ํ์ง, ์ด ์ฐ๋ ๋๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋๋ฐ, ์ฐ๋ ๋ ์ ์ฅ์์ ๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ ์๊น ์ด์ผ๊ธฐํ๋ ๋ณต์ญ์์ ๊ฐ์ ๊ฑฐ์ผ ๋์์ฑ์ ์ด์์ฒด์ ์์ ๋ค๋ค์ผ ํ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ง. ์ด์์ฒด์ ๋ ๋ฝ๊ณผ ์ปจ๋์ ๋ณ์์ ๊ฐ์ ๊ธฐ๋ณธ ๋์ ์ผ๋ก ๋ฉํฐ์ฐ๋ ๋ ํ๋ก๊ทธ๋จ์ ์ง์ํด์ผ ํ๋ค๋ค. ๋์งธ๋ก ์ด์์ฒด์ ๋ ๊ทธ ์์ฒด๋ก ์ต์ด์ ๋์ ํ๋ก๊ทธ๋จ์ด๊ธฐ ๋๋ฌธ์ด์ผ...
19 ํ์ด์ง: ๋ ๋น ๋ฅธ ๋ณํ(TLB) ๋งคํ ์ ๋ณด ์ ์ฅ(ํ์ด์ง ํ ์ด๋ธ ์ ์ฅ)์ ์ํด ํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์๊ตฌ๋จ ๊ฐ์ ์ฃผ์์์ ๋ฌผ๋ฆฌ ์ฃผ์๋ก์ ์ฃผ์ ๋ณํ์ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ ๋งคํ์ ๋ณด๋ฅผ ์ฝ์ด์ผํจ. ํต์ฌ ์ง๋ฌธ: ์ฃผ์ ๋ณํ ์๋๋ฅผ ์ด๋ป๊ฒ ํฅ์ํ ๊น? ์ฃผ์ ๋ณํ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๋ณํ-์์ธ ๋ฒํผ(translation-lookaside-buffer) ์ค์ฌ์ TLB๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ๋์ ํ๋ค. ์นฉ์ MMU(memory-management unit)์ ์ผ๋ถ๋ผ๊ณ ํ๋ค. ์์ฃผ ์ฐธ์กฐ๋๋ ๊ฐ์์ฃผ์ - ์ค์ฃผ์ ๋ณํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ํ๋์จ์ด ์บ์์ด๋ค. ์ฃผ์-๋ณํ ์บ์๊ฐ ์ข ๋ ์ ํฉํ ๋ช ์นญ์ด๋ค. 19.1 TLB์ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ // ๊ฐ์ ์ฃผ์์์ VPN(๊ฐ์ ํ์ด์ง ๋ฒํธ) ์ถ์ถ VPN = (VirtualAddress & VPN_MASK) >> SHIFT; // TLB ์กฐํ (TLB ํํธ ์ฌ๋ถ ํ์ธ) (Success, TlbEntry) = TLB_Lookup(VPN); if (Success == True) { // TLB Hit if (CanAccess(TlbEntry....
MySQL LZ77 ๋น๋๋ฅผ ์ฒดํฌํด์ ์นํํ๋ ๋ฐฉ์ ์์ธํ ๊ตฌํ์ -> ์ฌ๊ธฐ ์๊ณ ๋ฆฌ์ฆ LZ77_์์ถ(์ ๋ ฅ๋ฌธ์์ด): ์์ถ๊ฒฐ๊ณผ = ๋น ๋ฆฌ์คํธ ๊ฒ์๋ฒํผํฌ๊ธฐ = N ์ ๋ฐฉ๋ฒํผํฌ๊ธฐ = M ํ์ฌ์์น = 0 while ํ์ฌ์์น < ์ ๋ ฅ๋ฌธ์์ด์ ๊ธธ์ด: // ๊ฒ์ ๋ฒํผ์ ์ ๋ฐฉ ๋ฒํผ ์ค์ ๊ฒ์๋ฒํผ์์ = max(0, ํ์ฌ์์น - ๊ฒ์๋ฒํผํฌ๊ธฐ) ๊ฒ์๋ฒํผ๋ = ํ์ฌ์์น ์ ๋ฐฉ๋ฒํผ๋ = min(ํ์ฌ์์น + ์ ๋ฐฉ๋ฒํผํฌ๊ธฐ, ์ ๋ ฅ๋ฌธ์์ด์ ๊ธธ์ด) ์ต๋์ผ์น์์น = 0 ์ต๋์ผ์น๊ธธ์ด = 0 // ๊ฒ์ ๋ฒํผ์์ ๊ฐ์ฅ ๊ธด ์ผ์น ์ฐพ๊ธฐ for ๊ฒ์์์น = ๊ฒ์๋ฒํผ์์ to ๊ฒ์๋ฒํผ๋ - 1: ํ์ฌ์ผ์น๊ธธ์ด = 0 while ํ์ฌ์์น + ํ์ฌ์ผ์น๊ธธ์ด < ์ ๋ฐฉ๋ฒํผ๋ AND ๊ฒ์์์น + ํ์ฌ์ผ์น๊ธธ์ด < ํ์ฌ์์น AND ์ ๋ ฅ๋ฌธ์์ด[๊ฒ์์์น + ํ์ฌ์ผ์น๊ธธ์ด] == ์ ๋ ฅ๋ฌธ์์ด[ํ์ฌ์์น + ํ์ฌ์ผ์น๊ธธ์ด]: ํ์ฌ์ผ์น๊ธธ์ด += 1 if ํ์ฌ์ผ์น๊ธธ์ด > ์ต๋์ผ์น๊ธธ์ด: ์ต๋์ผ์น๊ธธ์ด = ํ์ฌ์ผ์น๊ธธ์ด ์ต๋์ผ์น์์น = ๊ฒ์์์น if ์ต๋์ผ์น๊ธธ์ด > 0: // ์๋์ ์์น ๊ณ์ฐ (๊ฒ์ ๋ฒํผ ๋ด์ ์คํ์ ) ์คํ์ = ํ์ฌ์์น - ์ต๋์ผ์น์์น ๋ค์๋ฌธ์ = ์ ๋ ฅ๋ฌธ์์ด[ํ์ฌ์์น + ์ต๋์ผ์น๊ธธ์ด] (์ ๋ฐฉ๋ฒํผ๋์ ๋๋ฌํ๋ค๋ฉด null ๋๋ ํน์ ๋ฌธ์) ์์ถ๊ฒฐ๊ณผ....