JavaRush /Java Blog /Random-KO /๋‹น์‹ ์ด ์ž๋ฐ”์— ๋Œ€ํ•ด ๋ชฐ๋ž๋˜ 10๊ฐ€์ง€
minuteman
๋ ˆ๋ฒจ 32

๋‹น์‹ ์ด ์ž๋ฐ”์— ๋Œ€ํ•ด ๋ชฐ๋ž๋˜ 10๊ฐ€์ง€

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
๊ทธ๋ ‡๋‹ค๋ฉด ์ตœ๊ทผ์— Java ์ž‘์—…์„ ์‹œ์ž‘ํ•˜์…จ๋‚˜์š”? "Oak"์ด๋ผ๊ณ  ๋ถˆ๋ ธ๋˜ ์‹œ์ ˆ, ๊ฐ์ฒด ์ง€ํ–ฅ์ด ์—ฌ์ „ํžˆ ๋œจ๊ฑฐ์šด ์ฃผ์ œ์˜€๋˜ ์‹œ์ ˆ, C++ ์‚ฌ๋žŒ๋“ค์ด Java์—๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ์‹œ์ ˆ, ์• ํ”Œ๋ฆฟ์— ๋Œ€ํ•ด ๋“ค์–ด๋ณธ ์‚ฌ๋žŒ์กฐ์ฐจ ์•„๋ฌด๋„ ์—†๋˜ ์‹œ์ ˆ์„ ๊ธฐ์–ตํ•˜์‹ญ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹ค์Œ ์‚ฌํ•ญ ์ค‘ ์ ˆ๋ฐ˜๋„ ๋ชจ๋ฅธ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Java์˜ ๋‚ด๋ถ€ ์ž‘๋™์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฉ‹์ง„ ๋†€๋ผ์›€์œผ๋กœ ํ•œ ์ฃผ๋ฅผ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ž๋ฐ”์— ๋Œ€ํ•ด ๋ชฐ๋ž๋˜ 10๊ฐ€์ง€ - 11. ํ™•์ธ๋œ ์˜ˆ์™ธ๋ž€ ์—†์Šต๋‹ˆ๋‹ค. ์ข‹์•„์š”! JVM์€ ๊ทธ๋Ÿฐ ์ผ์— ๋Œ€ํ•ด ์ „ํ˜€ ๋ชจ๋ฅด๊ณ  ์˜ค์ง Java ์–ธ์–ด๋งŒ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ํ™•์ธ๋œ ์˜ˆ์™ธ๊ฐ€ ์‹ค์ˆ˜์˜€๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Bruce Eckel์ด ํ”„๋ผํ•˜์˜ GeeCON์—์„œ์˜ ๋งˆ์ง€๋ง‰ ๊ฐ•์—ฐ์—์„œ ๋งํ–ˆ๋“ฏ์ด Java๋Š” ๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์–ธ์–ด๋Š” ์—†์œผ๋ฉฐ Java 8์กฐ์ฐจ๋„ ๋” ์ด์ƒ ์ƒˆ๋กœ์šด Streams API์—์„œ ์ด๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋žŒ๋‹ค๊ฐ€ IO ๋˜๋Š” JDBC๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์•ฝ๊ฐ„ ์„ฑ๊ฐ€์‹ค ์ˆ˜ ์žˆ์Œ). ). JVM์ด ๊ทธ๋Ÿฐ ๊ฒƒ์„ ๋ชจ๋ฅธ๋‹ค๋Š” ์ฆ๊ฑฐ๋ฅผ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ? ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ SQLException๋„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Lombok์˜ @SneakyThrows๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค. 2. ๋ฐ˜ํ™˜ ์œ ํ˜•๋งŒ ๋‹ค๋ฅธ โ€‹โ€‹์˜ค๋ฒ„๋กœ๋“œ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.public class Test { // No throws clause here public static void main(String[] args) { doThrow(new SQLException()); } static void doThrow(Exception e) { Test. doThrow0(e); } @SuppressWarnings("unchecked") static void doThrow0(Exception e) throws E { throw (E) e; } } ์ด๊ฑด ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์„ ๊ฑฐ์˜ˆ์š”, ๊ทธ๋ ‡์ฃ ? class Test { Object x() { return "abc"; } String x() { return "123"; } } ์˜ค๋ฅธ์ชฝ. Java ์–ธ์–ด์—์„œ๋Š” throw ๋˜๋Š” ๋ฐ˜ํ™˜ ์œ ํ˜•์˜ ์ฐจ์ด์— ๊ด€๊ณ„์—†์ด ๋™์ผํ•œ ํด๋ž˜์Šค ๋‚ด์—์„œ ๋™์‹œ์— ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ๋™๋“ฑํ•˜๊ฒŒ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž ๊น๋งŒ์š”. Class.getMethod(String, Classโ€ฆ)์— ๋Œ€ํ•œ ์„ค๋ช…์„œ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•˜์„ธ์š”. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค์— ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Java ์–ธ์–ด๋Š” ์„œ๋ช…์€ ๋™์ผํ•˜์ง€๋งŒ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” ๋ฐ˜๋ฉด Java Virtual Machine์€ ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ€์ƒ ๋จธ์‹ ์˜ ์ด๋Ÿฌํ•œ ์œ ์—ฐ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณต๋ณ€ ๋ฐ˜ํ™˜์€ ๋ธŒ๋ฆฌ์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€ ๋ฉ”์„œ๋“œ์™€ ์žฌ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋Š” ๋™์ผํ•œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ฐ€์ง€์ง€๋งŒ ๋ฐ˜ํ™˜ ์œ ํ˜•์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์™€, ๋ง์ด ๋˜๋„ค์š”. ๋‹ค์Œ์„ ์ž‘์„ฑํ•  ๋•Œ ์‹ค์ œ๋กœ ๋งŽ์€ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ณด์‹ญ์‹œ์˜ค. ๋”ฐ๋ผ์„œ t๋Š” ์‹ค์ œ๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž˜ ์ดํ•ด๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์˜ ํŠน์ • ๋ถ€๋ถ„์—์„œ Parent.x()์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ฉ์„ฑ ๋ธŒ๋ฆฌ์ง€ ๋ฉ”์„œ๋“œ๋Š” ์‹ค์ œ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ธŒ๋ฆฌ์ง€ ๋ฉ”์„œ๋“œ ์—†์ด ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ ์ด์ง„ ํ‘œํ˜„์—์„œ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•˜๋„๋ก JVM์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ณ ํ†ต์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค(๋ถ€์ž‘์šฉ์œผ๋กœ ๊ณต๋ณ€ ๋ฐฉ๋ฒ• ์žฌ์ •์˜๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค...). ํ˜„๋ช…ํ•ฉ๋‹ˆ๊นŒ? 3. ๋‹ค์Œ์€ ๋ชจ๋‘ 2์ฐจ์› ๋ฐฐ์—ด์ด๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๋ฉ˜ํƒˆ ๋ถ„์„๊ธฐ๊ฐ€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์ฆ‰์‹œ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋”๋ผ๋„ ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค! ๋‹ค์Œ ์ฝ”๋“œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ฏธ์นœ ์ง“์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์„ธ์š”? ๊ธ€์„ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์˜ ์ˆ˜๋„ ๊ทธ์•ผ๋ง๋กœ ์ƒ์ƒ๋ ฅ์„ ํญ๋ฐœ์‹œํ‚ต๋‹ˆ๋‹ค! ์ฃผ์„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํž˜์— ์ด์–ด ์‹ ๋น„๋กœ์›€์ด ๋‘ ๋ฒˆ์งธ์ธ ์žฅ์น˜์ž…๋‹ˆ๋‹ค. ์ฆ‰, 4์ฃผ๊ฐ„์˜ ํœด๊ฐ€ ์ง์ „์— ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์„ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 4. ์กฐ๊ฑด๋ฌธ์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค . ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์ด๋ฏธ ์กฐ๊ฑด๋ฌธ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์…จ๋‚˜์š”? ๋‹น์‹ ์„ ์‹ค๋ง์‹œํ‚ค๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„ ๋Œ€๋ถ€๋ถ„์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ์š”. ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ! ์กฐ๊ฑด ์—ฐ์‚ฐ์ž๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์œ ํ˜• ์บ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด NullPointerException์„ ๋˜์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ? 5. ๋ณตํ•ฉ ํ• ๋‹น ์—ฐ์‚ฐ์ž๋„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ˆ˜์™„์ด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๊นŒ? ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ฝ”๋“œ ์กฐ๊ฐ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. abstract class Parent { abstract T x(); } class Child extends Parent { @Override String x() { return "abc"; } } // Method descriptor #15 ()Ljava/lang/String; // Stack: 1, Locals: 1 java.lang.String x(); 0 ldc [16] 2 areturn Line numbers: [pc: 0, line: 7] Local variable table: [pc: 0, pc: 3] local: this index: 0 type: Child // Method descriptor #18 ()Ljava/lang/Object; // Stack: 1, Locals: 1 bridge synthetic java.lang.Object x(); 0 aload_0 [this] 1 invokevirtual Child.x() : java.lang.String [19] 4 areturn Line numbers: [pc: 0, line: 1] class Test { int[][] a() { return new int[0][]; } int[] b() [] { return new int[0][]; } int c() [][] { return new int[0][]; } } class Test { int[][] a = {{}}; int[] b[] = {{}}; int c[][] = {{}}; } @Target(ElementType.TYPE_USE) @interface Crazy {} class Test { @Crazy int[][] a1 = {{}}; int @Crazy [][] a2 = {{}}; int[] @Crazy [] a3 = {{}}; @Crazy int[] b1[] = {{}}; int @Crazy [] b2[] = {{}}; int[] b3 @Crazy [] = {{}}; @Crazy int c1[][] = {{}}; int c2 @Crazy [][] = {{}}; int c3[] @Crazy [] = {{}}; } ๋‹น์‹ ์ด ์ž๋ฐ”์— ๋Œ€ํ•ด ๋ชฐ๋ž๋˜ 10๊ฐ€์ง€ - 2 Object o1 = true ? new Integer(1) : new Double(2.0); Object o2; if (true) o2 = new Integer(1); else o2 = new Double(2.0); System.out.println(o1); System.out.println(o2); 1.0 1 Integer i = new Integer(1); if (i.equals(1)) i = null; Double d = new Double(2.0); Object o = true ? i : d; // NullPointerException! System.out.println(o); i += j; i = i + j; ์ง๊ด€์ ์œผ๋กœ ๊ทธ๋“ค์€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค - ๊ทธ๋“ค์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. JLS ์‚ฌ์–‘์— ๋”ฐ๋ฅด๋ฉด E1 op = E2 ์œ ํ˜•์˜ ๋ณตํ•ฉ ํ‘œํ˜„์‹์€ E1 = (T) ((E1) op (E2))์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ T๋Š” E1์ด ํ•œ ๋ฒˆ๋งŒ ํ‰๊ฐ€๋œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด E1์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ข‹์€ ์˜ˆ๋Š” *= ๋˜๋Š” /= : byte b = 10; b *= 5.7; System.out.println(b); // prints 57 ๋˜๋Š”: byte b = 100; b /= 2.5; System.out.println(b); // prints 40 ๋˜๋Š”: char ch = '0'; ch *= 1.1; System.out.println(ch); // prints '4' ๋˜๋Š”: ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค char ch = 'A'; ch *= 1.5; System.out.println(ch); // prints 'a' . ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ์œ ์šฉํ•œ ๋„๊ตฌ์ž…๋‹ˆ๊นŒ? 6. ๋‚œ์ˆ˜ ์ •์ˆ˜ ์ด์ œ ๋” ์–ด๋ ค์šด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์„ ์ฝ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์Šค์Šค๋กœ ๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์„ธ์š”. ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด for (int i = 0; i < 10; i++) { System.out.println((Integer) i); } ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 92 221 45 48 236 183 39 193 33 84 ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ• ๊นŒ์š”? ์ข‹์Šต๋‹ˆ๋‹ค. ๋Œ€๋‹ต์€ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด JDK์˜ ์ •์ˆ˜ ์บ์‹œ๋ฅผ ์žฌ์ •์˜ํ•œ ๋‹ค์Œ ์ž๋™ ๋ฐ•์‹ฑ ๋ฐ ์ž๋™ ์–ธ๋ฐ•์‹ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋ฅธ๋“ค์˜ ํ—ˆ๋ฝ ์—†์ด๋Š” ์ด๋Ÿฐ ์ง“์„ ํ•˜์ง€ ๋งˆ์„ธ์š”! ์ฆ‰, ๋‹น์‹ ์ด ์ž๋ฐ”์— ๋Œ€ํ•ด ๋ชฐ๋ž๋˜ 10๊ฐ€์ง€ - 3 7. GOTO ์ œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์—๋Š” GOTO๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! ์ด๋ ‡๊ฒŒ ์“ฐ์„ธ์š”: int goto = 1; ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค: ๋งŒ์•ฝ์„ ๋Œ€๋น„ํ•ด goto๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์˜ˆ์•ฝ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค... ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฉ‹์ง„ ์ ์€ break, continue ๋ฐ ํ‘œ์‹œ๋œ ๋ธ”๋ก๊ณผ ํ•จ๊ป˜ goto๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์ ํ”„ ๋ฐ”์ดํŠธ ์ฝ”๋“œ์—์„œ : ๋’ค๋กœ ์ ํ”„ ๋ฐ”์ดํŠธ ์ฝ”๋“œ์—์„œ: 8. Java์—๋Š” ์œ ํ˜• ๋ณ„์นญ์ด ์žˆ์Šต๋‹ˆ๋‹ค . ๋‹ค๋ฅธ ์–ธ์–ด(์˜ˆ: Ceylon)์—์„œ๋Š” ์œ ํ˜•์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„์นญ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์˜ People ํด๋ž˜์Šค๋Š” Set๊ณผ ์ƒํ˜ธ ๊ตํ™˜๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Test.java:44: error: expected int goto = 1; ^ label: { // do stuff if (check) break label; // do more stuff } 2 iload_1 [check] 3 ifeq 6 // Jumping forward 6 .. label: do { // do stuff if (check) continue label; // do more stuff break label; } while(true); 2 iload_1 [check] 3 ifeq 9 6 goto 2 // Jumping backward 9 .. interface People => Set ; : Java์—์„œ๋Š” ๋‹จ์ˆœํžˆ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ๋ณ„์นญ์„ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ์˜ ํ•„์š”์— ๋”ฐ๋ผ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Integer, Long ๋“ฑ๊ณผ ๊ฐ™์€ ์ด๋ฆ„์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋” ์งง์€ ์ด๋ฆ„์„ ์›ํ•ฉ๋‹ˆ๋‹ค: I์™€ L. Easy: ์œ„์˜ ์˜ˆ์—์„œ Integer๋Š” Test ํด๋ž˜์Šค์˜ ๊ฐ€์‹œ์„ฑ์„ ์œ„ํ•ด I๋กœ ๋ณ€ํ™˜๋˜๋Š” ๋ฐ˜๋ฉด Long์€ x() ๋ฉ”์†Œ๋“œ์˜ ์š”๊ตฌ์— ๋”ฐ๋ผ L๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด ๋ฐฉ๋ฒ•์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด ๊ธฐ์ˆ ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์—ฌ์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Integer์™€ Long์€ ์ตœ์ข… ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ฆ‰, I์™€ L์€ ํšจ์œจ์ ์ธ ๋ณ€ํ™˜์ž…๋‹ˆ๋‹ค(๊ฑฐ์˜ ๋ณ€ํ™˜์€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค). ์ตœ์ข… ์œ ํ˜•์ด ์•„๋‹Œ(์˜ˆ: Object)์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ์ผ๋ฐ˜ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์กฐ๊ธˆ ๋†€์•˜๊ณ  ๊ทธ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. 9. ์ผ๋ถ€ ์œ ํ˜• ๊ด€๊ณ„๋Š” ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค! ์ž, ์ด์ œ ์ •๋ง ํฅ๋ฏธ๋กœ์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋†์ถ•๋œ ์ปคํ”ผ๋ฅผ ํ•œ์ž” ๋งˆ์‹œ๊ณ  ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. People? p1 = null; Set ? p2 = p1; People? p3 = p2; class Test { void x(I i, L l) { System.out.println( i.intValue() + ", " + l.longValue() ); } } new Test().x(1, 2L);// A helper type. You could also just use List interface Type {} class C implements Type > {} class D

implements Type >>> {} ๊ทธ๋ ‡๋‹ค๋ฉด C์™€ D๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ• ๊นŒ์š”? ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” java.lang.Enum์˜ ์žฌ๊ท€์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์žฌ๊ท€์ ์ž…๋‹ˆ๋‹ค. ๊ณ ๋ ค ์‚ฌํ•ญ: ์œ„์˜ ์‚ฌ์–‘์„ ๊ณ ๋ คํ•˜๋ฉด enum์˜ ์‹ค์ œ ๊ตฌํ˜„์€ ๋‹จ์ง€ ๊ตฌ๋ฌธ์  ์„คํƒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๊นŒ? ์–ด๋ ค์šด ์งˆ๋ฌธ์ธ๋ฐ... ์‹ค์ œ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๊ณ  ์žˆ๋‚˜์š”? C๋Š” Type์˜ ํ•˜์œ„ ์œ ํ˜•์ธ๊ฐ€์š” ? Eclipse๋‚˜ Idea์—์„œ ์ด๊ฒƒ์„ ์ปดํŒŒ์ผํ•ด ๋ณด๋ฉด ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ๋งํ•ด ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ˆ˜๊ตฌ๋กœ ์”ป์–ด๋‚ด์„ธ์š”... Java์˜ ์ผ๋ถ€ ์œ ํ˜• ๊ด€๊ณ„๋Š” ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค! 10. ์œ ํ˜• ๊ต์ฐจ Java์—๋Š” ์œ ํ˜• ๊ต์ฐจ๋ผ๋Š” ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋‘ ์œ ํ˜•์˜ ๊ต์ฐจ์ ์ธ (์ผ๋ฐ˜) ์œ ํ˜•์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Test ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜ T์—๋Š” Serialized ๋ฐ Cloneable ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์ž์—ด์€ ์ œํ•œํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋‚ ์งœ๋Š” ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์œ ํ˜•์„ ์บ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ๋Š” Java8์—์„œ ์—ฌ๋Ÿฌ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋‚˜์š”? ๊ฑฐ์˜ ์•„๋ฌด๊ฒƒ๋„ ์•„๋‹ˆ์ง€๋งŒ ๋žŒ๋‹ค ์‹์„ ํ•„์š”ํ•œ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ์— ์—„์ฒญ๋‚œ ์ œํ•œ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†กํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ Runnable์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋žŒ๋‹ค์™€ ์ง๋ ฌํ™”๋Š” ์•ฝ๊ฐ„์˜ ์•„์ด๋Ÿฌ๋‹ˆ๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ ์œ ํ˜•๊ณผ ์ธ์ˆ˜๊ฐ€ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋žŒ๋‹ค ์‹์„ ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด๋”๋ผ๋„ ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์€ ์ง์ ‘ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง๋ ฌํ™” ๊ฐ€๋Šฅ์—๋งŒ ์บ์ŠคํŒ…ํ•˜๋ฉด ๋žŒ๋‹ค๋Š” ๋” ์ด์ƒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‘ ์œ ํ˜• ๋ชจ๋‘์— ์บ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. public abstract class Enum > { ... } // This enum MyEnum {} // Is really just sugar for this class MyEnum extends Enum { ... } class Test { Type c = new C(); Type> d = new D (); } Step 0) C Step 1) Type > >? Step 0) D > Step 1) Type >>> > Step 2) D >> Step 3) List >> > Step 4) D > >> Step . . . (expand forever) class Test { } // Doesn't compile Test s = null; // Compiles Test d = null; void execute(T t) {} execute((Serializable) (() -> {}));execute((Runnable & Serializable) (() -> {}));

Java๋Š” ์‹ ๋น„ํ•œ ๋งŒํผ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION