-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
2649 lines (1396 loc) · 799 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>EUNII's BLOG</title>
<subtitle>my recode</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="https://eunii.github.io/"/>
<updated>2020-01-27T12:04:00.058Z</updated>
<id>https://eunii.github.io/</id>
<author>
<name>eunii</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>[알고리즘] 6. 자료구조</title>
<link href="https://eunii.github.io/2019/12/06/tec/algorithm/al8/"/>
<id>https://eunii.github.io/2019/12/06/tec/algorithm/al8/</id>
<published>2019-12-05T15:00:00.000Z</published>
<updated>2020-01-27T12:04:00.058Z</updated>
<content type="html"><![CDATA[<h2 id="1-자료구조-기본"><a href="#1-자료구조-기본" class="headerlink" title="1. 자료구조 기본"></a>1. 자료구조 기본</h2><h3 id="1-1-컴퓨터-기본-커리큘럽"><a href="#1-1-컴퓨터-기본-커리큘럽" class="headerlink" title="1.1 컴퓨터 기본 커리큘럽"></a>1.1 컴퓨터 기본 커리큘럽</h3><h4 id="1-1-1-기본언어"><a href="#1-1-1-기본언어" class="headerlink" title="1.1.1 기본언어"></a>1.1.1 기본언어</h4><h4 id="1-1-2-자료구조"><a href="#1-1-2-자료구조" class="headerlink" title="1.1.2 자료구조"></a>1.1.2 자료구조</h4><h4 id="1-1-3-알고리즘"><a href="#1-1-3-알고리즘" class="headerlink" title="1.1.3 알고리즘"></a>1.1.3 알고리즘</h4><h3 id="1-2-자료구조란"><a href="#1-2-자료구조란" class="headerlink" title="1.2 자료구조란?"></a>1.2 자료구조란?</h3><blockquote><p>데이터를 담는 구조</p></blockquote><h3 id="1-3-기본-자료-구조"><a href="#1-3-기본-자료-구조" class="headerlink" title="1.3 기본 자료 구조"></a>1.3 기본 자료 구조</h3><h4 id="1-3-1-변수"><a href="#1-3-1-변수" class="headerlink" title="1.3.1 변수"></a>1.3.1 변수</h4><ul><li>int x=4;</li></ul><h4 id="1-3-2-배열"><a href="#1-3-2-배열" class="headerlink" title="1.3.2 배열"></a>1.3.2 배열</h4><ul><li>int[] arr={0,1,2};</li><li>장점: arr[i]번째 수를 바로 일 수 있음.</li><li>딘잠: 데이터 넣고 빼기가 힘듬(배열 앞뒤로 다 이동시키고 삽입)<h3 id="1-3-3-링크드-리스트"><a href="#1-3-3-링크드-리스트" class="headerlink" title="1.3.3 링크드 리스트"></a>1.3.3 링크드 리스트</h3></li><li>앞의 값이 다음 값을 알고있음</li><li>장점: 데이터 넣고 빼기 용이</li><li>x[i]번째 값 알기 어려움(처음부터 탐색)</li></ul><h2 id="2-기초-자료구조"><a href="#2-기초-자료구조" class="headerlink" title="2. 기초 자료구조"></a>2. 기초 자료구조</h2><blockquote><p>자료구조가 설계된 목적을 이해해야함</p></blockquote><ul><li>스택</li><li>큐</li><li>트리</li><li>그래프</li></ul><h3 id="2-1-스택-Stack"><a href="#2-1-스택-Stack" class="headerlink" title="2.1 스택(Stack)"></a>2.1 스택(Stack)</h3><ul><li>선형 자료구조</li></ul><table><thead><tr><th>in/out</th></tr></thead><tbody><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr></tbody></table><ul><li>LIFO(Last in first out)</li><li>push(), .pop(), </li><li>스택 오버플로우란 push()할때 할당된 공간이 다 차서 넘치는것</li><li>스택언더플로우란 공간에 데이터가 하나도 없을때 pop()하는것</li></ul><h4 id="2-1-1-스택-구현"><a href="#2-1-1-스택-구현" class="headerlink" title="2.1.1 스택 구현"></a>2.1.1 스택 구현</h4><ul><li>push()</li><li>pop()</li><li>top()</li><li>size()</li></ul><pre><code></code></pre><h3 id="2-2-큐-Quque"><a href="#2-2-큐-Quque" class="headerlink" title="2.2 큐(Quque)"></a>2.2 큐(Quque)</h3><table><thead><tr><th><-out</th><th></th><th></th><th></th><th></th><th><- in</th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li>FIFO(First in first out)</li><li>push(), .pop(), </li><li>스택 오버플로우란 push()할때 할당된 공간이 다 차서 넘치는것</li><li><p>스택언더플로우란 공간에 데이터가 하나도 없을때 pop()하는것</p></li><li><p>큐의 문제점 : 공간활용이 안좋음 >> 해결 원형큐</p></li></ul><h3 id="2-2-1-원형큐"><a href="#2-2-1-원형큐" class="headerlink" title="2.2.1 원형큐"></a>2.2.1 원형큐</h3><p>배열 공간을 원형으로 만들어서 함</p><h3 id="2-2-2-큐-활용문제-예시"><a href="#2-2-2-큐-활용문제-예시" class="headerlink" title="2.2.2 큐 활용문제 예시"></a>2.2.2 큐 활용문제 예시</h3><p>괄호가 올바른지 판단하기</p><h3 id="2-3-트리-Three"><a href="#2-3-트리-Three" class="headerlink" title="2.3 트리(Three)"></a>2.3 트리(Three)</h3><ul><li>root</li><li>노드(정점)</li><li>간선</li><li>트리의 재귀적성질</li></ul><h4 id="2-3-1-트리순회"><a href="#2-3-1-트리순회" class="headerlink" title="2.3.1 트리순회"></a>2.3.1 트리순회</h4><ul><li>전위순회 : root-Left-Right</li><li>중위순회 : Left-Root-Right</li><li>후위순회 : Left-Right-Root</li></ul><h3 id="2-4-우선순의-큐"><a href="#2-4-우선순의-큐" class="headerlink" title="2.4 우선순의 큐"></a>2.4 우선순의 큐</h3><ul><li>큐에 넣고 우선순위가 높은것 순으로 뽑기</li><li>배열을 이용한 우선순의 큐는 뽑고 다시채워야 해서 O(n^2)걸림->느림</li></ul><h3 id="2-4-힙-Heap"><a href="#2-4-힙-Heap" class="headerlink" title="2.4 힙(Heap)"></a>2.4 힙(Heap)</h3><blockquote><p>부모값이 항상 자식보다 작은 이진트리</p></blockquote><p>아래 트리에 4를 추가한다고 하면.</p><table><thead><tr><th></th><th></th><th></th><th>3</th><th></th><th></th><th></th></tr></thead><tbody><tr><td></td><td>5</td><td></td><td></td><td></td><td>7</td><td></td></tr><tr><td>23</td><td></td><td>7</td><td></td><td>9</td><td></td><td>null</td></tr></tbody></table><p>–4추가</p><table><thead><tr><th></th><th></th><th></th><th>3</th><th></th><th></th><th></th></tr></thead><tbody><tr><td></td><td>5</td><td></td><td></td><td></td><td>7</td><td></td></tr><tr><td>23</td><td></td><td>7</td><td></td><td>9</td><td></td><td>4</td></tr></tbody></table><p>4랑 7비교 4랑 7변경</p><table><thead><tr><th></th><th></th><th></th><th>3</th><th></th><th></th><th></th></tr></thead><tbody><tr><td></td><td>5</td><td></td><td></td><td></td><td>4</td><td></td></tr><tr><td>23</td><td></td><td>7</td><td></td><td>9</td><td></td><td>7</td></tr></tbody></table><p>4랑 3비교 유지 > 정렬끝!!</p><table><thead><tr><th></th><th></th><th></th><th>3</th><th></th><th></th><th></th></tr></thead><tbody><tr><td></td><td>5</td><td></td><td></td><td></td><td>4</td><td></td></tr><tr><td>23</td><td></td><td>7</td><td></td><td>9</td><td></td><td>7</td></tr></tbody></table><h4 id="2-4-1-힙의-삽입의-시간복잡도"><a href="#2-4-1-힙의-삽입의-시간복잡도" class="headerlink" title="2.4.1 힙의 삽입의 시간복잡도"></a>2.4.1 힙의 삽입의 시간복잡도</h4><p>완전 이진트리의 높이</p><table><thead><tr><th>노드수</th><th>높이</th></tr></thead><tbody><tr><td>1</td><td>1</td></tr><tr><td>2</td><td>2</td></tr><tr><td>3</td><td>2</td></tr><tr><td>4</td><td>3</td></tr><tr><td>5</td><td>3</td></tr><tr><td>6</td><td>3</td></tr><tr><td>7</td><td>3</td></tr><tr><td>8</td><td>4</td></tr></tbody></table><p>노드의 개수가 n개일때의 높이 = logn </p><p>2^n-1</p><ul><li>힙 값 삽입의 시간복잡도=> O(logn)</li><li>힙 값 삭제의 시간복잡도 => O(logn)</li></ul>]]></content>
<summary type="html">
<h2 id="1-자료구조-기본"><a href="#1-자료구조-기본" class="headerlink" title="1. 자료구조 기본"></a>1. 자료구조 기본</h2><h3 id="1-1-컴퓨터-기본-커리큘럽"><a href="#1-1-컴퓨터-
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/categories/tec/alogrithm/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/tags/alogrithm/"/>
<category term="알고리즘" scheme="https://eunii.github.io/tags/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/"/>
<category term="자료구조" scheme="https://eunii.github.io/tags/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0/"/>
</entry>
<entry>
<title>[알고리즘] 5. 고급 정렬(합병정렬, 퀵정렬)</title>
<link href="https://eunii.github.io/2019/12/05/tec/algorithm/al7/"/>
<id>https://eunii.github.io/2019/12/05/tec/algorithm/al7/</id>
<published>2019-12-04T15:00:00.000Z</published>
<updated>2020-01-27T12:02:55.721Z</updated>
<content type="html"><![CDATA[<h2 id="1-로그-개념과-효율성"><a href="#1-로그-개념과-효율성" class="headerlink" title="1. 로그 개념과 효율성"></a>1. 로그 개념과 효율성</h2><p>log2 16=4;<br>logx y = N;<br>x^n=y;<br>nlog n <- n이커질수록 o(n)과 속도 차이가 크다 </p><h2 id="2-고급정렬-종류"><a href="#2-고급정렬-종류" class="headerlink" title="2. 고급정렬 종류"></a>2. 고급정렬 종류</h2><h3 id="2-1-합병정렬"><a href="#2-1-합병정렬" class="headerlink" title="2.1 합병정렬"></a>2.1 합병정렬</h3><blockquote><p>정렬할 값을 반으로 나눠 각각 정렬 후 두 정렬을 크기순으로 합침</p></blockquote><h4 id="2-1-1-고급정렬-예제"><a href="#2-1-1-고급정렬-예제" class="headerlink" title="2.1.1 고급정렬 예제"></a>2.1.1 고급정렬 예제</h4><p>1) 아래 배열 정렬 </p><table><thead><tr><th>4</th><th>14</th><th>8</th><th>23</th><th>11</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>2) 반으로 나누기->각 값이 하나씩 있을때까지 </p><table><thead><tr><th>4</th><th>14</th><th>8</th><th></th><th>3</th><th>23</th><th>11</th></tr></thead><tbody><tr><td></td></tr></tbody></table><table><thead><tr><th>4</th><th>14</th><th></th><th>8</th><th></th><th>3</th><th>23</th><th></th><th>11</th></tr></thead><tbody><tr><td></td></tr></tbody></table><table><thead><tr><th>4</th><th></th><th>14</th><th></th><th>8</th><th></th><th>3</th><th></th><th>23</th><th></th><th>11</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>3) 각각 크기순으로 배열 합치기 </p><table><thead><tr><th><strong>4</strong></th><th><strong>14</strong></th><th></th><th>8</th><th></th><th><strong>3</strong></th><th><strong>23</strong></th><th></th><th>11</th></tr></thead><tbody><tr><td></td></tr></tbody></table><table><thead><tr><th><strong>4</strong></th><th><strong>8</strong></th><th><strong>14</strong></th><th></th><th><strong>3</strong></th><th><strong>11</strong></th><th><strong>23</strong></th></tr></thead><tbody><tr><td></td></tr></tbody></table><table><thead><tr><th><strong>3</strong></th><th><strong>4</strong></th><th><strong>8</strong></th><th><strong>11</strong></th><th><strong>14</strong></th><th><strong>23</strong></th></tr></thead><tbody><tr><td></td></tr></tbody></table><h4 id="2-1-2-합병정렬-시간복잡도"><a href="#2-1-2-합병정렬-시간복잡도" class="headerlink" title="2.1.2 합병정렬 시간복잡도"></a>2.1.2 합병정렬 시간복잡도</h4><p>1) 왼쪽 /오른쪽 합병정렬 T(n/2) +T(n/2) => n<br>2) 두 배열 합치기 o(n)<br>3) T(n)=2*T(n/2)+O(n)<br>이걸 풀면…<br>T(n)=O(nlogn)</p><h4 id="2-1-3-합병정렬-재귀함수-디자인"><a href="#2-1-3-합병정렬-재귀함수-디자인" class="headerlink" title="2.1.3 합병정렬 재귀함수 디자인"></a>2.1.3 합병정렬 재귀함수 디자인</h4><p>1) 함수 정의<br>2) 기저조건 s>=e이면 retrun<br>3) mearge(arr, s, e)<br>mearge(arr, s, mid)<br>mearge(arr, mid+1, e)</p><h4 id="2-1-4-합병정렬-구현"><a href="#2-1-4-합병정렬-구현" class="headerlink" title="2.1.4 합병정렬 구현"></a>2.1.4 합병정렬 구현</h4><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="2-2-퀵정렬"><a href="#2-2-퀵정렬" class="headerlink" title="2.2 퀵정렬"></a>2.2 퀵정렬</h3><blockquote><p>임의의 값 하나를 기준으로 기준값보다 큰건 오른쪽 작은건 왼쪽으로 보내기</p></blockquote><h3 id="2-2-1-예시"><a href="#2-2-1-예시" class="headerlink" title="2.2.1 예시"></a>2.2.1 예시</h3><p>1) 아래 배열 퀵정렬</p><table><thead><tr><th>3</th><th>1</th><th>5</th><th>4</th><th>2</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>2) 배열 제일 앞숫자3 기준 정렬</p><table><thead><tr><th>1</th><th>2</th><th><strong>3</strong></th><th>5</th><th>4</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>3-1) 3기준 앞 배열 제일 앞 숫자1로 정렬</p><table><thead><tr><th><strong>1</strong></th><th><strong>2</strong></th><th><strong>3</strong></th><th>5</th><th>4</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>3-2) 3기준 뒤 배열 중 가장 앞 숫자 5기준으로 정렬</p><table><thead><tr><th><strong>1</strong></th><th><strong>2</strong></th><th><strong>3</strong></th><th><strong>5</strong></th><th><strong>4</strong></th></tr></thead><tbody><tr><td></td></tr></tbody></table><h3 id="2-2-2-퀵정렬-시간복잡도"><a href="#2-2-2-퀵정렬-시간복잡도" class="headerlink" title="2.2.2 퀵정렬 시간복잡도"></a>2.2.2 퀵정렬 시간복잡도</h3><p>평균적으로는 O(nlogn) 가장 오래 걸리면 O(n^2)</p><h3 id="2-2-3-퀵정렬-구현"><a href="#2-2-3-퀵정렬-구현" class="headerlink" title="2.2.3 퀵정렬 구현"></a>2.2.3 퀵정렬 구현</h3><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="2-3-힙정렬"><a href="#2-3-힙정렬" class="headerlink" title="2.3 힙정렬"></a>2.3 힙정렬</h3><blockquote><p>트리구조를 이용한 정렬 나중에 나옴!</p></blockquote>]]></content>
<summary type="html">
<h2 id="1-로그-개념과-효율성"><a href="#1-로그-개념과-효율성" class="headerlink" title="1. 로그 개념과 효율성"></a>1. 로그 개념과 효율성</h2><p>log2 16=4;<br>logx y = N;<br
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/categories/tec/alogrithm/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/tags/alogrithm/"/>
<category term="정렬" scheme="https://eunii.github.io/tags/%EC%A0%95%EB%A0%AC/"/>
<category term="알고리즘" scheme="https://eunii.github.io/tags/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/"/>
</entry>
<entry>
<title>[알고리즘] 4. 재귀함수</title>
<link href="https://eunii.github.io/2019/12/04/tec/algorithm/al6/"/>
<id>https://eunii.github.io/2019/12/04/tec/algorithm/al6/</id>
<published>2019-12-03T15:00:00.000Z</published>
<updated>2020-01-27T12:02:17.330Z</updated>
<content type="html"><![CDATA[<h2 id="1-재귀함수"><a href="#1-재귀함수" class="headerlink" title="1. 재귀함수"></a>1. 재귀함수</h2><blockquote><p>자기자신을 부르는 함수</p></blockquote><h3 id="1-2-재귀함수가-의미있는-예제"><a href="#1-2-재귀함수가-의미있는-예제" class="headerlink" title="1.2 재귀함수가 의미있는 예제"></a>1.2 재귀함수가 의미있는 예제</h3><ul><li>펙토리얼 n! = n<em>(n-1)</em>(n-2)…*1<figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">getFactorial</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">if</span>(n==<span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;</span><br><span class="line"> <span class="hljs-keyword">else</span> <span class="hljs-keyword">return</span> n*getFactorial(n-<span class="hljs-number">1</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><p>함수 호출 흐름</p><ol><li>main에서 getFactorial(3) 호출된다고 가정.</li><li>getFactorial(3)에서<br> 3*getFactorial(2)리턴</li><li>getFactorial(2)에서<br> 2*getFactorial(1) 리턴</li><li>getFactorial(1)에서 1리턴</li><li>1<em>2</em>3 도출</li></ol><h3 id="1-2-두가지-계산반벙"><a href="#1-2-두가지-계산반벙" class="headerlink" title="1.2 두가지 계산반벙"></a>1.2 두가지 계산반벙</h3><h4 id="1-2-1-순차적-계산방법"><a href="#1-2-1-순차적-계산방법" class="headerlink" title="1.2.1 순차적 계산방법"></a>1.2.1 순차적 계산방법</h4><p>A를 계산, A를 이용해서 B를 계산, B를 이용해서 C를 계산..<br>n!=n<em>(n-1)…</em>1</p><h4 id="1-2-2-귀납적-계산방법"><a href="#1-2-2-귀납적-계산방법" class="headerlink" title="1.2.2 귀납적 계산방법"></a>1.2.2 귀납적 계산방법</h4><p>구하려고 하는 값은 f(x) f(x)를 구하기 위해 또 f(x)를 활용함<br>n!= 5<em>f(4)<br>n!=5</em>4<em>f(3)<br>…<br>n! = 5</em>4<em>3</em>2*f(1)</p><ul><li>n의 m제곱을 귀납적으로 정의<br>n^m = n<em>n^(m-1)<br>…<br>n^m = n</em>n<em>n..</em>n^0</li></ul><h3 id="1-3-수납적-귀납법"><a href="#1-3-수납적-귀납법" class="headerlink" title="1.3 수납적 귀납법"></a>1.3 수납적 귀납법</h3><p>명제 p(n)이 모든 n에 성립함을 증명.<br>p(k)가 성립한다고 가정후 p(k+1)이 성립함을 증명.</p><h2 id="2-재귀함수-디자인"><a href="#2-재귀함수-디자인" class="headerlink" title="2 재귀함수 디자인"></a>2 재귀함수 디자인</h2><h3 id="2-1-3가지-절차"><a href="#2-1-3가지-절차" class="headerlink" title="2.1 3가지 절차"></a>2.1 3가지 절차</h3><h4 id="1-함수의-역할을-명확하게-정의"><a href="#1-함수의-역할을-명확하게-정의" class="headerlink" title="1) 함수의 역할을 명확하게 정의"></a>1) 함수의 역할을 명확하게 정의</h4><h4 id="2-기저조건에서-함수가-제대로-동작함을-보임"><a href="#2-기저조건에서-함수가-제대로-동작함을-보임" class="headerlink" title="2) 기저조건에서 함수가 제대로 동작함을 보임"></a>2) 기저조건에서 함수가 제대로 동작함을 보임</h4><h4 id="3-함수가-제대로-동작한다고-가정하고-함수를-완성"><a href="#3-함수가-제대로-동작한다고-가정하고-함수를-완성" class="headerlink" title="3) 함수가 제대로 동작한다고 가정하고 함수를 완성"></a>3) 함수가 제대로 동작한다고 가정하고 함수를 완성</h4><h3 id="2-2-재귀함수-구현"><a href="#2-2-재귀함수-구현" class="headerlink" title="2.2 재귀함수 구현"></a>2.2 재귀함수 구현</h3><h4 id="2-2-1-n의-m제곱"><a href="#2-2-1-n의-m제곱" class="headerlink" title="2.2.1 n의 m제곱"></a>2.2.1 n의 m제곱</h4><h5 id="1-getPower-n-m-은-n의-m승을-반환하는-함수이다"><a href="#1-getPower-n-m-은-n의-m승을-반환하는-함수이다" class="headerlink" title="1) getPower(n,m)은 n의 m승을 반환하는 함수이다."></a>1) getPower(n,m)은 n의 m승을 반환하는 함수이다.</h5><p>ex) getPower(2,4)=16</p><h5 id="2-기저조건-getPower-n-0-1"><a href="#2-기저조건-getPower-n-0-1" class="headerlink" title="2) 기저조건 getPower(n,0)=1"></a>2) 기저조건 getPower(n,0)=1</h5><h5 id="3-getPower-n-m-n-getPower-n-m-1"><a href="#3-getPower-n-m-n-getPower-n-m-1" class="headerlink" title="3) getPower(n,m)=n * getPower(n, m-1)"></a>3) getPower(n,m)=n * getPower(n, m-1)</h5><h4 id="2-2-2-이진수-출력하기"><a href="#2-2-2-이진수-출력하기" class="headerlink" title="2.2.2 이진수 출력하기"></a>2.2.2 이진수 출력하기</h4><h5 id="1-pringBin-x-는-X를-이진수로-바꿔출력하는-함수"><a href="#1-pringBin-x-는-X를-이진수로-바꿔출력하는-함수" class="headerlink" title="1) pringBin(x)는 X를 이진수로 바꿔출력하는 함수"></a>1) pringBin(x)는 X를 이진수로 바꿔출력하는 함수</h5><h5 id="2-기저조건-printBin-1-1-printBin-0-0"><a href="#2-기저조건-printBin-1-1-printBin-0-0" class="headerlink" title="2) 기저조건 printBin(1)=1, printBin(0)=0"></a>2) 기저조건 printBin(1)=1, printBin(0)=0</h5><h5 id="3-printBin-x-print-x-2-print-x-2"><a href="#3-printBin-x-print-x-2-print-x-2" class="headerlink" title="3) printBin(x)={ print(x/2); print(x%2);}"></a>3) printBin(x)={ print(x/2); print(x%2);}</h5><h4 id="2-2-3-펠린드롬인지-판별하기"><a href="#2-2-3-펠린드롬인지-판별하기" class="headerlink" title="2.2.3 펠린드롬인지 판별하기"></a>2.2.3 펠린드롬인지 판별하기</h4><ul><li>펠린드롬은 좌우 대칭인 값을 말함<h5 id="1-isPal-String-start-end"><a href="#1-isPal-String-start-end" class="headerlink" title="1) isPal(String, start, end)"></a>1) isPal(String, start, end)</h5><h5 id="2-기저조건-start-end-isPal-String-start-end-true"><a href="#2-기저조건-start-end-isPal-String-start-end-true" class="headerlink" title="2) 기저조건: start==end isPal(String, start, end)=true;"></a>2) 기저조건: start==end isPal(String, start, end)=true;</h5><h5 id="3-isPal-String-start-end"><a href="#3-isPal-String-start-end" class="headerlink" title="3) isPal(String, start, end)"></a>3) isPal(String, start, end)</h5>if(String.start==String.end) return isPal(String, start+1, end-1);<br>else return false;</li></ul>]]></content>
<summary type="html">
<h2 id="1-재귀함수"><a href="#1-재귀함수" class="headerlink" title="1. 재귀함수"></a>1. 재귀함수</h2><blockquote>
<p>자기자신을 부르는 함수</p>
</blockquote>
<h3 id="
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/categories/tec/alogrithm/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/tags/alogrithm/"/>
<category term="알고리즘" scheme="https://eunii.github.io/tags/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/"/>
<category term="재귀함수" scheme="https://eunii.github.io/tags/%EC%9E%AC%EA%B7%80%ED%95%A8%EC%88%98/"/>
</entry>
<entry>
<title>[알고리즘] 3. 정수(Integer)</title>
<link href="https://eunii.github.io/2019/12/03/tec/algorithm/al5/"/>
<id>https://eunii.github.io/2019/12/03/tec/algorithm/al5/</id>
<published>2019-12-02T15:00:00.000Z</published>
<updated>2020-01-27T12:07:10.765Z</updated>
<content type="html"><![CDATA[<h2 id="1-정수"><a href="#1-정수" class="headerlink" title="1. 정수"></a>1. 정수</h2><h3 id="1-1-약수"><a href="#1-1-약수" class="headerlink" title="1.1 약수"></a>1.1 약수</h3><blockquote><p>특정 수를 나누어 떨어지게 하는 수</p></blockquote><h4 id="1-1-1-약수-구하기-구현"><a href="#1-1-1-약수-구하기-구현" class="headerlink" title="1.1.1 약수 구하기 구현"></a>1.1.1 약수 구하기 구현</h4><h3 id="1-2-소수"><a href="#1-2-소수" class="headerlink" title="1.2 소수"></a>1.2 소수</h3><blockquote><p>약수가 1과 자기자신인 수 </p></blockquote><h4 id="1-2-1-소수-구하기-구현"><a href="#1-2-1-소수-구하기-구현" class="headerlink" title="1.2.1 소수 구하기 구현"></a>1.2.1 소수 구하기 구현</h4><h4 id="1-2-2-에라토스테네스의-체-소수-구하기-구현"><a href="#1-2-2-에라토스테네스의-체-소수-구하기-구현" class="headerlink" title="1.2.2 에라토스테네스의 체(소수 구하기) 구현"></a>1.2.2 에라토스테네스의 체(소수 구하기) 구현</h4><h3 id="1-3-소인수-분해"><a href="#1-3-소인수-분해" class="headerlink" title="1.3 소인수 분해"></a>1.3 소인수 분해</h3><p>숫자N을 소수의 곱으로 나타냄</p><h4 id="1-3-1-구현"><a href="#1-3-1-구현" class="headerlink" title="1.3.1 구현"></a>1.3.1 구현</h4><h3 id="1-4-공약수와-공배수"><a href="#1-4-공약수와-공배수" class="headerlink" title="1.4 공약수와 공배수"></a>1.4 공약수와 공배수</h3><blockquote><p>A,B 공약수, A와 B의 공통된 약수<br>AB 공배수 A와 B의 공통된 배수</p></blockquote><h4 id="1-4-1-최대공약수-GCD-최소공배수-LCM"><a href="#1-4-1-최대공약수-GCD-최소공배수-LCM" class="headerlink" title="1.4.1 최대공약수(GCD), 최소공배수(LCM)"></a>1.4.1 최대공약수(GCD), 최소공배수(LCM)</h4><h4 id="1-4-2-유클리드-호제법"><a href="#1-4-2-유클리드-호제법" class="headerlink" title="1.4.2 유클리드 호제법"></a>1.4.2 유클리드 호제법</h4><blockquote><p>a, b, r(a/b)<br>b, r(a/b) , r(b, r(a/b))<br>… a, b, r==0일때, b 가 최대공약수</p></blockquote><h3 id="1-4-파스칼-삼각형"><a href="#1-4-파스칼-삼각형" class="headerlink" title="1.4 파스칼 삼각형"></a>1.4 파스칼 삼각형</h3><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">1</span><br><span class="line">121</span><br><span class="line">1331</span><br><span class="line">3C0, 3C1, 3C2, 3C3</span><br><span class="line">14641</span><br></pre></td></tr></table></figure><p>콤비네이션 값 구할때 사용(20C11)</p>]]></content>
<summary type="html">
<h2 id="1-정수"><a href="#1-정수" class="headerlink" title="1. 정수"></a>1. 정수</h2><h3 id="1-1-약수"><a href="#1-1-약수" class="headerlink" title="1.1
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/categories/tec/alogrithm/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/tags/alogrithm/"/>
<category term="알고리즘" scheme="https://eunii.github.io/tags/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/"/>
<category term="시간복잡도" scheme="https://eunii.github.io/tags/%EC%8B%9C%EA%B0%84%EB%B3%B5%EC%9E%A1%EB%8F%84/"/>
</entry>
<entry>
<title>[알고리즘] 2. 시간복잡도</title>
<link href="https://eunii.github.io/2019/12/02/tec/algorithm/al4/"/>
<id>https://eunii.github.io/2019/12/02/tec/algorithm/al4/</id>
<published>2019-12-01T15:00:00.000Z</published>
<updated>2020-01-27T12:00:06.020Z</updated>
<content type="html"><![CDATA[<h2 id="1-시간복잡도"><a href="#1-시간복잡도" class="headerlink" title="1. 시간복잡도"></a>1. 시간복잡도</h2><blockquote><p>문제가 얼마나 빠르게 해결되는지 나타냄<br>대략적으로 몇개의 명령을 수행하는지?</p></blockquote><h3 id="1-1-for문"><a href="#1-1-for문" class="headerlink" title="1.1 for문"></a>1.1 for문</h3><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i=<span class="hljs-number">0</span> ; i<n; i++){</span><br><span class="line"> <span class="hljs-keyword">int</span> a=<span class="hljs-number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p>int a=0;명령을 n번 수행 >> <strong>시간복잡도 O(n)</strong></p></blockquote><h3 id="1-2-n-n-이중for문"><a href="#1-2-n-n-이중for문" class="headerlink" title="1.2 n*n 이중for문"></a>1.2 n*n 이중for문</h3><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i=<span class="hljs-number">0</span> ; i<n; i++){</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> j=<span class="hljs-number">0</span> ; j<n; j++){</span><br><span class="line"> <span class="hljs-keyword">int</span> a=<span class="hljs-number">0</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p>int a=0;명령을 n*n번 수행 >> <strong>시간복잡도 O(n^2)</strong></p></blockquote><h3 id="1-3-n-n-1-n-2-…2-1-이중for문"><a href="#1-3-n-n-1-n-2-…2-1-이중for문" class="headerlink" title="1.3 n(n-1)(n-2) …2*1 이중for문"></a>1.3 n<em>(n-1)</em>(n-2) …2*1 이중for문</h3><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i=<span class="hljs-number">0</span> ; i<n; i++){</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> j=<span class="hljs-number">0</span> ; j<i; j++){</span><br><span class="line"> <span class="hljs-keyword">int</span> a=<span class="hljs-number">0</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p>int a=0;명령을 n(n-1)/2번 수행 >> 1/2<em>n</em>n >> 상수는 무시 >> <strong>시간복잡도 O(n^2)</strong></p></blockquote><h3 id="1-4-if절-있는-for문"><a href="#1-4-if절-있는-for문" class="headerlink" title="1.4 if절 있는 for문"></a>1.4 if절 있는 for문</h3><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i=<span class="hljs-number">0</span> ; i<n; i++){</span><br><span class="line"> <span class="hljs-keyword">if</span>(i==<span class="hljs-number">1</span>){</span><br><span class="line"> <span class="hljs-keyword">int</span> a=<span class="hljs-number">0</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p>최악의 경우 n번 수행(if절 결과에 따라) > O(N)<br>최고차항만 체크</p></blockquote><h2 id="2-입력크기에-따른-수행시간"><a href="#2-입력크기에-따른-수행시간" class="headerlink" title="2. 입력크기에 따른 수행시간"></a>2. 입력크기에 따른 수행시간</h2><ol><li>n의 입력 값에 따라 수행시간 다름</li><li>컴퓨터 사양에 따라 다름</li></ol><h3 id="2-1-O-N-시간복잡도"><a href="#2-1-O-N-시간복잡도" class="headerlink" title="2.1 O(N) 시간복잡도"></a>2.1 O(N) 시간복잡도</h3><ul><li>n이 9000만개일때 보통 1초</li></ul><h3 id="2-2-O-N-2-시간복잡도"><a href="#2-2-O-N-2-시간복잡도" class="headerlink" title="2.2 O(N^2) 시간복잡도"></a>2.2 O(N^2) 시간복잡도</h3><ul><li>n이 10000개일때 보통 1초 > 명령어 실행수 대략 <strong>1억에 1</strong></li></ul><h2 id="3-정렬의-시간복잡도"><a href="#3-정렬의-시간복잡도" class="headerlink" title="3. 정렬의 시간복잡도"></a>3. 정렬의 시간복잡도</h2><h3 id="3-1-선택정렬"><a href="#3-1-선택정렬" class="headerlink" title="3.1 선택정렬"></a>3.1 선택정렬</h3><blockquote><p>최소값 1번 찾는데 O(N)번 * N번 > <strong>O(n^2)</strong></p></blockquote><h3 id="3-2-삽입정렬"><a href="#3-2-삽입정렬" class="headerlink" title="3.2 삽입정렬"></a>3.2 삽입정렬</h3><blockquote><p>원소 하나 삽입 시 O(N)걸림 * N번 > <strong>O(n^2)</strong></p></blockquote><h3 id="3-3-버블-정렬"><a href="#3-3-버블-정렬" class="headerlink" title="3.3 버블 정렬"></a>3.3 버블 정렬</h3><blockquote><p>인접한 원소 비교해서 뒤로 보냄 O(n) 걸림 * n번 > <strong>O(n^2)</strong></p></blockquote><ul><li>선택, 삽입, 버블 정렬은 시간복잡도가 안 좋은편!!</li></ul>]]></content>
<summary type="html">
<h2 id="1-시간복잡도"><a href="#1-시간복잡도" class="headerlink" title="1. 시간복잡도"></a>1. 시간복잡도</h2><blockquote>
<p>문제가 얼마나 빠르게 해결되는지 나타냄<br>대략적으로 몇개의
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/categories/tec/alogrithm/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/tags/alogrithm/"/>
<category term="알고리즘" scheme="https://eunii.github.io/tags/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/"/>
<category term="시간복잡도" scheme="https://eunii.github.io/tags/%EC%8B%9C%EA%B0%84%EB%B3%B5%EC%9E%A1%EB%8F%84/"/>
</entry>
<entry>
<title>[알고리즘] 1. 정렬 기초(선택정렬, 삽입정렬, 버블정렬)</title>
<link href="https://eunii.github.io/2019/12/01/tec/algorithm/al3/"/>
<id>https://eunii.github.io/2019/12/01/tec/algorithm/al3/</id>
<published>2019-11-30T15:00:00.000Z</published>
<updated>2020-01-27T11:59:17.757Z</updated>
<content type="html"><![CDATA[<h2 id="1-정렬"><a href="#1-정렬" class="headerlink" title="1.정렬"></a>1.정렬</h2><blockquote><p>오름차순, 내림차순 </p></blockquote><h3 id="1-1-정렬의-종류"><a href="#1-1-정렬의-종류" class="headerlink" title="1.1 정렬의 종류"></a>1.1 정렬의 종류</h3><ol><li>선택정렬</li><li>삽입정렬</li><li>버블정렬</li></ol><h4 id="1-1-1-선택정렬-예시"><a href="#1-1-1-선택정렬-예시" class="headerlink" title="1.1.1 선택정렬 예시"></a>1.1.1 선택정렬 예시</h4><blockquote><p>배열을 순서대로 탐색하면서 최소값을 앞으로 이동시킴</p></blockquote><h5 id="0-주어진-배열"><a href="#0-주어진-배열" class="headerlink" title="0) 주어진 배열"></a>0) 주어진 배열</h5><table><thead><tr><th>2</th><th>5</th><th>6</th><th>7</th><th>1</th><th>3</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="1-첫번째-정렬-1과-2-자리변경"><a href="#1-첫번째-정렬-1과-2-자리변경" class="headerlink" title="1) 첫번째 정렬(1과 2 자리변경)"></a>1) 첫번째 정렬(1과 2 자리변경)</h5><table><thead><tr><th><strong>1</strong></th><th>5</th><th>6</th><th>7</th><th><strong>2</strong></th><th>3</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="2-두번째-정렬-배열2부터-최소값찾기-2와-5자리-변경"><a href="#2-두번째-정렬-배열2부터-최소값찾기-2와-5자리-변경" class="headerlink" title="2) 두번째 정렬(배열2부터 최소값찾기/2와 5자리 변경)"></a>2) 두번째 정렬(배열2부터 최소값찾기/2와 5자리 변경)</h5><table><thead><tr><th>1</th><th><strong>2</strong></th><th>6</th><th>7</th><th><strong>5</strong></th><th>3</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="3-세번째-정렬-배열3부터-최소값찾기-3와-6자리-변경"><a href="#3-세번째-정렬-배열3부터-최소값찾기-3와-6자리-변경" class="headerlink" title="3) 세번째 정렬(배열3부터 최소값찾기/3와 6자리 변경)"></a>3) 세번째 정렬(배열3부터 최소값찾기/3와 6자리 변경)</h5><table><thead><tr><th>1</th><th>2</th><th>3</th><th>7</th><th>5</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="4-네번째-정렬-배열4부터-최소값찾기-5와-7자리-변경"><a href="#4-네번째-정렬-배열4부터-최소값찾기-5와-7자리-변경" class="headerlink" title="4) 네번째 정렬(배열4부터 최소값찾기/5와 7자리 변경)"></a>4) 네번째 정렬(배열4부터 최소값찾기/5와 7자리 변경)</h5><table><thead><tr><th>1</th><th>2</th><th>3</th><th>5</th><th>7</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="5-다섯번째-정렬-배열5부터-최소값찾기-6와-7자리-변경"><a href="#5-다섯번째-정렬-배열5부터-최소값찾기-6와-7자리-변경" class="headerlink" title="5) 다섯번째 정렬(배열5부터 최소값찾기/6와 7자리 변경)"></a>5) 다섯번째 정렬(배열5부터 최소값찾기/6와 7자리 변경)</h5><table><thead><tr><th>1</th><th>2</th><th>3</th><th>5</th><th>6</th><th>7</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="6-선택정렬끝"><a href="#6-선택정렬끝" class="headerlink" title="6) 선택정렬끝!!"></a>6) 선택정렬끝!!</h5><h4 id="1-2-1-삽입정렬"><a href="#1-2-1-삽입정렬" class="headerlink" title="1.2.1 삽입정렬"></a>1.2.1 삽입정렬</h4><blockquote><p>기준 배열과 나머지 배열 비교하여 작은것 것을 앞으로 바꿈</p></blockquote><p>ex)</p><h5 id="0-주어진-배열-1"><a href="#0-주어진-배열-1" class="headerlink" title="0) 주어진 배열"></a>0) 주어진 배열</h5><table><thead><tr><th>2</th><th>5</th><th>9</th><th>1</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="1-첫번째-정렬"><a href="#1-첫번째-정렬" class="headerlink" title="1) 첫번째 정렬"></a>1) 첫번째 정렬</h5><p>(2와 5비교 유지) </p><table><thead><tr><th>2</th><th>5</th><th>9</th><th>1</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(2와 9비교 유지) </p><table><thead><tr><th>2</th><th>5</th><th>9</th><th>1</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(2와 1비교 1과 2위치 변경)</p><table><thead><tr><th>1</th><th>5</th><th>9</th><th>2</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(1과 6비교 유지)</p><table><thead><tr><th>1</th><th>5</th><th>9</th><th>2</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="2-두번째-정렬-배열2부터-최소값찾기-2와-5자리-변경-1"><a href="#2-두번째-정렬-배열2부터-최소값찾기-2와-5자리-변경-1" class="headerlink" title="2) 두번째 정렬(배열2부터 최소값찾기/2와 5자리 변경)"></a>2) 두번째 정렬(배열2부터 최소값찾기/2와 5자리 변경)</h5><p>(5와 9비교 유지)</p><table><thead><tr><th>1</th><th>5</th><th>9</th><th>2</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(5와 2비교 자리변경)</p><table><thead><tr><th>1</th><th>2</th><th>9</th><th>5</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(2와 6비교 유지)</p><table><thead><tr><th>1</th><th>2</th><th>9</th><th>5</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="3-세번째-정렬-배열3부터-최소값찾기-3와-6자리-변경-1"><a href="#3-세번째-정렬-배열3부터-최소값찾기-3와-6자리-변경-1" class="headerlink" title="3) 세번째 정렬(배열3부터 최소값찾기/3와 6자리 변경)"></a>3) 세번째 정렬(배열3부터 최소값찾기/3와 6자리 변경)</h5><p>(5와9비교 유지)</p><table><thead><tr><th>1</th><th>2</th><th>5</th><th>9</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(5와 6비교 유지)</p><table><thead><tr><th>1</th><th>2</th><th>5</th><th>9</th><th>6</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="4-네번째-정렬-배열3부터-최소값찾기-3와-6자리-변경"><a href="#4-네번째-정렬-배열3부터-최소값찾기-3와-6자리-변경" class="headerlink" title="4) 네번째 정렬(배열3부터 최소값찾기/3와 6자리 변경)"></a>4) 네번째 정렬(배열3부터 최소값찾기/3와 6자리 변경)</h5><p>(9와9비교 변경)</p><table><thead><tr><th>1</th><th>2</th><th>5</th><th>6</th><th>9</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="5-삽입정렬끝"><a href="#5-삽입정렬끝" class="headerlink" title="5) 삽입정렬끝!!"></a>5) 삽입정렬끝!!</h5><h4 id="1-3-1-버블정렬"><a href="#1-3-1-버블정렬" class="headerlink" title="1.3.1 버블정렬"></a>1.3.1 버블정렬</h4><blockquote><p>인접한 두 원소 비교 해서 큰 수를 뒤로 보냄</p></blockquote><p>ex)</p><h5 id="0-주어진-배열-2"><a href="#0-주어진-배열-2" class="headerlink" title="0) 주어진 배열"></a>0) 주어진 배열</h5><table><thead><tr><th>3</th><th>2</th><th>5</th><th>1</th><th>4</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="1-첫번째-정렬-1"><a href="#1-첫번째-정렬-1" class="headerlink" title="1) 첫번째 정렬"></a>1) 첫번째 정렬</h5><p>(3과 2비교 자리 바꿈) </p><table><thead><tr><th>2</th><th>3</th><th>5</th><th>1</th><th>4</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(3과 5비교 유지) </p><table><thead><tr><th>2</th><th>3</th><th>5</th><th>1</th><th>4</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(5와 1비교 자리 변경)</p><table><thead><tr><th>2</th><th>3</th><th>1</th><th>5</th><th>4</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(5와 4비교 변경 > 5자리 확정)</p><table><thead><tr><th>2</th><th>3</th><th>1</th><th>4</th><th>5</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="2-두번째-정렬"><a href="#2-두번째-정렬" class="headerlink" title="2) 두번째 정렬"></a>2) 두번째 정렬</h5><p>(2와 3비교 유지)</p><table><thead><tr><th>2</th><th>3</th><th>1</th><th>4</th><th>5</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(3와 1비교 자리변경)</p><table><thead><tr><th>2</th><th>1</th><th>3</th><th>4</th><th>5</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(3와 4비교 유지 > 4자리 확정)</p><table><thead><tr><th>2</th><th>1</th><th>3</th><th>4</th><th>5</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="3-세번째-정렬"><a href="#3-세번째-정렬" class="headerlink" title="3) 세번째 정렬"></a>3) 세번째 정렬</h5><p>(2와1비교 변경)</p><table><thead><tr><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th></tr></thead><tbody><tr><td></td></tr></tbody></table><p>(2와 3비교 유지 > 3자리 확정)</p><table><thead><tr><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="4-네번째-정렬"><a href="#4-네번째-정렬" class="headerlink" title="4) 네번째 정렬"></a>4) 네번째 정렬</h5><p>(1와2비교 유지 > 2자리 확정)</p><table><thead><tr><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th></tr></thead><tbody><tr><td></td></tr></tbody></table><h5 id="5-버블정렬끝"><a href="#5-버블정렬끝" class="headerlink" title="5) 버블정렬끝!!"></a>5) 버블정렬끝!!</h5>]]></content>
<summary type="html">
<h2 id="1-정렬"><a href="#1-정렬" class="headerlink" title="1.정렬"></a>1.정렬</h2><blockquote>
<p>오름차순, 내림차순 </p>
</blockquote>
<h3 id="1-1-정렬의-종류"
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/categories/tec/alogrithm/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/tags/alogrithm/"/>
<category term="정렬" scheme="https://eunii.github.io/tags/%EC%A0%95%EB%A0%AC/"/>
<category term="알고리즘" scheme="https://eunii.github.io/tags/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/"/>
</entry>
<entry>
<title>[Hexo와 깃허브로 블로그 만들기] 블로그에 layout 만들어 빠른 포스팅 하기</title>
<link href="https://eunii.github.io/2019/10/18/tec/blog/blog12/"/>
<id>https://eunii.github.io/2019/10/18/tec/blog/blog12/</id>
<published>2019-10-18T04:10:25.000Z</published>
<updated>2019-10-18T04:13:01.317Z</updated>
<content type="html"><![CDATA[<h2 id="1-scaffolds-파일-아래-blog-md-파일을-만든다"><a href="#1-scaffolds-파일-아래-blog-md-파일을-만든다" class="headerlink" title="1. /scaffolds 파일 아래 blog.md 파일을 만든다."></a>1. /scaffolds 파일 아래 blog.md 파일을 만든다.</h2><p>원하는 형식으로 Front-Matter부분을 수정한다.<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">---</span><br><span class="line">title: {{ title }}</span><br><span class="line"></span><br><span class="line">categories:</span><br><span class="line"> [tec, blog]</span><br><span class="line">tags:</span><br><span class="line"> [blog, tec, hexo, github]</span><br><span class="line"> </span><br><span class="line">toc: true</span><br><span class="line">date: {{ date }}</span><br><span class="line">---</span><br></pre></td></tr></table></figure></p><h2 id="2-커멘드-창에서-프로젝트-위치아래에서-아래와-같이-명령어를-입력한다"><a href="#2-커멘드-창에서-프로젝트-위치아래에서-아래와-같이-명령어를-입력한다" class="headerlink" title="2. 커멘드 창에서 (프로젝트 위치아래에서) 아래와 같이 명령어를 입력한다."></a>2. 커멘드 창에서 (프로젝트 위치아래에서) 아래와 같이 명령어를 입력한다.</h2><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new blog -p tec/blog/blog13 "레이아웃 만들기"</span><br></pre></td></tr></table></figure><ul><li>blog: 아까 scaffolders에서 만든 레이아웃 파일명 </li><li>-p: 경로명 </li><li>“레이아웃만들기”: title안에 들어갈 내용<br><a href="https://hexo.io/docs/writing#content-inner" rel="external nofollow noopener noreferrer" target="_blank">명령어 옵션 참고</a></li></ul><h2 id="3-source-posts-tec-blog-blog13-md-파일이-생성된-것을-확인-할-수있다"><a href="#3-source-posts-tec-blog-blog13-md-파일이-생성된-것을-확인-할-수있다" class="headerlink" title="3. /source/_posts/tec/blog/blog13.md 파일이 생성된 것을 확인 할 수있다."></a>3. /source/_posts/tec/blog/blog13.md 파일이 생성된 것을 확인 할 수있다.</h2><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">---</span><br><span class="line">title: "레이아웃 만들기"</span><br><span class="line">categories:</span><br><span class="line"> [tec, blog]</span><br><span class="line">tags:</span><br><span class="line"> [blog, tec, hexo, github, google-analytics]</span><br><span class="line">toc: true </span><br><span class="line">date: 2019/10/18 13:09:23 </span><br><span class="line">---</span><br></pre></td></tr></table></figure><h2 id="4-해당-파일에-원하는-글을-써서-배포한다"><a href="#4-해당-파일에-원하는-글을-써서-배포한다" class="headerlink" title="4. 해당 파일에 원하는 글을 써서 배포한다."></a>4. 해당 파일에 원하는 글을 써서 배포한다.</h2>]]></content>
<summary type="html">
<h2 id="1-scaffolds-파일-아래-blog-md-파일을-만든다"><a href="#1-scaffolds-파일-아래-blog-md-파일을-만든다" class="headerlink" title="1. /scaffolds 파일 아래 blog.m
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="blog" scheme="https://eunii.github.io/categories/tec/blog/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="blog" scheme="https://eunii.github.io/tags/blog/"/>
<category term="github" scheme="https://eunii.github.io/tags/github/"/>
<category term="hexo" scheme="https://eunii.github.io/tags/hexo/"/>
<category term="google-analytics" scheme="https://eunii.github.io/tags/google-analytics/"/>
</entry>
<entry>
<title>[React 교과서] 6장 React 에서 이벤트 다루기</title>
<link href="https://eunii.github.io/2019/09/03/tec/react/react7/"/>
<id>https://eunii.github.io/2019/09/03/tec/react/react7/</id>
<published>2019-09-03T02:26:25.000Z</published>
<updated>2019-09-03T08:20:08.795Z</updated>
<content type="html"><![CDATA[<blockquote><p>리엑트 교과서를 정리한 내용입니다.</p></blockquote><h2 id="6-1-React에서-DOM이벤트-다루기"><a href="#6-1-React에서-DOM이벤트-다루기" class="headerlink" title="6.1 React에서 DOM이벤트 다루기"></a>6.1 React에서 DOM이벤트 다루기</h2><p>아래 예제 코드는 이벤트 리스너에서 this를 콘솔에 표시하도록 한 코드. 여기서 event 객체는 내장 DOM이벤트를 객체를 개선한 것으로 합성 이벤트라고 부름 </p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><button onclick={(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">event</span>)</span>{</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-keyword">this</span>.event)</span><br><span class="line">}).bind(<span class="hljs-keyword">this</span>)}></span><br><span class="line">Save</span><br><span class="line"><<span class="hljs-regexp">/button></span></span><br></pre></td></tr></table></figure><p>아래 경우에 bind(tnis)로 바인딩하지 않는다.</p><ul><li>this를 이용해서 해당 클래스를 참조 할 필요가 없을때</li><li>ES6+ 클래스 대신 예쩐방식인 React.createClass()를 사용할때. 이때는 createClass()가 자동으로 바인딩함. </li><li>화살표 함수(() => {})를 사용할 때</li></ul><p>Reaact버전 15에서 지원하는 DOM 이벤트</p><table><thead><tr><th>이벤트 분류</th><th>React가 지원하는 이벤트</th></tr></thead><tbody><tr><td>마우스 이벤트</td><td>onClick, onContentMenu, <br> onDoubleClick, onDrag, <br>onDragEnd, onDragEnter,<br> onDragExit, onDragLeave, <br> onDragOver, onDragStart,<br> onDrop, onMouseDown, <br> onMouseEnter, onMouseLeave, <br> onMouseMove, onMouseOut,<br> onMouseOver, onMouseUp <br></td></tr><tr><td>키보드 이벤트</td><td>onKeyDown, onKeyPress, onKeyup</td></tr><tr><td>클립보드 이벤트</td><td>onCopy, onCut, onPaste</td></tr><tr><td>폼 이벤트</td><td>onChange, onInpute,<br> onSubmit, onTnvalid</td></tr><tr><td>포커스 이벤트</td><td>onFocus, onBlur</td></tr><tr><td>터치 이벤트</td><td>onTouchCancel, onTouchEnd,<br> onTouchMove, onTouchStart</td></tr><tr><td>UI이벤트</td><td>onScroll</td></tr><tr><td>휠 이벤트</td><td>onWheel</td></tr><tr><td>영역선택 이벤트</td><td>onSelect</td></tr><tr><td>이미지 이벤트</td><td>onLoad, onError</td></tr><tr><td>애니메이션 이벤트</td><td>onAnimationStart, onAnimationEnd, <br> onAnimationIteration</td></tr><tr><td>트랜지션 이벤트</td><td>onTransitionEnd</td></tr></tbody></table><h3 id="6-1-1-캡쳐-및-버블링-단계"><a href="#6-1-1-캡쳐-및-버블링-단계" class="headerlink" title="6.1.1 캡쳐 및 버블링 단계"></a>6.1.1 캡쳐 및 버블링 단계</h3><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Mouse</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span></span></span><br><span class="line"> <div</span><br><span class="line"> style={{border: '1px solid red'}}</span><br><span class="line"> onMouseOverCapture={((event)=>{</span><br><span class="line"> console.log('mouse over on capture event')</span><br><span class="line"> console.dir(event, this)}).bind(this)}</span><br><span class="line"> onMouseOver={((event)=>{</span><br><span class="line"> console.log('mouse over on bubbling event')</span><br><span class="line"> console.dir(event, this)}).bind(this)} ></span><br><span class="line"> Open DevTools and move your mouse cursor over here</span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="6-1-2-React이벤트-살펴보기"><a href="#6-1-2-React이벤트-살펴보기" class="headerlink" title="6.1.2 React이벤트 살펴보기"></a>6.1.2 React이벤트 살펴보기</h3><h3 id="6-1-3-React-합성-이벤트-객체-다루기"><a href="#6-1-3-React-합성-이벤트-객체-다루기" class="headerlink" title="6.1.3 React 합성 이벤트 객체 다루기"></a>6.1.3 React 합성 이벤트 객체 다루기</h3><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Mouse</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span></span></span><br><span class="line"> <div</span><br><span class="line"> style={{border: '1px solid red'}}</span><br><span class="line"> onMouseOver={((event)=>{</span><br><span class="line"> console.log('mouse is over with event')</span><br><span class="line"> console.dir(event)}).bind(this)} ></span><br><span class="line"> Open DevTools and move your mouse cursor over here</span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="6-1-4-이벤트와-상태-사용하기"><a href="#6-1-4-이벤트와-상태-사용하기" class="headerlink" title="6.1.4 이벤트와 상태 사용하기"></a>6.1.4 이벤트와 상태 사용하기</h3><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Content</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {<span class="hljs-attr">counter</span>: <span class="hljs-number">0</span>}</span><br><span class="line"> }</span><br><span class="line"> handleClick(event) {</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({<span class="hljs-attr">counter</span>: ++<span class="hljs-keyword">this</span>.state.counter})</span><br><span class="line"> }</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <div></span><br><span class="line"> <button</span><br><span class="line"> onClick={<span class="hljs-keyword">this</span>.handleClick.bind(<span class="hljs-keyword">this</span>)}</span><br><span class="line"> className=<span class="hljs-string">"btn btn-primary"</span>></span><br><span class="line"> Don<span class="hljs-string">'t click me {this.state.counter} times!</span></span><br><span class="line"><span class="hljs-string"> </button></span></span><br><span class="line"><span class="hljs-string"> </div></span></span><br><span class="line"><span class="hljs-string"> )</span></span><br><span class="line"><span class="hljs-string"> }</span></span><br><span class="line"><span class="hljs-string">}</span></span><br></pre></td></tr></table></figure><h3 id="6-1-5-이벤트-핸들러를-속성으로-전달하기"><a href="#6-1-5-이벤트-핸들러를-속성으로-전달하기" class="headerlink" title="6.1.5 이벤트 핸들러를 속성으로 전달하기"></a>6.1.5 이벤트 핸들러를 속성으로 전달하기</h3><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ClickCounterButton</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">button</span></span></span></span><br><span class="line"><span class="hljs-xml"> onClick={this.props.handler}</span></span><br><span class="line"><span class="hljs-xml"> className="btn btn-danger"></span></span><br><span class="line"><span class="hljs-xml"> Increase Volume (Current volume is {this.props.counter})</span></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">button</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="6-1-6-컴포넌트-간의-데이터-교환"><a href="#6-1-6-컴포넌트-간의-데이터-교환" class="headerlink" title="6.1.6 컴포넌트 간의 데이터 교환"></a>6.1.6 컴포넌트 간의 데이터 교환</h3><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ClickCounterButton</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">button</span></span></span></span><br><span class="line"><span class="hljs-xml"> onClick={this.props.handler}</span></span><br><span class="line"><span class="hljs-xml"> className="btn btn-info"></span></span><br><span class="line"><span class="hljs-xml"> Don't touch me with your dirty hands!</span></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">button</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Content</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-keyword">this</span>.handleClick = <span class="hljs-keyword">this</span>.handleClick.bind(<span class="hljs-keyword">this</span>)</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {<span class="hljs-attr">counter</span>: <span class="hljs-number">0</span>}</span><br><span class="line"> }</span><br><span class="line"> handleClick(event) {</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({<span class="hljs-attr">counter</span>: ++<span class="hljs-keyword">this</span>.state.counter})</span><br><span class="line"> }</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <div></span><br><span class="line"> <ClickCounterButton handler={<span class="hljs-keyword">this</span>.handleClick}/></span><br><span class="line"> <br/></span><br><span class="line"> <Counter value={<span class="hljs-keyword">this</span>.state.counter}/></span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> )</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure><h2 id="6-2-React가-지원하지-않는-DOM이벤트-처리하기"><a href="#6-2-React가-지원하지-않는-DOM이벤트-처리하기" class="headerlink" title="6.2 React가 지원하지 않는 DOM이벤트 처리하기"></a>6.2 React가 지원하지 않는 DOM이벤트 처리하기</h2><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Radio</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-keyword">this</span>.handleResize = <span class="hljs-keyword">this</span>.handleResize.bind(<span class="hljs-keyword">this</span>)</span><br><span class="line"> <span class="hljs-keyword">let</span> order = props.order</span><br><span class="line"> <span class="hljs-keyword">let</span> i = <span class="hljs-number">1</span></span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {</span><br><span class="line"> outerStyle: <span class="hljs-keyword">this</span>.getStyle(<span class="hljs-number">4</span>, i),</span><br><span class="line"> innerStyle: <span class="hljs-keyword">this</span>.getStyle(<span class="hljs-number">1</span>, i),</span><br><span class="line"> selectedStyle: <span class="hljs-keyword">this</span>.getStyle(<span class="hljs-number">2</span>, i),</span><br><span class="line"> taggerStyle: {<span class="hljs-attr">top</span>: order*<span class="hljs-number">20</span>, <span class="hljs-attr">width</span>: <span class="hljs-number">25</span>, <span class="hljs-attr">height</span>: <span class="hljs-number">25</span>}</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> getStyle(i, m) {</span><br><span class="line"> <span class="hljs-keyword">let</span> value = i*m</span><br><span class="line"> <span class="hljs-keyword">return</span> {</span><br><span class="line"> top: value,</span><br><span class="line"> bottom: value,</span><br><span class="line"> left: value,</span><br><span class="line"> right: value,</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> componentDidMount() {</span><br><span class="line"> <span class="hljs-built_in">window</span>.addEventListener(<span class="hljs-string">'resize'</span>, <span class="hljs-keyword">this</span>.handleResize)</span><br><span class="line"> }</span><br><span class="line"> componentWillUnmount() {</span><br><span class="line"> <span class="hljs-built_in">window</span>.removeEventListener(<span class="hljs-string">'resize'</span>, <span class="hljs-keyword">this</span>.handleResize)</span><br><span class="line"> }</span><br><span class="line"> handleResize(event) {</span><br><span class="line"> <span class="hljs-keyword">let</span> w = <span class="hljs-number">1</span>+ <span class="hljs-built_in">Math</span>.round(<span class="hljs-built_in">window</span>.innerWidth / <span class="hljs-number">300</span>)</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({</span><br><span class="line"> taggerStyle: {<span class="hljs-attr">top</span>: <span class="hljs-keyword">this</span>.props.order*w*<span class="hljs-number">10</span>, <span class="hljs-attr">width</span>: w*<span class="hljs-number">10</span>, <span class="hljs-attr">height</span>: w*<span class="hljs-number">10</span>},</span><br><span class="line"> textStyle: {<span class="hljs-attr">left</span>: w*<span class="hljs-number">13</span>, <span class="hljs-attr">fontSize</span>: <span class="hljs-number">7</span>*w}</span><br><span class="line"> })</span><br><span class="line"> }</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span></span></span><br><span class="line"> <div className="radio-tagger" style={this.state.taggerStyle}></span><br><span class="line"> <input type="radio" name={this.props.name} id={this.props.id}></span><br><span class="line"> </input></span><br><span class="line"> <label htmlFor={this.props.id}></span><br><span class="line"> <div className="radio-text" style={this.state.textStyle}>{this.props.label}</div></span><br><span class="line"> <div className="radio-outer" style={this.state.outerStyle}></span><br><span class="line"> <div className="radio-inner" style={this.state.innerStyle}></span><br><span class="line"> <div className="radio-selected" style={this.state.selectedStyle}></span><br><span class="line"> </div></span><br><span class="line"> </div></span><br><span class="line"> </div></span><br><span class="line"> </label></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="6-3-React를-다른-라이브러리와-통합하기-jQurey-UI이벤트"><a href="#6-3-React를-다른-라이브러리와-통합하기-jQurey-UI이벤트" class="headerlink" title="6.3 React를 다른 라이브러리와 통합하기: jQurey UI이벤트"></a>6.3 React를 다른 라이브러리와 통합하기: jQurey UI이벤트</h2><h3 id="6-3-1-버튼-통합하기"><a href="#6-3-1-버튼-통합하기" class="headerlink" title="6.3.1. 버튼 통합하기"></a>6.3.1. 버튼 통합하기</h3><p>방법1 jQuery슬라이더를 위한 이벤트를 React컴포넌트에서 등록하는 방법</p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SliderButtons</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {<span class="hljs-attr">sliderValue</span>: <span class="hljs-number">0</span>}</span><br><span class="line"> <span class="hljs-keyword">this</span>.handleSlide = <span class="hljs-keyword">this</span>.handleSlide.bind(<span class="hljs-keyword">this</span>)</span><br><span class="line"> <span class="hljs-keyword">this</span>.handleChange = <span class="hljs-keyword">this</span>.handleChange.bind(<span class="hljs-keyword">this</span>)</span><br><span class="line"> }</span><br><span class="line"> handleSlide(event, ui) {</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({<span class="hljs-attr">sliderValue</span>: ui.value})</span><br><span class="line"> }</span><br><span class="line"> handleChange(value) {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-params">()</span>=></span> {</span><br><span class="line"> $(<span class="hljs-string">'#slider'</span>).slider(<span class="hljs-string">'value'</span>, <span class="hljs-keyword">this</span>.state.sliderValue + value)</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({<span class="hljs-attr">sliderValue</span>: <span class="hljs-keyword">this</span>.state.sliderValue + value})</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> componentDidMount() {</span><br><span class="line"> $(<span class="hljs-string">'#slider'</span>).on(<span class="hljs-string">'slide'</span>, <span class="hljs-keyword">this</span>.handleSlide)</span><br><span class="line"> }</span><br><span class="line"> componentWillUnmount() {</span><br><span class="line"> $(<span class="hljs-string">'#slider'</span>).off(<span class="hljs-string">'slide'</span>, <span class="hljs-keyword">this</span>.handleSlide)</span><br><span class="line"> }</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span></span></span><br><span class="line"> <button disabled={(this.state.sliderValue<1) ? true : false}</span><br><span class="line"> className="btn default-btn"</span><br><span class="line"> onClick={this.handleChange(-1)}></span><br><span class="line"> 1 Less ({this.state.sliderValue - 1})</span><br><span class="line"> </button></span><br><span class="line"> <button disabled={(this.state.sliderValue>99) ? true : false}</span><br><span class="line"> className="btn default-btn"</span><br><span class="line"> onClick={this.handleChange(1)}></span><br><span class="line"> 1 More ({this.state.sliderValue + 1})</span><br><span class="line"> </button></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"><span class="hljs-xml"> }</span></span><br><span class="line"><span class="hljs-xml">}</span></span><br></pre></td></tr></table></figure><h3 id="6-3-2-라벨-통합하기"><a href="#6-3-2-라벨-통합하기" class="headerlink" title="6.3.2 라벨 통합하기"></a>6.3.2 라벨 통합하기</h3><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SliderValue</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-keyword">this</span>.handleSlide = <span class="hljs-keyword">this</span>.handleSlide.bind(<span class="hljs-keyword">this</span>)</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {<span class="hljs-attr">sliderValue</span>: <span class="hljs-number">0</span>}</span><br><span class="line"> }</span><br><span class="line"> handleSlide(event) {</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({<span class="hljs-attr">sliderValue</span>: event.detail.ui.value})</span><br><span class="line"> }</span><br><span class="line"> componentDidMount() {</span><br><span class="line"> <span class="hljs-built_in">window</span>.addEventListener(<span class="hljs-string">'slide'</span>, <span class="hljs-keyword">this</span>.handleSlide)</span><br><span class="line"> }</span><br><span class="line"> componentWillUnmount() {</span><br><span class="line"> <span class="hljs-built_in">window</span>.removeEventListener(<span class="hljs-string">'slide'</span>, <span class="hljs-keyword">this</span>.handleSlide)</span><br><span class="line"> }</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">""</span> ></span></span></span><br><span class="line"><span class="hljs-xml"> Value: {this.state.sliderValue}</span></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<blockquote>
<p>리엑트 교과서를 정리한 내용입니다.</p>
</blockquote>
<h2 id="6-1-React에서-DOM이벤트-다루기"><a href="#6-1-React에서-DOM이벤트-다루기" class="headerlink" t
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="react" scheme="https://eunii.github.io/categories/tec/react/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="react" scheme="https://eunii.github.io/tags/react/"/>
<category term="프레임워크" scheme="https://eunii.github.io/tags/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/"/>
<category term="리엑트" scheme="https://eunii.github.io/tags/%EB%A6%AC%EC%97%91%ED%8A%B8/"/>
</entry>
<entry>
<title>[React 교과서] 5장 React 컴포넌트 라이프사이클 이벤트</title>
<link href="https://eunii.github.io/2019/08/29/tec/react/react6/"/>
<id>https://eunii.github.io/2019/08/29/tec/react/react6/</id>
<published>2019-08-29T02:26:25.000Z</published>
<updated>2019-08-29T06:44:41.140Z</updated>
<content type="html"><![CDATA[<blockquote><p>리엑트 교과서를 정리한 내용입니다.</p></blockquote><h2 id="5-1-React컴포넌트-라이프사이클-이벤트-한눈에-살펴보기"><a href="#5-1-React컴포넌트-라이프사이클-이벤트-한눈에-살펴보기" class="headerlink" title="5.1 React컴포넌트 라이프사이클 이벤트 한눈에 살펴보기"></a>5.1 React컴포넌트 라이프사이클 이벤트 한눈에 살펴보기</h2><p>라이프사이클 이벤트를 기반으로 컴포넌트의 동작을 제어하고 사용자 정의를 할 수 있다. </p><ul><li>마운팅 이벤트 : React엘리먼트를 DOM 노드에 추가할때 발생</li><li>갱신 이벤트 : 속성이나 상태가 변경되어 React엘리먼트를 갱신할 때 발생</li><li>언마운팅이벤트 : React엘리먼트를 DOM에서 제거할때 발생</li></ul><h2 id="5-2-이벤트-분류"><a href="#5-2-이벤트-분류" class="headerlink" title="5.2 이벤트 분류"></a>5.2 이벤트 분류</h2><ul><li>마운팅 : React가 이벤트를 한번만 실행</li><li>갱신: React가 이벤트를 여러번 실행</li><li>언마운팅: React가 이벤트를 한번만 실행</li></ul><p>아래 순서로 라이플 사이클이 실행된다</p><ol><li>constructor() : 엘리먼트를 생성하여 기본속성과 상태를 설정할때 실행</li><li>마운팅<ul><li>componentWillMount(): DOM에 삽입전에 실행</li><li>componentDidMount(): DOM에 삽입 후에 실행</li></ul></li><li>갱신<ul><li>componentWillRecetiveProps(nextProps) : 컴포넌트가 속성을 받기 직전에 실행</li><li>shouldComponentUpdate(nextProps, nextState) : 컴포넌트가 갱신되는 조건을 정의해서 재렌더링을 초적화함. boolean값을 반환</li><li>componentWillUpdate(nextProps, nextState) : 컴포넌트가 갱신되기 직전에 실행</li><li>componentDidUpdate(prevProps, prevState) : 컴포넌트가 갱신된 후에 실행</li></ul></li><li>언마운팅<ul><li>componentWillUnmount() : 컴포넌트를 DOM에서 제거하기 전에 실행, 구독한 이벤트를 제거하거나 다른 정리 작업 수행 가능</li></ul></li></ol><ul><li>라이플사이클 이벤트와 속성 및 상태의 상관관계</li></ul><table><thead><tr><th>마운팅</th><th>컴포넌트 속성 갱신</th><th>컴포넌트 상태 갱신</th></tr></thead><tbody><tr><td>constructor()</td><td></td><td></td></tr><tr><td>componentWillMount()</td><td>componentWillRecetiveProps()</td><td></td></tr><tr><td></td><td>shouldComponentUpdate()</td><td>shouldComponentUpdate()</td></tr><tr><td></td><td>componentWillUpdate()</td><td>componentWillUpdate()</td></tr><tr><td>render()</td><td>render()</td><td>render()</td></tr><tr><td></td><td>componentDidUpdate()</td><td>componentDidUpdate()</td></tr><tr><td>componentDidMount()</td><td></td><td></td></tr><tr><td></td><td></td></tr></tbody></table><table><thead><tr><th>forceUpdate()를 이용한 갱신</th><th>언마운팅</th></tr></thead><tbody><tr><td></td><td></td></tr><tr><td></td><td></td></tr><tr><td></td><td></td></tr><tr><td></td><td></td></tr><tr><td>componentWillUpdate()</td><td></td></tr><tr><td>render()</td><td></td></tr><tr><td>componentDidUpdate()</td><td></td></tr><tr><td></td><td></td></tr><tr><td></td><td>componentWillUnmount()</td></tr></tbody></table><h2 id="5-3-이벤트-구현"><a href="#5-3-이벤트-구현" class="headerlink" title="5.3 이벤트 구현"></a>5.3 이벤트 구현</h2><p>라이프사이클 이벤트를 구현하려면 클래스에 메서드를 정의해야함.<br>ex) componentDidMouht()를 정의하면 컴포넌트 클래스의 엘리먼트가 DOM에 추가되었을때 이 메서드 호출하고 마운팅으로 분류 되어있으므로 컴포넌트 클래스의 인스턴스마다 한번만 호출됨. </p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Content</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> componentWillMount(){</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(ReactDOM.findDOMNode(<span class="hljs-keyword">this</span>)) <span class="hljs-comment">// DOM 노드가 null</span></span><br><span class="line"> }</span><br><span class="line"> componentDidMount(){</span><br><span class="line"> <span class="hljs-built_in">console</span>.dir(ReactDOM.findDOMNode(<span class="hljs-keyword">this</span>)) <span class="hljs-comment">// DOM 노드가 <div></span></span><br><span class="line"> }</span><br><span class="line"> render(){</span><br><span class="line"> <span class="hljs-keyword">return</span>()</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li>DOM은 늘 대문자로 쓴다.</li></ul><h2 id="5-4-모든-이벤트-실행하기"><a href="#5-4-모든-이벤트-실행하기" class="headerlink" title="5.4 모든 이벤트 실행하기"></a>5.4 모든 이벤트 실행하기</h2><ul><li>Logger컴포넌트의 렌더링과 세번의 갱신 실행 코드<figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Content</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-keyword">this</span>.launchClock()</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {</span><br><span class="line"> counter: <span class="hljs-number">0</span>,</span><br><span class="line"> currentTime: (<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>()).toLocaleString()</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> launchClock() {</span><br><span class="line"> setInterval(<span class="hljs-function"><span class="hljs-params">()</span>=></span>{</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({</span><br><span class="line"> counter: ++<span class="hljs-keyword">this</span>.state.counter,</span><br><span class="line"> currentTime: (<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>()).toLocaleString()</span><br><span class="line"> })</span><br><span class="line"> }, <span class="hljs-number">1000</span>)</span><br><span class="line"> }</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.state.counter > <span class="hljs-number">2</span>) <span class="hljs-keyword">return</span> <div/></span><br><span class="line"> <span class="hljs-keyword">return</span> <Logger time={this.state.currentTime}></Logger></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Logger</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'constructor'</span>)</span><br><span class="line"> }</span><br><span class="line"> componentWillMount() {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'componentWillMount is triggered'</span>)</span><br><span class="line"> }</span><br><span class="line"> componentDidMount(e) {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'componentDidMount is triggered'</span>)</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'DOM node: '</span>, ReactDOM.findDOMNode(<span class="hljs-keyword">this</span>))</span><br><span class="line"> }</span><br><span class="line"> componentWillReceiveProps(newProps) {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'componentWillReceiveProps is triggered'</span>)</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'new props: '</span>, newProps)</span><br><span class="line"> }</span><br><span class="line"> shouldComponentUpdate(newProps, newState) {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'shouldComponentUpdate is triggered'</span>)</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'new props: '</span>, newProps)</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'new state: '</span>, newState)</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span></span><br><span class="line"> }</span><br><span class="line"> componentWillUpdate(newProps, newState) {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'componentWillUpdate is triggered'</span>)</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'new props: '</span>, newProps)</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'new state: '</span>, newState)</span><br><span class="line"> }</span><br><span class="line"> componentDidUpdate(oldProps, oldState) {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'componentDidUpdate is triggered'</span>)</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'old props: '</span>, oldProps)</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'old state: '</span>, oldState)</span><br><span class="line"> }</span><br><span class="line"> componentWillUnmount() {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'componentWillUnmount'</span>)</span><br><span class="line"> }</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'rendering... Display'</span>)</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <div>{<span class="hljs-keyword">this</span>.props.time}<<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> )</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure><h2 id="5-5-마운팅-이벤트"><a href="#5-5-마운팅-이벤트" class="headerlink" title="5.5 마운팅 이벤트"></a>5.5 마운팅 이벤트</h2><p>마운팅 이벤트 유형은 실제 DOM에 컴포넌트를 추가하는 것에 대한 이벤트다.</p><ul><li>componentWillMount(): React엘리먼트가 실제 DOM에 곧 추가 될 것을 알림</li><li>componentDidMount(): React엘리먼트를 실제 DOM에 추가한 시전으로, 이 시점의 React엘리먼트는 DOM노드임.<br>*constructor()는 componentWillMount()보다 먼저 실행됨. </li></ul><h3 id="5-5-1-componentWillMount"><a href="#5-5-1-componentWillMount" class="headerlink" title="5.5.1 componentWillMount()"></a>5.5.1 componentWillMount()</h3><p>초기 렌더링 직전에 실행됨. 브라우저와 프론트엔드에서 이루어짐.<br>서버 렌더링 과정에서도 componentWillMount()는 실행됨. </p><h3 id="5-5-2-componentDidMount"><a href="#5-5-2-componentDidMount" class="headerlink" title="5.5.2 componentDidMount()"></a>5.5.2 componentDidMount()</h3><p>초기렌더링 마친 후 실행됨. 브라우저에서 한번 실행되고 서버렌더링에서는 실행 안 됨.<br>자식엘리먼트를 참조로 접근할 수 있음. 자식 컴포넌트의 componentDidMount()는 부모 컴포넌트의 componentDidMount()보다 먼저 호출됨 </p><p>componentDidMount() 이벤트는 다른 라이브러리를 통합하기 가장 적절한 위치임. </p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Users</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {</span><br><span class="line"> users: [] <span class="hljs-comment">// 이렇게 초기화 해놔야 render()에서 해당 상태가 존재하는지 안 하는지 신경 안쓸 수 있음</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> componentDidMount() {</span><br><span class="line"> fetch(<span class="hljs-keyword">this</span>.props[<span class="hljs-string">'data-url'</span>])</span><br><span class="line"> .then(<span class="hljs-function">(<span class="hljs-params">response</span>)=></span>response.json())</span><br><span class="line"> .then(<span class="hljs-function">(<span class="hljs-params">users</span>)=></span><span class="hljs-keyword">this</span>.setState({<span class="hljs-attr">users</span>: users}))</span><br><span class="line"> }</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <div className="container"></span><br><span class="line"> <h1>List of Users</h1></span><br><span class="line"> <table className="table-striped table-condensed table table-bordered table-hover"></span><br><span class="line"> <tbody>{this.state.users.map((user)=></span><br><span class="line"> <tr key={user.id}></span><br><span class="line"> <td>{user.first_name} {user.last_name}</td></span><br><span class="line"> <td> {user.email}</td></span><br><span class="line"> <td> {user.ip_address}</td></span><br><span class="line"> </tr>)}</span><br><span class="line"> </tbody></span><br><span class="line"> </table></span><br><span class="line"> </div></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>XHR 요청을 위한 코드를 componentDidMount()에 사용하는 것이 좋음</p><h2 id="5-6-갱신-이벤트"><a href="#5-6-갱신-이벤트" class="headerlink" title="5.6 갱신 이벤트"></a>5.6 갱신 이벤트</h2><p>마운팅 이벤트는 React를 다른 프레임워크나 라이브러리 데이터 저장소와 연결하는데 사용하곤 함.<br>갱신 이벤트는 컴포넌트를 갱신하는것과 관련됨. </p><ol><li>componentWillRecivierProps(newProps)</li><li>shouldComponentUpdate()</li><li>componentWillIpdate()</li><li>componentDidUpdate()</li></ol><h2 id="5-7-언마운팅-이벤트"><a href="#5-7-언마운팅-이벤트" class="headerlink" title="5.7 언마운팅 이벤트"></a>5.7 언마운팅 이벤트</h2><p>DOM에서 요소를 분리하거나 제거하는것</p><h3 id="5-7-1-componentWillUnmount"><a href="#5-7-1-componentWillUnmount" class="headerlink" title="5.7.1 componentWillUnmount()"></a>5.7.1 componentWillUnmount()</h3><p>DOM에서 컴포넌트가 제거되기 직전 호출.<br>ex)타이머 제거하거나 DOM요소 정리하거나, componentDidMount()에서 연결한 이벤트 제거 등. </p>]]></content>
<summary type="html">
<blockquote>
<p>리엑트 교과서를 정리한 내용입니다.</p>
</blockquote>
<h2 id="5-1-React컴포넌트-라이프사이클-이벤트-한눈에-살펴보기"><a href="#5-1-React컴포넌트-라이프사이클-이벤트-한눈에-살펴보기
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="react" scheme="https://eunii.github.io/categories/tec/react/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="react" scheme="https://eunii.github.io/tags/react/"/>
<category term="프레임워크" scheme="https://eunii.github.io/tags/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/"/>
<category term="리엑트" scheme="https://eunii.github.io/tags/%EB%A6%AC%EC%97%91%ED%8A%B8/"/>
</entry>
<entry>
<title>[React 교과서] 4장 React 컴포넌트의 객체 상태</title>
<link href="https://eunii.github.io/2019/08/28/tec/react/react5/"/>
<id>https://eunii.github.io/2019/08/28/tec/react/react5/</id>
<published>2019-08-28T08:26:25.000Z</published>
<updated>2019-08-29T02:01:15.084Z</updated>
<content type="html"><![CDATA[<blockquote><p>리엑트 교과서를 정리한 내용입니다.</p></blockquote><p>리엑트에서 가장 중요한 부분이다.</p><h2 id="4-1-React컴포넌트의-상태란"><a href="#4-1-React컴포넌트의-상태란" class="headerlink" title="4.1 React컴포넌트의 상태란?"></a>4.1 React컴포넌트의 상태란?</h2><p>React의 상태는 컴포넌트의 변경 가능한 데이터 저장소이다.<br>컴포넌트를 속성과 상태가 있는 함수라고 생각하면 함수의 결과가 UI표현(뷰)이다.<br>속성과 상태는 모두 뷰를 갱신하기 위해 사용하지만 목적이 다름. </p><ul><li>상태:<br>상태는 이름을 활용하여 접근함. this.state 객체속성 ex) this.state.inputFileValue<br>뷰의 랜더링이 갱신될 때 동적 정보를 출력하기 위해 사용됨.<br>관련된 부분만 갱신됨.</li></ul><p>아래 안티 패턴 예시<br>상태 외의 다른 값을 변경해도 뷰를 갱신할 수 없다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">let</span> inputValue =<span class="hljs-string">'Texas'</span></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Autocomplete</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> updateValues(){ <span class="hljs-comment">//--사용자 입력에 의해 실행됨</span></span><br><span class="line"> <span class="hljs-keyword">this</span>.props.inputValue = <span class="hljs-string">'California'</span></span><br><span class="line"> inputValue =<span class="hljs-string">'California'</span></span><br><span class="line"> <span class="hljs-keyword">this</span>.inputValue=<span class="hljs-string">'California'</span></span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"> render(){</span><br><span class="line"> <span class="hljs-keyword">return</span>(</span><br><span class="line"> <div></span><br><span class="line"> {<span class="hljs-keyword">this</span>.props.inputValue}</span><br><span class="line"> {inputValue}</span><br><span class="line"> {<span class="hljs-keyword">this</span>.inputValue}</span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> )</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure></p><p>속성은 부모 컴포넌트에서 새로운 값을 전달하면 뷰를 갱신하여 현재 다루는 자식 컴포넌트의 새로운 인스턴스를 생성함.<br>해당 자식 컴포넌트의 컨텍스트내에서 this.props.inputValue=’California’로 변경해도 소용이 없음!</p><h2 id="4-2-상태-객체-다루기"><a href="#4-2-상태-객체-다루기" class="headerlink" title="4.2 상태 객체 다루기"></a>4.2 상태 객체 다루기</h2><h3 id="4-2-1-상태-객체에-접근하기"><a href="#4-2-1-상태-객체에-접근하기" class="headerlink" title="4.2.1 상태 객체에 접근하기"></a>4.2.1 상태 객체에 접근하기</h3><p>맴버변수로 this 를 통해 접근 가능. this.state.name와 같은 방식으로 접근.<br>render()에서 this.state를 랜더링 할 수 있음. ex) {this.state.inputFieldValue}</p><ul><li>현재 시간 출력하는 시계 구현하기<ul><li>폴더 구조<br> /clock <pre><code>index </code></pre> /jsx <pre><code>script.jsx clock.jsx </code></pre> /js <pre><code>script.js clock.js react.js react-dom.js </code></pre></li></ul></li></ul><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Clock</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span></span>{</span><br><span class="line"> render(){</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span>{this.state.currentTime}<span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">ReactDOM.render(</span><br><span class="line"> <Clock/></span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span>)</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>위와 같이 하면 ‘currentTime’ 값이 null이라는 오류가 발생한다.<br>속성과 달리 상태는 부모 객체에서 설정하는것이 아니고 render()안에서 setState를 실행 할 수도 없다.</p><h3 id="4-2-2-초기-상태-설정하기"><a href="#4-2-2-초기-상태-설정하기" class="headerlink" title="4.2.2 초기 상태 설정하기"></a>4.2.2 초기 상태 설정하기</h3><p>초기 상태를 설정하려면 React.Component를 사용하는 ES6클래스의 생성자에서 this.state를 선언함. 반드시 super()에 속성을 전달하여 실행한다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyFancyComponent</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span></span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props){</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {...}</span><br><span class="line"> }</span><br><span class="line"> render(){</span><br><span class="line"> ...</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>초기 상태를 설정하면서 다른 로직도 추가 가능.<br>ex) new Date()를 사용하여 currentTime 값을 설정함. toLocaleString()을 사용하면 상용자 위치에 맞는 적절한 날짜시간 형식을 보여줄 수 있음. </p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Clock</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span></span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props){</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-keyword">this</span>.state={<span class="hljs-attr">currentTime</span>: (<span class="hljs-keyword">new</span> DAte()).toLocaleString(<span class="hljs-string">'en'</span>)}</span><br><span class="line"> }</span><br><span class="line"> ...</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>초기 상태 주의사항</p><ul><li>this.state는 반드시 객체여야함. </li><li>생성자 메서드의 이름은 반드시 constructor로 함. </li><li>부며 클래스가 있는 클래스에서 construtcor()매서드를 생성하면 항상 super()를 호출함.</li><li>상속으로 클래스를 구현하면 constructor()매서드를 따로 작성하지 않으면 super()를 호출한것으로 가정함.</li><li>constructor()메서드 내에서 한번만 this.state로 직접 상태를 선언하고 그 외 부분에서는 this.stat=…로 직접 상태 선언하지 않는다. </li></ul><h3 id="4-2-3-상태-갱신하기"><a href="#4-2-3-상태-갱신하기" class="headerlink" title="4.2.3 상태 갱신하기"></a>4.2.3 상태 갱신하기</h3><p>클래스 매서드인 this.setState(data, callback)를 사용하면 상태 변경 가능.<br>data를 현재 상태에 병합하고 render()을 호출, 이후 callback함수 실행됨.<br>setState()가 비동기로 작동함. </p><p>시계를 시작하려면 setInterval()을 한번 호출해야함.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Clock</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span></span>{</span><br><span class="line"> counstructor(props){</span><br><span class="line"> <span class="hljs-keyword">super</span>(props)</span><br><span class="line"> <span class="hljs-keyword">this</span>.lauchClock()</span><br><span class="line"> <span class="hljs-keyword">this</span>.state ={</span><br><span class="line"> currentTime: (<span class="hljs-keyword">new</span> DAte()).toLocaleString(<span class="hljs-string">'en'</span>)</span><br><span class="line"> } </span><br><span class="line"> }</span><br><span class="line"> launchClock(){</span><br><span class="line"> setInterval(<span class="hljs-function"><span class="hljs-params">()</span>=></span> {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Updating time...'</span>)</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({</span><br><span class="line"> currentTime: (<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>()).toLocaleString(<span class="hljs-string">'en'</span>)</span><br><span class="line"> })</span><br><span class="line"> }, <span class="hljs-number">1000</span>)</span><br><span class="line"> }</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Rendering Clock...'</span>)</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span>{this.state.currentTime}<span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>setState()로 상태를 교체할때 상태 항목이 여러개 있으면 명시해준것만 바뀌고 나머진 값이 그대로임.<br>setState()가 render()를 실행시킴. </p><h2 id="4-3-상태-객체와-속성"><a href="#4-3-상태-객체와-속성" class="headerlink" title="4.3 상태 객체와 속성"></a>4.3 상태 객체와 속성</h2><p>상태 객체와 속성은 모두 클래스의 맴버이며 각각 this.state와 this.props를 말함. </p><ul><li>상태 객체 vs 속성 객체<ul><li>상태 객체는 변경가능, 속성 객체는 변경 불가능. </li><li>상태는 해당 컴포넌트 자체에서 정의, 속성은 부모 컴포넌트에서 전달(부모컴포넌트에서만 값을 변경 가능함).</li><li>상태는 컴포넌트에서 설정되고 갱신, 속성은 뷰 생성시에 정해지고 변경안됨.</li></ul></li></ul><h2 id="4-4-상태비저장-컴포넌트"><a href="#4-4-상태비저장-컴포넌트" class="headerlink" title="4.4 상태비저장 컴포넌트"></a>4.4 상태비저장 컴포넌트</h2><ul><li>상태비저장 컴포넌트는 상태 객체가 없고 이벤트 또는 메서드를 갖지 않음. </li><li>상태비저장 컴포넌트의 목적은 뷰를 랜더링 하는것 뿐임. </li><li>속성을 전달받아 처리. </li><li>예측하기 편해서 이해, 유지보수, 디버깅이 편함.<br>=> 상태비저장컴포넌트 많이 사용하고 상태저장컴포넌트는 적게 사용하는게 바람직함. </li></ul><p>아래는 상태비저장 컴포넌트 예제<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloWorld</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span></span>{</span><br><span class="line"> render(){</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">h1{...this.props}</span>></span> Hello{ this.props.frameworkName} world!!!<span class="hljs-tag"></<span class="hljs-name">h1</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>상태가 필요하지 않으면 함수로 선언하면됨.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">functipn Link(props){</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span> =<span class="hljs-string">{props.href}</span> <span class="hljs-attr">target</span>=<span class="hljs-string">"_blank"</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"btn btn-primary"</span>></span></span></span><br><span class="line"><span class="hljs-xml"> {props.text}<span class="hljs-tag"></<span class="hljs-name">a</span>></span></span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">ReactDOM.render(</span><br><span class="line"> <Link text =<span class="hljs-string">'Buy React Quickly'</span></span><br><span class="line"> href =<span class="hljs-string">'https://www.manning.com/books/react-quickly'</span> />,</span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span>)</span><br><span class="line">)</span><br></pre></td></tr></table></figure></p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">const</span> Link = <span class="hljs-function">(<span class="hljs-params">props</span>)=></span>{</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <href={props.href}</span><br><span class="line"> target =<span class="hljs-string">"_blank"</span></span><br><span class="line"> className=<span class="hljs-string">"btn btn-primary"</span> ></span><br><span class="line"> {props.text}</span><br><span class="line"> <<span class="hljs-regexp">/a></span></span><br><span class="line"><span class="hljs-regexp"> )</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure><p>상태비저장 컴포넌트는 상태를 가질 수 없지만 propTypes와 defaultProps를 프로퍼티로 가질 수 있다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Link</span> (<span class="hljs-params">props</span>)</span>{</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span> = <span class="hljs-string">{props.href}</span></span></span></span><br><span class="line"><span class="hljs-xml"> target="_blank"</span></span><br><span class="line"><span class="hljs-xml"> className="btn btn-primary"></span></span><br><span class="line"><span class="hljs-xml"> {props.text}</span></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">a</span>></span></span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">Link.propTypes={...}</span><br><span class="line">Link.defaultProps={...}</span><br></pre></td></tr></table></figure></p><h2 id="4-5-상태비저장-컴포넌트와-상태저장-컴포넌트의-비교"><a href="#4-5-상태비저장-컴포넌트와-상태저장-컴포넌트의-비교" class="headerlink" title="4.5 상태비저장 컴포넌트와 상태저장 컴포넌트의 비교"></a>4.5 상태비저장 컴포넌트와 상태저장 컴포넌트의 비교</h2><p>HTML 렌더링을 처리하는것으로 충분한 경우 상태비저장 컴포포넌트가 더 선언적이고 작동이 잘됨.</p><ul><li><p>상태를 사용해야 하는 경우</p><ul><li>UI 상태, 상호작용, 서버에서 데이터 불러오는것 등 을 관리하려면 상태저장 컴포넌트를 활용한다.</li></ul></li><li><p>아날로그와 디지털 방식으로 노출하는 시계</p><ul><li>프로젝트 구조<br>/clock-analog-digital<br> /jsx <pre><code>analog-display.jsx clock.jsx digital-display.jsx script.jsx </code></pre> /js <pre><code>analog-display.js clock.js digital-display.js script.js react.js react-dom.js </code></pre>/<br> index.html</li></ul></li></ul><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">render() {</span><br><span class="line"> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Rendering...'</span>)</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span></span></span><br><span class="line"> <AnalogDisplay time={this.state.currentTime}/></span><br><span class="line"> <DigitalDisplay time={this.state.currentTime}/></span><br><span class="line"> </div></span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">const</span> DigitalDisplay = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">props</span>)</span>{</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span>{props.time}<span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">const</span> AnalogDisplay = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">props</span>) </span>{</span><br><span class="line"> <span class="hljs-keyword">let</span> date = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(props.time);</span><br><span class="line"> <span class="hljs-keyword">let</span> dialStyle = {</span><br><span class="line"> position: <span class="hljs-string">'relative'</span>,</span><br><span class="line"> top: <span class="hljs-number">0</span>,</span><br><span class="line"> left: <span class="hljs-number">0</span>,</span><br><span class="line"> width: <span class="hljs-number">200</span>,</span><br><span class="line"> height: <span class="hljs-number">200</span>,</span><br><span class="line"> borderRadius: <span class="hljs-number">20000</span>,</span><br><span class="line"> borderStyle: <span class="hljs-string">'solid'</span>,</span><br><span class="line"> borderColor: <span class="hljs-string">'black'</span></span><br><span class="line"> };</span><br><span class="line"> <span class="hljs-keyword">let</span> secondHandStyle = {</span><br><span class="line"> position: <span class="hljs-string">'relative'</span>,</span><br><span class="line"> top: <span class="hljs-number">100</span>,</span><br><span class="line"> left: <span class="hljs-number">100</span>,</span><br><span class="line"> border: <span class="hljs-string">'1px solid red'</span>,</span><br><span class="line"> width: <span class="hljs-string">'40%'</span>,</span><br><span class="line"> height: <span class="hljs-number">1</span>,</span><br><span class="line"> transform: <span class="hljs-string">'rotate('</span> + (date.getSeconds() / <span class="hljs-number">60</span> * <span class="hljs-number">360</span> - <span class="hljs-number">90</span>).toString() + <span class="hljs-string">'deg)'</span>,</span><br><span class="line"> transformOrigin: <span class="hljs-string">'0% 0%'</span>,</span><br><span class="line"> backgroundColor: <span class="hljs-string">'red'</span></span><br><span class="line"> };</span><br><span class="line"> <span class="hljs-keyword">let</span> minuteHandStyle = {</span><br><span class="line"> position: <span class="hljs-string">'relative'</span>,</span><br><span class="line"> top: <span class="hljs-number">100</span>,</span><br><span class="line"> left: <span class="hljs-number">100</span>,</span><br><span class="line"> border: <span class="hljs-string">'1px solid grey'</span>,</span><br><span class="line"> width: <span class="hljs-string">'40%'</span>,</span><br><span class="line"> height: <span class="hljs-number">3</span>,</span><br><span class="line"> transform: <span class="hljs-string">'rotate('</span> + (date.getMinutes() / <span class="hljs-number">60</span> * <span class="hljs-number">360</span> - <span class="hljs-number">90</span>).toString() + <span class="hljs-string">'deg)'</span>,</span><br><span class="line"> transformOrigin: <span class="hljs-string">'0% 0%'</span>,</span><br><span class="line"> backgroundColor: <span class="hljs-string">'grey'</span></span><br><span class="line"> };</span><br><span class="line"> <span class="hljs-keyword">let</span> hourHandStyle = {</span><br><span class="line"> position: <span class="hljs-string">'relative'</span>,</span><br><span class="line"> top: <span class="hljs-number">92</span>,</span><br><span class="line"> left: <span class="hljs-number">106</span>,</span><br><span class="line"> border: <span class="hljs-string">'1px solid grey'</span>,</span><br><span class="line"> width: <span class="hljs-string">'20%'</span>,</span><br><span class="line"> height: <span class="hljs-number">7</span>,</span><br><span class="line"> transform: <span class="hljs-string">'rotate('</span> + (date.getHours() / <span class="hljs-number">12</span> * <span class="hljs-number">360</span> - <span class="hljs-number">90</span>).toString() + <span class="hljs-string">'deg)'</span>,</span><br><span class="line"> transformOrigin: <span class="hljs-string">'0% 0%'</span>,</span><br><span class="line"> backgroundColor: <span class="hljs-string">'grey'</span></span><br><span class="line"> };</span><br><span class="line"> <span class="hljs-keyword">return</span> React.createElement(</span><br><span class="line"> <span class="hljs-string">'div'</span>,</span><br><span class="line"> <span class="hljs-literal">null</span>,</span><br><span class="line"> React.createElement(</span><br><span class="line"> <span class="hljs-string">'div'</span>,</span><br><span class="line"> { <span class="hljs-attr">style</span>: dialStyle },</span><br><span class="line"> React.createElement(<span class="hljs-string">'div'</span>, { <span class="hljs-attr">style</span>: secondHandStyle }),</span><br><span class="line"> React.createElement(<span class="hljs-string">'div'</span>, { <span class="hljs-attr">style</span>: minuteHandStyle }),</span><br><span class="line"> React.createElement(<span class="hljs-string">'div'</span>, { <span class="hljs-attr">style</span>: hourHandStyle })</span><br><span class="line"> )</span><br><span class="line"> );</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<blockquote>
<p>리엑트 교과서를 정리한 내용입니다.</p>
</blockquote>
<p>리엑트에서 가장 중요한 부분이다.</p>
<h2 id="4-1-React컴포넌트의-상태란"><a href="#4-1-React컴포넌트의-상태란" cl
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="react" scheme="https://eunii.github.io/categories/tec/react/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="react" scheme="https://eunii.github.io/tags/react/"/>
<category term="프레임워크" scheme="https://eunii.github.io/tags/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/"/>
<category term="리엑트" scheme="https://eunii.github.io/tags/%EB%A6%AC%EC%97%91%ED%8A%B8/"/>
</entry>
<entry>
<title>[React 교과서] 3장 JSX</title>
<link href="https://eunii.github.io/2019/08/14/tec/react/react4/"/>
<id>https://eunii.github.io/2019/08/14/tec/react/react4/</id>
<published>2019-08-14T08:26:25.000Z</published>
<updated>2019-08-29T01:58:40.433Z</updated>
<content type="html"><![CDATA[<blockquote><p>리엑트 교과서를 정리한 내용입니다.</p></blockquote><h2 id="3-1-JSX의-정의와-장점"><a href="#3-1-JSX의-정의와-장점" class="headerlink" title="3.1 JSX의 정의와 장점"></a>3.1 JSX의 정의와 장점</h2><p>함수 호출과 객체 생성을 위한 문법적 편의를 제공하는 자바스크립트의 확장. JSX가 React에 필수적이지는 않지만 같이 사용할것이 권장됨</p><ul><li>개발자 경험 개선: 코드를 읽기 쉽다</li><li>팀의 생산성 향상: HTML과 비슷하여 친숙함</li><li><p>문법 오류와 코드량 감소</p></li><li><p>JSX코드 예제</p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><div></span><br><span class="line"> <HelloWorld/></span><br><span class="line"> <br/></span><br><span class="line"> <a href = <span class="hljs-string">"https://eunii.github.io"</span>> eunii blog<<span class="hljs-regexp">/a></span></span><br><span class="line"><span class="hljs-regexp"></</span>div></span><br></pre></td></tr></table></figure></li><li><p>위의 코드 자바스크립트로 변경한 예제</p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">React.createElement(</span><br><span class="line"> <span class="hljs-string">"div"</span>,</span><br><span class="line"> <span class="hljs-literal">null</span>,</span><br><span class="line"> React.createElement(HellowWorld, <span class="hljs-literal">null</span>),</span><br><span class="line"> React.createElement(<span class="hljs-string">"br"</span>, <span class="hljs-literal">null</span>),</span><br><span class="line"> React.createElement(</span><br><span class="line"> <span class="hljs-string">"a"</span>,</span><br><span class="line"> {<span class="hljs-attr">href</span> : <span class="hljs-string">"https://eunii.github.io"</span>},</span><br><span class="line"> <span class="hljs-string">"eunii blog"</span></span><br><span class="line"> ),</span><br><span class="line">)</span><br></pre></td></tr></table></figure></li></ul><p>자바스크립트 코드 사이에 <>가 있으면 처음에는 어색하지만. React.createBlement(NAME, …) 대신 을 사용하는것이 훨씬 직관적이고 편리하다.<br>JSX를 사용하려면 브라우저에서 실행하기 전에 컴파일 또는 트랜스파일 과정을 거쳐 일반적 자바스크립트 파일로 변환해야한다.</p><h2 id="3-2-JSX의-이해"><a href="#3-2-JSX의-이해" class="headerlink" title="3.2 JSX의 이해"></a>3.2 JSX의 이해</h2><h3 id="3-2-1-JSX로-React-엘리먼트-생성하기"><a href="#3-2-1-JSX로-React-엘리먼트-생성하기" class="headerlink" title="3.2.1 JSX로 React 엘리먼트 생성하기"></a>3.2.1 JSX로 React 엘리먼트 생성하기</h3><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">React.createElement(</span><br><span class="line"> name,</span><br><span class="line"> {<span class="hljs-attr">key1</span>: value1, <span class="hljs-attr">key2</span>: vlaue2, ...},</span><br><span class="line"> child1, child2, ..., childN</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>위의 코드를 JSX로 바꾸면 아래와 같다<br><figure class="highlight jsx hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><name key1=value1 key2 value2 ...></span><br><span class="line"> <child1/></span><br><span class="line"> <child2/></span><br><span class="line"> ...</span><br><span class="line"> <childN/></span><br><span class="line"><<span class="hljs-regexp">/name></span></span><br></pre></td></tr></table></figure></p><p>계속 공부해 왔던 HelloWorld예제를 자바스크립트로 작성하면<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">ReactDOM.render(</span><br><span class="line"> React.createElement(<span class="hljs-string">'h1'</span>, <span class="hljs-literal">null</span>, <span class="hljs-string">'Hello world!'</span>),</span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span>)</span><br><span class="line">)</span><br></pre></td></tr></table></figure></p><p>위의 코드를 JSX로 작성하면<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">ReactDOM.render(</span><br><span class="line"> <h1>Hello world!<span class="hljs-xml"><span class="hljs-tag"></<span class="hljs-name">h1</span>></span></span></span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span>)</span><br><span class="line">)</span><br></pre></td></tr></table></figure></p><p>JSX문법으로 작성한 객체도 변수에 저장 가능하다.<br><figure class="highlight jsx hljs"><figcaption><span>harmony</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">let</span> helloWorldReactElement = <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">h1</span>></span>Hello world!<span class="hljs-tag"></<span class="hljs-name">h1</span>></span></span></span><br><span class="line">ReactDOM.render(</span><br><span class="line"> helloWorldReactElement,</span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span>)</span><br><span class="line">)</span><br></pre></td></tr></table></figure></p><h3 id="3-2-2-React-컴포넌트에-JSX-사용하기"><a href="#3-2-2-React-컴포넌트에-JSX-사용하기" class="headerlink" title="3.2.2 React 컴포넌트에 JSX 사용하기"></a>3.2.2 React 컴포넌트에 JSX 사용하기</h3><figure class="highlight plain hljs"><figcaption><span>JSX 태그는 표준 HTML 태그 이름이기도 하다. 컴포넌트를 다룰 때에도 같은 문법을 사용하고 컴포넌트 클래스 이름이 대문자로 시작한다.</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- JSX를 이용해서 생성한 HelloWorld클래스</span><br><span class="line">```js</span><br><span class="line">class HelloWorld extends React.Component{</span><br><span class="line"> render(){</span><br><span class="line"> return(</span><br><span class="line"> <div></span><br><span class="line"> <h1> 1. Hello world!</h1></span><br><span class="line"> <h2> 2. Hello world!</h1></span><br><span class="line"> </div></span><br><span class="line"> )</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line">ReactDOM.render(</span><br><span class="line"> <HelloWorld/></span><br><span class="line"> document.getElementById('content')</span><br><span class="line">)</span><br></pre></td></tr></table></figure><h3 id="3-2-3-JSX에서-변수-출력하기"><a href="#3-2-3-JSX에서-변수-출력하기" class="headerlink" title="3.2.3 JSX에서 변수 출력하기"></a>3.2.3 JSX에서 변수 출력하기</h3><p>컴포넌트를 작송할때, 약간의 코드로 자체적으로 뷰를 변경할 수 있는 코드를 만들기. ex) 현재 시간/날짜를 사용하기<br>JSX없이 React만 사용하면 +를 이용해 연결하거느 ‘와 ${varName}로 표시한 문자열 탬플릿을 사용할 수 있다. (템플릿 리터럴)</p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DateTimeNow</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span></span>{</span><br><span class="line"> render(){</span><br><span class="line"> <span class="hljs-keyword">let</span> dateTimeNow = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>().toLocaleDateString()</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">span</span>></span> Hello {this.props.userName}, current date and time is {dateTimeNow}.<span class="hljs-tag"></<span class="hljs-name">span</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">let</span> helloWorldReactElement = <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">h1</span>></span>Hello world!<span class="hljs-tag"></<span class="hljs-name">h1</span>></span></span></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloWorld</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span></span></span><br><span class="line"><span class="hljs-xml"> {helloWorldReactElement}</span></span><br><span class="line"><span class="hljs-xml"> {helloWorldReactElement}</span></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line">ReactDOM.render(</span><br><span class="line"> <HelloWorld/>,</span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span>)</span><br><span class="line">)</span><br></pre></td></tr></table></figure><h3 id="3-2-4-JSX에서-속성-사용하기"><a href="#3-2-4-JSX에서-속성-사용하기" class="headerlink" title="3.2.4 JSX에서 속성 사용하기"></a>3.2.4 JSX에서 속성 사용하기</h3><p>사용자 계정에 연결할 컴포넌트를 만들때, href와 title의 값은 사용자에 따라 달라져야 하므로 하드 코딩할 수 없다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProfileLint</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span></span>{</span><br><span class="line"> render(){</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <a href ={<span class="hljs-keyword">this</span>.props.url}</span><br><span class="line"> title ={<span class="hljs-keyword">this</span>.props.lable}</span><br><span class="line"> target=<span class="hljs-string">"_blank"</span>></span><br><span class="line"> Profile</span><br><span class="line"> <<span class="hljs-regexp">/a></span></span><br><span class="line"><span class="hljs-regexp"> </span></span><br><span class="line"><span class="hljs-regexp"> )</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure></p><p>위의 코드에서 속성값은 ProfileLink 생성시에 정의된다. ProfileLink를 생성하는 부모 컴포넌트에서 이 값을 전달함.<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><ProfileLink url='/user/azat' label='Profile for azat' /></span><br></pre></td></tr></table></figure></p><p>가끔 사용자 지정 데이터를 속성으로 추가할 때가 있다. DOM요소에 속성으로 넣는것은 흔히 사용하지만 HTML 비표준 속성에 데이터를 저장하는 것은 안티패턴으로 여겨진다.<br>DOM에서 데이터를 가져오는것은 메모리 상의 가상 저장소에서 데이터를 가져오는것보다 느리다.</p><p>데이터를 반드시 HTML요소의 속성으로 저장해야 하는 경우는 data-*속성을 사용한다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><li data-react-is-awesom={<span class="hljs-keyword">this</span>.reactIsAwesome}> React is awesome!<span class="hljs-xml"><span class="hljs-tag"></<span class="hljs-name">li</span>></span></span></span><br></pre></td></tr></table></figure></p><p>위의 경우reactIsAwesome 값이 true라면 아래와 같이 HTML이 렌더링 된다<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><li data-react-is-awesom=<span class="hljs-string">"true"</span>}> React is awesome!<span class="hljs-xml"><span class="hljs-tag"></<span class="hljs-name">li</span>></span></span></span><br></pre></td></tr></table></figure></p><p>하지만 아래와 같이 비표준 HTML속성을 전달하면 HTML속성이 렌더링 되지 않는다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><li react-is-awesom={<span class="hljs-keyword">this</span>.reactIsAwesome}> React is awesome!<span class="hljs-xml"><span class="hljs-tag"></<span class="hljs-name">li</span>></span></span></span><br><span class="line"><li reactIsAwesom={<span class="hljs-keyword">this</span>.reactIsAwesome}> React is awesome!<span class="hljs-xml"><span class="hljs-tag"></<span class="hljs-name">li</span>></span></span></span><br></pre></td></tr></table></figure></p><p>위의 결과는 아래와 같다<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><li> React is awesome!<span class="hljs-xml"><span class="hljs-tag"></<span class="hljs-name">li</span>></span></span></span><br><span class="line"><li> React is awesome!<span class="hljs-xml"><span class="hljs-tag"></<span class="hljs-name">li</span>></span></span></span><br></pre></td></tr></table></figure></p><p>아것대신 this.props를 통해서 입력한데이터는 모든 속성에 접근할 수 있다. 모든 속성을 전달해야 한다면 …를 사용할 수 있다.({…this.props)</p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloWorld</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">h1</span> {<span class="hljs-attr">...this.props</span>}></span>Hello {this.props.frameworkName} world!!!<span class="hljs-tag"></<span class="hljs-name">h1</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">ReactDOM.render(</span><br><span class="line"> <div></span><br><span class="line"> <HelloWorld</span><br><span class="line"> id=<span class="hljs-string">'ember'</span></span><br><span class="line"> frameworkName=<span class="hljs-string">'Ember.js'</span></span><br><span class="line"> title=<span class="hljs-string">'A framework for creating ambitious web applications.'</span>/></span><br><span class="line"> <HelloWorld</span><br><span class="line"> id=<span class="hljs-string">'backbone'</span></span><br><span class="line"> frameworkName=<span class="hljs-string">'Backbone.js'</span></span><br><span class="line"> title=<span class="hljs-string">'Backbone.js gives structure to web applications...'</span>/></span><br><span class="line"> <HelloWorld</span><br><span class="line"> id=<span class="hljs-string">'angular'</span></span><br><span class="line"> frameworkName=<span class="hljs-string">'Angular.js'</span></span><br><span class="line"> title=<span class="hljs-string">'Superheroic JavaScript MVW Framework'</span>/></span><br><span class="line"> <<span class="hljs-regexp">/div>,</span></span><br><span class="line"><span class="hljs-regexp"> document.getElementById('content')</span></span><br><span class="line"><span class="hljs-regexp">)</span></span><br></pre></td></tr></table></figure><h3 id="3-2-5-React-컴포넌트-메서드-생성하기"><a href="#3-2-5-React-컴포넌트-메서드-생성하기" class="headerlink" title="3.2.5 React 컴포넌트 메서드 생성하기"></a>3.2.5 React 컴포넌트 메서드 생성하기</h3><p>React 컴포넌트에 애플리케이션을 위한 메서드를 자유롭게 추가할 수 있다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Content</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> getUrl(){</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-string">'http://webapplog.com'</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> render(){</span><br><span class="line"> ...</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>{}안에 클래스 메서드를 호출 하는 방식으로 사용한다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Content</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> getUrl() {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-string">'http://webapplog.com'</span></span><br><span class="line"> }</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <div></span><br><span class="line"> <p>Your REST API URL is: <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">{this.getUrl()}</span>></span>{this.getUrl()}<span class="hljs-tag"></<span class="hljs-name">a</span>></span></span><span class="hljs-xml"><span class="hljs-tag"></<span class="hljs-name">p</span>></span></span></span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> )</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure></p><h3 id="3-2-6-JSX의-if-else처리"><a href="#3-2-6-JSX의-if-else처리" class="headerlink" title="3.2.6 JSX의 if/else처리"></a>3.2.6 JSX의 if/else처리</h3><ul><li>유저 세션에 따른 렌더링 처리 예시(자바스크립트)<figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">render(){</span><br><span class="line"> <span class="hljs-keyword">if</span>(user.session)</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/logout"</span>></span> Logout<span class="hljs-tag"></<span class="hljs-name">a</span>></span></span></span><br><span class="line"> <span class="hljs-keyword">else</span></span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/login"</span>></span> Login<span class="hljs-tag"></<span class="hljs-name">a</span>></span></span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><p>JSX로 3가지 방법 표현법<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-comment">//방법1 변수</span></span><br><span class="line">render(){</span><br><span class="line"> <span class="hljs-keyword">let</span> link</span><br><span class="line"> <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>.props.user.session){</span><br><span class="line"> link = <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/logout"</span>></span> Logout<span class="hljs-tag"></<span class="hljs-name">a</span>></span></span></span><br><span class="line"> <span class="hljs-keyword">else</span></span><br><span class="line"> link = <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/login"</span>></span> Login<span class="hljs-tag"></<span class="hljs-name">a</span>></span></span></span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span>{link}<span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-comment">// 방법 2 표현식</span></span><br><span class="line">render(){</span><br><span class="line"> <span class="hljs-keyword">let</span> link = <span class="hljs-function">(<span class="hljs-params">sessionFlag</span>) =></span> {</span><br><span class="line"> <span class="hljs-keyword">if</span>(sessionFlag){ </span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/logout"</span>></span> Logout<span class="hljs-tag"></<span class="hljs-name">a</span>></span></span></span><br><span class="line"> <span class="hljs-keyword">else</span> </span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/login"</span>></span> Login<span class="hljs-tag"></<span class="hljs-name">a</span>></span></span></span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span>{link(this.props.user.session})}<span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-comment">//방법 3 삼항연산자</span></span><br><span class="line">render(){</span><br><span class="line"> <span class="hljs-keyword">return</span>(</span><br><span class="line"> <div></span><br><span class="line"> {(<span class="hljs-keyword">this</span>.props.uwer.session)</span><br><span class="line"> ? <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/logout"</span>></span> Logout<span class="hljs-tag"></<span class="hljs-name">a</span>></span></span></span><br><span class="line"> : <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/login"</span>></span> Login<span class="hljs-tag"></<span class="hljs-name">a</span>></span></span></span><br><span class="line"> }</span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> ) </span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure></p><ul><li>return 문 이전에 JSX 외부에 변수를 선언한 후 JSX 내부에서 {}를 사용하여 출력한다</li><li>return 문 이전에 JSX외부에서 값을 반환하는 함수 표현식을 선언한 후 JSX내부의 {}에서 실행한다</li><li>삼항연산자를 사용한다</li><li>JSX 내부에서 즉시 실행함수를 사용한다. </li></ul><h3 id="3-2-7-JSX의-주석-작성-방법"><a href="#3-2-7-JSX의-주석-작성-방법" class="headerlink" title="3.2.7 JSX의 주석 작성 방법"></a>3.2.7 JSX의 주석 작성 방법</h3><p>일반 자바스크립트 주석과 비슷하다. {}로 감싸서 작성한다.</p><h2 id="3-3-Babel을-이용한-JSX-트랜스-파일러-설정하기"><a href="#3-3-Babel을-이용한-JSX-트랜스-파일러-설정하기" class="headerlink" title="3.3 Babel을 이용한 JSX 트랜스 파일러 설정하기"></a>3.3 Babel을 이용한 JSX 트랜스 파일러 설정하기</h2><p>JSX파일을 자바스크립트코드로 변환하는 과정을 트랜스파일레이션이라고 한다.</p><ul><li>Babel 명령줄 인터페이스 도구</li><li>Node.js 또는 브라우저 자바스크립트로 작성한 스크립트(API방식): babel-core 패키지를 이용해서 스크립트를 직성해 변환하는 방식</li><li>빌드 도구: Grunt, Gulp, Webpack도구에서 Babel을 플러그인으로 사용할 수 있다.</li></ul><h4 id="1-Node-js-npm-설치"><a href="#1-Node-js-npm-설치" class="headerlink" title="1. Node.js npm 설치"></a>1. Node.js npm 설치</h4><h2 id="3-4-React와-JSX의-까다로운-부분"><a href="#3-4-React와-JSX의-까다로운-부분" class="headerlink" title="3.4 React와 JSX의 까다로운 부분"></a>3.4 React와 JSX의 까다로운 부분</h2><p>태그를 닫을 때 반드시 /를 넣어야 한다. </p><h3 id="3-4-1-특수문자"><a href="#3-4-1-특수문자" class="headerlink" title="3.4.1 특수문자"></a>3.4.1 특수문자</h3><p>HTML엔터티코드를 사용하여 저작권 표시나 말바꿈표 따옴표 등을 사용할 수 있다.</p><ul><li><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">- ```mdash;</span><br></pre></td></tr></table></figure></li><li><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">```js</span><br><span class="line"><span>&copy;&mdash;&ldquo;</span></span><br><span class="line"><input value ="&copy;&mdash;&ldquo;"/></span><br></pre></td></tr></table></figure></li></ul><p>아래 코드는 작동하지 않는 오류 코드<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">var</span> specialChars = <span class="hljs-string">"&copy;&mdash;&ldquo;"</span></span><br><span class="line"><span>{specialChars}<<span class="hljs-regexp">/span></span></span><br><span class="line"><span class="hljs-regexp"><input value={specialChars}/</span>></span><br></pre></td></tr></table></figure></p><p>위험한 HTML구문에 대해서 자동으로 이스케이프를 적용함. 특수문자를 노출하려면 다음 방법중 하나를 선택한다.</p><ul><li>배열로 출력해 여러개의 분자열로 분리</li><li>소스코드에 특수문자를 직접 복사해서 넣는다</li><li>특스문자를 \u로 시작하는 이스케이프 시퀸스로 바꾼 후에 유니코드번호를 찾아 사용한다.</li><li>String.fromCharCode(charCodeNumber)를 이용해서 유니코드 번호에서 문자로 변경한다</li><li>React 엘리먼트의 _html에 dangerouslySetInnerHTML을 이용하는 방법이 있으나 추천하지 않는다</li></ul>]]></content>
<summary type="html">
<blockquote>
<p>리엑트 교과서를 정리한 내용입니다.</p>
</blockquote>
<h2 id="3-1-JSX의-정의와-장점"><a href="#3-1-JSX의-정의와-장점" class="headerlink" title="3.1 JSX의
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="react" scheme="https://eunii.github.io/categories/tec/react/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="react" scheme="https://eunii.github.io/tags/react/"/>
<category term="프레임워크" scheme="https://eunii.github.io/tags/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/"/>
<category term="리엑트" scheme="https://eunii.github.io/tags/%EB%A6%AC%EC%97%91%ED%8A%B8/"/>
</entry>
<entry>
<title>[React 교과서] 2장 React 첫걸음</title>
<link href="https://eunii.github.io/2019/08/13/tec/react/react3/"/>
<id>https://eunii.github.io/2019/08/13/tec/react/react3/</id>
<published>2019-08-13T08:26:25.000Z</published>
<updated>2019-08-28T05:27:19.104Z</updated>
<content type="html"><![CDATA[<blockquote><p>리엑트 교과서를 정리한 내용입니다.</p></blockquote><p>엘리먼트는 컴포넌트의 인스턴스이며 컴포넌트 클래스라고 한다.</p><h2 id="2-1-엘리먼트-중첩"><a href="#2-1-엘리먼트-중첩" class="headerlink" title="2.1 엘리먼트 중첩"></a>2.1 엘리먼트 중첩</h2><p>여러개 엘리먼트가 중첩되는 경우가 많다.<br>ReactDOM.render()에는 하나의 React엘리먼트만 인자로 전달할 수 있다.<br>동일한 DOM객체에 두개의 h1태그를 렌더링해야 하는 경우 두 요소를 <figure class="highlight plain hljs"><figcaption><span>```<span>```으로 감싸 사용</span></span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">```js</span><br><span class="line"> var h1 = React.createElement('h1', null, 'Hello world!') //-h1요소를 생성하여 변수에 담음</span><br><span class="line"> var div = React.createElement('div', null, h1,h1) //-세번째 이후 매개변수가 문자열이 아니면 새로 생성하는 엘리먼트의 자식 엘리먼트다.</span><br><span class="line"> ReactDOM.render( //h1요소를 ID가 content인 실제 DOM에 랜더링함</span><br><span class="line"> div,</span><br><span class="line"> document.getElementById('content')</span><br><span class="line"> )</span><br></pre></td></tr></table></figure></p><p>createElement 의 첫번째 매개변수에는 아래 두가지 자료형을 입력할 수 있다.</p><ul><li>문자열로 작성한 일반적 HTML태그. 소문자로 작성 ex) ‘h1’, ‘div’</li><li>React 컴포넌트 객체, HelloWorld를 예로 들 수 있음. React 컴포넌트 객체이름은 대문자로 시작한다. </li></ul><h2 id="2-2-React컴포넌트-클래스-생성"><a href="#2-2-React컴포넌트-클래스-생성" class="headerlink" title="2.2 React컴포넌트 클래스 생성"></a>2.2 React컴포넌트 클래스 생성</h2><p>컴포넌트 클래스(component class)를 사용하면 기능을 느슨하게 결합된 부분으로 분리하여 코드를 재사용할 수 있다.<br>‘Hello world!’를 별도의 클래스로 분리하는 방법.</p><p>class HelloWorld extends React.Component로 상속받아 사용<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">let</span> h1 = React.createElement(<span class="hljs-string">'h1'</span>, <span class="hljs-literal">null</span>, <span class="hljs-string">'Hello world!'</span>)</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloWorld</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> React.createElement(<span class="hljs-string">'div'</span>, <span class="hljs-literal">null</span>, h1, h1)</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line">ReactDOM.render(</span><br><span class="line"> React.createElement(HelloWorld, <span class="hljs-literal">null</span>),</span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span>)</span><br><span class="line">)</span><br></pre></td></tr></table></figure></p><p>여기서 render()는 엘리먼트 하나만 반환함</p><p>Hello world!를 여러번 노출해야하면 아래와 같이 클래스 재사용 가능<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">ReactDOM.render(</span><br><span class="line"> React.createElement(div, </span><br><span class="line"> <span class="hljs-literal">null</span>, </span><br><span class="line"> React.createElement(HelloWorld), </span><br><span class="line"> React.createElement(HelloWorld), </span><br><span class="line"> React.createElement(HelloWorld)</span><br><span class="line"> ),</span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span> )</span><br><span class="line">)</span><br></pre></td></tr></table></figure></p><h2 id="2-3-React-속성-props-사용하기"><a href="#2-3-React-속성-props-사용하기" class="headerlink" title="2.3 React 속성(props) 사용하기"></a>2.3 React 속성(props) 사용하기</h2><p>컴포넌트의 속성(properties)은 React선언형 스타일의 기초다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">React.createElememt(<span class="hljs-string">'a'</span>, {<span class="hljs-attr">href</span>: <span class="hljs-string">'https://eunii.github.io'</span>})</span><br></pre></td></tr></table></figure></p><p>속성은 컴포넌트 내부에서는 변경할 수 없는 값이다.<br>부모 컴포넌트가 자식 생성 시점에 속성을 할당한다.</p><p>속성은 아래와 같은 용도로 사용가능</p><ul><li>일반적 HTML 요소의 속성: href, title, style, class</li><li>React 컴포넌트 클래스의 자바스크립트코드에서 this.props의 값. 예를 들어 this.props.PROPERTY_NAME<br>render()메서드에서 입력하여 렌더링하거나 코드에서 활용 할 수 있다.</li></ul><p>HelloWorld컴포넌트에 아래 세가지 속성을 추가한다.</p><ul><li>id</li><li>frameworkHame</li><li>title<br>id와 title은 h1의 표준속성과 일치에서 랜더링하고 frameworkName은 랜더링 하지 않는다.</li></ul><p>h1을 구현하기 전에 helloWorld클래스의 속성을 전달해야함.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">ReactDOM.render(</span><br><span class="line"> React.createElement(</span><br><span class="line"> <span class="hljs-string">'div'</span>,</span><br><span class="line"> <span class="hljs-literal">null</span>,</span><br><span class="line"> React.createElement(HelloWorld, {</span><br><span class="line"> id: <span class="hljs-string">'ember'</span>,</span><br><span class="line"> frameworkName: <span class="hljs-string">'Ember.js'</span>,</span><br><span class="line"> title: <span class="hljs-string">'A framework for creating ambitious web applications.'</span>}),</span><br><span class="line"> React.createElement(HelloWorld, {</span><br><span class="line"> id: <span class="hljs-string">'backbone'</span>,</span><br><span class="line"> frameworkName: <span class="hljs-string">'Backbone.js'</span>,</span><br><span class="line"> title: <span class="hljs-string">'Backbone.js gives structure to web applications...'</span>}),</span><br><span class="line"> React.createElement(HelloWorld, {</span><br><span class="line"> id: <span class="hljs-string">'angular'</span>,</span><br><span class="line"> frameworkName: <span class="hljs-string">'Angular.js'</span>,</span><br><span class="line"> title: <span class="hljs-string">'Superheroic JavaScript MVW Framework'</span>})</span><br><span class="line"> ),</span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span>)</span><br><span class="line">)</span><br></pre></td></tr></table></figure></p><p>render()에서 frameworkName속성 사용하기<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloWorld</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> React.createElement(</span><br><span class="line"> <span class="hljs-string">'h1'</span>,</span><br><span class="line"> <span class="hljs-keyword">this</span>.props, <span class="hljs-comment">//모든 속성을 자식 엘리먼트에 전달한다.</span></span><br><span class="line"> <span class="hljs-string">'Hello '</span> + <span class="hljs-keyword">this</span>.props.frameworkName + <span class="hljs-string">' world!'</span></span><br><span class="line"> )</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<blockquote>
<p>리엑트 교과서를 정리한 내용입니다.</p>
</blockquote>
<p>엘리먼트는 컴포넌트의 인스턴스이며 컴포넌트 클래스라고 한다.</p>
<h2 id="2-1-엘리먼트-중첩"><a href="#2-1-엘리먼트-중첩" c
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="react" scheme="https://eunii.github.io/categories/tec/react/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="react" scheme="https://eunii.github.io/tags/react/"/>
<category term="프레임워크" scheme="https://eunii.github.io/tags/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/"/>
<category term="리엑트" scheme="https://eunii.github.io/tags/%EB%A6%AC%EC%97%91%ED%8A%B8/"/>
</entry>
<entry>
<title>[React 교과서] 1장 React 살펴보기</title>
<link href="https://eunii.github.io/2019/08/12/tec/react/react2/"/>
<id>https://eunii.github.io/2019/08/12/tec/react/react2/</id>
<published>2019-08-12T02:26:25.000Z</published>
<updated>2019-08-12T08:48:46.740Z</updated>
<content type="html"><![CDATA[<blockquote><p>리엑트 교과서를 정리한 내용입니다.</p></blockquote><h2 id="1-1-React란-무엇인가"><a href="#1-1-React란-무엇인가" class="headerlink" title="1.1 React란 무엇인가?"></a>1.1 React란 무엇인가?</h2><ul><li>페이스북에서 만든 자바스크립트 기반의 UI 컴포넌트 라이브러리.</li></ul><h2 id="1-2-React가-해결할-수-있는-문제"><a href="#1-2-React가-해결할-수-있는-문제" class="headerlink" title="1.2 React가 해결할 수 있는 문제"></a>1.2 React가 해결할 수 있는 문제</h2><ul><li>DOM을 매번 새로 생성하기 위해 UI를 함수로 만들었다.</li></ul><h2 id="1-3-React의-장점"><a href="#1-3-React의-장점" class="headerlink" title="1.3 React의 장점"></a>1.3 React의 장점</h2><ul><li>단순한 앱 개발</li><li>빠른 UI</li><li>코드량 감소</li></ul><h3 id="1-3-1-간결성"><a href="#1-3-1-간결성" class="headerlink" title="1.3.1 간결성"></a>1.3.1 간결성</h3><ul><li>선언형 스타일 채택</li><li>순수한 자바스크립트를 이용한 컴포넌트 기반 아키텍쳐</li><li>강력한 추상화</li></ul><h4 id="선언형-스타일-채택"><a href="#선언형-스타일-채택" class="headerlink" title="선언형 스타일 채택"></a>선언형 스타일 채택</h4><p>선언형 스타일의 장점은 간단하고 가독성이 좋다. 결과값에 더 집중했다.<br>뷰에 변경이 발생하는경우 react가 알아서 갱신.</p><ul><li>명령형 코드 예시<figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">var</span> arr =[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>],</span><br><span class="line">arr2 = []</span><br><span class="line"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i=<span class="hljs-number">0</span>; i<arr.length; i++){</span><br><span class="line"> arr2[i] = arr[i]*<span class="hljs-number">2</span></span><br><span class="line">}</span><br><span class="line"><span class="hljs-built_in">console</span>.log(<span class="hljs-string">'a'</span>,arr2)</span><br></pre></td></tr></table></figure></li></ul><p>결과창<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">a [2,4,6,8,10]</span><br></pre></td></tr></table></figure></p><ul><li>선언형 코드 예시<figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">var</span> arr = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>]</span><br><span class="line">arr2 = arr.map(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">v,i</span>)</span>{ <span class="hljs-keyword">return</span> v*<span class="hljs-number">2</span> })</span><br><span class="line"><span class="hljs-built_in">console</span>.log(<span class="hljs-string">'b'</span>, arr2)</span><br></pre></td></tr></table></figure></li></ul><p>결과창<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">b [2,4,6,8,10]</span><br></pre></td></tr></table></figure></p><h4 id="자바스크립트를-이용한-컴포넌트-기반-아키텍처"><a href="#자바스크립트를-이용한-컴포넌트-기반-아키텍처" class="headerlink" title="자바스크립트를 이용한 컴포넌트 기반 아키텍처"></a>자바스크립트를 이용한 컴포넌트 기반 아키텍처</h4><p>코드 재사용이 쉬워 코드를 줄일 수 있다. </p><ul><li>코드 예시<figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">if</span> (user.session) <span class="hljs-keyword">return</span> React.createElement(<span class="hljs-string">'a'</span>,{<span class="hljs-attr">hret</span>: <span class="hljs-string">'/logout'</span>}, <span class="hljs-string">'Logout'</span>)</span><br><span class="line"><span class="hljs-keyword">else</span> <span class="hljs-keyword">return</span> React.createElement(<span class="hljs-string">'a'</span>, {<span class="hljs-attr">href</span>:<span class="hljs-string">'/login'</span>}, <span class="hljs-string">'Login'</span>)</span><br></pre></td></tr></table></figure></li></ul><h4 id="강력한-추상화"><a href="#강력한-추상화" class="headerlink" title="강력한 추상화"></a>강력한 추상화</h4><p>내부 인터페이스를 숨기고 정규화 과정을 거친 합성 메서드와 속성을 제공한다.</p><h3 id="1-3-2-속도와-테스트-용이성"><a href="#1-3-2-속도와-테스트-용이성" class="headerlink" title="1.3.2 속도와 테스트 용이성"></a>1.3.2 속도와 테스트 용이성</h3><p>가상 DOM은 자바스크립트 메모리에만 존자한다. 데이터 변경시 가상 DOM을 머저 비교하고 랜더링이 필요한 경우애만 실제 DDM에 랜더링 한다.<br>필요한 부분반 갱신함.</p><h3 id="1-3-3-React의-폭넓은-개발-커뮤니티와-생태계"><a href="#1-3-3-React의-폭넓은-개발-커뮤니티와-생태계" class="headerlink" title="1.3.3 React의 폭넓은 개발 커뮤니티와 생태계"></a>1.3.3 React의 폭넓은 개발 커뮤니티와 생태계</h3><ul><li>React 컴포넌트 목록: <a href="https://github.com/brillout/awsome-reactcomponents" rel="external nofollow noopener noreferrer" target="_blank">1</a><pre><code>[2](http://devarchy.com/react-components) </code></pre></li></ul><p>등등..</p><h2 id="1-4-React의-단점"><a href="#1-4-React의-단점" class="headerlink" title="1.4 React의 단점"></a>1.4 React의 단점</h2><ul><li>AngularJS나 Ember같은 기능을 사용하려면 라이브러리를 함꼐 사용해야함</li><li>다른 프레임워크만큼 성숙하지 않음.-> 핵심 API가 조금씩 바뀜</li><li>관련 자료가 부족</li><li>단방향 데이터 바인딩만 제공</li><li>리액티브 프로그래밍은 아니다.</li></ul><h2 id="1-5-웹-애플리케이션에-React적용하기"><a href="#1-5-웹-애플리케이션에-React적용하기" class="headerlink" title="1.5 웹 애플리케이션에 React적용하기"></a>1.5 웹 애플리케이션에 React적용하기</h2><ul><li>UI 라이브러리로 React와 관련된 Reduz나 React Router를 활용한 단일 페이지 애플리케이션 스택의 구성</li><li>MVC의 V를 대체하는 UI라이브러리로 기존 IVX프레임워크와 결합</li><li>jQuery 를 기반으로 서버 측 렌더링을 거친 애플리케이션에서 자동완성 등 일부 기능을 위한 UI컴포넌트로 활용</li><li>대부분의 로직을 직접처리하는 백엔드에서 서버측 렌더링 탬플릿 라이브러리로 활용</li><li>백엔드와 프론트엔드서 모두 자바스크립트를 사용하는 경우</li><li>React Native를 UI 라이브러리로 사용한 모바일 앱</li><li>여러가지 렌더링 대상에 적용할 목적으로 사용하는 UI라이브러리</li></ul><h3 id="1-5-1-React-라이브러리와-렌더링-대상"><a href="#1-5-1-React-라이브러리와-렌더링-대상" class="headerlink" title="1.5.1 React 라이브러리와 렌더링 대상"></a>1.5.1 React 라이브러리와 렌더링 대상</h3><ul><li>UI개발이 필요한 환경에 어디든지 사용할 수 있게 만드는중. ReactDOM.rander()를 사용함(여러 환경에서 사용가능)</li></ul><h3 id="1-5-2-단일-페이지-애플리케이션과-React"><a href="#1-5-2-단일-페이지-애플리케이션과-React" class="headerlink" title="1.5.2 단일 페이지 애플리케이션과 React"></a>1.5.2 단일 페이지 애플리케이션과 React</h3><p>서버보다는 클라이언트(브라우저)에 로직이 더 많은 팻 클라이언트다. SPA는 HTML렌더링, 입력값 겁증, UI변경 등의 기능을 브라우저에서 해결한다.<br>SPA 방식으로는 MVC아키텍처를 많이 사용하지만 다른 방식도 있음.</p><h3 id="1-5-3-React-개발-스택"><a href="#1-5-3-React-개발-스택" class="headerlink" title="1.5.3 React 개발 스택"></a>1.5.3 React 개발 스택</h3><p>모델링,스타일라우팅 등에 정해진 방법이 없어 다른 라이브러리를 결합해 사용한다.</p><p>(책 56쪽)</p><ul><li>데이터 모젤링과 백엔드</li><li>라우팅</li><li>React용 Bootstrap컴포넌트</li><li>날짜 입력 컴포넌트</li><li>WAI-ARIA정의를 따르는 자동완성컴포넌트</li></ul><h2 id="1-6-첫번째-React앱-만들기-Hello-World"><a href="#1-6-첫번째-React앱-만들기-Hello-World" class="headerlink" title="1.6 첫번째 React앱 만들기:Hello World"></a>1.6 첫번째 React앱 만들기:Hello World</h2><p>파일구조<br>/hello-world<br> /js<br> react.js<br> react-dom.js<br> index.html</p><p>예시 코드는 <a href="https://github.com/azat-co/react-quickly/tree/master/ch01/hello-world" rel="external nofollow noopener noreferrer" target="_blank">여기</a> 에서 다운받을 수 있다.</p><p>index.html파일 내용<br><figure class="highlight html hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-meta"><!DOCTYPE html></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">html</span>></span></span><br><span class="line"> <span class="hljs-tag"><<span class="hljs-name">head</span>></span></span><br><span class="line"> <span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"js/react.js"</span>></span><span class="hljs-undefined"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span></span><br><span class="line"> <span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"js/react-dom.js"</span>></span><span class="hljs-undefined"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span></span><br><span class="line"> <span class="hljs-tag"></<span class="hljs-name">head</span>></span></span><br><span class="line"> <span class="hljs-tag"><<span class="hljs-name">body</span>></span></span><br><span class="line"> <span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"content"</span>></span><span class="hljs-tag"></<span class="hljs-name">div</span>></span></span><br><span class="line"> <span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span>></span><span class="hljs-undefined"></span></span><br><span class="line"><span class="hljs-undefined"> </span><span class="hljs-tag"></<span class="hljs-name">script</span>></span></span><br><span class="line"> <span class="hljs-tag"></<span class="hljs-name">body</span>></span></span><br><span class="line"><span class="hljs-tag"></<span class="hljs-name">html</span>></span></span><br></pre></td></tr></table></figure></p><p>React 엘리먼트를 생성하려면 React.createElement(clementName, data, child)를 호출한다</p><ul><li>elementName : HTML 태그명’h1’처럼 문자열로 작성하거나 직접 만든 컴포넌트 를래스 객체를 넘겨줄 수 있음</li><li>data: 속성이나 상위컴포넌트에 받는 값으로 null이나{name: Azat} 같은 형태의 데이너</li><li>child: 자식 엘리먼트나 태그 내부에 작성하는 텍스트</li></ul><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">var</span> h1 = React.createElement(<span class="hljs-string">'h1'</span>, <span class="hljs-literal">null</span>, <span class="hljs-string">'Hello world!'</span>) <span class="hljs-comment">//-h1요소를 생성하여 변수에 담음</span></span><br><span class="line"> ReactDOM.render( <span class="hljs-comment">//h1요소를 ID가 content인 실제 DOM에 랜더링함</span></span><br><span class="line"> h1,</span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span>)</span><br><span class="line"> )</span><br></pre></td></tr></table></figure><p>아래처럼 변수에 담지 않고 직접 넣어줄수도 있다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">ReactDOM.render( <span class="hljs-comment">//h1요소를 ID가 content인 실제 DOM에 랜더링함</span></span><br><span class="line"> React.createElement(<span class="hljs-string">'h1'</span>, <span class="hljs-literal">null</span>, <span class="hljs-string">'Hello world!'</span>)</span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'content'</span>)</span><br><span class="line">)</span><br></pre></td></tr></table></figure></p><p>웹 브라우져에서 </p><p><div id="content"><br> <h1 data-reactroot>Hello world!</h1><br></div><br>객체가 만들어진것을 볼 수 있다.</p>]]></content>
<summary type="html">
<blockquote>
<p>리엑트 교과서를 정리한 내용입니다.</p>
</blockquote>
<h2 id="1-1-React란-무엇인가"><a href="#1-1-React란-무엇인가" class="headerlink" title="1.1 Reac
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="react" scheme="https://eunii.github.io/categories/tec/react/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="react" scheme="https://eunii.github.io/tags/react/"/>
<category term="프레임워크" scheme="https://eunii.github.io/tags/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/"/>
<category term="리엑트" scheme="https://eunii.github.io/tags/%EB%A6%AC%EC%97%91%ED%8A%B8/"/>
</entry>
<entry>
<title>[React] React 시작하기</title>
<link href="https://eunii.github.io/2019/08/06/tec/react/react1/"/>
<id>https://eunii.github.io/2019/08/06/tec/react/react1/</id>
<published>2019-08-06T02:26:25.000Z</published>
<updated>2019-08-09T02:04:05.604Z</updated>
<content type="html"><![CDATA[<h2 id="1-Nodejs-설치-및-최신-버전-확인-6버전-이상"><a href="#1-Nodejs-설치-및-최신-버전-확인-6버전-이상" class="headerlink" title="1. Nodejs 설치 및 최신 버전 확인(6버전 이상)"></a>1. Nodejs 설치 및 최신 버전 확인(6버전 이상)</h2><ul><li><a href="https://nodejs.org/ko/" rel="external nofollow noopener noreferrer" target="_blank">https://nodejs.org/ko/</a> 여기서 최신 nodejs를 설치한다.</li><li>콘솔 창(window + R -> cmd 검색) 에서 아래와 같이 명령어를 입력하면 내 pc에 깔린 nodejs버전이 나온다.<figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">node -v</span><br></pre></td></tr></table></figure></li></ul><h2 id="2-프로젝트를-생성할-폴더-위치로-이동하여-다음과-같이-프로젝트를-시작한다"><a href="#2-프로젝트를-생성할-폴더-위치로-이동하여-다음과-같이-프로젝트를-시작한다" class="headerlink" title="2. 프로젝트를 생성할 폴더 위치로 이동하여 다음과 같이 프로젝트를 시작한다."></a>2. 프로젝트를 생성할 폴더 위치로 이동하여 다음과 같이 프로젝트를 시작한다.</h2><p>아래 명령어로 폴더에 이동후<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd d:\dev\react\tutorial</span><br></pre></td></tr></table></figure></p><p>아래 명령어로 프로젝트를 시작한다.<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ npm install -g create-react-app </span><br><span class="line">$ create-react-app my-app</span><br></pre></td></tr></table></figure></p><h2 id="3-my-app-src-하위의-파일들을-삭제한다"><a href="#3-my-app-src-하위의-파일들을-삭제한다" class="headerlink" title="3. my-app/src 하위의 파일들을 삭제한다."></a>3. my-app/src 하위의 파일들을 삭제한다.</h2><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ cd my-app</span><br><span class="line">$ rm -f src/*</span><br></pre></td></tr></table></figure><h2 id="4-my-app-src-index-css-파일을-만들어-아래-내용을-복사한다"><a href="#4-my-app-src-index-css-파일을-만들어-아래-내용을-복사한다" class="headerlink" title="4. my-app/src/index.css 파일을 만들어 아래 내용을 복사한다."></a>4. my-app/src/index.css 파일을 만들어 아래 내용을 복사한다.</h2><figure class="highlight css hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-selector-tag">body</span> {</span><br><span class="line"> <span class="hljs-attribute">font</span>: <span class="hljs-number">14px</span> <span class="hljs-string">"Century Gothic"</span>, Futura, sans-serif;</span><br><span class="line"> <span class="hljs-attribute">margin</span>: <span class="hljs-number">20px</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-selector-tag">ol</span>, <span class="hljs-selector-tag">ul</span> {</span><br><span class="line"> <span class="hljs-attribute">padding-left</span>: <span class="hljs-number">30px</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-selector-class">.board-row</span><span class="hljs-selector-pseudo">:after</span> {</span><br><span class="line"> <span class="hljs-attribute">clear</span>: both;</span><br><span class="line"> <span class="hljs-attribute">content</span>: <span class="hljs-string">""</span>;</span><br><span class="line"> <span class="hljs-attribute">display</span>: table;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-selector-class">.status</span> {</span><br><span class="line"> <span class="hljs-attribute">margin-bottom</span>: <span class="hljs-number">10px</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-selector-class">.square</span> {</span><br><span class="line"> <span class="hljs-attribute">background</span>: <span class="hljs-number">#fff</span>;</span><br><span class="line"> <span class="hljs-attribute">border</span>: <span class="hljs-number">1px</span> solid <span class="hljs-number">#999</span>;</span><br><span class="line"> <span class="hljs-attribute">float</span>: left;</span><br><span class="line"> <span class="hljs-attribute">font-size</span>: <span class="hljs-number">24px</span>;</span><br><span class="line"> <span class="hljs-attribute">font-weight</span>: bold;</span><br><span class="line"> <span class="hljs-attribute">line-height</span>: <span class="hljs-number">34px</span>;</span><br><span class="line"> <span class="hljs-attribute">height</span>: <span class="hljs-number">34px</span>;</span><br><span class="line"> <span class="hljs-attribute">margin-right</span>: -<span class="hljs-number">1px</span>;</span><br><span class="line"> <span class="hljs-attribute">margin-top</span>: -<span class="hljs-number">1px</span>;</span><br><span class="line"> <span class="hljs-attribute">padding</span>: <span class="hljs-number">0</span>;</span><br><span class="line"> <span class="hljs-attribute">text-align</span>: center;</span><br><span class="line"> <span class="hljs-attribute">width</span>: <span class="hljs-number">34px</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-selector-class">.square</span><span class="hljs-selector-pseudo">:focus</span> {</span><br><span class="line"> <span class="hljs-attribute">outline</span>: none;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-selector-class">.kbd-navigation</span> <span class="hljs-selector-class">.square</span><span class="hljs-selector-pseudo">:focus</span> {</span><br><span class="line"> <span class="hljs-attribute">background</span>: <span class="hljs-number">#ddd</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-selector-class">.game</span> {</span><br><span class="line"> <span class="hljs-attribute">display</span>: flex;</span><br><span class="line"> <span class="hljs-attribute">flex-direction</span>: row;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-selector-class">.game-info</span> {</span><br><span class="line"> <span class="hljs-attribute">margin-left</span>: <span class="hljs-number">20px</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="5-my-app-src-index-js-파일을-아래-내용을-복사하여-만든다"><a href="#5-my-app-src-index-js-파일을-아래-내용을-복사하여-만든다" class="headerlink" title="5. my-app/src/index.js 파일을 아래 내용을 복사하여 만든다."></a>5. my-app/src/index.js 파일을 아래 내용을 복사하여 만든다.</h2><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;</span><br><span class="line"><span class="hljs-keyword">import</span> ReactDOM <span class="hljs-keyword">from</span> <span class="hljs-string">'react-dom'</span>;</span><br><span class="line"><span class="hljs-keyword">import</span> <span class="hljs-string">'./index.css'</span>; </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Square</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <button className=<span class="hljs-string">"square"</span>></span><br><span class="line"> {<span class="hljs-comment">/* TODO */</span>}</span><br><span class="line"> <<span class="hljs-regexp">/button></span></span><br><span class="line"><span class="hljs-regexp"> );</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br><span class="line"><span class="hljs-regexp"></span></span><br><span class="line"><span class="hljs-regexp">class Board extends React.Component {</span></span><br><span class="line"><span class="hljs-regexp"> renderSquare(i) {</span></span><br><span class="line"><span class="hljs-regexp"> return <Square /</span>>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">const</span> status = <span class="hljs-string">'Next player: X'</span>;</span><br><span class="line"></span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <div></span><br><span class="line"> <div className=<span class="hljs-string">"status"</span>>{status}<<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> <div className="board-row"></span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(0)}</span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(1)}</span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(2)}</span></span><br><span class="line"><span class="hljs-regexp"> </</span>div></span><br><span class="line"> <div className=<span class="hljs-string">"board-row"</span>></span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">3</span>)}</span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">4</span>)}</span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">5</span>)}</span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> <div className="board-row"></span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(6)}</span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(7)}</span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(8)}</span></span><br><span class="line"><span class="hljs-regexp"> </</span>div></span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> );</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br><span class="line"><span class="hljs-regexp"></span></span><br><span class="line"><span class="hljs-regexp">class Game extends React.Component {</span></span><br><span class="line"><span class="hljs-regexp"> render() {</span></span><br><span class="line"><span class="hljs-regexp"> return (</span></span><br><span class="line"><span class="hljs-regexp"> <div className="game"></span></span><br><span class="line"><span class="hljs-regexp"> <div className="game-board"></span></span><br><span class="line"><span class="hljs-regexp"> <Board /</span>></span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> <div className="game-info"></span></span><br><span class="line"><span class="hljs-regexp"> <div>{/</span>* status *<span class="hljs-regexp">/}</</span>div></span><br><span class="line"> <ol>{<span class="hljs-comment">/* TODO */</span>}<<span class="hljs-regexp">/ol></span></span><br><span class="line"><span class="hljs-regexp"> </</span>div></span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> );</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br><span class="line"><span class="hljs-regexp"></span></span><br><span class="line"><span class="hljs-regexp">/</span><span class="hljs-regexp">/ ========================================</span></span><br><span class="line"><span class="hljs-regexp"></span></span><br><span class="line"><span class="hljs-regexp">ReactDOM.render(</span></span><br><span class="line"><span class="hljs-regexp"> <Game /</span>>,</span><br><span class="line"> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'root'</span>)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="6-아래-명령어로-시작한다"><a href="#6-아래-명령어로-시작한다" class="headerlink" title="6. 아래 명령어로 시작한다."></a>6. 아래 명령어로 시작한다.</h2><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">$ npm start</span><br><span class="line">``` </span><br><span class="line"></span><br><span class="line">## 7. localhost:3000 으로 아래와 같은 화면이 뜬다.</span><br><span class="line"></span><br><span class="line">## 8. my-app/src/index.js파일을 열어보면 아래 세가지 컴포넌트로 구성되어 있다.</span><br><span class="line"></span><br><span class="line">- Square : 하나의 <button>을 렌더링함</span><br><span class="line">- Board : 9개의 사각형을 랜더링함</span><br><span class="line">- Game : 공백있는 하나의 보드를 랜더링함</span><br><span class="line"></span><br><span class="line">## 9. Board 컴포넌트에서 Square 컴포넌트로 데이터(숫자 0~9) 전달하기</span><br><span class="line"></span><br><span class="line">### 9.1 index.js파일의 Board클래스 부분을 아래와 같이 변경한다.</span><br><span class="line">```js</span><br><span class="line">class Board extends React.Component {</span><br><span class="line"> renderSquare(i) {</span><br><span class="line"> return <Square value={i} />;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h3 id="9-2-Square클래스-render-메서드를-아래와-같이-변경한다"><a href="#9-2-Square클래스-render-메서드를-아래와-같이-변경한다" class="headerlink" title="9.2 Square클래스 render 메서드를 아래와 같이 변경한다."></a>9.2 Square클래스 render 메서드를 아래와 같이 변경한다.</h3><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Square</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <button className=<span class="hljs-string">"square"</span>></span><br><span class="line"> {<span class="hljs-keyword">this</span>.props.value}</span><br><span class="line"> <<span class="hljs-regexp">/button></span></span><br><span class="line"><span class="hljs-regexp"> );</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure><ul><li>이렇게 변경해서 저장 후 npm start로 실행해보면 비어있던 9개 사각형 칸에 0~8까지 숫자가 입력되서 나온다.</li></ul><h2 id="10-대화형-컴포넌트-빈-사각형을-클릭하면-X표시가-되게-변경하기"><a href="#10-대화형-컴포넌트-빈-사각형을-클릭하면-X표시가-되게-변경하기" class="headerlink" title="10. 대화형 컴포넌트 : 빈 사각형을 클릭하면 X표시가 되게 변경하기"></a>10. 대화형 컴포넌트 : 빈 사각형을 클릭하면 X표시가 되게 변경하기</h2><h3 id="10-1-Sqare의-render-함수를-아래와-같이-변경한다"><a href="#10-1-Sqare의-render-함수를-아래와-같이-변경한다" class="headerlink" title="10.1 Sqare의 render()함수를 아래와 같이 변경한다."></a>10.1 Sqare의 render()함수를 아래와 같이 변경한다.</h3><p>Square클래스의 생성자에서 this.state을 설정하여 상태(초기값 null)를 가질 수 있게 한다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Square</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props);</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {</span><br><span class="line"> value: <span class="hljs-literal">null</span>,</span><br><span class="line"> };</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>아래와 같이 render()함수를 변경하면 사각형을 클릭하면 클릭한 빈 사각형안의 값이 X로 바뀐다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Square</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props);</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {</span><br><span class="line"> value: <span class="hljs-literal">null</span>,</span><br><span class="line"> };</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <button className=<span class="hljs-string">"square"</span> onClick={() => <span class="hljs-keyword">this</span>.setState({<span class="hljs-attr">value</span>: <span class="hljs-string">'X'</span>})}></span><br><span class="line"> {<span class="hljs-keyword">this</span>.state.value}</span><br><span class="line"> <<span class="hljs-regexp">/button></span></span><br><span class="line"><span class="hljs-regexp"> );</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure></p><h2 id="11-State에-저장하기"><a href="#11-State에-저장하기" class="headerlink" title="11 State에 저장하기"></a>11 State에 저장하기</h2><p>클릭 할때마다 o,x 번갈아 나오게 하고, 승자를 가리기 위해 9개 블럭의 상태를 동시에 확인해야함.<br>여러 하위 컴포넌트로 부터 데이터를 모으거나, 하위 컴포넌트들이 서로 통신하기 원하면 상위컴포넌트로 state를 이동시킴.<br>상위 컴포컨트는 props를 통해 하위 컴포넌트로 state를 전달해 줄 수 있다. </p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Board</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props);</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {</span><br><span class="line"> squares: <span class="hljs-built_in">Array</span>(<span class="hljs-number">9</span>).fill(<span class="hljs-literal">null</span>),</span><br><span class="line"> };</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> renderSquare(i) {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">Square</span> <span class="hljs-attr">value</span>=<span class="hljs-string">{i}</span> /></span>;</span></span><br><span class="line"><span class="hljs-xml"> }</span></span><br><span class="line"><span class="hljs-xml"></span></span><br><span class="line"><span class="hljs-xml"> render() {</span></span><br><span class="line"><span class="hljs-xml"> const status = 'Next player: X';</span></span><br><span class="line"><span class="hljs-xml"></span></span><br><span class="line"><span class="hljs-xml"> return (</span></span><br><span class="line"> <div></span><br><span class="line"> <div className="status">{status}</div></span><br><span class="line"> <div className="board-row"></span><br><span class="line"> {this.renderSquare(0)}</span><br><span class="line"> {this.renderSquare(1)}</span><br><span class="line"> {this.renderSquare(2)}</span><br><span class="line"> </div></span><br><span class="line"> <div className="board-row"></span><br><span class="line"> {this.renderSquare(3)}</span><br><span class="line"> {this.renderSquare(4)}</span><br><span class="line"> {this.renderSquare(5)}</span><br><span class="line"> </div></span><br><span class="line"> <div className="board-row"></span><br><span class="line"> {this.renderSquare(6)}</span><br><span class="line"> {this.renderSquare(7)}</span><br><span class="line"> {this.renderSquare(8)}</span><br><span class="line"> </div></span><br><span class="line"><span class="hljs-xml"> <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span></span><br><span class="line"><span class="hljs-xml"> );</span></span><br><span class="line"><span class="hljs-xml"> }</span></span><br><span class="line"><span class="hljs-xml">}</span></span><br></pre></td></tr></table></figure><p>지금 board의 renderSquare매서드는 아래와 같다.<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">renderSquare(i) {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">Square</span> <span class="hljs-attr">value</span> =<span class="hljs-string">{i}</span> /></span>;</span></span><br><span class="line"><span class="hljs-xml"></span></span><br><span class="line"><span class="hljs-xml">}</span></span><br></pre></td></tr></table></figure></p><p>Square에 value prop를 전달하도록 수정한다<br><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">renderSquare(i) {</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-xml"><span class="hljs-tag"><<span class="hljs-name">Square</span> <span class="hljs-attr">value</span>=<span class="hljs-string">{this.state.squares[i]}</span> /></span>;</span></span><br><span class="line"><span class="hljs-xml"> }</span></span><br></pre></td></tr></table></figure></p><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">renderSquare(i) {</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <Square</span><br><span class="line"> value={<span class="hljs-keyword">this</span>.state.squares[i]}</span><br><span class="line"> onClick={() => <span class="hljs-keyword">this</span>.handleClick(i)}</span><br><span class="line"> /></span><br><span class="line"> );</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Square</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <button className=<span class="hljs-string">"square"</span> onClick={() => <span class="hljs-keyword">this</span>.props.onClick()}></span><br><span class="line"> {<span class="hljs-keyword">this</span>.props.value}</span><br><span class="line"> <<span class="hljs-regexp">/button></span></span><br><span class="line"><span class="hljs-regexp"> );</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Board</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props);</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {</span><br><span class="line"> squares: <span class="hljs-built_in">Array</span>(<span class="hljs-number">9</span>).fill(<span class="hljs-literal">null</span>),</span><br><span class="line"> };</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> handleClick(i) {</span><br><span class="line"> <span class="hljs-keyword">const</span> squares = <span class="hljs-keyword">this</span>.state.squares.slice();</span><br><span class="line"> squares[i] = <span class="hljs-string">'X'</span>;</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({<span class="hljs-attr">squares</span>: squares});</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> renderSquare(i) {</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <Square</span><br><span class="line"> value={<span class="hljs-keyword">this</span>.state.squares[i]}</span><br><span class="line"> onClick={() => <span class="hljs-keyword">this</span>.handleClick(i)}</span><br><span class="line"> /></span><br><span class="line"> );</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">const</span> status = <span class="hljs-string">'Next player: X'</span>;</span><br><span class="line"></span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <div></span><br><span class="line"> <div className=<span class="hljs-string">"status"</span>>{status}<<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> <div className="board-row"></span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(0)}</span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(1)}</span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(2)}</span></span><br><span class="line"><span class="hljs-regexp"> </</span>div></span><br><span class="line"> <div className=<span class="hljs-string">"board-row"</span>></span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">3</span>)}</span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">4</span>)}</span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">5</span>)}</span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> <div className="board-row"></span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(6)}</span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(7)}</span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(8)}</span></span><br><span class="line"><span class="hljs-regexp"> </</span>div></span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> );</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br></pre></td></tr></table></figure><figure class="highlight js hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Square</span>(<span class="hljs-params">props</span>) </span>{</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <button className=<span class="hljs-string">"square"</span> onClick={props.onClick}></span><br><span class="line"> {props.value}</span><br><span class="line"> <<span class="hljs-regexp">/button></span></span><br><span class="line"><span class="hljs-regexp"> );</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br><span class="line"><span class="hljs-regexp"></span></span><br><span class="line"><span class="hljs-regexp">class Board extends React.Component {</span></span><br><span class="line"><span class="hljs-regexp"> renderSquare(i) {</span></span><br><span class="line"><span class="hljs-regexp"> return (</span></span><br><span class="line"><span class="hljs-regexp"> <Square</span></span><br><span class="line"><span class="hljs-regexp"> value={this.props.squares[i]}</span></span><br><span class="line"><span class="hljs-regexp"> onClick={() => this.props.onClick(i)}</span></span><br><span class="line"><span class="hljs-regexp"> /</span>></span><br><span class="line"> );</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <div></span><br><span class="line"> <div className=<span class="hljs-string">"board-row"</span>></span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">0</span>)}</span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">1</span>)}</span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">2</span>)}</span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> <div className="board-row"></span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(3)}</span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(4)}</span></span><br><span class="line"><span class="hljs-regexp"> {this.renderSquare(5)}</span></span><br><span class="line"><span class="hljs-regexp"> </</span>div></span><br><span class="line"> <div className=<span class="hljs-string">"board-row"</span>></span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">6</span>)}</span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">7</span>)}</span><br><span class="line"> {<span class="hljs-keyword">this</span>.renderSquare(<span class="hljs-number">8</span>)}</span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> </</span>div></span><br><span class="line"> );</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Game</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">React</span>.<span class="hljs-title">Component</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">constructor</span>(props) {</span><br><span class="line"> <span class="hljs-keyword">super</span>(props);</span><br><span class="line"> <span class="hljs-keyword">this</span>.state = {</span><br><span class="line"> history: [</span><br><span class="line"> {</span><br><span class="line"> squares: <span class="hljs-built_in">Array</span>(<span class="hljs-number">9</span>).fill(<span class="hljs-literal">null</span>)</span><br><span class="line"> }</span><br><span class="line"> ],</span><br><span class="line"> stepNumber: <span class="hljs-number">0</span>,</span><br><span class="line"> xIsNext: <span class="hljs-literal">true</span></span><br><span class="line"> };</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> handleClick(i) {</span><br><span class="line"> <span class="hljs-keyword">const</span> history = <span class="hljs-keyword">this</span>.state.history.slice(<span class="hljs-number">0</span>, <span class="hljs-keyword">this</span>.state.stepNumber + <span class="hljs-number">1</span>);</span><br><span class="line"> <span class="hljs-keyword">const</span> current = history[history.length - <span class="hljs-number">1</span>];</span><br><span class="line"> <span class="hljs-keyword">const</span> squares = current.squares.slice();</span><br><span class="line"> <span class="hljs-keyword">if</span> (calculateWinner(squares) || squares[i]) {</span><br><span class="line"> <span class="hljs-keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> squares[i] = <span class="hljs-keyword">this</span>.state.xIsNext ? <span class="hljs-string">"X"</span> : <span class="hljs-string">"O"</span>;</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({</span><br><span class="line"> history: history.concat([</span><br><span class="line"> {</span><br><span class="line"> squares: squares</span><br><span class="line"> }</span><br><span class="line"> ]),</span><br><span class="line"> stepNumber: history.length,</span><br><span class="line"> xIsNext: !<span class="hljs-keyword">this</span>.state.xIsNext</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> jumpTo(step) {</span><br><span class="line"> <span class="hljs-keyword">this</span>.setState({</span><br><span class="line"> stepNumber: step,</span><br><span class="line"> xIsNext: (step % <span class="hljs-number">2</span>) === <span class="hljs-number">0</span></span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> render() {</span><br><span class="line"> <span class="hljs-keyword">const</span> history = <span class="hljs-keyword">this</span>.state.history;</span><br><span class="line"> <span class="hljs-keyword">const</span> current = history[<span class="hljs-keyword">this</span>.state.stepNumber];</span><br><span class="line"> <span class="hljs-keyword">const</span> winner = calculateWinner(current.squares);</span><br><span class="line"></span><br><span class="line"> <span class="hljs-keyword">const</span> moves = history.map(<span class="hljs-function">(<span class="hljs-params">step, move</span>) =></span> {</span><br><span class="line"> <span class="hljs-keyword">const</span> desc = move ?</span><br><span class="line"> <span class="hljs-string">'Go to move #'</span> + move :</span><br><span class="line"> <span class="hljs-string">'Go to game start'</span>;</span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <li key={move}></span><br><span class="line"> <button onClick={() => <span class="hljs-keyword">this</span>.jumpTo(move)}>{desc}<<span class="hljs-regexp">/button></span></span><br><span class="line"><span class="hljs-regexp"> </</span>li></span><br><span class="line"> );</span><br><span class="line"> });</span><br><span class="line"></span><br><span class="line"> <span class="hljs-keyword">let</span> status;</span><br><span class="line"> <span class="hljs-keyword">if</span> (winner) {</span><br><span class="line"> status = <span class="hljs-string">"Winner: "</span> + winner;</span><br><span class="line"> } <span class="hljs-keyword">else</span> {</span><br><span class="line"> status = <span class="hljs-string">"Next player: "</span> + (<span class="hljs-keyword">this</span>.state.xIsNext ? <span class="hljs-string">"X"</span> : <span class="hljs-string">"O"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="hljs-keyword">return</span> (</span><br><span class="line"> <div className=<span class="hljs-string">"game"</span>></span><br><span class="line"> <div className=<span class="hljs-string">"game-board"</span>></span><br><span class="line"> <Board</span><br><span class="line"> squares={current.squares}</span><br><span class="line"> onClick={i => <span class="hljs-keyword">this</span>.handleClick(i)}</span><br><span class="line"> /></span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> <div className="game-info"></span></span><br><span class="line"><span class="hljs-regexp"> <div>{status}</</span>div></span><br><span class="line"> <ol>{moves}<<span class="hljs-regexp">/ol></span></span><br><span class="line"><span class="hljs-regexp"> </</span>div></span><br><span class="line"> <<span class="hljs-regexp">/div></span></span><br><span class="line"><span class="hljs-regexp"> );</span></span><br><span class="line"><span class="hljs-regexp"> }</span></span><br><span class="line"><span class="hljs-regexp">}</span></span><br><span class="line"><span class="hljs-regexp"></span></span><br><span class="line"><span class="hljs-regexp">/</span><span class="hljs-regexp">/ ========================================</span></span><br><span class="line"><span class="hljs-regexp"></span></span><br><span class="line"><span class="hljs-regexp">ReactDOM.render(<Game /</span>>, <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"root"</span>));</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculateWinner</span>(<span class="hljs-params">squares</span>) </span>{</span><br><span class="line"> <span class="hljs-keyword">const</span> lines = [</span><br><span class="line"> [<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>],</span><br><span class="line"> [<span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>],</span><br><span class="line"> [<span class="hljs-number">6</span>, <span class="hljs-number">7</span>, <span class="hljs-number">8</span>],</span><br><span class="line"> [<span class="hljs-number">0</span>, <span class="hljs-number">3</span>, <span class="hljs-number">6</span>],</span><br><span class="line"> [<span class="hljs-number">1</span>, <span class="hljs-number">4</span>, <span class="hljs-number">7</span>],</span><br><span class="line"> [<span class="hljs-number">2</span>, <span class="hljs-number">5</span>, <span class="hljs-number">8</span>],</span><br><span class="line"> [<span class="hljs-number">0</span>, <span class="hljs-number">4</span>, <span class="hljs-number">8</span>],</span><br><span class="line"> [<span class="hljs-number">2</span>, <span class="hljs-number">4</span>, <span class="hljs-number">6</span>]</span><br><span class="line"> ];</span><br><span class="line"> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i < lines.length; i++) {</span><br><span class="line"> <span class="hljs-keyword">const</span> [a, b, c] = lines[i];</span><br><span class="line"> <span class="hljs-keyword">if</span> (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {</span><br><span class="line"> <span class="hljs-keyword">return</span> squares[a];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="1-Nodejs-설치-및-최신-버전-확인-6버전-이상"><a href="#1-Nodejs-설치-및-최신-버전-확인-6버전-이상" class="headerlink" title="1. Nodejs 설치 및 최신 버전 확인(6버전 이상)"><
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="react" scheme="https://eunii.github.io/categories/tec/react/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="react" scheme="https://eunii.github.io/tags/react/"/>
<category term="프레임워크" scheme="https://eunii.github.io/tags/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/"/>
<category term="리엑트" scheme="https://eunii.github.io/tags/%EB%A6%AC%EC%97%91%ED%8A%B8/"/>
</entry>
<entry>
<title>[Markdown] Markdown 문법 정리</title>
<link href="https://eunii.github.io/2019/08/05/tec/blog/blog11/"/>
<id>https://eunii.github.io/2019/08/05/tec/blog/blog11/</id>
<published>2019-08-05T11:40:25.000Z</published>
<updated>2019-08-06T08:44:57.950Z</updated>
<content type="html"><![CDATA[<h2 id="1-Header"><a href="#1-Header" class="headerlink" title="1. Header"></a>1. Header</h2><p>글머리 1 ~ 6<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"># This is a H1</span><br><span class="line">## This is a H2</span><br><span class="line">### This is a H3</span><br><span class="line">#### This is a H4</span><br><span class="line">##### This is a H5</span><br><span class="line">###### This is a H6</span><br></pre></td></tr></table></figure></p><blockquote><h1 id="This-is-a-H1"><a href="#This-is-a-H1" class="headerlink" title="This is a H1"></a>This is a H1</h1><h2 id="This-is-a-H2"><a href="#This-is-a-H2" class="headerlink" title="This is a H2"></a>This is a H2</h2><h3 id="This-is-a-H3"><a href="#This-is-a-H3" class="headerlink" title="This is a H3"></a>This is a H3</h3><h4 id="This-is-a-H4"><a href="#This-is-a-H4" class="headerlink" title="This is a H4"></a>This is a H4</h4><h5 id="This-is-a-H5"><a href="#This-is-a-H5" class="headerlink" title="This is a H5"></a>This is a H5</h5><h6 id="This-is-a-H6"><a href="#This-is-a-H6" class="headerlink" title="This is a H6"></a>This is a H6</h6></blockquote><h2 id="2-굵게-기울임꼴-텍스트"><a href="#2-굵게-기울임꼴-텍스트" class="headerlink" title="2. 굵게 기울임꼴 텍스트"></a>2. 굵게 기울임꼴 텍스트</h2><h3 id="2-1-굵게-지정하려면-두개의-별표로-묶습니다"><a href="#2-1-굵게-지정하려면-두개의-별표로-묶습니다" class="headerlink" title="2.1 굵게 지정하려면 두개의 별표로 묶습니다."></a>2.1 굵게 지정하려면 두개의 별표로 묶습니다.</h3><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">This text is **bold**.</span><br></pre></td></tr></table></figure><p>This text is <strong>bold</strong>.<br><br></p><h3 id="2-2-기울임꼴로-지정하려면-한개의-별표로-묶습니다"><a href="#2-2-기울임꼴로-지정하려면-한개의-별표로-묶습니다" class="headerlink" title="2.2 기울임꼴로 지정하려면 한개의 별표로 묶습니다."></a>2.2 기울임꼴로 지정하려면 한개의 별표로 묶습니다.</h3><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">This text is *italic*.</span><br></pre></td></tr></table></figure><p>This text is <em>italic</em>.<br><br></p><h3 id="2-3-굵게-기울임꼴로-지정하려면-세개의-별표로-묶습니다"><a href="#2-3-굵게-기울임꼴로-지정하려면-세개의-별표로-묶습니다" class="headerlink" title="2.3 굵게 기울임꼴로 지정하려면 세개의 별표로 묶습니다."></a>2.3 굵게 기울임꼴로 지정하려면 세개의 별표로 묶습니다.</h3><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">This text is ***bold and italic***.</span><br></pre></td></tr></table></figure><p>This text is <strong><em>bold and italic</em></strong>.<br><br></p><h2 id="3-BlockQuote"><a href="#3-BlockQuote" class="headerlink" title="3. BlockQuote"></a>3. BlockQuote</h2><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> This is a BlockQuote</span><br></pre></td></tr></table></figure><blockquote><p>This is a BlockQuote</p><blockquote><p>This is a BlockQuote</p><blockquote><p>This is a BlockQuote</p></blockquote></blockquote></blockquote><p>이 안에서도 마크다운 요소를 사용할 수 있습니다.</p><pre>> - List> <figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">> BlockQuote</span><br><span class="line">></span><br></pre></td></tr></table></figure></pre><blockquote><ul><li>List<figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">> BlcokQuote</span><br><span class="line">></span><br></pre></td></tr></table></figure></li></ul></blockquote><h2 id="4-List"><a href="#4-List" class="headerlink" title="4. List"></a>4. List</h2><h3 id="4-1-순서-있는-목록"><a href="#4-1-순서-있는-목록" class="headerlink" title="4.1 순서 있는 목록"></a>4.1 순서 있는 목록</h3><p>어떤 번호를 넣더라도 내림차순으로 숫자가 지정됩니다.<br><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">1. 첫번쨰</span><br><span class="line">3. 두번째</span><br><span class="line">2. 세번째</span><br></pre></td></tr></table></figure></p><ol><li>첫번째</li><li>두번째</li><li>세번째</li></ol><p><br><br>다른 목록 안에 목록을 중첩하려면 항목을 들여씁니다.</p><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">1. 첫번쨰</span><br><span class="line"> 1. 두번째</span><br><span class="line"> 1. 세번째</span><br><span class="line">1. 네번째</span><br></pre></td></tr></table></figure><ol><li>첫번째<ol><li>두번째</li><li>세번째</li></ol></li><li>네번쨰</li></ol><h3 id="4-2-순서-없는-목록"><a href="#4-2-순서-없는-목록" class="headerlink" title="4.2 순서 없는 목록"></a>4.2 순서 없는 목록</h3><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">* 빨강</span><br><span class="line"> * 녹색</span><br><span class="line"> * 파랑</span><br><span class="line"></span><br><span class="line">+ 빨강</span><br><span class="line"> + 녹색</span><br><span class="line"> + 파랑</span><br><span class="line"></span><br><span class="line">- 빨강</span><br><span class="line"> - 녹색</span><br><span class="line"> - 파랑</span><br></pre></td></tr></table></figure><ul><li>빨강<ul><li>녹색<ul><li>파랑</li></ul></li></ul></li></ul><ul><li>빨강<ul><li>녹색<ul><li>파랑</li></ul></li></ul></li></ul><ul><li>빨강<ul><li>녹색<ul><li>파랑</li></ul></li></ul></li></ul><h2 id="5-Table"><a href="#5-Table" class="headerlink" title="5. Table"></a>5. Table</h2><p>파이프(|) 및 하이픈(-)을 이용하여 테이블을 만들 수 있습니다.<br>하이픈으로는 헤더를 만들며 파이프로는 각 열을 만듭니다.<br>하이픈으로 헤더 구분시 좌측에 콜론(:)을 삽입 할 경우 좌측정렬 우측에 삽입 할 경우 우측정렬이 되며 양쪽에 둘 경우 가운데 정렬이 됩니다.</p><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">| Fun | With | Tables |</span><br><span class="line">| :------------------- | -------------------: |:---------------:|</span><br><span class="line">| left-aligned column | right-aligned column | centered column |</span><br><span class="line">| $100 | $100 | $100 |</span><br><span class="line">| $10 | $10 | $10 |</span><br><span class="line">| $1 | $1 | $1 |</span><br></pre></td></tr></table></figure><table><thead><tr><th style="text-align:left">Fun</th><th style="text-align:right">With</th><th style="text-align:center">Tables</th></tr></thead><tbody><tr><td style="text-align:left">left-aligned column</td><td style="text-align:right">right-aligned column</td><td style="text-align:center">centered column</td></tr><tr><td style="text-align:left">$100</td><td style="text-align:right">$100</td><td style="text-align:center">$100</td></tr><tr><td style="text-align:left">$10</td><td style="text-align:right">$10</td><td style="text-align:center">$10</td></tr><tr><td style="text-align:left">$1</td><td style="text-align:right">$1</td><td style="text-align:center">$1</td></tr></tbody></table><h2 id="6-링크"><a href="#6-링크" class="headerlink" title="6. 링크"></a>6. 링크</h2><h3 id="6-1-참조-링크"><a href="#6-1-참조-링크" class="headerlink" title="6.1. 참조 링크"></a>6.1. 참조 링크</h3><p>syntax:</p><blockquote><p>[id]: Link<br>[title][id]</p></blockquote><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[hscodev]: hsco.dev</span><br><span class="line">[github]: https://github.com/hscodev</span><br><span class="line"></span><br><span class="line">[블로그][hscodev]</span><br><span class="line"></span><br><span class="line">[깃허브][github]</span><br></pre></td></tr></table></figure><p><a href="https://hsco.dev" rel="external nofollow noopener noreferrer" target="_blank">블로그</a></p><p><a href="https://github.com/hscodev" rel="external nofollow noopener noreferrer" target="_blank">깃허브</a></p><h3 id="6-2-인라인-링크"><a href="#6-2-인라인-링크" class="headerlink" title="6.2. 인라인 링크"></a>6.2. 인라인 링크</h3><p>syntax: </p><blockquote><p>[Label](Link)</p></blockquote><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[블로그](https://hsco.dev)</span><br></pre></td></tr></table></figure><p><a href="https://hsco.dev" rel="external nofollow noopener noreferrer" target="_blank">블로그</a></p><h3 id="6-3-자동연결"><a href="#6-3-자동연결" class="headerlink" title="6.3. 자동연결"></a>6.3. 자동연결</h3><p>syntax: </p><blockquote><p>\<link></p></blockquote><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><https://hsco.dev></span><br></pre></td></tr></table></figure><p><a href="https://hsco.dev" rel="external nofollow noopener noreferrer" target="_blank">https://hsco.dev</a></p><h3 id="7-코드"><a href="#7-코드" class="headerlink" title="7. 코드"></a>7. 코드</h3><p>개발 코드를 코드블록으로 배치 할 수 있습니다.<br>alias 별칭을 이용하여 구문 강조가 가능합니다.</p><table><thead><tr><th>이름</th><th>Alias</th></tr></thead><tbody><tr><td>java</td><td>java</td></tr><tr><td>json</td><td>json</td></tr><tr><td>javascript</td><td>javascript</td></tr><tr><td>html</td><td>html</td></tr><tr><td>markdown</td><td>md</td></tr><tr><td>SQL</td><td>sql</td></tr><tr><td>등</td></tr></tbody></table><pre><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">your code goes in here</span><br></pre></td></tr></table></figure></pre><h3 id="8-이미지"><a href="#8-이미지" class="headerlink" title="8. 이미지"></a>8. 이미지</h3><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="/assets/images/별그림.png" alt="Alt text"><br><img src="/assets/images/별그림.png" alt="Alt text" title="별그림"></p>]]></content>
<summary type="html">
<h2 id="1-Header"><a href="#1-Header" class="headerlink" title="1. Header"></a>1. Header</h2><p>글머리 1 ~ 6<br><figure class="highlight plain
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="blog" scheme="https://eunii.github.io/categories/tec/blog/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="blog" scheme="https://eunii.github.io/tags/blog/"/>
<category term="github" scheme="https://eunii.github.io/tags/github/"/>
<category term="hexo" scheme="https://eunii.github.io/tags/hexo/"/>
<category term="Markdown" scheme="https://eunii.github.io/tags/Markdown/"/>
<category term="마크다운" scheme="https://eunii.github.io/tags/%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4/"/>
</entry>
<entry>
<title>[소켓통신/websocket] Spring boot로 소켓통신 채팅 웹 페이지 만들기</title>
<link href="https://eunii.github.io/2019/06/22/tec/spring/socket1/"/>
<id>https://eunii.github.io/2019/06/22/tec/spring/socket1/</id>
<published>2019-06-22T01:59:25.000Z</published>
<updated>2019-06-22T04:23:29.522Z</updated>
<content type="html"><![CDATA[<h2 id="1-Spring-boot로-웹-소켓통신-채팅-페이지-만들기"><a href="#1-Spring-boot로-웹-소켓통신-채팅-페이지-만들기" class="headerlink" title="1.Spring boot로 웹 소켓통신 채팅 페이지 만들기"></a>1.Spring boot로 웹 소켓통신 채팅 페이지 만들기</h2><h2 id="2-STS에서-Spirng-project-만들기"><a href="#2-STS에서-Spirng-project-만들기" class="headerlink" title="2. STS에서 Spirng project 만들기"></a>2. STS에서 Spirng project 만들기</h2><h3 id="2-1-files-new-Spring-Start-Project-클릭"><a href="#2-1-files-new-Spring-Start-Project-클릭" class="headerlink" title="2.1 files - new - Spring Start Project 클릭"></a>2.1 files - new - Spring Start Project 클릭</h3><img src="/assets/images/tec/socket/1.JPG"> <h3 id="2-2-아래와-같이-입력-프로젝트-이름-등-next클릭"><a href="#2-2-아래와-같이-입력-프로젝트-이름-등-next클릭" class="headerlink" title="2.2 아래와 같이 입력(프로젝트 이름 등) - next클릭"></a>2.2 아래와 같이 입력(프로젝트 이름 등) - next클릭</h3><img src="/assets/images/tec/socket/2.JPG"> <h3 id="2-3-Available에web-검색-후-WebSocket-Spring-web-start-체크-후-Finish-클릭"><a href="#2-3-Available에web-검색-후-WebSocket-Spring-web-start-체크-후-Finish-클릭" class="headerlink" title="2.3 Available에web 검색 후 WebSocket, Spring web start 체크 후 Finish 클릭"></a>2.3 Available에web 검색 후 WebSocket, Spring web start 체크 후 Finish 클릭</h3><img src="/assets/images/tec/socket/3.JPG"> <h3 id="2-4-pom-xml에-다음과-같은-디펜던시-추가-됐는지-확인한다"><a href="#2-4-pom-xml에-다음과-같은-디펜던시-추가-됐는지-확인한다" class="headerlink" title="2.4 pom.xml에 다음과 같은 디펜던시 추가 됐는지 확인한다."></a>2.4 pom.xml에 다음과 같은 디펜던시 추가 됐는지 확인한다.</h3><figure class="highlight xml hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span><br><span class="line"><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-web-services<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span><br><span class="line"><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-websocket<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span><br><span class="line"><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span><br></pre></td></tr></table></figure><p>아래 디펜던시를 추가한다.<br><figure class="highlight xml hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.apache.tomcat.embed<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></span><br><span class="line"><span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>tomcat-embed-jasper<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></span><br><span class="line"><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></span><br></pre></td></tr></table></figure></p><img src="/assets/images/tec/socket/4.JPG"> <h3 id="2-5-src-main-webapp-WEB-INF-jsp-폴더를-만든다"><a href="#2-5-src-main-webapp-WEB-INF-jsp-폴더를-만든다" class="headerlink" title="2.5 src/main/webapp/WEB-INF/jsp 폴더를 만든다"></a>2.5 src/main/webapp/WEB-INF/jsp 폴더를 만든다</h3><img src="/assets/images/tec/socket/5.JPG"> <h3 id="2-6-src-main-resources-application-properites에-아래-내용을-추가한다"><a href="#2-6-src-main-resources-application-properites에-아래-내용을-추가한다" class="headerlink" title="2.6 src/main/resources/application.properites에 아래 내용을 추가한다."></a>2.6 src/main/resources/application.properites에 아래 내용을 추가한다.</h3><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">spring.mvc.view.prefix=/WEB-INF/jsp/</span><br><span class="line">spring.mvc.view.suffix=.jsp</span><br></pre></td></tr></table></figure><img src="/assets/images/tec/socket/5.JPG"> <h3 id="2-7-src-main-io-github-eunii-chatting-ChattingApplication-java에-config-어노테이션을-추가한다"><a href="#2-7-src-main-io-github-eunii-chatting-ChattingApplication-java에-config-어노테이션을-추가한다" class="headerlink" title="2.7 src/main/ io.github.eunii.chatting/ChattingApplication.java에 @config 어노테이션을 추가한다."></a>2.7 src/main/ io.github.eunii.chatting/ChattingApplication.java에 @config 어노테이션을 추가한다.</h3><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="hljs-keyword">package</span> io.github.eunii.chatting;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.boot.SpringApplication;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"><span class="hljs-meta">@SpringBootApplication</span></span><br><span class="line"><span class="hljs-meta">@Configuration</span></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ChattingApplication</span> </span>{</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{</span><br><span class="line">SpringApplication.run(ChattingApplication.class, args);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="3-src-main-java-아래-io-github-eunii-chatting-config-패키지를-만들고-아래-내용의-WebScoketConfig-java-파일을-만든다"><a href="#3-src-main-java-아래-io-github-eunii-chatting-config-패키지를-만들고-아래-내용의-WebScoketConfig-java-파일을-만든다" class="headerlink" title="3. src/main/java 아래 io.github.eunii.chatting.config 패키지를 만들고 아래 내용의 WebScoketConfig.java 파일을 만든다."></a>3. src/main/java 아래 io.github.eunii.chatting.config 패키지를 만들고 아래 내용의 WebScoketConfig.java 파일을 만든다.</h2><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">package</span> io.github.eunii.chatting.config;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.web.socket.config.annotation.EnableWebSocket;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.web.socket.config.annotation.WebSocketConfigurer;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;</span><br><span class="line"><span class="hljs-keyword">import</span> io.github.eunii.chatting.handler.SocketTextHandler;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="hljs-meta">@Configuration</span></span><br><span class="line"><span class="hljs-meta">@EnableWebSocket</span></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">WebSocketConfig</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">WebSocketConfigurer</span> </span>{</span><br><span class="line"></span><br><span class="line"><span class="hljs-meta">@Autowired</span></span><br><span class="line">SocketTextHandler socketTextHandler;</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">registerWebSocketHandlers</span><span class="hljs-params">(WebSocketHandlerRegistry registry)</span> </span>{</span><br><span class="line">registry.addHandler(socketTextHandler, <span class="hljs-string">"/chat"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>/chat 으로 호출이 오면 SocketTestHandler를 실행한다는 뜻이다.</p><img src="/assets/images/tec/socket/6.JPG"> <h2 id="4-src-main-java-아래-io-github-eunii-chatting-handler-패키지를-만들고-아래-내용의-SocketTextHandler-java-파일을-만든다"><a href="#4-src-main-java-아래-io-github-eunii-chatting-handler-패키지를-만들고-아래-내용의-SocketTextHandler-java-파일을-만든다" class="headerlink" title="4 src/main/java 아래 io.github.eunii.chatting.handler 패키지를 만들고 아래 내용의 SocketTextHandler.java 파일을 만든다."></a>4 src/main/java 아래 io.github.eunii.chatting.handler 패키지를 만들고 아래 내용의 SocketTextHandler.java 파일을 만든다.</h2><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">package</span> io.github.eunii.chatting.handler;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="hljs-keyword">import</span> java.util.HashMap;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.web.socket.CloseStatus;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.web.socket.TextMessage;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.web.socket.WebSocketSession;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.web.socket.handler.TextWebSocketHandler;</span><br><span class="line"></span><br><span class="line"><span class="hljs-meta">@Component</span></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SocketTextHandler</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">TextWebSocketHandler</span> </span>{</span><br><span class="line"></span><br><span class="line"><span class="hljs-comment">//ArrayList<WebSocketSession> sessions = new ArrayList<>();</span></span><br><span class="line">HashMap<String, WebSocketSession> sessions = <span class="hljs-keyword">new</span> HashMap<>();</span><br><span class="line"></span><br><span class="line"><span class="hljs-comment">// client에서 메시지가 서버로 전송댈때 실행되는 함수.</span></span><br><span class="line"><span class="hljs-meta">@Override</span></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleTextMessage</span><span class="hljs-params">(WebSocketSession session, TextMessage message)</span> </span>{</span><br><span class="line">String payload = message.getPayload();</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">try</span> {</span><br><span class="line"></span><br><span class="line"><span class="hljs-comment">// 접속된 모든 세션에 메시지 전송</span></span><br><span class="line"><span class="hljs-keyword">for</span> (String key : sessions.keySet()) {</span><br><span class="line">WebSocketSession ss = sessions.get(key);</span><br><span class="line">ss.sendMessage(<span class="hljs-keyword">new</span> TextMessage(payload));</span><br><span class="line">}</span><br><span class="line">} <span class="hljs-keyword">catch</span> (IOException e) {</span><br><span class="line"><span class="hljs-comment">// TODO Auto-generated catch block</span></span><br><span class="line">e.printStackTrace();</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-comment">// 세션이 생성될때 시작되는 함수</span></span><br><span class="line"><span class="hljs-meta">@Override</span></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">afterConnectionEstablished</span><span class="hljs-params">(WebSocketSession session)</span> <span class="hljs-keyword">throws</span> Exception </span>{</span><br><span class="line"><span class="hljs-keyword">super</span>.afterConnectionEstablished(session);</span><br><span class="line">sessions.put(session.getId(), session);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-comment">// 세션이 끝날때 실행되는 함수</span></span><br><span class="line"><span class="hljs-meta">@Override</span></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">afterConnectionClosed</span><span class="hljs-params">(WebSocketSession session, CloseStatus status)</span> <span class="hljs-keyword">throws</span> Exception </span>{</span><br><span class="line"></span><br><span class="line">sessions.remove(session.getId());</span><br><span class="line"><span class="hljs-keyword">super</span>.afterConnectionClosed(session, status);</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li>handleTextMessage(WebSocketSession session, TextMessage message) 함수는 클라이언트에서 ws.send(data)가 호출되면 실행된다.</li><li>afterConnectionEstablished()는 세션이 시작될때 실행되는 함수이다. 여기선 sessions에 생성된 세션 정보를 저장한다.</li><li>afterConnectionClosed()는 세션이 끊길때 실행되는 함수. 여기선 sessions에 저장된 세션 정보를 지운다.</li></ul><img src="/assets/images/tec/socket/7.JPG"> <h2 id="4-Client-jps-페이지-만들기-src-main-webapp-WEB-INF-jsp에-chat-jsp파일을-만든다"><a href="#4-Client-jps-페이지-만들기-src-main-webapp-WEB-INF-jsp에-chat-jsp파일을-만든다" class="headerlink" title="4. Client jps 페이지 만들기 src/main/webapp/WEB-INF/jsp에 chat.jsp파일을 만든다."></a>4. Client jps 페이지 만들기 src/main/webapp/WEB-INF/jsp에 chat.jsp파일을 만든다.</h2><figure class="highlight plain hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><%@ page language="java" contentType="text/html; charset=UTF-8"</span><br><span class="line">pageEncoding="UTF-8"%></span><br><span class="line"><!DOCTYPE html></span><br><span class="line"><html></span><br><span class="line"><head></span><br><span class="line"><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script></span><br><span class="line"><meta charset="UTF-8"></span><br><span class="line"><title>Insert title here</title></span><br><span class="line"></head></span><br><span class="line"></span><br><span class="line"><script type="text/javascript"></span><br><span class="line"></span><br><span class="line">var ws;</span><br><span class="line">function connectWs() {</span><br><span class="line">ws = new WebSocket('ws://' + location.host + '/chat');</span><br><span class="line">ws.onmessage = function(data) {</span><br><span class="line">console.log(data.data);</span><br><span class="line">$("<p>"+data.data+"</p>").prependTo('#chat');</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">$('#startBtn').hide();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">function send() {</span><br><span class="line">ws.send($("#chatting").val());</span><br><span class="line">$('#chatting').val("");</span><br><span class="line">}</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><body></span><br><span class="line"></span><br><span class="line"><h1>채팅 방 입니다</h1></span><br><span class="line"><button onclick="connectWs()" id="startBtn"> 채팅 시작하기</button></span><br><span class="line"><input id="chatting"></input><button onclick="send()"> 보내기 </button></span><br><span class="line"><div></span><br><span class="line"><p id="chat"></p></span><br><span class="line"></div></span><br><span class="line"></body></span><br><span class="line"></html></span><br></pre></td></tr></table></figure><ul><li><p>jquery를 추가한다.</p> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script></li><li><p>채팅 시작하기 버튼을 만들어 connectWs() 함수로 소켓을 연다.</p></li><li><p>ws.onmessage = function(data) {} 함수는 서버에서 handleTextMessage()가 실행되어 전송해준 data를 받는다.</p></li><li><p>ws.send(“STRING”) 함수는 send()함수가 실행될때마다 handleTextMessage(WebSocketSession session, TextMessage message)에 message정보를 보낸다.</p></li></ul><h2 id="5-src-main-java-아래-io-github-eunii-chatting-controller-패키지를-만들고-아래-내용의-MainController-java-파일을-만든다"><a href="#5-src-main-java-아래-io-github-eunii-chatting-controller-패키지를-만들고-아래-내용의-MainController-java-파일을-만든다" class="headerlink" title="5 src/main/java 아래 io.github.eunii.chatting.controller 패키지를 만들고 아래 내용의 MainController.java 파일을 만든다."></a>5 src/main/java 아래 io.github.eunii.chatting.controller 패키지를 만들고 아래 내용의 MainController.java 파일을 만든다.</h2><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">package</span> io.github.eunii.chatting.controller;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="hljs-keyword">import</span> org.springframework.web.servlet.ModelAndView;</span><br><span class="line"></span><br><span class="line"><span class="hljs-meta">@Controller</span></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MainController</span> </span>{</span><br><span class="line"></span><br><span class="line"><span class="hljs-meta">@RequestMapping</span>(<span class="hljs-string">"/"</span>)</span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> ModelAndView <span class="hljs-title">home</span><span class="hljs-params">()</span> </span>{</span><br><span class="line">ModelAndView mv = <span class="hljs-keyword">new</span> ModelAndView(<span class="hljs-string">"chat"</span>);</span><br><span class="line"><span class="hljs-keyword">return</span> mv;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="6-start-as-Spring-boot-app으로-서버를-실행한다"><a href="#6-start-as-Spring-boot-app으로-서버를-실행한다" class="headerlink" title="6. start as Spring boot app으로 서버를 실행한다."></a>6. start as Spring boot app으로 서버를 실행한다.</h2><img src="/assets/images/tec/socket/8.JPG"> <h2 id="7-두개의-브라우저에서-http-localhost-8080-창을-띄운다"><a href="#7-두개의-브라우저에서-http-localhost-8080-창을-띄운다" class="headerlink" title="7. 두개의 브라우저에서 http://localhost:8080/ 창을 띄운다."></a>7. 두개의 브라우저에서 <a href="http://localhost:8080/" rel="external nofollow noopener noreferrer" target="_blank">http://localhost:8080/</a> 창을 띄운다.</h2><img src="/assets/images/tec/socket/9.JPG"> <h2 id="8-채팅-시작하기를-누른다"><a href="#8-채팅-시작하기를-누른다" class="headerlink" title="8. 채팅 시작하기를 누른다."></a>8. 채팅 시작하기를 누른다.</h2><img src="/assets/images/tec/socket/10.JPG"> <h2 id="9-메시지를-전송해-본다"><a href="#9-메시지를-전송해-본다" class="headerlink" title="9. 메시지를 전송해 본다."></a>9. 메시지를 전송해 본다.</h2><img src="/assets/images/tec/socket/11.JPG"> ]]></content>
<summary type="html">
<h2 id="1-Spring-boot로-웹-소켓통신-채팅-페이지-만들기"><a href="#1-Spring-boot로-웹-소켓통신-채팅-페이지-만들기" class="headerlink" title="1.Spring boot로 웹 소켓통신 채팅 페이지
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="spring" scheme="https://eunii.github.io/categories/tec/spring/"/>
<category term="websocket" scheme="https://eunii.github.io/tags/websocket/"/>
<category term="소켓통신" scheme="https://eunii.github.io/tags/%EC%86%8C%EC%BC%93%ED%86%B5%EC%8B%A0/"/>
<category term="spirng boot" scheme="https://eunii.github.io/tags/spirng-boot/"/>
</entry>
<entry>
<title>[공유기 도메인 설정] LG U+ 공유기로 무료 도메인 설정하기</title>
<link href="https://eunii.github.io/2019/06/17/tec/network/network1/"/>
<id>https://eunii.github.io/2019/06/17/tec/network/network1/</id>
<published>2019-06-17T02:26:25.000Z</published>
<updated>2019-06-22T04:17:34.950Z</updated>
<content type="html"><![CDATA[<h2 id="1-LG-U-라우터-접속"><a href="#1-LG-U-라우터-접속" class="headerlink" title="1. LG U+ 라우터 접속"></a>1. LG U+ 라우터 접속</h2><ul><li><a href="http://192.168.219.1" rel="external nofollow noopener noreferrer" target="_blank">http://192.168.219.1</a> 에 접속한다.<br>(윈도우+cmd창에서 ipconfig 하면 기본 게이트 웨이 주소)</li></ul><img src="/assets/images/network/공유기1.JPG"><h2 id="2-공유기에-적힌-‘웹admin암호’로-로그인한다"><a href="#2-공유기에-적힌-‘웹admin암호’로-로그인한다" class="headerlink" title="2.공유기에 적힌 ‘웹admin암호’로 로그인한다."></a>2.공유기에 적힌 ‘웹admin암호’로 로그인한다.</h2><img src="/assets/images/network/공유기2.JPG"><h2 id="3-DDNS-설정부분의-톱니바퀴-모양을-누른다"><a href="#3-DDNS-설정부분의-톱니바퀴-모양을-누른다" class="headerlink" title="3. DDNS 설정부분의 톱니바퀴 모양을 누른다."></a>3. DDNS 설정부분의 톱니바퀴 모양을 누른다.</h2><img src="/assets/images/network/공유기3.JPG"><h2 id="4-네트워크-설정-세부설정-DDNS-버튼을-눌러도-됨"><a href="#4-네트워크-설정-세부설정-DDNS-버튼을-눌러도-됨" class="headerlink" title="4. 네트워크 설정 - 세부설정 - DDNS 버튼을 눌러도 됨."></a>4. 네트워크 설정 - 세부설정 - DDNS 버튼을 눌러도 됨.</h2><p>DDNS 설정을 사용함으로 바꾼다.<br>DDNS 서버를 noip.com 을 선택하고 DDNS사용자 등록을 누른다.</p><img src="/assets/images/network/공유기4.JPG"><h2 id="5-noip-com-에-가서-sign-up-버튼을-눌러-회원가입을-한다"><a href="#5-noip-com-에-가서-sign-up-버튼을-눌러-회원가입을-한다" class="headerlink" title="5. noip.com 에 가서 sign up 버튼을 눌러 회원가입을 한다."></a>5. noip.com 에 가서 sign up 버튼을 눌러 회원가입을 한다.</h2><p><a href="https://www.noip.com" rel="external nofollow noopener noreferrer" target="_blank">noip 홈페이지</a> </p><img src="/assets/images/network/공유기5.JPG"><h2 id="6-email-비밀번호-호스트네임을-넣고-원하는-도메인주소를-선택한다"><a href="#6-email-비밀번호-호스트네임을-넣고-원하는-도메인주소를-선택한다" class="headerlink" title="6. email, 비밀번호, 호스트네임을 넣고 원하는 도메인주소를 선택한다."></a>6. email, 비밀번호, 호스트네임을 넣고 원하는 도메인주소를 선택한다.</h2><p>free sign up 버튼을 누른다.<br><img src="/assets/images/network/공유기6.JPG"></p><h2 id="7-여기에서-프로그램을-다운받아-실행한다"><a href="#7-여기에서-프로그램을-다운받아-실행한다" class="headerlink" title="7. 여기에서 프로그램을 다운받아 실행한다."></a>7. <a href="https://www.noip.com/download?page=win" rel="external nofollow noopener noreferrer" target="_blank">여기</a>에서 프로그램을 다운받아 실행한다.</h2><img src="/assets/images/network/공유기7.JPG"><h2 id="8-다운로드-받은-프로그램을-실행해서-로그인-한다"><a href="#8-다운로드-받은-프로그램을-실행해서-로그인-한다" class="headerlink" title="8. 다운로드 받은 프로그램을 실행해서 로그인 한다."></a>8. 다운로드 받은 프로그램을 실행해서 로그인 한다.</h2><img src="/assets/images/network/공유기8.JPG"><h2 id="9-만든-도메인을-클릭하고-save버튼을-누른다"><a href="#9-만든-도메인을-클릭하고-save버튼을-누른다" class="headerlink" title="9. 만든 도메인을 클릭하고 save버튼을 누른다."></a>9. 만든 도메인을 클릭하고 save버튼을 누른다.</h2><img src="/assets/images/network/공유기9.JPG"><h2 id="10-공유기-라우터-화면으로-돌아와서-사용자-비밀번호-호스트-도메인-이름을-넣고-설정-적용-버튼을-누른다"><a href="#10-공유기-라우터-화면으로-돌아와서-사용자-비밀번호-호스트-도메인-이름을-넣고-설정-적용-버튼을-누른다" class="headerlink" title="10. 공유기 라우터 화면으로 돌아와서 사용자, 비밀번호, 호스트 도메인 이름을 넣고 설정 적용 버튼을 누른다."></a>10. 공유기 라우터 화면으로 돌아와서 사용자, 비밀번호, 호스트 도메인 이름을 넣고 설정 적용 버튼을 누른다.</h2><img src="/assets/images/network/공유기10.JPG"><h2 id="11-host도메인에-접속하여-잘-접속되는지-확인한다"><a href="#11-host도메인에-접속하여-잘-접속되는지-확인한다" class="headerlink" title="11. host도메인에 접속하여 잘 접속되는지 확인한다."></a>11. host도메인에 접속하여 잘 접속되는지 확인한다.</h2>]]></content>
<summary type="html">
<h2 id="1-LG-U-라우터-접속"><a href="#1-LG-U-라우터-접속" class="headerlink" title="1. LG U+ 라우터 접속"></a>1. LG U+ 라우터 접속</h2><ul>
<li><a href="http://
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="network" scheme="https://eunii.github.io/categories/tec/network/"/>
<category term="network" scheme="https://eunii.github.io/tags/network/"/>
<category term="공유기" scheme="https://eunii.github.io/tags/%EA%B3%B5%EC%9C%A0%EA%B8%B0/"/>
<category term="도메인" scheme="https://eunii.github.io/tags/%EB%8F%84%EB%A9%94%EC%9D%B8/"/>
<category term="noip" scheme="https://eunii.github.io/tags/noip/"/>
</entry>
<entry>
<title>[자료구조] MeargeSort(병합 정렬) - Java</title>
<link href="https://eunii.github.io/2019/05/16/tec/algorithm/al1/"/>
<id>https://eunii.github.io/2019/05/16/tec/algorithm/al1/</id>
<published>2019-05-15T15:00:00.000Z</published>
<updated>2019-05-16T08:25:46.749Z</updated>
<content type="html"><![CDATA[<h2 id="1-병합정렬-MeargeSort"><a href="#1-병합정렬-MeargeSort" class="headerlink" title="1. 병합정렬(MeargeSort)"></a>1. 병합정렬(MeargeSort)</h2><h3 id="1-1-병합-정렬이란"><a href="#1-1-병합-정렬이란" class="headerlink" title="1.1 병합 정렬이란?"></a>1.1 병합 정렬이란?</h3><ol><li>정렬할때 가장 작은 단위로 나눠서 정렬후(sort) 병합(mearge)하는 것을 말한다. </li></ol><h3 id="문제-2751-백준-수-정렬하기-2"><a href="#문제-2751-백준-수-정렬하기-2" class="headerlink" title="문제.2751 [백준] 수 정렬하기 2"></a>문제.2751 [백준] <a href="https://www.acmicpc.net/problem/2751" rel="external nofollow noopener noreferrer" target="_blank">수 정렬하기 2</a></h3><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="hljs-keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="hljs-keyword">import</span> java.io.InputStreamReader;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Main</span> </span>{</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">mergeSort</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] arr)</span> </span>{</span><br><span class="line">mergeSort(arr, <span class="hljs-number">0</span>, arr.length - <span class="hljs-number">1</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">mergeSort</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] arr, <span class="hljs-keyword">int</span> start, <span class="hljs-keyword">int</span> end)</span> </span>{</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">int</span>[] tmp = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[arr.length];</span><br><span class="line"><span class="hljs-keyword">if</span> (start < end) {</span><br><span class="line"><span class="hljs-keyword">int</span> mid = (start + end) / <span class="hljs-number">2</span>;</span><br><span class="line">mergeSort(arr, start, mid);</span><br><span class="line">mergeSort(arr, mid + <span class="hljs-number">1</span>, end);</span><br><span class="line">mearge(arr, start, mid, end);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">mearge</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] arr, <span class="hljs-keyword">int</span> start, <span class="hljs-keyword">int</span> mid, <span class="hljs-keyword">int</span> end)</span> </span>{</span><br><span class="line"><span class="hljs-keyword">int</span>[] tmp = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[arr.length];</span><br><span class="line"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = start; i <= end; i++) {</span><br><span class="line">tmp[i] = arr[i];</span><br><span class="line">}</span><br><span class="line"><span class="hljs-keyword">int</span> part1 = start;</span><br><span class="line"><span class="hljs-keyword">int</span> part2 = mid + <span class="hljs-number">1</span>;</span><br><span class="line"><span class="hljs-keyword">int</span> index = start;</span><br><span class="line"><span class="hljs-keyword">while</span> (part1 <= mid && part2 <= end) {</span><br><span class="line"><span class="hljs-keyword">if</span> (tmp[part1] <= tmp[part2]) {</span><br><span class="line">arr[index] = tmp[part1];</span><br><span class="line">part1++;</span><br><span class="line">} <span class="hljs-keyword">else</span> {</span><br><span class="line">arr[index] = tmp[part2];</span><br><span class="line">part2++;</span><br><span class="line">}</span><br><span class="line">index++;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i <= mid - part1; i++) {</span><br><span class="line">arr[index + i] = tmp[part1 + i];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">printArray</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] arr)</span> </span>{</span><br><span class="line"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i : arr) {</span><br><span class="line">System.out.println(i);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> NumberFormatException, IOException </span>{</span><br><span class="line"></span><br><span class="line">BufferedReader br = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(System.in));</span><br><span class="line"><span class="hljs-keyword">int</span> n = Integer.parseInt(br.readLine());</span><br><span class="line"><span class="hljs-keyword">int</span>[] arr = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[n];</span><br><span class="line"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < n; i++) {</span><br><span class="line">arr[i] = Integer.parseInt(br.readLine());</span><br><span class="line">}</span><br><span class="line">br.close();</span><br><span class="line">mergeSort(arr);</span><br><span class="line">printArray(arr);</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li>4,3,2,1 배열을 정렬할때 아래 순으로 졍렬된다. </li></ul><table><thead><tr><th style="text-align:center">4</th><th style="text-align:center">3</th><th style="text-align:center">2</th><th style="text-align:center">1</th></tr></thead><tbody><tr><td style="text-align:center">3</td><td style="text-align:center">4</td><td style="text-align:center">2</td><td style="text-align:center">1</td></tr><tr><td style="text-align:center">3</td><td style="text-align:center">4</td><td style="text-align:center">1</td><td style="text-align:center">2</td></tr><tr><td style="text-align:center">1</td><td style="text-align:center">2</td><td style="text-align:center">3</td><td style="text-align:center">4</td></tr></tbody></table>]]></content>
<summary type="html">
<h2 id="1-병합정렬-MeargeSort"><a href="#1-병합정렬-MeargeSort" class="headerlink" title="1. 병합정렬(MeargeSort)"></a>1. 병합정렬(MeargeSort)</h2><h3 id="1
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/categories/tec/alogrithm/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/tags/alogrithm/"/>
<category term="정렬" scheme="https://eunii.github.io/tags/%EC%A0%95%EB%A0%AC/"/>
</entry>
<entry>
<title>[자료구조] QuickSort(퀵정렬) - Java</title>
<link href="https://eunii.github.io/2019/05/16/tec/algorithm/al2/"/>
<id>https://eunii.github.io/2019/05/16/tec/algorithm/al2/</id>
<published>2019-05-15T15:00:00.000Z</published>
<updated>2019-05-16T08:25:46.763Z</updated>
<content type="html"><![CDATA[<h2 id="1-QuickSort-퀵정렬"><a href="#1-QuickSort-퀵정렬" class="headerlink" title="1. QuickSort(퀵정렬)"></a>1. QuickSort(퀵정렬)</h2><h3 id="1-1-퀵정렬-이란"><a href="#1-1-퀵정렬-이란" class="headerlink" title="1.1 퀵정렬 이란?"></a>1.1 퀵정렬 이란?</h3><ol><li>배열중에 임의의 한 값을 선택해 그 기준값을 기준으로 작은건 왼쪽, 큰건 오른쪽에 정렬.</li></ol><h3 id="문제-2751-백준-수-정렬하기-2"><a href="#문제-2751-백준-수-정렬하기-2" class="headerlink" title="문제.2751 [백준] 수 정렬하기 2"></a>문제.2751 [백준] <a href="https://www.acmicpc.net/problem/2751" rel="external nofollow noopener noreferrer" target="_blank">수 정렬하기 2</a></h3><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="hljs-keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="hljs-keyword">import</span> java.io.InputStreamReader;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Main</span> </span>{</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> NumberFormatException, IOException </span>{</span><br><span class="line"></span><br><span class="line">BufferedReader br = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(System.in));</span><br><span class="line"><span class="hljs-keyword">int</span> n = Integer.parseInt(br.readLine());</span><br><span class="line"><span class="hljs-keyword">int</span>[] arr = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[n];</span><br><span class="line"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < n; i++) {</span><br><span class="line">arr[i] = Integer.parseInt(br.readLine());</span><br><span class="line">}</span><br><span class="line">br.close();</span><br><span class="line">quickSort(arr);</span><br><span class="line"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i : arr) {</span><br><span class="line">System.out.println(i);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">quickSort</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] arr)</span> </span>{</span><br><span class="line">sort(arr, <span class="hljs-number">0</span>, arr.length - <span class="hljs-number">1</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sort</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] arr, <span class="hljs-keyword">int</span> start, <span class="hljs-keyword">int</span> end)</span> </span>{</span><br><span class="line"><span class="hljs-keyword">if</span> (start >= end)</span><br><span class="line"><span class="hljs-keyword">return</span>;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">int</span> mid = partition(arr, start, end);</span><br><span class="line">sort(arr, start, mid - <span class="hljs-number">1</span>);</span><br><span class="line">sort(arr, mid, end);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">partition</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] arr, <span class="hljs-keyword">int</span> start, <span class="hljs-keyword">int</span> end)</span> </span>{</span><br><span class="line"><span class="hljs-keyword">int</span> pivot = arr[(start + end) / <span class="hljs-number">2</span>];</span><br><span class="line"><span class="hljs-keyword">while</span> (start <= end) {</span><br><span class="line"><span class="hljs-keyword">while</span> (arr[start] < pivot)</span><br><span class="line">start++;</span><br><span class="line"><span class="hljs-keyword">while</span> (arr[end] > pivot)</span><br><span class="line">end--;</span><br><span class="line"><span class="hljs-keyword">if</span> (start <= end) {</span><br><span class="line">swap(arr, start, end);</span><br><span class="line">start++;</span><br><span class="line">end--;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="hljs-keyword">return</span> start;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">swap</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] arr, <span class="hljs-keyword">int</span> i, <span class="hljs-keyword">int</span> j)</span> </span>{</span><br><span class="line"><span class="hljs-keyword">int</span> tmp = arr[i];</span><br><span class="line">arr[i] = arr[j];</span><br><span class="line">arr[j] = tmp;</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li>4,3,2,1,0 배열을 정렬할때 아래 순으로 졍렬된다. </li></ul><table><thead><tr><th style="text-align:center">4</th><th style="text-align:center">3</th><th style="text-align:center">2</th><th style="text-align:center">1</th><th style="text-align:center">0</th></tr></thead><tbody><tr><td style="text-align:center">0</td><td style="text-align:center">3</td><td style="text-align:center">2</td><td style="text-align:center">1</td><td style="text-align:center">4</td></tr><tr><td style="text-align:center">0</td><td style="text-align:center">1</td><td style="text-align:center">2</td><td style="text-align:center">3</td><td style="text-align:center">4</td></tr></tbody></table>]]></content>
<summary type="html">
<h2 id="1-QuickSort-퀵정렬"><a href="#1-QuickSort-퀵정렬" class="headerlink" title="1. QuickSort(퀵정렬)"></a>1. QuickSort(퀵정렬)</h2><h3 id="1-1-퀵정렬-이
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/categories/tec/alogrithm/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="alogrithm" scheme="https://eunii.github.io/tags/alogrithm/"/>
<category term="정렬" scheme="https://eunii.github.io/tags/%EC%A0%95%EB%A0%AC/"/>
</entry>
<entry>
<title>[SPRING] 6. DI(Dependency injection)</title>
<link href="https://eunii.github.io/2019/05/15/tec/spring/spring2/"/>
<id>https://eunii.github.io/2019/05/15/tec/spring/spring2/</id>
<published>2019-05-14T15:00:00.000Z</published>
<updated>2019-05-15T08:43:08.469Z</updated>
<content type="html"><![CDATA[<blockquote><p>인프런의 <em>자바 스프링 프레임워크(ver.2018) - 신입 프로그래머를 위한 강좌</em>를 보고 정리한 내용입니다. </p></blockquote><h2 id="6-DI-Dependency-injection"><a href="#6-DI-Dependency-injection" class="headerlink" title="6. DI(Dependency injection)"></a>6. DI(Dependency injection)</h2><h3 id="6-1-DI-Dependency-Injection-란"><a href="#6-1-DI-Dependency-Injection-란" class="headerlink" title="6.1 DI(Dependency Injection)란?"></a>6.1 DI(Dependency Injection)란?</h3><ul><li>배터리 일체형<figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ElectronicCarToy</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">private</span> Battery battery;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">ElectroniCarToy</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> battery = <span class="hljs-keyword">new</span> NormalBattery();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><p>배터리가 떨어지면 장난감 새로 구입해야함</p><ul><li>배터리 분리형 1<figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ElectronicCarToy</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">private</span> Battery battery;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">ElectroniCarToy</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setBattery</span><span class="hljs-params">(Battery battery)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">this</span>.battery = battery;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><p>setBattery()를통해 배터리를 교체 할 수 있다. (처음에 배터리 없는 상태로 출시)</p><ul><li>배터리 분리형 2<figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ElectronicCarToy</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">private</span> Battery battery;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">ElectroniCarToy</span><span class="hljs-params">(Battery battery)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">this</span>.battery = battery;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setBattery</span><span class="hljs-params">(Battery battery)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">this</span>.battery = battery;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><p>setBattery()를통해 배터리를 교체 할 수 있다. (처음에 배터리 있는 상태로 출시)</p>]]></content>
<summary type="html">
<blockquote>
<p>인프런의 <em>자바 스프링 프레임워크(ver.2018) - 신입 프로그래머를 위한 강좌</em>를 보고 정리한 내용입니다. </p>
</blockquote>
<h2 id="6-DI-Dependency-injection">
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="spring" scheme="https://eunii.github.io/categories/tec/spring/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="spring" scheme="https://eunii.github.io/tags/spring/"/>
<category term="framework" scheme="https://eunii.github.io/tags/framework/"/>
</entry>
<entry>
<title>[SPRING] 1. 스프링 개요</title>
<link href="https://eunii.github.io/2019/05/15/tec/spring/spring1/"/>
<id>https://eunii.github.io/2019/05/15/tec/spring/spring1/</id>
<published>2019-05-14T15:00:00.000Z</published>
<updated>2019-05-15T08:36:15.170Z</updated>
<content type="html"><![CDATA[<blockquote><p>인프런의 <em>자바 스프링 프레임워크(ver.2018) - 신입 프로그래머를 위한 강좌</em>를 보고 정리한 내용입니다. </p></blockquote><h2 id="1-스프링개요"><a href="#1-스프링개요" class="headerlink" title="1. 스프링개요"></a>1. 스프링개요</h2><h3 id="1-1-스프링프레임워크"><a href="#1-1-스프링프레임워크" class="headerlink" title="1.1 스프링프레임워크"></a>1.1 스프링프레임워크</h3><p>스프링프레임워크는 주요기능으로 DI. AOP, MVC, JDBC등을 제공한다.</p><h3 id="1-2-스프링-프레임워크-모듈"><a href="#1-2-스프링-프레임워크-모듈" class="headerlink" title="1.2 스프링 프레임워크 모듈"></a>1.2 스프링 프레임워크 모듈</h3><table><thead><tr><th>스프링모듈</th><th>기능</th></tr></thead><tbody><tr><td>spring-core</td><td>스프링의 핵심인 DI(Depenency Injection)과 IoC(Inversion of Control)을 제공</td></tr><tr><td>spring-aop</td><td>AOP 구현 기능 제공</td></tr><tr><td>spring-jdbc</td><td>데이터베이스를 쉽게 다룰 수 있는 기능 제공</td></tr><tr><td>spring-tx</td><td>스프링에서 제공하는 트랜젝션 관련 기능</td></tr><tr><td>spring-webmvc</td><td>스프링에서 제공하는 컨트롤러(Controller)와 뷰(View)를 이용한 MVC구현 기능 제공</td></tr></tbody></table><h3 id="1-3-스프링-컨테이너-IoC"><a href="#1-3-스프링-컨테이너-IoC" class="headerlink" title="1.3 스프링 컨테이너(IoC)"></a>1.3 스프링 컨테이너(IoC)</h3><p>스프링에서 객체를 생성하고 조립하는 컨테이너(contatiner)로, 컨테이너를 통해 생성된 객체를 빈(Bean)이라고 부른다. </p><ol><li>객체생성 및 속성 데이터 작성(xml문서)</li><li>스프링컨테이너에서 객체 생성 및 조립</li><li>애플리케이션 구현(개발 문서)</li></ol>]]></content>
<summary type="html">
<blockquote>
<p>인프런의 <em>자바 스프링 프레임워크(ver.2018) - 신입 프로그래머를 위한 강좌</em>를 보고 정리한 내용입니다. </p>
</blockquote>
<h2 id="1-스프링개요"><a href="#1-스프링개요"
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="spring" scheme="https://eunii.github.io/categories/tec/spring/"/>
<category term="tec" scheme="https://eunii.github.io/tags/tec/"/>
<category term="spring" scheme="https://eunii.github.io/tags/spring/"/>
<category term="framework" scheme="https://eunii.github.io/tags/framework/"/>
</entry>
<entry>
<title>[CH11. 컬렉션프레임웍과 유용한 클래스] 컬렉션 프레임워크</title>
<link href="https://eunii.github.io/2019/05/11/tec/java/java14/"/>
<id>https://eunii.github.io/2019/05/11/tec/java/java14/</id>
<published>2019-05-11T11:46:25.000Z</published>
<updated>2019-05-13T07:25:17.787Z</updated>
<content type="html"><![CDATA[<h2 id="1-컬렉션-프레임웍-Collection-Framework"><a href="#1-컬렉션-프레임웍-Collection-Framework" class="headerlink" title="1. 컬렉션 프레임웍(Collection Framework)"></a>1. 컬렉션 프레임웍(Collection Framework)</h2><h3 id="1-6-Enumeration-Iterator-ListIterator"><a href="#1-6-Enumeration-Iterator-ListIterator" class="headerlink" title="1.6 Enumeration, Iterator, ListIterator"></a>1.6 Enumeration, Iterator, ListIterator</h3><h4 id="1-6-1-Iterator"><a href="#1-6-1-Iterator" class="headerlink" title="1.6.1 Iterator"></a>1.6.1 Iterator</h4><p>컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator인터페이스를 정의해 Collection인터페이스에 Iterator를 반환하는 iterator()를 정의하고있다. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Iterator</span></span>{</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">boolean</span> <span class="hljs-title">hasNext</span><span class="hljs-params">()</span></span>;</span><br><span class="line"> ObjectNext();</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">remove</span><span class="hljs-params">()</span></span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Collection</span> </span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Iterator</span><span class="hljs-params">()</span></span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>iterator()은 Collection 인터페이스에 구현되어있기 때문에 자손 클래스인 List와 Set에도 포함되어 있음. </p><table><thead><tr><th>메서드</th><th>설명</th></tr></thead><tbody><tr><td>boolean hasNext()</td><td>읽어올 요소가 남아있는지 확인. 있으면 true, 없으면 false를 반환한다.</td></tr><tr><td>Object next()</td><td>다음 요소를 읽어온다. next()를 호출하기 전에 hasNext()를 호출해 확인하는것이 안전하다.</td></tr><tr><td>void remove()</td><td>next()로 읽어 온 요소를 삭제. next()호출 한 다음에 remove()를 호출해야 한다.</td></tr></tbody></table><h4 id="1-6-2-Enumeration과-ListIterator"><a href="#1-6-2-Enumeration과-ListIterator" class="headerlink" title="1.6.2 Enumeration과 ListIterator"></a>1.6.2 Enumeration과 ListIterator</h4><ul><li>Enumeration은 컬렉션 프레임웍이 만들어지기 전에 사용하는것 Iterator의 구버전. Iterator를 사용하자. </li><li>ListIterator는 Iterator를 상속받아 기능을 추가한 것. 양방향으로 이동이 가능함.<br>ArrayList나 LinkedList와 같이 List인터페이스를 구현한 컬렉션에서만 사용가능 </li></ul><h3 id="1-7-HashSet"><a href="#1-7-HashSet" class="headerlink" title="1.7 HashSet"></a>1.7 HashSet</h3><p>HashSet은 Set인터페이스를 구현한 가장 대표적 컬렉션.<br>중복된 요소를 저장하지 않음. 저장순서를 유지하지 않음.<br>저장순서 유지하려면 LinkedHashSet을 사용하면 됨. </p><table><thead><tr><th>생성자 또는 메서드</th><th>설명</th></tr></thead><tbody><tr><td>HashSet()</td><td>HashSet객체를 생성한다.</td></tr><tr><td>HashSet(Collection c)</td><td>주어진 컬렉션을 포함하는 HashSet객체를 생성한다.</td></tr><tr><td>HashSet(int initialCapactiy)</td><td>주어진 값을 초기용량으로 하는 HashSet객체를 생성한다.</td></tr><tr><td>HashSet(int initialCapactiy, float loadFactor)</td><td>초기용량과 load factor를 지정하는 생성자</td></tr><tr><td>boolean add(Object o)</td><td>새로운 객체를 저장한다</td></tr><tr><td>boolean addAll(Collection c)</td><td>주어진 컬렉션에 모든 객체를 추가한다.</td></tr><tr><td>void clear()</td><td>저장된 모든 객체를 삭제한다.</td></tr><tr><td>Object clone()</td><td>HashSEt을 복제하여 반환한다.</td></tr><tr><td>boolean contains(Object o)</td><td>지정된 객체를 포함하고 있는지 알려준다.</td></tr><tr><td>boolean containsAll(Collection c)</td><td>주어진 컬렉션에 저장된 모든 객체들을 포함하고 있는지 알려준다.</td></tr><tr><td>boolean isEmpty()</td><td>HashSet이 비어있는지 알려준다.</td></tr><tr><td>boolean iterator()</td><td>Iterator 를 반환한다.</td></tr><tr><td>boolean remove(Object o)</td><td>지정된 객체를 HashSet에서 삭제한다.</td></tr><tr><td>boolean removeAll(Collection c)</td><td>주어진컬렉션에 저장된 모든 객체와 동일한 것을 HashSet에서 모두 삭제한다(차집합)</td></tr><tr><td>boolean retainAll(Collection c)</td><td>주어진 컬렉션에 저장된 객체와 동일한 것만 남기고 삭제한다.(교집합)</td></tr><tr><td>int size()</td><td>저장된 객체의 개수를 반환한다.</td></tr><tr><td>Object[] toArray()</td><td>저장된 객체들을 객체배열의 형태로 변환한다.</td></tr><tr><td>Object[] toArray(Object[] a)</td><td>저장된 객체들을 주어진 객체배열 a에 담는다.</td></tr></tbody></table><h3 id="1-8-ThreeSet"><a href="#1-8-ThreeSet" class="headerlink" title="1.8 ThreeSet"></a>1.8 ThreeSet</h3><p>ThreeSet은 이진검색트리라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스.<br>정렬, 검색, 범위검색에 뛰어난 성능을 보인다. </p>]]></content>
<summary type="html">
<h2 id="1-컬렉션-프레임웍-Collection-Framework"><a href="#1-컬렉션-프레임웍-Collection-Framework" class="headerlink" title="1. 컬렉션 프레임웍(Collection Framewo
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="java" scheme="https://eunii.github.io/categories/tec/java/"/>
<category term="java의 정석" scheme="https://eunii.github.io/tags/java%EC%9D%98-%EC%A0%95%EC%84%9D/"/>
</entry>
<entry>
<title>[CH11. 컬렉션프레임웍과 유용한 클래스] List, Set, Map</title>
<link href="https://eunii.github.io/2019/05/11/tec/java/java13/"/>
<id>https://eunii.github.io/2019/05/11/tec/java/java13/</id>
<published>2019-05-11T11:45:25.000Z</published>
<updated>2019-05-13T07:25:39.200Z</updated>
<content type="html"><![CDATA[<h2 id="1-컬렉션-프레임웍-Collection-Framework"><a href="#1-컬렉션-프레임웍-Collection-Framework" class="headerlink" title="1. 컬렉션 프레임웍(Collection Framework)"></a>1. 컬렉션 프레임웍(Collection Framework)</h2><p>데이터군을 저장하는 클래스들을 표준화 한 설계. </p><h3 id="1-1-컬렉션프레임웍의-핵심-인터페이스-List-Set-Map"><a href="#1-1-컬렉션프레임웍의-핵심-인터페이스-List-Set-Map" class="headerlink" title="1.1 컬렉션프레임웍의 핵심 인터페이스 - List, Set, Map"></a>1.1 컬렉션프레임웍의 핵심 인터페이스 - List, Set, Map</h3><table><thead><tr><th>인터페이스</th><th>특징</th></tr></thead><tbody><tr><td>List</td><td>순서가 있는 데이터의 집합. 데이터의 중복을 허용한다.<br> 예) 대기자 명단 <br> 구현클래스: ArrayList, LinkedList, Stack, Vector 등</td></tr><tr><td>Set</td><td>순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다. <br>예) 양의 정수집합, 소수의 집합 <br> 구현클래스 : HashSet, ThreeSet 등</td></tr><tr><td>Map</td><td>키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터의 집합 <br> 순서는 유지되지 않으며, 키는 중복을 허용하지 않고 값은 중복을 허용한다.<br>예) 우편번호, 지역번호(전화번호)<br>구현클래스: HashMap, ThreeMap, Hashtable, Properties 등</td></tr></tbody></table><h4 id="1-1-1-Collection-인터페이스"><a href="#1-1-1-Collection-인터페이스" class="headerlink" title="1.1.1 Collection 인터페이스"></a>1.1.1 Collection 인터페이스</h4><table><thead><tr><th>메서드</th><th>설명</th></tr></thead><tbody><tr><td>boolean add(Object o)<br>boolean addAll(Collection o)</td><td>지정된 객체 또는 컬렉션이 객체들을 Collection 에 추가한다.</td></tr><tr><td>void clear()</td><td>Collection 의 객체를 모두 삭제한다.</td></tr><tr><td>boolean contains(Object o)<br>boolean containsAll(Collection c)</td><td>지정된 객체 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인한다.</td></tr><tr><td>boolean equals(Object o)</td><td>동일한 Collection인지 비교한다.</td></tr><tr><td>int hashCode()</td><td>Collection의 hash code를 반환한다.</td></tr><tr><td>boolean isEmpty()</td><td>Collection이 비어있는지 확인한다.</td></tr><tr><td>Iterator iterator()</td><td>Collection의 Iterator를 얻어서 반환한다</td></tr><tr><td>boolean remove(Object o)</td><td>지정된 객체를 삭제한다</td></tr><tr><td>boolean removeAll(Collection c)</td><td>지정된 Collection에 포함된 객체들을 삭제한다.</td></tr><tr><td>boolean retainAll(Collection c)</td><td>지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제한다. 이 작업으로 인해 Collection에 변화가 있으면 true없으면 false를 반환한다.</td></tr><tr><td>int size()</td><td>Collection에 저장된 객체의 개수를 반환한다.</td></tr><tr><td>Object[] toArray()</td><td>Collection에 저장된 객체를 객체배열(Object[])로 반환한다.</td></tr><tr><td>Object[] toArray(Object[] a)</td><td>지정된 배열에 Collectiom의 객체를 저장해서 반환한다.</td></tr></tbody></table><h4 id="1-1-2-List인터페이스"><a href="#1-1-2-List인터페이스" class="headerlink" title="1.1.2 List인터페이스"></a>1.1.2 List인터페이스</h4><p>| 메서드 | 설명 |<br>| void add(int index, Object element)<br> addAll(int index, Collection c) | 지정된 위치에 객체를 컬렉션에 포함된 객체들을 추가한다. |<br>| Object get(int index) | 지정된 위치에 있는 객체를 반환한다. |<br>| int indexOf(Object o) | 지정된 객체의 위치를 반환한다.<br>(List의 첫번째 요소부터 순방향으로 찾는다.) |<br>| int lastIndexOf(Object o) | 지정된 객체의 위치를 반환한다. <br>(List의 마지막 요소부터 역방향으로 찾는다.) |<br>| ListIterator listIterator() <br> ListIterator listIterator(int index) | List의 객체에 접근할 수 있는 ListIterator를 반환한다. |<br>| Object remove(int index) | 지정된 위치에 있는 객체를 삭제하고 삭제된 객체를 반환한다. |<br>| Object set(int index, Object element) | 지졷왼 위치에 객체를 저장한다. |<br>| List subList(int fromIndex, int toIndex) | 지정된 범위에 있는 객체를 반환한다. | </p><h4 id="1-1-3-Set인터페이스"><a href="#1-1-3-Set인터페이스" class="headerlink" title="1.1.3 Set인터페이스"></a>1.1.3 Set인터페이스</h4><p>중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용됨. HashSet, ThreeSet등이 있음. </p><h4 id="1-1-4-Map인터페이스"><a href="#1-1-4-Map인터페이스" class="headerlink" title="1.1.4 Map인터페이스"></a>1.1.4 Map인터페이스</h4><table><thead><tr><th>메서드</th><th>설명</th></tr></thead><tbody><tr><td>void clear()</td><td>Map의모든 객체를 삭제한다</td></tr><tr><td>boolean containsKey(Object Key)</td><td>지정된 key 객체와 일치하는 Map의 key 객체가 있는지 확인한다.</td></tr><tr><td>boolean containsValue()</td><td>지정된 value객체와 일치하는 Map의 value객체가 있는지 확인한다.</td></tr><tr><td>set entrySet()</td><td>Map에 저장되어있는 key-value쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환한다.</td></tr><tr><td>boolean equals(Object o)</td><td>동일한 Map인지 비교한다</td></tr><tr><td>Object get(Object key)</td><td>지정한 key 객체에 대응하는 value 객체를 찾아서 반환한다.</td></tr><tr><td>int hashCode()</td><td>해시코드를 반환한다.</td></tr><tr><td>boolean isEmpty()</td><td>Map이 비어있는지 확인한다.</td></tr><tr><td>Set keySet()</td><td>Map에 저장된 모든 key 객체를 반환한다.</td></tr><tr><td>Object put(Object key, Object value</td><td>Map에 value객체를 key객체에 연결하여 저장한다.</td></tr><tr><td>void putAll(Map t)</td><td>지정한 Map의 모든 key-value쌍을 추가한다.</td></tr><tr><td>Object remove(Object key)</td><td>지정한 key객체와 일치하는 key-value 객체를 삭제한다</td></tr><tr><td>int size()</td><td>Map에 저장된 key-value쌍의 개수를 반환한다.</td></tr><tr><td>Collection values()</td><td>Map에 저장된 모든 value객체를 반환한다.</td></tr></tbody></table><h4 id="1-1-5-Map-Entry-인터페이스"><a href="#1-1-5-Map-Entry-인터페이스" class="headerlink" title="1.1.5 Map.Entry 인터페이스"></a>1.1.5 Map.Entry 인터페이스</h4><h3 id="1-2-동기화-Synchronization"><a href="#1-2-동기화-Synchronization" class="headerlink" title="1.2 동기화(Synchronization)"></a>1.2 동기화(Synchronization)</h3><p>Collections클래스에 아래와 같은 동기화 메서드 제공함. 필요할때 사용가능. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-function"><span class="hljs-keyword">static</span> Collection <span class="hljs-title">synchronizedCollection</span><span class="hljs-params">(Collection c)</span></span></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">static</span> List <span class="hljs-title">synchronizedList</span><span class="hljs-params">(List list)</span></span></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">static</span> Map <span class="hljs-title">synchronizedMap</span> <span class="hljs-params">(Map m)</span></span></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">static</span> Set <span class="hljs-title">synchronizedSet</span><span class="hljs-params">(Set s)</span></span></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">static</span> SortedMap <span class="hljs-title">synchronizedSortedMap</span><span class="hljs-params">(SortedMap m)</span></span></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">static</span> SortedSet <span class="hljs-title">synchronizedSortedSet</span><span class="hljs-params">(SortedSet s)</span></span></span><br></pre></td></tr></table></figure><p>위 메서드를 아래와 같이 사용가능함. </p> <figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">List list = Collections.synchronizedList(<span class="hljs-function">New <span class="hljs-title">ArrayList</span><span class="hljs-params">(...)</span>)</span>;</span><br></pre></td></tr></table></figure><h3 id="1-3-Vector와-ArrayList"><a href="#1-3-Vector와-ArrayList" class="headerlink" title="1.3 Vector와 ArrayList"></a>1.3 Vector와 ArrayList</h3><table><thead><tr><th>공통점</th><th>차이점</th></tr></thead><tbody><tr><td>- List인터페이스를 구현한다.<br>저장순서가 유지되고 중복을 허용한다.<br>- 데이터의 저장공간으로 배열을 사용한다.</td><td>- Vector는 멀티쓰레드에 대한 동기화가 되어있으나 ArrayList는 그렇지 않다.</td></tr></tbody></table><blockquote><p>Deep Copy vs Shallow Copy </p><blockquote><p>Shallow : 단순히 참조만 복사하는것, 원본 객체에 영향을 받는다.<br>Deep : 원본과 같은 데이터를 저장하고 있는 새로운 객체나 배열을 생성하는것. 원본 객체에 영향을 받지 않음 </p></blockquote></blockquote><h3 id="1-4-LinkedList"><a href="#1-4-LinkedList" class="headerlink" title="1.4 LinkedList"></a>1.4 LinkedList</h3><p>배열의 단점</p><ol><li>크기를 변경할 수 없다.</li><li>비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다. </li></ol><p>LinkedList는 불연속적으로 존재하는 데이터를 서로 연결한것.<br>링크드리스트의 각 요소(node)들은 자신과 연결된 다음 요소에 대한 참조(주소값)과 데이터로 구성됨. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Node</span></span>{</span><br><span class="line"> Node next; <span class="hljs-comment">// 다음요소의 주소를 저장</span></span><br><span class="line"> Object obj; <span class="hljs-comment">// 데이터를 저장</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>이동방향이 단방향이어서 다음 요소에 대한 접근은 쉽지만 이전요소에 대한 접근은 어렵다.<br>이 단점을 보완한것이 더블링크드리스트(이중 연렬리스트)<br>링크드리스트에 참조변수를 하나 추가해서 이전 요소에 대한 참조가 가능하게 한것. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Node</span></span>{</span><br><span class="line"> Node next; <span class="hljs-comment">//다음 요소의 주소를 저장</span></span><br><span class="line"> Node previous; <span class="hljs-comment">//이전 요소의 주소를 저장</span></span><br><span class="line"> Object obj; <span class="hljs-comment">// 데이터를 저장</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>더블써큘러링크드 리스트두 있음. </p><ol><li>순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.</li><li>중간데이터를 추가/삭제하는 경우에는 LinkedList 가 ArrayList보다 빠르다. </li></ol><p>데이터의 개수가 변하지 않는 경우는 ArrayList, 데이터 개수의 변경이 잦다면 LinkedList를 사용하는것이 낫다. </p><p>두가지 혼합 방법 : 처음작업전 데이터는 ArrayList에 저장, 작업할때는 LinkenList로 옮겨서 사용 </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">ArrayList al = <span class="hljs-keyword">new</span> ArrayList(<span class="hljs-number">1000000</span>);</span><br><span class="line"><span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">1000000</span>; i++) {</span><br><span class="line"> al.add(i+<span class="hljs-string">""</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">LinkedList ll = <span class="hljs-keyword">new</span> LinkedList(al);</span><br><span class="line"><span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">1000</span>; i++) {</span><br><span class="line"> al.add(<span class="hljs-number">500</span>, <span class="hljs-string">"X"</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="1-5-Stack과-Queue"><a href="#1-5-Stack과-Queue" class="headerlink" title="1.5 Stack과 Queue"></a>1.5 Stack과 Queue</h3><ul><li>Stack은 마지막에 저장된 데이터를 가장 먼저 꺼냄 LIFO</li><li>Queue는 처음에 저장한 데이터를 가장 먼저 꺼냄 FIFO </li></ul><p>Queue는 ArrayList보다 LinkedList로 구현하는것이 더 적합 </p><p><strong>Stack</strong> </p><table><thead><tr><th>메서드</th><th>설명</th></tr></thead><tbody><tr><td>boolean empty()</td><td>Stack이 비어있는지 알려준다</td></tr><tr><td>Object peek()</td><td>Stack의 맨 위에 저장된 객체를 반환한다. 꺼내지는 않는다. 비어있으면 null을 반환한다.</td></tr><tr><td>Object pop()</td><td>Stack의 맨 위에 저장된 객체를 꺼낸다.</td></tr><tr><td>Object push(Object item)</td><td>Stack에 객체를 저장한다.</td></tr><tr><td>int search(Object o)</td><td>Stack에서 주어진 객체를 찾아서 그 위치를 반환한다.1부터 시작함</td></tr></tbody></table><p><strong>Queue</strong> </p><table><thead><tr><th>메서드</th><th>설명</th></tr></thead><tbody><tr><td>Object element()</td><td>삭제없이 저장된 요소를 읽어온다. peek와 다른점은 queue가 비었을때 Exception을 발생시킴</td></tr><tr><td>boolean offer(Object o)</td><td>Queue에 객체를 저장한다. 성공하면 true, 실패하면 false를 반환한다.</td></tr><tr><td>Object peek()</td><td>삭제없이 읽어온다. Queue가 비었을때는 null을 반환한다.</td></tr><tr><td>Object pool()</td><td>Queue에서 꺼내온다. 비어있을때는 null을 반환한다.</td></tr><tr><td>Object remove()</td><td>Queue에서 꺼내온다. 비어있으면 에외를 발생시킨다.</td></tr></tbody></table><ul><li>스택의 활용 예 : 수식계산. 수식괄호검사, 워드프로세서의 undo/redo, 웹브라우저 앞으로 뒤로 </li><li>큐의 활용 예 : 최근사용문서, 인쇄작업대기목록, 버퍼</li></ul>]]></content>
<summary type="html">
<h2 id="1-컬렉션-프레임웍-Collection-Framework"><a href="#1-컬렉션-프레임웍-Collection-Framework" class="headerlink" title="1. 컬렉션 프레임웍(Collection Framewo
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="java" scheme="https://eunii.github.io/categories/tec/java/"/>
<category term="java" scheme="https://eunii.github.io/tags/java/"/>
</entry>
<entry>
<title>[CH15. 네트워킹(Networking)] 네트워킹</title>
<link href="https://eunii.github.io/2019/05/10/tec/java/java12/"/>
<id>https://eunii.github.io/2019/05/10/tec/java/java12/</id>
<published>2019-05-10T11:40:25.000Z</published>
<updated>2019-05-13T07:21:37.842Z</updated>
<content type="html"><![CDATA[<h2 id="1-네트워킹"><a href="#1-네트워킹" class="headerlink" title="1.네트워킹"></a>1.네트워킹</h2><p>두대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는것. </p><h3 id="1-1-클라이언트-서버-client-server"><a href="#1-1-클라이언트-서버-client-server" class="headerlink" title="1.1 클라이언트/서버(client/server)"></a>1.1 클라이언트/서버(client/server)</h3><p>서버(server)는 서비스를 제공하는 컴퓨터, 클라이언트(client)는 서비스를 사용하는 컴퓨터.<br>ex) 파일서버(file server), 메일서버(mail server), 어플래케이션 서버(application server)</p><table><thead><tr><th>서버기반 모델(server-based-model)</th><th>P2P모델(peer-to-peer model)</th></tr></thead><tbody><tr><td>- 안정적인서비스 제공이 가능하다.<br>- 공유데이터의 관리와 보안이 용이하다.<br>- 서버구축비용과 관리비용이 든다.</td><td>- 서버구축 및 운용비용을 절감할 수 있다. <br> - 자원의 활용을 극대화 할 수 있다. <br>- 자원의 관리가 어렵다. <br>- 보안이 취약하다.</td></tr></tbody></table><h3 id="1-2-IP주소-IP-address"><a href="#1-2-IP주소-IP-address" class="headerlink" title="1.2 IP주소(IP address)"></a>1.2 IP주소(IP address)</h3><p>IP주소는 컴퓨터(호스트, host)를 구별하는데 사용하는 고유한 값.<br>4 byte(32bit)의 정수로 구성되어있음. <em>a.b.c.d</em>와 같은 형식으로 표현됨.<br>abcd는 0~255사이의 정수이다.<br>윈도우 콘솔에서 ifconfig를 확인하면 ip주소를 확인 할 수 있음.<br>ex) </p><ul><li>ip주소<br>192.168.10 .100<br>(네트워크주소).(호스트주소) </li><li>서브넷마스크<br>255.255.255.0 </li></ul><h3 id="1-3-InetAddress"><a href="#1-3-InetAddress" class="headerlink" title="1.3 InetAddress"></a>1.3 InetAddress</h3><p>자바에서 IP주소를 다루기 위한 클래스로 InetAddress 제공함 </p><h3 id="1-4-URL-Uniform-Resource-Location"><a href="#1-4-URL-Uniform-Resource-Location" class="headerlink" title="1.4 URL(Uniform Resource Location)"></a>1.4 URL(Uniform Resource Location)</h3><p>URL은 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한것.<br>“프로토콜://호스트명:포트번호/경로명/파이명?쿼리스트링#참조”의 형태로 이루워져있음. </p><ul><li>프로토콜 : 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약(http)</li><li>호스트명: 자원을 제공하는 서버의 이름(<a href="http://www.javahome.com" rel="external nofollow noopener noreferrer" target="_blank">www.javahome.com</a>)</li><li>포트번호 : 통신에 사용되는 서버의 포트번호(80)</li><li>경로명 : 접근하려는 자원이 저장된 서버상의 위치(/sample/)</li><li>파일명 : 접근하려는 자원의 이름(hello.html)</li><li>쿼리 : url에서 ?이후부분</li><li>참조 : url에서 # 이후부분 </li></ul><p>java에서 URL 클래스를 제공함 </p><h3 id="1-5-URL-Connection"><a href="#1-5-URL-Connection" class="headerlink" title="1.5 URL Connection"></a>1.5 URL Connection</h3><p>어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 추상클래스. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">import</span> java.net.*;</span><br><span class="line"><span class="hljs-keyword">import</span> java.io.*;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NetworkEx3</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span></span>{</span><br><span class="line"> URL url = <span class="hljs-keyword">null</span>;</span><br><span class="line"> String address = <span class="hljs-string">"http://www.javahome.com/sample/hello.html"</span>;</span><br><span class="line"> String line =<span class="hljs-string">""</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">try</span>{</span><br><span class="line"> url = <span class="hljs-keyword">new</span> URL(address);</span><br><span class="line"> URLConnection conn = url.openConnection();</span><br><span class="line"> </span><br><span class="line"> System.out.println(<span class="hljs-string">"conn.toSTring(): "</span>+conn);</span><br><span class="line"> }<span class="hljs-keyword">catch</span>(Exception e){</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li>아래코드는 해당 페이지의 내용을 읽어온다.. </li></ul><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">import</span> java.net.*;</span><br><span class="line"><span class="hljs-keyword">import</span> java.io.*;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NetworkEx4</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span></span>{</span><br><span class="line"> URL url = <span class="hljs-keyword">null</span>;</span><br><span class="line"> BufferedReader input = <span class="hljs-keyword">null</span>;</span><br><span class="line"> String address = <span class="hljs-string">"http://www.javahome.com/sample/hello.html"</span>;</span><br><span class="line"> String line =<span class="hljs-string">""</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">try</span>{</span><br><span class="line"> url = <span class="hljs-keyword">new</span> URL(address);</span><br><span class="line"> </span><br><span class="line"> input = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(url.openStream()));</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">while</span>((line= input.readline()) != <span class="hljs-keyword">null</span>) {</span><br><span class="line"> System.out.println(line);</span><br><span class="line"> }</span><br><span class="line"> input.close();</span><br><span class="line"> }<span class="hljs-keyword">catch</span>(Exception e){</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li>이진파일을 읽어 저장함. </li></ul><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">import</span> java.net.*;</span><br><span class="line"><span class="hljs-keyword">import</span> java.io.*;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NetworkEx5</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span></span>{</span><br><span class="line"> URL url = <span class="hljs-keyword">null</span>;</span><br><span class="line"> InputStream in = <span class="hljs-keyword">null</span>;</span><br><span class="line"> FileOutputStream out = <span class="hljs-keyword">null</span>;</span><br><span class="line"> String address = <span class="hljs-string">"http://www.javahome.com/sample/hello.zip"</span>;</span><br><span class="line"> <span class="hljs-keyword">int</span> ch = <span class="hljs-number">0</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">try</span>{</span><br><span class="line"> url = <span class="hljs-keyword">new</span> URL(address);</span><br><span class="line"> in = url.openStream();</span><br><span class="line"> out = <span class="hljs-keyword">new</span> FileOutputStream(<span class="hljs-string">"hello.zip"</span>);</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">while</span>((ch= inlread()) != -<span class="hljs-number">1</span>) {</span><br><span class="line"> out.writy(ch);</span><br><span class="line"> }</span><br><span class="line"> in.close();</span><br><span class="line"> out.close();</span><br><span class="line"> }<span class="hljs-keyword">catch</span>(Exception e){</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="2-소켓-프로그래밍"><a href="#2-소켓-프로그래밍" class="headerlink" title="2. 소켓 프로그래밍"></a>2. 소켓 프로그래밍</h2><p>소켓을 이용한 통신프로그래밍.<br>java.net패키지를 통해 소켓 프로그래밍을 지원함. </p><h3 id="2-1-TCP와-UDP"><a href="#2-1-TCP와-UDP" class="headerlink" title="2.1 TCP와 UDP"></a>2.1 TCP와 UDP</h3><p>TCP/IP 프로토콜은 이기종 시스템간의 통신을 위한 표준 프로토콜로 프로토콜의 집합이다.<br>TCP와 UDP모두 TCP/IP에 포함되어 있음, OSI 7계층의 전송계층에 해당하는 프로토콜이다. </p><table><thead><tr><th>항목</th><th>TCP</th><th>UDP</th></tr></thead><tbody><tr><td>연결방식</td><td>.연결기반<br>- 연결 후 통신(전화기)<br>- 1:1통신방식</td><td>.비연결기반<br>- 연결없이 통신(소포)<br>- 1:1, 1:n, n:n 통신방식</td></tr><tr><td>특징</td><td>.데이터의 경계를 구분안함<br>.신뢰성 있는 데이터를 전송<br>- 데이터의 전송순서가 보장됨<br>- 데이터의 수신여부를 확인함<br>(데이터가 손실되면 재전송)<br>- 패킷을 관리할 필요가 없음<br>.UDP보다 전송속도가 느림</td><td>.데이터의 경계를 구분함<br>.신뢰성 없는 데이터 전송<br>- 데이터의 전송순서가 바뀔 수 있음<br>- 데이터의 수신여부를 확인안 함<br>(데이터가 손실되어도 알 수 없음)<br>- 패킷을 관리해 주어야 함<br>.TCP보다 전송속도가 빠름</td></tr><tr><td>관련 클래스</td><td>.Scoket<br>.ServerSocket</td><td>.DatagramSocket<br>.DatagramPacket<br>.MulticastSocket</td></tr></tbody></table><h3 id="2-3-TCP-소켓-프로그래밍"><a href="#2-3-TCP-소켓-프로그래밍" class="headerlink" title="2.3 TCP 소켓 프로그래밍"></a>2.3 TCP 소켓 프로그래밍</h3><p><strong>서버 프로그램과 클라이언트 프로그램간의 통신과정 단계</strong></p><ol><li>서버프로그램에서는 서버소켓을 사용하여 서버의 컴퓨터의 특정 포트에서 클라이언트의 연결요청을 처리할 준비를 한다. </li><li>클라이언트 프로그램은 접속할 서버의 IP주소와 포트 정보를 가지고 소켓을 생성해서 서버에 연결을 요청한다. </li><li>서버소켓은 클라이언트의 연결요청으 ㄹ받으면 서버에서 새로운 소켓을 생성해서 클라이언트의 소켓과 연결되도록 한다.</li><li>이제 클라이언트 소켓과 새로 생성된 서버의 소켓은 서버소켓과 관계없이 일대일 통신을 한다. </li></ol><h3 id="2-4-UDP-소켓-프로그래밍"><a href="#2-4-UDP-소켓-프로그래밍" class="headerlink" title="2.4 UDP 소켓 프로그래밍"></a>2.4 UDP 소켓 프로그래밍</h3>]]></content>
<summary type="html">
<h2 id="1-네트워킹"><a href="#1-네트워킹" class="headerlink" title="1.네트워킹"></a>1.네트워킹</h2><p>두대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는것. </p>
<h3 id="1-1-클
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="java" scheme="https://eunii.github.io/categories/tec/java/"/>
<category term="java의 정석" scheme="https://eunii.github.io/tags/java%EC%9D%98-%EC%A0%95%EC%84%9D/"/>
</entry>
<entry>
<title>[CH12. 쓰레드] 프로세스와 쓰레드</title>
<link href="https://eunii.github.io/2019/05/08/tec/java/java11/"/>
<id>https://eunii.github.io/2019/05/08/tec/java/java11/</id>
<published>2019-05-08T11:40:25.000Z</published>
<updated>2019-05-13T07:16:07.295Z</updated>
<content type="html"><![CDATA[<h2 id="1-프로세스와-쓰레드"><a href="#1-프로세스와-쓰레드" class="headerlink" title="1. 프로세스와 쓰레드"></a>1. 프로세스와 쓰레드</h2><p>프로세스(process)는 간단하게 말하면 실행중인 프로그램이다.<br><strong>프로그램 –실행–> 프로세스</strong><br>프로세스는 데이터, 메모리등의 자원과 쓰레드로 구성되어있음.<br>프로세스의 자원을 이용해서 실제 작업을 수행하는 것.<br>모든 프로세스는 최소 하나 이상의 쓰레드가 존재. 둘 이상이면 멀티쓰레드 프로세스라한다. </p><ul><li>멀티쓰레딩의 장점<ul><li>CPU의 사용률을 향상시킴.</li><li>자원을 보다 효울적으로 사용할 수 있음.</li><li>사용자에 대한 응답성이 향상됨.</li><li>작업이 분리되어 코드가 간결해짐. </li></ul></li></ul><p>동기화(synhronization), 교착상태(deadlock)등을 고려해서 신중히 프로그래밍 해야함.</p><h2 id="2-쓰레드의-구현과-실행"><a href="#2-쓰레드의-구현과-실행" class="headerlink" title="2. 쓰레드의 구현과 실행"></a>2. 쓰레드의 구현과 실행</h2><p>구현 방법</p><ol><li><p>Thread클래스 상속</p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyThread</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Thread</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-comment">//Thread의 run()함수를 오버라이딩.</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>Runnable인터페이스 구현(일반적인 방법)</p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyThread</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Runnable</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-comment">//추상메서드 run()을 구현</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ol><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx1</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span></span>{</span><br><span class="line"> ThreadEx1_1 t1 = <span class="hljs-keyword">new</span> ThreadEx1_1();</span><br><span class="line"> </span><br><span class="line"> Runnable r = <span class="hljs-keyword">new</span> ThreadEx1_2();</span><br><span class="line"> Thread t2 = <span class="hljs-keyword">new</span> Thread(r);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx1_1</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Thread</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">5</span>; i++) {</span><br><span class="line"> System.out.println(getName());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx1_2</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Runnable</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">5</span>; i++) {</span><br><span class="line"> System.out.println(Thread.currentThread().getName());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>쓰레드 생성 후 start()를 호출해야 작업을 시작함.<br>한번 사용한 쓰레드는 다시 재사용할 수 없다. 하나의 쓰레드에 한번의 start()만 호출 될 수 있음. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">ThreadEx1_1 t1 = <span class="hljs-keyword">new</span> ThreadEx_1();</span><br><span class="line">t1.start();</span><br><span class="line">t.start();<span class="hljs-comment">//이건 불가능</span></span><br><span class="line">``` </span><br><span class="line"></span><br><span class="line"></span><br><span class="line">```java</span><br><span class="line">ThreadEx1_1 t1 = <span class="hljs-keyword">new</span> ThreadEx1_1();</span><br><span class="line">t1.start();</span><br><span class="line">t1 = <span class="hljs-keyword">new</span> ThreadEx1_1();</span><br><span class="line">t.start();<span class="hljs-comment">//이건 가능</span></span><br></pre></td></tr></table></figure><h2 id="3-start-와-run"><a href="#3-start-와-run" class="headerlink" title="3. start()와 run()"></a>3. start()와 run()</h2><ul><li>run()을 호출하는 것은 생성된 쓰레드를 실행하는 것이 아니라 단순히 클래스에속한 메서드를 하나 호출하는것. </li></ul><hr><p>call stack </p><p>run </p><h2 id="main"><a href="#main" class="headerlink" title="main "></a>main </h2><ul><li>start()을 호출하는 것은 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택을 생성한 후 run()을 호출해서 생성된 호출스택에 run()이 저장되게 한다.<br>모든 쓰레드는 독립적인 작업을 수행하기 위해 자신만의 호출스택을 필요로 하기 때문에 새로운 쓰레드를 생성하고 실행시킬때마다 새로운 호출스택이 생성되고 쓰레드가 종료되면 작업에 사용된 호출스택은 소멸된다. </li></ul><ol><li>main메서드에서 쓰레드의 start메서드를 호출한다.</li><li>start메서드는 쓰레드가 작업을 수행하는데 사용될 새로운 호출 스택을 생성한다. </li><li>생성된 호출스택에 run 메서드를 호출해서 쓰레드가 작업을 수행하도록 한다. </li><li>이제는 호츨스택이 2개이기때문에 스케줄러가 정한 순서에 으해 번갈아 가면서 실행된다. </li></ol><p>실행중인 쓰레드가 하나도 없을때 프로그램은 종료된다.</p><h2 id="4-싱글쓰레드와-멀티쓰레드"><a href="#4-싱글쓰레드와-멀티쓰레드" class="headerlink" title="4. 싱글쓰레드와 멀티쓰레드"></a>4. 싱글쓰레드와 멀티쓰레드</h2><p>두개의 작업을 하나의 쓰레드로 하면 한 작업 끝난 후 다른 작업 끝.<br>두개의 작업을 두개의 쓰레드로 하면 짧은시간동안 쓰레드 2개가 번갈아 가면서 작업을 수행해서 동시에 두 작업이 처리되는것과 같다고 느낌.<br>CPU만 사용하는 계산 작업이면 멀티쓰레드가 전환하는 시간때문에 오히려 느림.<br>CPU외 자원을 사용하는 경우 싱글쓰레드 프로세스 보다 멀티쓰레드프로세스가 더 효율적임.<br>ex)외부기기에서 입출력 받는 경우<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">import</span> javax.swing.JOptionPane;</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx6</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception</span>{</span><br><span class="line"> String input = JOptionPanel.showInputDialog(<span class="hljs-string">"아무 값이나 입력하세요."</span>);</span><br><span class="line"> System.out.println(<span class="hljs-string">"입력하신 값은 "</span>+input+<span class="hljs-string">"입니다."</span>);</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">10</span>; i > <span class="hljs-number">0</span> ; i--) {</span><br><span class="line"> System.out.println(i);</span><br><span class="line"> <span class="hljs-keyword">try</span>{</span><br><span class="line"> Thread.sleep(<span class="hljs-number">1000</span>);</span><br><span class="line"> }<span class="hljs-keyword">catch</span>(Exception e){}</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>위의 예는 입력을 받은 후 출력하기 때문에 사용자가 입력하는 동안에는 출력 작업이 일어나지 않는다.<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">import</span> javax.swing.JOptionPane;</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx7</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception</span>{</span><br><span class="line"> </span><br><span class="line"> ThreadEx7_1 th1 = <span class="hljs-keyword">new</span> ThreadEx7_1();</span><br><span class="line"> th1.start();</span><br><span class="line"> </span><br><span class="line"> String input = JOptionPanel.showInputDialog(<span class="hljs-string">"아무 값이나 입력하세요."</span>);</span><br><span class="line"> System.out.println(<span class="hljs-string">"입력하신 값은 "</span>+input+<span class="hljs-string">"입니다."</span>);</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx7_1</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Thread</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">10</span>; i > <span class="hljs-number">0</span> ; i--) {</span><br><span class="line"> System.out.println(i);</span><br><span class="line"> <span class="hljs-keyword">try</span>{</span><br><span class="line"> Thread.sleep(<span class="hljs-number">1000</span>);</span><br><span class="line"> }<span class="hljs-keyword">catch</span>(Exception e){}</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>위의 코드는 입력받는 동안 출력되고 입력된 값이 출력되고 또 출력이 된다.</p><h2 id="5-쓰레드의-우선순위"><a href="#5-쓰레드의-우선순위" class="headerlink" title="5. 쓰레드의 우선순위"></a>5. 쓰레드의 우선순위</h2><p>쓰레드에 우선순위(priority)의 멤버변수가 있다.<br>우선순위의 범위는 1~10이고 숫자가 높을수록 더 우선순위가 높다.<br>우선순위의 값은 상대적이다. 1,2와 8,9의 결과 값이 같다.<br>우선순위는 쓰레드생성한 쓰레드로부터 상속받는다.<br>main 메서드를 수행하는 쓰레드의 우선순위는 5.<br>파일 다운로드와 채팅기능 중 채팅에 더 우선순위를 높여야 한다.<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">setPripority</span><span class="hljs-params">(<span class="hljs-keyword">int</span> new Priority)</span></span>;</span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">getPriority</span><span class="hljs-params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> MAX_PRIORITY =<span class="hljs-number">10</span>;</span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> MIN_PRIORITY =<span class="hljs-number">1</span>;</span><br><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> NORM_PRIORITY = <span class="hljs-number">5</span>;</span><br></pre></td></tr></table></figure></p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx9</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception</span>{</span><br><span class="line"> </span><br><span class="line"> ThreadEx9_1 th1 = <span class="hljs-keyword">new</span> ThreadEx9_1();</span><br><span class="line"> ThreadEx9_2 th2 = <span class="hljs-keyword">new</span> ThreadEx9_2();</span><br><span class="line"> th2.setPriority(<span class="hljs-number">7</span>);</span><br><span class="line"> System.out.println(<span class="hljs-string">"입력하신 값은 "</span>+input+<span class="hljs-string">"입니다."</span>);</span><br><span class="line"> th1.start();</span><br><span class="line"> th2.start(); </span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx9_1</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">300</span> ; i++) {</span><br><span class="line"> System.out.println(<span class="hljs-string">"-"</span>);</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> j = <span class="hljs-number">0</span>; j < <span class="hljs-number">1000000</span> ; j++) {}</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx9_2</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">300</span> ; i++) {</span><br><span class="line"> System.out.println(<span class="hljs-string">"|"</span>);</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> j = <span class="hljs-number">0</span>; j < <span class="hljs-number">1000000</span> ; j++) {}</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>위 결과는 |가 먼저 끝나고, - 이 완료된다.</p><h2 id="6-쓰레드-그룹-thread-group"><a href="#6-쓰레드-그룹-thread-group" class="headerlink" title="6. 쓰레드 그룹(thread group)"></a>6. 쓰레드 그룹(thread group)</h2><p>서로 관련된 쓰레드를 그룹으로 다루기 위한것.<br>폴더를 생성해서 관련된 파일을 묶어 관리하는것처럼 쓰레드도 그룹으로 묶어서 관리.<br>쓰레드를 쓰레드 그룹에 포함시키려면 Thread생성자를 이용해야함<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Thread(ThreadGroup group, String name)</span><br><span class="line">Thread(ThreadGroup gorup, Runnable target)</span><br></pre></td></tr></table></figure></p><h2 id="7-데몬쓰레드-deamon-thread"><a href="#7-데몬쓰레드-deamon-thread" class="headerlink" title="7. 데몬쓰레드(deamon thread)"></a>7. 데몬쓰레드(deamon thread)</h2><p>데몬쓰레드는 일반 쓰레드의 작업을 돕는 보조역할.<br>일반쓰레드 작업이끝나면 데몬 쓰레드는 강제종료됨.<br>ex) 가비지컬렉터, 위드프로세서 자동저장, 화면자동갱신<br>무한루프와 조건문을 이용해서 실행 후 대기하고 있다가 특정 조건이 되면 작업 수행하고 다시 대기. </p><h2 id="8-쓰레드의-실행제어"><a href="#8-쓰레드의-실행제어" class="headerlink" title="8. 쓰레드의 실행제어"></a>8. 쓰레드의 실행제어</h2><p>쓰레드 프로그램이 어렵게 느껴지는 건 동기화와 스케줄링때문임. </p><ul><li>쓰레드 스케쥴링과 관련된 메서드 </li></ul><table><thead><tr><th>생성자/메서드</th><th>설명</th></tr></thead><tbody><tr><td>void interupt()</td><td>sleep()이나 join()에 의해 일시정지상태인 쓰레드를 실행대기상태로 만든다.<br> 해당 쓰레드에서는 interuptedExcetption이 발생함으로써 일시정지상태를 벗어나게 된다.</td></tr><tr><td>void join()<br>void join(long millis) <br> void join(long millis, int nanos)</td><td>지정된 시간동안 쓰레드가 실행되도록한다. 지정된 시간이 자나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속한다.</td></tr><tr><td>void resume()</td><td>supend()에 의해 일시정지상태에 있는 쓰레드를 실행대기 상태로 만든다.</td></tr><tr><td>static void sleep(long millis)<br>static void sleep(long millis, int nanos)</td><td>지정된 시간( 천분의 일초 단위) 동안 쓰레드를 일시정지 시킨다. 지정한 시간이 지나고 나면 자동적으로 다시 실행대기가 된다.</td></tr><tr><td>void stop()</td><td>쓰레드를 즉시 종료시킨다. 교착상태(dead-lock)에 빠지기 쉽기 때문에 deprecated되었다.</td></tr><tr><td>void suspend()</td><td>쓰레드를 일시정지시킨다. resume()을 호출하면 다시 실행대기상태가 된다.</td></tr><tr><td>satic void yield()</td><td>실행중에 다른 쓰레드에게 양보하고 실행대기상태가 된다.</td></tr></tbody></table><ul><li>쓰레드의 상태 </li></ul><table><thead><tr><th>상태</th><th>설명</th></tr></thead><tbody><tr><td>NEW</td><td>쓰레드가 생성되고 아직 start()가 호출되지 않은 상태</td></tr><tr><td>RUNNABLE</td><td>실행 중 또는 실행 가능한 상태</td></tr><tr><td>BLOCKED</td><td>동기화 블럭에 의해서 일시정지된 상태(Lock이 풀릴때까지 기다리는 상태)</td></tr><tr><td>WATING, <br>TIMED_WATING</td><td>쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은 일시정지 상태. TIMED_WATEING은 일시정지시간이 지정된 경우를 의미한다.</td></tr><tr><td>TERMINATED</td><td>쓰레드의 작업이 종료된 상태</td></tr></tbody></table><ol><li>쓰레드 생성하고 start()을 호출하면 실행대기열에 저장. 순서를 기다림. Quequ와같은 구조로 먼저 실행대기열에 들어온 쓰레드가 먼저 실행됨. </li><li>실행대기상태이다가 자기 차례가 오면 실행상태가 됨.</li><li>주어진 실행시간이 다되거나 yeild()를 만나면 다시 실행대기 상태가 되고 다음 차례의 쓰레드가 실행상태가 됨.</li><li>실행중 suspend(), sleep(), wait(), join(), I/O block에 의해 일시정지상태가 딜 수 있음.</li><li>지정된 일시정지 시간이 지나거나 notify(), reusme(), interrup()가 호출되면 일시정지 상태를 벗어나 다시 실행대기열에 들어가 순서를 기다림.</li><li>실행을 모두 마치거나 stop()이 호출되면 쓰레드는 소멸됨. </li></ol><ul><li><p>join()을 사용한 예시</p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx13</span></span>{</span><br><span class="line"> <span class="hljs-keyword">static</span> <span class="hljs-keyword">long</span> startTime=<span class="hljs-number">0</span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception</span>{</span><br><span class="line"> </span><br><span class="line"> ThreadEx13_1 th1 = <span class="hljs-keyword">new</span> ThreadEx13_1();</span><br><span class="line"> ThreadEx13_2 th2 = <span class="hljs-keyword">new</span> ThreadEx13_2();</span><br><span class="line"> th1.start();</span><br><span class="line"> th2.start(); </span><br><span class="line"> startTime = System.currentTimeMillis();</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">try</span>{</span><br><span class="line"> th1.join();<span class="hljs-comment">//th1의 작업이 끝날때까지 기다린다.</span></span><br><span class="line"> th2.join();<span class="hljs-comment">//th2의 작업이 끝날때까지 기다린다.</span></span><br><span class="line"> }<span class="hljs-keyword">catch</span> (InterruptedException e){}</span><br><span class="line"> </span><br><span class="line"> System.out.println(<span class="hljs-string">"소요시간:"</span> + (System.currentTimeMillis()- ThreadEx13.startTime));</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx13_1</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">300</span> ; i++) {</span><br><span class="line"> System.out.println(<span class="hljs-string">"-"</span>);</span><br><span class="line"> }</span><br><span class="line"> }<span class="hljs-comment">//run()</span></span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx13_2</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">300</span> ; i++) {</span><br><span class="line"> System.out.println(<span class="hljs-string">"|"</span>);</span><br><span class="line"> }</span><br><span class="line"> } <span class="hljs-comment">//run()</span></span><br><span class="line">}</span><br><span class="line">``` </span><br><span class="line"></span><br><span class="line">join()을 사용하지 않으면 main 쓰레드는 바로 종료되지만, join()을 사용해서 th1과 th2의 작업이 마칠때까지 main쓰레드가 기다림 </span><br><span class="line">- 쓰레드가 순차적으로 실행되어야 할때 사용하는 예제. </span><br><span class="line"></span><br><span class="line">```java</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx14</span></span>{</span><br><span class="line"> <span class="hljs-keyword">static</span> <span class="hljs-keyword">long</span> startTime=<span class="hljs-number">0</span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception</span>{</span><br><span class="line"> </span><br><span class="line"> ThreadEx14_1 th1 = <span class="hljs-keyword">new</span> ThreadEx14_1();</span><br><span class="line"> ThreadEx14_2 th2 = <span class="hljs-keyword">new</span> ThreadEx14_2();</span><br><span class="line"> th1.start();</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">try</span>{</span><br><span class="line"> th1.join();</span><br><span class="line"> }<span class="hljs-keyword">catch</span> (InterruptedException e){}</span><br><span class="line"> th2.start();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx14_1</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">300</span> ; i++) {</span><br><span class="line"> System.out.println(<span class="hljs-string">"-"</span>);</span><br><span class="line"> }</span><br><span class="line"> }<span class="hljs-comment">//run()</span></span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx14_2</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">300</span> ; i++) {</span><br><span class="line"> System.out.println(<span class="hljs-string">"|"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>아래 코드는 th1, th2, Main쓰레드 순으로 종료됨 </p></li></ul><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx15</span></span>{</span><br><span class="line"> <span class="hljs-keyword">static</span> <span class="hljs-keyword">long</span> startTime=<span class="hljs-number">0</span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception</span>{</span><br><span class="line"> </span><br><span class="line"> ThreadEx15_1 th1 = <span class="hljs-keyword">new</span> ThreadEx15_1();</span><br><span class="line"> ThreadEx15_2 th2 = <span class="hljs-keyword">new</span> ThreadEx15_2();</span><br><span class="line"> th1.start();</span><br><span class="line"> th2.start();</span><br><span class="line"> <span class="hljs-keyword">try</span>{</span><br><span class="line"> th1.sleep();</span><br><span class="line"> }<span class="hljs-keyword">catch</span> (InterruptedException e){}</span><br><span class="line"> System.out.println(<span class="hljs-string">"<<main종료>>"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx15_1</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">300</span> ; i++) {</span><br><span class="line"> System.out.println(<span class="hljs-string">"-"</span>);</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="hljs-string">"<<TH1종료>>"</span>);</span><br><span class="line"> }<span class="hljs-comment">//run()</span></span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx15_2</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">300</span> ; i++) {</span><br><span class="line"> System.out.println(<span class="hljs-string">"|"</span>);</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="hljs-string">"<<TH2종료>>"</span>);</span><br><span class="line"> } <span class="hljs-comment">//run()</span></span><br><span class="line">}</span><br><span class="line">``` </span><br><span class="line"></span><br><span class="line">왜 th1이 sleep()으로 잠들어있어도 가장 먼저 종료될까? </span><br><span class="line">sleep()이 항상 현재 실행중인 쓰레드에 대해 작동해서 th1.sleep()호출해도 main메서드를 실행하는 main쓰레드가 영향받는다. </span><br><span class="line"><span class="hljs-keyword">static</span>으로 선언되어 있어서 참조변수로 sleep()을 호출하기 보다는 Thread.sleep()이렇게 호츨해야 함.</span><br><span class="line"></span><br><span class="line">## 9. 쓰레드의 동기화 </span><br><span class="line">멀티쓰레드는 여러 쓰레드가 같은 프로세스내의 자원을 공유하기 때문에 데이터가 원래 의도했더것과는 다르게 변경 될 수 있음. </span><br><span class="line"></span><br><span class="line">### 9.1 synchorized를 이용한 동기화 </span><br><span class="line">공유 데이터에 lock을 걸어 먼저 작업중이던 쓰레드가 작업을 완전히 마칠때까지는 다른 쓰레드에게 제어권이 넘어가도 데이터가 변경되지 않도록 보호함. </span><br><span class="line"></span><br><span class="line">- <span class="hljs-keyword">synchronized</span> 사용방법 두가지. </span><br><span class="line">가능하면 메서드에 <span class="hljs-keyword">synchronized</span>를 사용하는 메서드 단위 동기화를 권장함. </span><br><span class="line"></span><br><span class="line">```java</span><br><span class="line"><span class="hljs-comment">// 1. 특정한 객체에 lock을 걸고자 할때</span></span><br><span class="line"> sysnchronized(객체의 참조변수){</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"><span class="hljs-comment">// 2. 메서드에 lock을 걸고자 할때</span></span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">void</span> <span class="hljs-title">calcSum</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> </span><br><span class="line"> }</span><br></pre></td></tr></table></figure><p>synchronized를 이용해서 객체를 동기화 하면 쓰레드가 교착상태에 빠질 수 있다.<br>교착상태란 구 쓰레드가 lock이 된 상태로 서로 lock가 풀리기를 무한정 기다리게 되는상황. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx21</span> </span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span></span>{</span><br><span class="line"> RunnbaleImpl r = <span class="hljs-keyword">new</span> RunnableImpl();</span><br><span class="line"> Thread th1 = <span class="hljs-keyword">new</span> Thread(r);</span><br><span class="line"> Thread th2 = <span class="hljs-keyword">new</span> Thread(r);</span><br><span class="line"> th1.start();</span><br><span class="line"> th2.start();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RunnableTmpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Runnable</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> iv = <span class="hljs-number">0</span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> lv = <span class="hljs-number">0</span>;</span><br><span class="line"> String name = Thread.currentThread().getName();</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">while</span>(lv<<span class="hljs-number">3</span>){</span><br><span class="line"> System.out.println(name+<span class="hljs-string">"Local var: "</span>+ ++lv);</span><br><span class="line"> System.out.println(name+<span class="hljs-string">"Instance var: "</span>+ ++iv);</span><br><span class="line"> System.out.println();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>실행결과<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">Thread-<span class="hljs-number">0</span> Local <span class="hljs-keyword">var</span>: <span class="hljs-number">1</span></span><br><span class="line">Thread-<span class="hljs-number">0</span> Instance <span class="hljs-keyword">var</span>: <span class="hljs-number">1</span> </span><br><span class="line"></span><br><span class="line">Thread-<span class="hljs-number">0</span> Local <span class="hljs-keyword">var</span>: <span class="hljs-number">2</span></span><br><span class="line">Thread-<span class="hljs-number">0</span> Instance <span class="hljs-keyword">var</span>: <span class="hljs-number">2</span> </span><br><span class="line"></span><br><span class="line">Thread-<span class="hljs-number">0</span> Local <span class="hljs-keyword">var</span>: <span class="hljs-number">3</span></span><br><span class="line">Thread-<span class="hljs-number">0</span> Instance <span class="hljs-keyword">var</span>: <span class="hljs-number">3</span> </span><br><span class="line"></span><br><span class="line">Thread-<span class="hljs-number">0</span> Local <span class="hljs-keyword">var</span>: <span class="hljs-number">1</span></span><br><span class="line">Thread-<span class="hljs-number">0</span> Instance <span class="hljs-keyword">var</span>: <span class="hljs-number">4</span> </span><br><span class="line"></span><br><span class="line">Thread-<span class="hljs-number">0</span> Local <span class="hljs-keyword">var</span>: <span class="hljs-number">2</span></span><br><span class="line">Thread-<span class="hljs-number">0</span> Instance <span class="hljs-keyword">var</span>: <span class="hljs-number">5</span> </span><br><span class="line"></span><br><span class="line">Thread-<span class="hljs-number">0</span> Local <span class="hljs-keyword">var</span>: <span class="hljs-number">3</span></span><br><span class="line">Thread-<span class="hljs-number">0</span> Instance <span class="hljs-keyword">var</span>: <span class="hljs-number">6</span></span><br></pre></td></tr></table></figure></p><p> 여기서 인스턴스변수 iv는 main, th1, th2 쓰레드 모두 접근이 가능함.(쓰레드간의 변수 공유)<br> lv는 지역변수라 각 쓰레드 스택내에서 생성되어 공유되지 않는다.</p><ul><li>다음은 동기화가 잘 되지 않아 데이터 값이 변형된 예제.<figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ThreadEx24</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span></span>{</span><br><span class="line"> RunnbaleImpl r = <span class="hljs-keyword">new</span> RunnableImpl();</span><br><span class="line"> Thread th1 = <span class="hljs-keyword">new</span> Thread(r);</span><br><span class="line"> Thread th2 = <span class="hljs-keyword">new</span> Thread(r);</span><br><span class="line"> th1.start();</span><br><span class="line"> th2.start();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Account</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> balance =<span class="hljs-number">1000</span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">withdraw</span> <span class="hljs-params">(<span class="hljs-keyword">int</span> money)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">if</span>(balance>=money){</span><br><span class="line"> <span class="hljs-keyword">try</span>{ Thread.sleep(<span class="hljs-number">1000</span>);} <span class="hljs-keyword">catch</span>(Exception e){}</span><br><span class="line"> balance -=money;</span><br><span class="line"> }</span><br><span class="line"> }<span class="hljs-comment">//withdraw</span></span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RunnableEx24</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Runnable</span></span>{</span><br><span class="line"> Account acc = <span class="hljs-keyword">new</span> Account();</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">while</span>(acc.balance > <span class="hljs-number">0</span>){</span><br><span class="line"> <span class="hljs-comment">//100, 200, 300중의 한 값을 임의로 선택해서 출금</span></span><br><span class="line"> <span class="hljs-keyword">int</span> money = (<span class="hljs-keyword">int</span>)(Math.random()*<span class="hljs-number">3</span>+<span class="hljs-number">1</span>)*<span class="hljs-number">100</span>;</span><br><span class="line"> acc.withdraw(money);</span><br><span class="line"> System.out.println(<span class="hljs-string">"balance:"</span>+acc.balance);</span><br><span class="line"> }</span><br><span class="line"> }<span class="hljs-comment">//run()</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><p>실행 결과<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">balance:<span class="hljs-number">700</span></span><br><span class="line">balance:<span class="hljs-number">400</span></span><br><span class="line">balance:<span class="hljs-number">200</span></span><br><span class="line">balance:<span class="hljs-number">0</span></span><br><span class="line">balance:-<span class="hljs-number">100</span></span><br><span class="line">``` </span><br><span class="line"></span><br><span class="line">잔고(balance)가 임의의 출금금액(money)보다 클 경우에만 출금하도록 되어있는데 잔고에 -<span class="hljs-number">100</span>이 나왔음. </span><br><span class="line"><span class="hljs-keyword">if</span>조건문 통과하고 출금직전에 다른쓰레드가 끼어들어서 먼저 출금했기때문이다. </span><br><span class="line"><span class="hljs-keyword">if</span>문과 출금하는 기능은 하나로 <span class="hljs-keyword">synchronized</span>되어야 한다. </span><br><span class="line"></span><br><span class="line">```java</span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">void</span> <span class="hljs-title">withdraw</span> <span class="hljs-params">(<span class="hljs-keyword">int</span> money)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">if</span>(balance>=money){</span><br><span class="line"> <span class="hljs-keyword">try</span>{ Thread.sleep(<span class="hljs-number">1000</span>);} <span class="hljs-keyword">catch</span>(Exception e){}</span><br><span class="line"> balance -=money;</span><br><span class="line"> }</span><br><span class="line">}<span class="hljs-comment">//withdraw</span></span><br><span class="line">``` </span><br><span class="line"></span><br><span class="line">```java</span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">withdraw</span> <span class="hljs-params">(<span class="hljs-keyword">int</span> money)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">synchronized</span>(<span class="hljs-keyword">this</span>){</span><br><span class="line"> <span class="hljs-keyword">if</span>(balance>=money){</span><br><span class="line"> <span class="hljs-keyword">try</span>{ Thread.sleep(<span class="hljs-number">1000</span>);} <span class="hljs-keyword">catch</span>(Exception e){}</span><br><span class="line"> balance -=money;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line">}<span class="hljs-comment">//withdraw</span></span><br></pre></td></tr></table></figure></p><h3 id="9-2-wait-과-notify"><a href="#9-2-wait-과-notify" class="headerlink" title="9.2 wait()과 notify()"></a>9.2 wait()과 notify()</h3><p> 쓰레드를 동기화 할때 효율을 높이기 위해 사용할 수 있다.<br> 한쓰레드가 lock걸려 다른 쓰레드는 lock이 풀릴때까지 기다려야 되는 상황이 있음.<br> 쓰레드에 lock을 걸는것 대신에 wait()을 호출해서 다른 쓰레드에 제어권을 넘겨주고 대기상태로 기다리다가 다른쓰레드에 의해 notify()가 호출되면 다시 실행상태가 되도록 함<br> wait()과 notify()는 Object클래스에서 정의되서 모든 객체에서 호출이 가능함.<br> 동기화 블록 내에서만 사용가능. 쓰레드가 wait()을 호출하면 그때까지 걸어 놓은 lock을 풀고 대기실에 들어가기 됨.<br> notify()는 객체의 wating pool에 있는 쓰레드 중 하나만 깨움.</p><ul><li>wait(), notify(), notifyAll()<ul><li>Object에 정의 되어있다.</li><li>동기화 블록(synchronized)내에서만 사용할 수 있다. </li><li>보다 효율적인 동기화를 가능하게 한다. </li></ul></li></ul><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Account</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> balance =<span class="hljs-number">1000</span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">void</span> <span class="hljs-title">withdraw</span> <span class="hljs-params">(<span class="hljs-keyword">int</span> money)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">if</span>(balance>=money){</span><br><span class="line"> <span class="hljs-keyword">try</span>{ </span><br><span class="line"> wait();</span><br><span class="line"> } <span class="hljs-keyword">catch</span>(Exception e){}</span><br><span class="line"> balance -=money;</span><br><span class="line"> }</span><br><span class="line"> }<span class="hljs-comment">//withdraw</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">void</span> <span class="hljs-title">desposit</span><span class="hljs-params">(<span class="hljs-keyword">int</span> money)</span></span>{</span><br><span class="line"> balance += money;</span><br><span class="line"> notify();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="1-프로세스와-쓰레드"><a href="#1-프로세스와-쓰레드" class="headerlink" title="1. 프로세스와 쓰레드"></a>1. 프로세스와 쓰레드</h2><p>프로세스(process)는 간단하게 말하면 실행중인 프로그
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="java" scheme="https://eunii.github.io/categories/tec/java/"/>
<category term="java의 정석" scheme="https://eunii.github.io/tags/java%EC%9D%98-%EC%A0%95%EC%84%9D/"/>
</entry>
<entry>
<title>[CH7. 객체지향프로그래밍2] 추상클래스</title>
<link href="https://eunii.github.io/2019/05/07/tec/java/java9/"/>
<id>https://eunii.github.io/2019/05/07/tec/java/java9/</id>
<published>2019-05-07T11:40:25.000Z</published>
<updated>2019-05-13T07:17:47.889Z</updated>
<content type="html"><![CDATA[<h2 id="6-추상클래스"><a href="#6-추상클래스" class="headerlink" title="6. 추상클래스"></a>6. 추상클래스</h2><h3 id="6-1-추상클래스란"><a href="#6-1-추상클래스란" class="headerlink" title="6.1 추상클래스란?"></a>6.1 추상클래스란?</h3><p>미완성된 설계도. 미완성 메서드(추상메서드)를 포함하고 있는 클래스.<br>추상 클래스는 상속을 통해 자손클래스에 의해서만 완성될 수 있음.<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">abstract</span> <span class="hljs-class"><span class="hljs-keyword">class</span> 클래스이름</span>{</span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><h3 id="6-2-추상메서드"><a href="#6-2-추상메서드" class="headerlink" title="6.2 추상메서드"></a>6.2 추상메서드</h3><p>메서드 선언부와 구현부 중 선언부만 작성한것.<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">abstract</span> 리턴타입 메서드이름();</span><br></pre></td></tr></table></figure></p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">abstract</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Player</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title">play</span><span class="hljs-params">(<span class="hljs-keyword">int</span> pos)</span></span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title">stop</span><span class="hljs-params">()</span></span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AudioPlayeer</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Player</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">play</span><span class="hljs-params">(<span class="hljs-keyword">int</span> pos)</span></span>{</span><br><span class="line"> <span class="hljs-comment">// 기능 구현 </span></span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">stop</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-comment">//기능 구현</span></span><br><span class="line"> } </span><br><span class="line">}</span><br><span class="line"><span class="hljs-keyword">abstract</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AbstractPlayer</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Player</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">play</span><span class="hljs-params">(<span class="hljs-keyword">int</span> pos)</span> </span>{</span><br><span class="line"> <span class="hljs-comment">// 기능 구현</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="6-3-추상클래스의-작성"><a href="#6-3-추상클래스의-작성" class="headerlink" title="6.3 추상클래스의 작성"></a>6.3 추상클래스의 작성</h3><ul><li>추상 : 낱낱의 구체적 표상이나 개념에서 공통된 성질을 뽑아 이를 일반적인 개념으로 파악하는 정신 작용. </li><li>추상화 : 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업.</li><li>구체화 : 상속을 통해 클래스를 구현, 확장하는 작업</li></ul><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">abstract</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Player</span></span>{</span><br><span class="line"> <span class="hljs-keyword">boolean</span> pause;</span><br><span class="line"> <span class="hljs-keyword">int</span> currentPos;</span><br><span class="line"> </span><br><span class="line"> Player(){</span><br><span class="line"> pause = <span class="hljs-keyword">false</span>;</span><br><span class="line"> currentPos = <span class="hljs-number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title">play</span><span class="hljs-params">(<span class="hljs-keyword">int</span> pos)</span></span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title">stop</span><span class="hljs-params">()</span></span>;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">play</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> play(currentPos);</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">pause</span> <span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">if</span>(pause){</span><br><span class="line"> pause = <span class="hljs-keyword">false</span>;</span><br><span class="line"> }<span class="hljs-keyword">else</span> {</span><br><span class="line"> pause = <span class="hljs-keyword">true</span>;</span><br><span class="line"> stop();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>위의 Player추상클래스를 조상으로 하는 CDPlayer<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CDPlayer</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">player</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">play</span><span class="hljs-params">(<span class="hljs-keyword">int</span> currentPos)</span></span>{</span><br><span class="line"> <span class="hljs-comment">//기능 구현</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">stop</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-comment">//기능 구현</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">int</span> currentTrace;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">nextTrace</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> currentTrace++;</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">preTrace</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">if</span>(currentTrace><span class="hljs-number">1</span>){</span><br><span class="line"> currentTrace--;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>추상메서드로 안 만들고 구현부를 빈 상태로 두어 자손 클래스에서 오버라이드해서 사용할 수 있지만<br>추상메서드로하면 필수로 구연해야 한다. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Marine</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> x,y;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>{}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">stop</span><span class="hljs-params">()</span></span>{};</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">stimPack</span><span class="hljs-params">()</span></span>{}</span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Tank</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> x,y;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>{}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">stop</span><span class="hljs-params">()</span></span>{};</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">changeMode</span><span class="hljs-params">()</span></span>{}</span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Dropship</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> x,y;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>{}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">stop</span><span class="hljs-params">()</span></span>{};</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">load</span><span class="hljs-params">()</span></span>{}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">unload</span><span class="hljs-params">()</span></span>{}</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><p>위에서 공통부분을 뽑아내서 추상클래스 Unit을 만들어 다시 구현.<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">abstract</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Unit</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> x,y;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">stop</span><span class="hljs-params">()</span></span>{};</span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Marine</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Unit</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>{}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">stimPack</span><span class="hljs-params">()</span></span>{}</span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Tank</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Unit</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>{}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">changeMode</span><span class="hljs-params">()</span></span>{}</span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Dropship</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Unit</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>{}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">load</span><span class="hljs-params">()</span></span>{}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">unload</span><span class="hljs-params">()</span></span>{}</span><br><span class="line"> }</span><br></pre></td></tr></table></figure></p><p>위와같이 구현하면 아래처럼 Unit으로 배열로 다룰 수 있음<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Unit[] grop = <span class="hljs-keyword">new</span> Unit[<span class="hljs-number">4</span>];</span><br><span class="line">group[<span class="hljs-number">0</span>] = <span class="hljs-keyword">new</span> Marine();</span><br><span class="line">group[<span class="hljs-number">1</span>] = <span class="hljs-keyword">new</span> Tank();</span><br><span class="line">group[<span class="hljs-number">2</span>] = <span class="hljs-keyword">new</span> Marine();</span><br><span class="line">group[<span class="hljs-number">4</span>] = <span class="hljs-keyword">new</span> Dropship();</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<h2 id="6-추상클래스"><a href="#6-추상클래스" class="headerlink" title="6. 추상클래스"></a>6. 추상클래스</h2><h3 id="6-1-추상클래스란"><a href="#6-1-추상클래스란" class="he
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="java" scheme="https://eunii.github.io/categories/tec/java/"/>
<category term="java의 정석" scheme="https://eunii.github.io/tags/java%EC%9D%98-%EC%A0%95%EC%84%9D/"/>
</entry>
<entry>
<title>[CH7. 객체지향프로그래밍2] 인터페이스의 </title>
<link href="https://eunii.github.io/2019/05/07/tec/java/java10/"/>
<id>https://eunii.github.io/2019/05/07/tec/java/java10/</id>
<published>2019-05-07T11:40:25.000Z</published>
<updated>2019-05-13T07:17:02.160Z</updated>
<content type="html"><![CDATA[<h2 id="7-인터페이스"><a href="#7-인터페이스" class="headerlink" title="7. 인터페이스"></a>7. 인터페이스</h2><h3 id="7-1-인터페이스란"><a href="#7-1-인터페이스란" class="headerlink" title="7.1 인터페이스란?"></a>7.1 인터페이스란?</h3><p>인터페이스는 일종의 추상클래스.<br>추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서<br>추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. </p><h3 id="7-2-인터페이스의-작성"><a href="#7-2-인터페이스의-작성" class="headerlink" title="7.2 인터페이스의 작성"></a>7.2 인터페이스의 작성</h3><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">interface</span> 인터페이스이름</span>{</span><br><span class="line"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> 타입 상수이름 = 값;</span><br><span class="line"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">abstract</span> 메서드이름(매개변수 목록);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li>모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.</li><li>모든 메서드는 public abstract 이어야하며, 이를 생략할 수 있다. </li></ul><h3 id="7-3-인터페이스의-상속"><a href="#7-3-인터페이스의-상속" class="headerlink" title="7.3 인터페이스의 상속"></a>7.3 인터페이스의 상속</h3><p>인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속이 가능하다. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Movable</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>;</span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Attactable</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(Unit u)</span></span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Fightable</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Movable</span>, <span class="hljs-title">Attackable</span></span>{}</span><br></pre></td></tr></table></figure><h3 id="7-4-인터페이스의-구현"><a href="#7-4-인터페이스의-구현" class="headerlink" title="7.4 인터페이스의 구현"></a>7.4 인터페이스의 구현</h3><p>그 자체로는 인스턴스를 생성할 수 없음. 클래스에서 implements를 사용하여 구현함. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> 클래스 이름 <span class="hljs-keyword">implements</span> 인터페이스이름</span>{</span><br><span class="line"> <span class="hljs-comment">//인터페이스에 정의된 추상메서드 구현</span></span><br><span class="line">}</span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Figther</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Fightable</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>{</span><br><span class="line"> <span class="hljs-comment">//기능 구현</span></span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">attack</span><span class="hljs-params">(Unit u)</span></span>{</span><br><span class="line"> <span class="hljs-comment">//기능 구현</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>구현하는 인터페이스의 메서드 중 일부만 구현하면 추상메서드로 선언되어야 함.<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">abstract</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Fighter</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Figtable</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>{</span><br><span class="line"> <span class="hljs-comment">//기능 구현</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>상속과 구현을 동시에 할 수 있음<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Figther</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Unit</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Figthable</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y)</span></span>{</span><br><span class="line"> <span class="hljs-comment">//기능 구현</span></span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">attack</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-comment">//기능 구현</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><h3 id="7-5-인터페이스를-이용한-다중상속"><a href="#7-5-인터페이스를-이용한-다중상속" class="headerlink" title="7.5 인터페이스를 이용한 다중상속"></a>7.5 인터페이스를 이용한 다중상속</h3><p>자바에서는 다중상속을 허용하지 않아서 인터페이스로 다중상속을 할 수는 있지만 거의 하지 않는다.<br>두개의 클래스를 상속받아야 하는 상황이라면 두 클래스중 비중이 높은걸 상속받고 나머지는 클래스 내부 멤버로 포함시키는 방법.<br>필요한 부분을 뽑아 인터페이슬슬 만든 후 구현함.</p><h3 id="7-6-인터페이스를-이용한-다형성"><a href="#7-6-인터페이스를-이용한-다형성" class="headerlink" title="7.6 인터페이스를 이용한 다형성"></a>7.6 인터페이스를 이용한 다형성</h3><p>인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수있고 형변환도 가능함.<br>인터페이스 : Fightable, 클래스 : Fighter(implements Figtable)일때<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Fightable f = (Fightable) <span class="hljs-keyword">new</span> Figther();</span><br><span class="line">Fightable f = <span class="hljs-keyword">new</span> Fighter();</span><br></pre></td></tr></table></figure></p><p>인터페이스는 매게변수 타입으로도 쓸 수 있음<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-function">viod <span class="hljs-title">attack</span><span class="hljs-params">(Figtable f)</span></span>{}</span><br></pre></td></tr></table></figure></p><p>메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야한다.<br>여기서는 new Figther();<br>리턴타입으로 인터페이스 타입을 지정하는것도 가능함.<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-function">Fightable <span class="hljs-title">method</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-comment">// ...</span></span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Fighter();</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><h3 id="7-7-인터페이스의-장점"><a href="#7-7-인터페이스의-장점" class="headerlink" title="7.7 인터페이스의 장점"></a>7.7 인터페이스의 장점</h3><ul><li>개발시간을 단축시킬 수 있다. </li><li>표준화가 가능하다. </li><li>서로 관계업는 클래스들에게 관계를 맺어줄 수 있다.</li><li>독립적인 프로그래밍이 가능하다.</li></ul><h3 id="7-8-인터페이스의-이해"><a href="#7-8-인터페이스의-이해" class="headerlink" title="7.8 인터페이스의 이해"></a>7.8 인터페이스의 이해</h3><ul><li>클래스를 사용하는 쪽과 클래스를 제공하는 쪽이 있다.</li><li>메서드 사용하느 쪽에서는 사용하려는 메서드의 선언부만 알면된다. </li></ul>]]></content>
<summary type="html">
<h2 id="7-인터페이스"><a href="#7-인터페이스" class="headerlink" title="7. 인터페이스"></a>7. 인터페이스</h2><h3 id="7-1-인터페이스란"><a href="#7-1-인터페이스란" class="he
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="java" scheme="https://eunii.github.io/categories/tec/java/"/>
<category term="java의 정석" scheme="https://eunii.github.io/tags/java%EC%9D%98-%EC%A0%95%EC%84%9D/"/>
</entry>
<entry>
<title>[CH7. 객체지향프로그래밍2] 다형성</title>
<link href="https://eunii.github.io/2019/05/06/tec/java/java8/"/>
<id>https://eunii.github.io/2019/05/06/tec/java/java8/</id>
<published>2019-05-06T11:40:25.000Z</published>
<updated>2019-05-13T07:18:51.729Z</updated>
<content type="html"><![CDATA[<h2 id="5-다형성"><a href="#5-다형성" class="headerlink" title="5. 다형성"></a>5. 다형성</h2><h3 id="5-1-다형성이란"><a href="#5-1-다형성이란" class="headerlink" title="5.1 다형성이란?"></a>5.1 다형성이란?</h3><p>여러가지 형태를 가질 수 있는 능력.<br>조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 함.<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Tv</span></span>{</span><br><span class="line"> <span class="hljs-keyword">boolean</span> power;</span><br><span class="line"> <span class="hljs-keyword">int</span> channel;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">power</span><span class="hljs-params">()</span></span>{power = !power;}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">channelUp</span><span class="hljs-params">()</span></span>{++channel;}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">channelDown</span><span class="hljs-params">()</span></span>{--channel;}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CaptionTv</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Tv</span></span>{</span><br><span class="line"> String text;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">caption</span><span class="hljs-params">()</span></span>{};</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Tv t = <span class="hljs-keyword">new</span> Tv();</span><br><span class="line">CaptionTv c = <span class="hljs-keyword">new</span> CaptionTv();</span><br></pre></td></tr></table></figure><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Tv t = <span class="hljs-keyword">new</span> CaptionTv();</span><br></pre></td></tr></table></figure><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">CaptionTv c = <span class="hljs-keyword">new</span> CaptionTv();</span><br><span class="line">Tv t = <span class="hljs-keyword">new</span> CaptionTv();</span><br></pre></td></tr></table></figure><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-comment">//이렇게는 불가능함</span></span><br><span class="line">CaptionTv c = <span class="hljs-keyword">new</span> Tv();</span><br></pre></td></tr></table></figure><p>조상 타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.<br>반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다. </p><h3 id="5-2-참조변수의-형병환"><a href="#5-2-참조변수의-형병환" class="headerlink" title="5.2 참조변수의 형병환"></a>5.2 참조변수의 형병환</h3><p>자손타입->조상타입(up-castion) : 형변환 생략 가능<br>자손타입<-조상타입(Down-castion) : 형변환 생략 불가</p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Car</span></span>{</span><br><span class="line"> String color;</span><br><span class="line"> <span class="hljs-keyword">int</span> door;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">drive</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> System.out.println(<span class="hljs-string">"drive, Brrr~"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">stop</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> System.out.println(<span class="hljs-string">"stop!!"</span>);</span><br><span class="line"> } </span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">FireEngine</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Car</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">water</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> System.out.println(<span class="hljs-string">"water!!!"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Ambulance</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Car</span> </span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">siren</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> System.out.println(<span class="hljs-string">"siren~~!"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>FireEngine타입과 Ambulance타입은 서로 형변환 불가능<br>Car 타입과 FireEngine 타입 형변환 예시<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Car car = <span class="hljs-keyword">null</span>;</span><br><span class="line">FireEngine fe = <span class="hljs-keyword">new</span> FireEngine();</span><br><span class="line">FireEngine fe2 = <span class="hljs-keyword">null</span>;</span><br><span class="line"></span><br><span class="line">car = fe; <span class="hljs-comment">//car = (Car) fe; 형변환이 생략된 형태</span></span><br><span class="line">fe2 = (FireEngine) car; <span class="hljs-comment">//형변환 생략 불가.</span></span><br></pre></td></tr></table></figure></p><p>아래 예제는 컴파일에러는 발생하지 않지만 실행시 에러가 발생함.<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CastingTest2</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String args[])</span></span>{</span><br><span class="line"> Car car = <span class="hljs-keyword">new</span> Car();</span><br><span class="line"> Car car2 = <span class="hljs-keyword">null</span>;</span><br><span class="line"> FireEngine fe = <span class="hljs-keyword">null</span>;</span><br><span class="line"> </span><br><span class="line"> car.drive();</span><br><span class="line"> fe = (FireEngine) car; <span class="hljs-comment">//실행시 여기서 에러 발생</span></span><br><span class="line"> fe.drive();</span><br><span class="line"> car2 = fe;</span><br><span class="line"> car2.drive();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">``` </span><br><span class="line"></span><br><span class="line">car가 Car타입의 인스턴스여서 FireEngine을 받을 수 없음.</span><br><span class="line">- 캐스트연산자를 사용하면 서로 상속관계에 있는 클래스 타입의 참조변수간의 형변환은 양방향으로 자유롭게 수행될 수 있다. </span><br><span class="line">그러나 참조변수가 참조하고 있는 인스턴스의 자손타입으로 형변환을 하는것은 허용되지 않는다. </span><br><span class="line"></span><br><span class="line">### 5.3 instanceof연산자 </span><br><span class="line">참조변수가 참조하는 인스턴스 실제타입을 확인하기 위해 <span class="hljs-keyword">instanceof</span>연산자 사용. </span><br><span class="line">주로 조건문에사용. </span><br><span class="line">* 값이 ull인 참조변수에 대해 <span class="hljs-keyword">instanceof</span>연산을 하면 <span class="hljs-keyword">false</span>나옴. </span><br><span class="line"></span><br><span class="line">```java</span><br><span class="line"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">doWork</span><span class="hljs-params">(Car c)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">if</span>(c <span class="hljs-keyword">instanceof</span> FireEngine){</span><br><span class="line"> FireEngine fe = (FireEngind) c;</span><br><span class="line"> fe.water();</span><br><span class="line"> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>( c instance of Ambulance){</span><br><span class="line"> Ambulance a = (Ambulance) c;</span><br><span class="line"> a.siren();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">InstanceOfTest</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span> <span class="hljs-params">(String args[])</span></span>{</span><br><span class="line"> FireEngine fe = <span class="hljs-keyword">new</span> FireEngine();</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">if</span>(fe <span class="hljs-keyword">instanceof</span> FireEngine){</span><br><span class="line"> System.out.println(<span class="hljs-string">"FireEngine instance"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-keyword">if</span>( fe <span class="hljs-keyword">instanceof</span> Car){</span><br><span class="line"> System.out.println(<span class="hljs-string">"Car instance"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-keyword">if</span>( fe <span class="hljs-keyword">instanceof</span> Object){</span><br><span class="line"> System.out.println(<span class="hljs-string">"Object instance"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>위의 코드를 실행할 경우<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">FireEngine instance</span><br><span class="line">Car instance</span><br><span class="line">Object instance</span><br></pre></td></tr></table></figure></p><h3 id="5-4-참조변수와-인스턴스의-연결"><a href="#5-4-참조변수와-인스턴스의-연결" class="headerlink" title="5.4 참조변수와 인스턴스의 연결"></a>5.4 참조변수와 인스턴스의 연결</h3><p>멤버변수가 조상클래스와 자손클래스에 중복으로 정의된 경우, 조상 타입의 참조변수를 사용했을 때는 조상클래스에 선언된 멤버변수가 사용되고, 지손타입의 참조변수를 사용했을 때는 자손틀래스에 선언된 멤버변수가 사용된다. </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BindingTest</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span></span>{</span><br><span class="line"> Parent p = <span class="hljs-keyword">new</span> Child();</span><br><span class="line"> Child c = <span class="hljs-keyword">new</span> Child();</span><br><span class="line"> </span><br><span class="line"> System.out.println(<span class="hljs-string">"p.x ="</span> + p.x);</span><br><span class="line"> p.method();</span><br><span class="line"> </span><br><span class="line"> System.out.println(<span class="hljs-string">"c.x= "</span>+c.x);</span><br><span class="line"> c.method();</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Parent</span> </span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> x = <span class="hljs-number">100</span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">method</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> System.out.println(<span class="hljs-string">"Parent Method"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Child</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> x = <span class="hljs-number">200</span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">method</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> System.out.println(<span class="hljs-string">"Child Method"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>실행결과<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">p.x=<span class="hljs-number">100</span></span><br><span class="line">Child Method</span><br><span class="line">c.x=<span class="hljs-number">200</span></span><br><span class="line">Child Method</span><br></pre></td></tr></table></figure></p><h3 id="5-5-매개변수의-다형성"><a href="#5-5-매개변수의-다형성" class="headerlink" title="5.5 매개변수의 다형성"></a>5.5 매개변수의 다형성</h3><h3 id="5-6-여러-종류의-객체를-하나의-배열로-다루기"><a href="#5-6-여러-종류의-객체를-하나의-배열로-다루기" class="headerlink" title="5.6 여러 종류의 객체를 하나의 배열로 다루기"></a>5.6 여러 종류의 객체를 하나의 배열로 다루기</h3>]]></content>
<summary type="html">
<h2 id="5-다형성"><a href="#5-다형성" class="headerlink" title="5. 다형성"></a>5. 다형성</h2><h3 id="5-1-다형성이란"><a href="#5-1-다형성이란" class="headerlink"
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="java" scheme="https://eunii.github.io/categories/tec/java/"/>
<category term="java의 정석" scheme="https://eunii.github.io/tags/java%EC%9D%98-%EC%A0%95%EC%84%9D/"/>
</entry>
<entry>
<title>[CH7. 객체지향프로그래밍2] Package와 import</title>
<link href="https://eunii.github.io/2019/05/05/tec/java/java7/"/>
<id>https://eunii.github.io/2019/05/05/tec/java/java7/</id>
<published>2019-05-05T11:40:25.000Z</published>
<updated>2019-05-13T07:18:51.740Z</updated>
<content type="html"><![CDATA[<h2 id="3-Package와-import"><a href="#3-Package와-import" class="headerlink" title="3 Package와 import"></a>3 Package와 import</h2><h3 id="3-1-패키지-package"><a href="#3-1-패키지-package" class="headerlink" title="3.1 패키지(package)"></a>3.1 패키지(package)</h3><p>패키지란, 클래스의 묶음. 물리적으로 하나의 디렉터리임.<br>ex) java.lang.String은 java/lang 디렉터리에 위치한 Strig 클래스이다. </p><ul><li>하나의 소스파일에는 첫번째 문장으로 단 한번의 패키지 선언만을 허용한다.</li><li>모든 클래스는 반드시 하나의 패키지에 속해야 된다.</li><li>패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.</li><li>패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉터리다. </li></ul><h3 id="3-2-패키지의-선언"><a href="#3-2-패키지의-선언" class="headerlink" title="3.2 패키지의 선언"></a>3.2 패키지의 선언</h3><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">package</span> 패키지명;</span><br></pre></td></tr></table></figure><h3 id="3-3-import-문"><a href="#3-3-import-문" class="headerlink" title="3.3 import 문"></a>3.3 import 문</h3><p>import 문은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공함. </p><h3 id="3-4-import문의-선언"><a href="#3-4-import문의-선언" class="headerlink" title="3.4 import문의 선언"></a>3.4 import문의 선언</h3><p>일반적인 소스 파일(*.java)의 구성은 다음의 순서로 되어있다. </p><ol><li>package문</li><li>import문</li><li>클래스선언 </li></ol><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">import</span> 패키지명.클래스명;</span><br><span class="line"><span class="hljs-keyword">import</span> 패키지명.*;</span><br></pre></td></tr></table></figure><h2 id="4-제어자"><a href="#4-제어자" class="headerlink" title="4 제어자"></a>4 제어자</h2><h3 id="4-1-제어자란"><a href="#4-1-제어자란" class="headerlink" title="4.1 제어자란?"></a>4.1 제어자란?</h3><p>클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여함</p><ul><li>접근제어자 - public, protected, default, private</li><li>그외 - static, final, abstract, native, transient, synchronized, volatile, strictfp<br>제어자는 클래스, 멤버변수, 메서드에 주로 사용됨.<br>하나의 대상에 여러 제어자를 조합하는 것은 가능하나 접근제어자는 하나만 쓸 수 있다. </li></ul><h3 id="4-2-static-클래스의-공통적인"><a href="#4-2-static-클래스의-공통적인" class="headerlink" title="4.2 static - 클래스의, 공통적인"></a>4.2 static - 클래스의, 공통적인</h3><ul><li>static 이 사용될 수 있는곳 : 멤머변수, 메서드, 초기화 블럭 </li></ul><p>*static </p><table><thead><tr><th>대상</th><th>의미</th></tr></thead><tbody><tr><td>멤버변수</td><td>- 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.<br> - 클래스변수는 인스턴스를 생성하지 않고도 가능하다.<br> - 클래스가 메모리에 로드될 때 생성된다.</td></tr><tr><td>메서드</td><td>- 인스턴스를 생성하지 않고도 호룰이 가능한 static 메서드가 된다. <br> static 메서드 내에선 인스턴스 멤버들을 직접 사용할 수 없다. </td></tr></tbody></table><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">StaticTest</span></span>{</span><br><span class="line"> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> width =<span class="hljs-number">200</span>;</span><br><span class="line"> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> height = <span class="hljs-number">120</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-keyword">static</span> {</span><br><span class="line"> <span class="hljs-comment">// static 변수의 초기화 수행</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">max</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">return</span> a>b?a:b;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="4-3-final-마지막의-변경될-수-없는"><a href="#4-3-final-마지막의-변경될-수-없는" class="headerlink" title="4.3 final - 마지막의, 변경될 수 없는"></a>4.3 final - 마지막의, 변경될 수 없는</h3><p>final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수<br>*final </p><table><thead><tr><th>대상</th><th>의미</th></tr></thead><tbody><tr><td>클래스</td><td>변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. <br> 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없음</td></tr><tr><td>메서드</td><td>변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.</td></tr><tr><td>멤버변수/지역변수</td><td>변수 앞에 final이 붙으면 값을 변경할 수 없는 상수가 된다.</td></tr></tbody></table><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">FinalTest</span></span>{</span><br><span class="line"> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> MAX_SIZE = <span class="hljs-number">10</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">final</span> <span class="hljs-keyword">void</span> <span class="hljs-title">getMaxSize</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> LV = MAX_SIZE;</span><br><span class="line"> <span class="hljs-keyword">return</span> MAX_SIZE;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="4-4-생성자를-이용한-final-멤버변수-초기화"><a href="#4-4-생성자를-이용한-final-멤버변수-초기화" class="headerlink" title="4.4 생성자를 이용한 final 멤버변수 초기화"></a>4.4 생성자를 이용한 final 멤버변수 초기화</h3><p>final 붙은 변수는 상수임으로 일반적으로 선언과 초기화를 동시에 하지만, 인스턴스 변수의 경우 생성자에서 초기화 되도록 할 수 있다.<br>각 인스턴스마다 final 이 붙은 멤버 변수가 다른 값을 갖도록 하는 것이 가능하다.<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Card</span></span>{</span><br><span class="line"> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> NUMBER;</span><br><span class="line"> <span class="hljs-keyword">final</span> String KIND;</span><br><span class="line"> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> width = <span class="hljs-number">100</span>;</span><br><span class="line"> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> height =<span class="hljs-number">250</span>;</span><br><span class="line"> </span><br><span class="line"> Card(String kind, <span class="hljs-keyword">int</span> num){</span><br><span class="line"> KIND = kind;</span><br><span class="line"> NUMBER = num;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> Card(){</span><br><span class="line"> <span class="hljs-keyword">this</span>(<span class="hljs-string">"HEART"</span>,<span class="hljs-number">1</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><h3 id="4-5-abstract-추상의-미완성의"><a href="#4-5-abstract-추상의-미완성의" class="headerlink" title="4.5 abstract - 추상의, 미완성의"></a>4.5 abstract - 추상의, 미완성의</h3><p>미완성의 의미를 가지고 있다.<br>메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용함. </p><ul><li>abstract가 사용될 수 있는 곳 - 클래스, 메서드</li></ul><p>*abstract </p><table><thead><tr><th>대상</th><th>의미</th></tr></thead><tbody><tr><td>클래스</td><td>클래스 내에 추상메서드가 선언되어 있음을 의미한다.</td></tr><tr><td>메서드</td><td>선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 알린다.</td></tr></tbody></table><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">abstract</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AbstractTest</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title">move</span><span class="hljs-params">()</span></span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="4-6-접근제어자"><a href="#4-6-접근제어자" class="headerlink" title="4.6 접근제어자"></a>4.6 접근제어자</h3><ul><li>멤버 또는 클래스에 사용되어 외부에서 접근하지 못하게 제한하는 역할.</li><li>접근 제어자가 사용될 수 있는곳- 클래스, 멤버변수, 메서드, 생성자<ul><li>private : 같은 클래스 내에서만 접근이 가능하다.</li><li>default : 같은 패키지 내에서만 접근이 가은하다.</li><li>protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다.</li><li>public : 접근 제한이 없다.</li></ul></li></ul><h3 id="4-7-접근-제어자를-이용한-캡슐화"><a href="#4-7-접근-제어자를-이용한-캡슐화" class="headerlink" title="4.7 접근 제어자를 이용한 캡슐화"></a>4.7 접근 제어자를 이용한 캡슐화</h3><p>접근 제어자 사용하는 이유: </p><ul><li>외부로 부터 데이터를 보호하기 위해</li><li>외부에는 불필요한 내부적으로만 사용되는 부분을 감추기 위해</li></ul><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Time</span></span>{</span><br><span class="line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> hour;</span><br><span class="line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> minute;</span><br><span class="line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> second;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getHour</span><span class="hljs-params">()</span></span>{<span class="hljs-keyword">return</span> hour;}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setHour</span><span class="hljs-params">(<span class="hljs-keyword">int</span> hour)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">if</span>(hour<<span class="hljs-number">0</span> || hour > <span class="hljs-number">23</span>){</span><br><span class="line"> <span class="hljs-keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-keyword">this</span>.hour = hour;</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getMinute</span><span class="hljs-params">()</span></span>{<span class="hljs-keyword">return</span> minute;}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setMinute</span><span class="hljs-params">(<span class="hljs-keyword">int</span> min)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">if</span>(min<<span class="hljs-number">0</span> || hour > <span class="hljs-number">59</span>){</span><br><span class="line"> <span class="hljs-keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-keyword">this</span>.minute = min;</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getSecond</span><span class="hljs-params">()</span></span>{<span class="hljs-keyword">return</span> second;}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setSecond</span><span class="hljs-params">(<span class="hljs-keyword">int</span> sec)</span></span>{</span><br><span class="line"> <span class="hljs-keyword">if</span>(sec <<span class="hljs-number">0</span> || sec > <span class="hljs-number">59</span>){</span><br><span class="line"> <span class="hljs-keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="hljs-keyword">this</span>.second = sec;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="4-9-제어자의-조합"><a href="#4-9-제어자의-조합" class="headerlink" title="4.9 제어자의 조합"></a>4.9 제어자의 조합</h3><table><thead><tr><th>대상</th><th>사용가능한 제어자</th></tr></thead><tbody><tr><td>클래스</td><td>public, default, final, abstract</td></tr><tr><td>메서드</td><td>모든 접근제어자, final, abstract, static</td></tr><tr><td>멤버변수</td><td>모든 접근제어자, final, static</td></tr><tr><td>지역변수</td><td>final</td></tr></tbody></table><ol><li>메서드에 static과 abstract를 함께 사용할 수 없다.</li><li>클래스에 abstract와 final을 동시에 사용할 수 없다.</li><li>abstract메서드의 접근제어자가 private일 수 없다.</li><li>메서드에 private와 final을 같이 사용할 필요는 없다.(둘중 하나만 사용해도 충분)</li></ol>]]></content>
<summary type="html">
<h2 id="3-Package와-import"><a href="#3-Package와-import" class="headerlink" title="3 Package와 import"></a>3 Package와 import</h2><h3 id="3-1-패
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="java" scheme="https://eunii.github.io/categories/tec/java/"/>
<category term="java의 정석" scheme="https://eunii.github.io/tags/java%EC%9D%98-%EC%A0%95%EC%84%9D/"/>
</entry>
<entry>
<title>[CH7. 객체지향프로그래밍2] 오버라이딩</title>
<link href="https://eunii.github.io/2019/05/04/tec/java/java6/"/>
<id>https://eunii.github.io/2019/05/04/tec/java/java6/</id>
<published>2019-05-04T11:40:25.000Z</published>
<updated>2019-05-13T07:21:05.563Z</updated>
<content type="html"><![CDATA[<h2 id="2-오버라이딩"><a href="#2-오버라이딩" class="headerlink" title="2. 오버라이딩"></a>2. 오버라이딩</h2><h3 id="2-1-오버라이딩이란"><a href="#2-1-오버라이딩이란" class="headerlink" title="2.1 오버라이딩이란?"></a>2.1 오버라이딩이란?</h3><p>조상 클래스부터 상속받은 메서드의 내용을 변경하는것<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Point</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> x;</span><br><span class="line"> <span class="hljs-keyword">int</span> y;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function">String <span class="hljs-title">getLocation</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-string">"x : "</span>+x+<span class="hljs-string">", y : "</span> + y;</span><br><span class="line"> }</span><br><span class="line">|</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Point3D</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Point</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> z;</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function">String <span class="hljs-title">getLocation</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> <span class="hljs-keyword">return</span> <span class="hljs-string">"x : "</span>+x+<span class="hljs-string">", y : "</span> + y+<span class="hljs-string">", z : "</span>+z;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><h3 id="2-2-오버라이딩의-조건"><a href="#2-2-오버라이딩의-조건" class="headerlink" title="2.2 오버라이딩의 조건"></a>2.2 오버라이딩의 조건</h3><p>메서드 선언부는 조상의 것과 완전 일치해야함.<br>자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와</p><ul><li>이름이 같아야 한다.</li><li>매개변수가 같아야 한다.</li><li>리턴 타입이 같아야 한다.</li></ul><ol><li>접근제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.<br>ex) 조상클래스의 메서드의 접근 제어자가 protected라면<br>자식클래스에서 오버라이딩 하는 메서드의 접근 제어자는 protected나 public 이어야함. </li><li>조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.</li></ol><ul><li>조상 클래스의 메서드를 자손클래스에서 오버라이딩할 때 <ol><li>접근제어자를 조상클래스의 메서드보다 좁은 범위로 할 수 없다.</li><li>예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.</li><li>인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.</li></ol></li></ul><h3 id="2-3-오버로딩-VS-오버라이딩"><a href="#2-3-오버로딩-VS-오버라이딩" class="headerlink" title="2.3 오버로딩 VS 오버라이딩"></a>2.3 오버로딩 VS 오버라이딩</h3><ul><li>오버로딩(overloading) : 기존에 없는 메서드를 정의하는것(new)</li><li>오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)</li></ul><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Parent</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">parentMethod</span><span class="hljs-params">()</span></span>{};</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Chile</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Parent</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">parentMethod</span><span class="hljs-params">()</span></span>{} <span class="hljs-comment">// 오버라이딩;</span></span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">parentMethod</span><span class="hljs-params">(<span class="hljs-keyword">int</span> i)</span></span>{} <span class="hljs-comment">//오버로딩</span></span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">childMethod</span><span class="hljs-params">()</span></span>{}</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">childMethod</span><span class="hljs-params">(<span class="hljs-keyword">int</span> i)</span></span>{} <span class="hljs-comment">//오버로딩</span></span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">childMethod</span><span class="hljs-params">()</span></span>{}<span class="hljs-comment">// 에러 함수가 중복됨</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="2-4-super"><a href="#2-4-super" class="headerlink" title="2.4 super"></a>2.4 super</h3><p>자손클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수.<br>조상클래스의 멤버와 자손클래스의 멤버가 중복 정의되서 구별해야 되지 않는 상황이면 super대신 this를 써도 됨.<br>static 메서드(클래스 메서드)에서는 사용 할 수 없다.</p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SuperTest</span></span>{</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String args[])</span></span>{</span><br><span class="line"> Child c = <span class="hljs-keyword">new</span> Child();</span><br><span class="line"> c.method();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Parent</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> x =<span class="hljs-number">10</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Child</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Parent</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> x =<span class="hljs-number">20</span>;</span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">method</span><span class="hljs-params">()</span></span>{</span><br><span class="line"> system.out.println(<span class="hljs-string">"x="</span>+x); </span><br><span class="line"> system.out.println(<span class="hljs-string">"this.x="</span>+<span class="hljs-keyword">this</span>.x);</span><br><span class="line"> system.out.println(<span class="hljs-string">"super.x="</span>+<span class="hljs-keyword">super</span>.x); </span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>실행 결과<br><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">x=<span class="hljs-number">20</span></span><br><span class="line"><span class="hljs-keyword">this</span>.x=<span class="hljs-number">20</span>;</span><br><span class="line"><span class="hljs-keyword">super</span>.x=<span class="hljs-number">10</span>;</span><br></pre></td></tr></table></figure></p><h3 id="2-5-super-조상클래스의-생성자"><a href="#2-5-super-조상클래스의-생성자" class="headerlink" title="2.5 super() - 조상클래스의 생성자"></a>2.5 super() - 조상클래스의 생성자</h3><p>super()는 조상클래스의 생성자를 호출하는 생성자이다.<br>Object클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자(같은 클래스의 다른 생성자 또는 조상의 생성자)를 호출 해야함.<br>그렇지 않으면 컴파일러가 super(); 를 자동으로 첫줄에 삽입. </p><ol><li>클래스 - 어떤 클래스의 인스턴스를 생성할것인가?</li><li>생성자 - 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?</li></ol>]]></content>
<summary type="html">
<h2 id="2-오버라이딩"><a href="#2-오버라이딩" class="headerlink" title="2. 오버라이딩"></a>2. 오버라이딩</h2><h3 id="2-1-오버라이딩이란"><a href="#2-1-오버라이딩이란" class="
</summary>
<category term="tec" scheme="https://eunii.github.io/categories/tec/"/>
<category term="java" scheme="https://eunii.github.io/categories/tec/java/"/>
<category term="java의 정석" scheme="https://eunii.github.io/tags/java%EC%9D%98-%EC%A0%95%EC%84%9D/"/>
</entry>
<entry>
<title>[CH6. 객체지향프로그래밍1 ] 변수의 초기화</title>
<link href="https://eunii.github.io/2019/05/03/tec/java/java4/"/>
<id>https://eunii.github.io/2019/05/03/tec/java/java4/</id>
<published>2019-05-03T11:40:25.000Z</published>
<updated>2019-05-13T07:21:05.585Z</updated>
<content type="html"><![CDATA[<h2 id="6-변수의-초기화"><a href="#6-변수의-초기화" class="headerlink" title="6. 변수의 초기화"></a>6. 변수의 초기화</h2><h3 id="6-1-변수의-초기화"><a href="#6-1-변수의-초기화" class="headerlink" title="6.1 변수의 초기화"></a>6.1 변수의 초기화</h3><p>변수를 선언하고 처읍으로 값을 저장하는것.<br>가능하면 선언과 동시에 초기화 하는게 바람직. </p><ul><li>멤버변수(클래스변수와 인스턴스 변수)와 배열의 초기화는 선택적이지만,<br>지역변수는 반드시 초기화 후 사용해야함.</li></ul><p>멤버변수 추기화 방법</p><ol><li>명시적 초기화</li><li>생성자</li><li>초기화 블럭<ul><li>인스턴스 초기화 블럭: 인스턴스변수를 초기화 하는데 사용</li><li>클래스 초기화 블럭: 클래스를 초기화 하는데 사용 </li></ul></li></ol><h3 id="6-2-명시적-초기화"><a href="#6-2-명시적-초기화" class="headerlink" title="6.2 명시적 초기화"></a>6.2 명시적 초기화</h3><p> 변수 선언과 동시에 초기화 하는것<br> <figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Car</span></span>{</span><br><span class="line"> <span class="hljs-keyword">int</span> door= <span class="hljs-number">4</span>; <span class="hljs-comment">//기본형 변수 초기화</span></span><br><span class="line"> Engine = <span class="hljs-keyword">new</span> Engine(); <span class="hljs-comment">// 참조형 변수 초기화</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><h3 id="6-3-초기화-블럭"><a href="#6-3-초기화-블럭" class="headerlink" title="6. 3 초기화 블럭"></a>6. 3 초기화 블럭</h3><ul><li>초기화 블럭 - 클래스변수의 복잡한 초기화에 사용</li><li>인스턴스 초기화 블럭 - 인스턴스 변수의 복잡한 초기화에 사용</li></ul><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">InitBlock</span></span>{</span><br><span class="line"> <span class="hljs-keyword">static</span>{<span class="hljs-comment">/* 클래스 초기화 블럭*/</span>}</span><br><span class="line"> {<span class="hljs-comment">/*인스턴스 초기화 블럭 */</span>}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>클래스 초기화 블럭은 클래스가 메모리에 올라가 갈 때 한번만 수행.<br>인스턴스 초기화는 인스턴스 생성될때 생성자보다 먼저 수행됨.</p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">Car(){</span><br><span class="line"> System.out.println(<span class="hljs-string">"Car인스턴스가 생성되었습니다."</span>);</span><br><span class="line"> color= <span class="hljs-string">"withe"</span>;</span><br><span class="line"> gearType=<span class="hljs-string">"auto"</span>;</span><br><span class="line">}</span><br><span class="line">Car(String color, String gearType){</span><br><span class="line"> System.out.println(<span class="hljs-string">"Car인스턴스가 생성되었습니다."</span>);</span><br><span class="line"> <span class="hljs-keyword">this</span>.color= color;</span><br><span class="line"> <span class="hljs-keyword">this</span>.gearType=gearType;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>동일한 “Car인스턴스가 생성되었습니다.” 처리를 인스턴스 블럭으로 아래와 같이 처리 </p><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">{ System.out.println(<span class="hljs-string">"Car인스턴스가 생성되었습니다."</span>); }</span><br><span class="line"></span><br><span class="line">Car(){</span><br><span class="line"> color= <span class="hljs-string">"withe"</span>;</span><br><span class="line"> gearType=<span class="hljs-string">"auto"</span>;</span><br><span class="line">}</span><br><span class="line">Car(String color, String gearType){</span><br><span class="line"> <span class="hljs-keyword">this</span>.color= color;</span><br><span class="line"> <span class="hljs-keyword">this</span>.gearType=gearType;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="6-4-멤버변수의-초기화-시기와-순서"><a href="#6-4-멤버변수의-초기화-시기와-순서" class="headerlink" title="6.4 멤버변수의 초기화 시기와 순서"></a>6.4 멤버변수의 초기화 시기와 순서</h3><ul><li>클래스 변수 초기화 시점 - 클래스가 처음 로딩될 때 한번 초기화</li><li><p>인스턴스 변수의 초기화 시점 - 인스턴스가 생성될 때마다 각 인스턴스별로 초기화 이루어짐</p></li><li><p>클래스 변수 초기화 순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭</p></li><li>인스턴스 변수 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스초기화 블럭 -> 생성자 </li></ul><figure class="highlight java hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Product</span></span>{</span><br><span class="line"> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> count =<span class="hljs-number">0</span>; <span class="hljs-comment">//생성된 인스턴스 수를 저장하기 위한 변수</span></span><br><span class="line"> <span class="hljs-keyword">int</span> serialNo; <span class="hljs-comment">//인스턴스 고유 번호</span></span><br><span class="line"> </span><br><span class="line"> {</span><br><span class="line"> ++count;</span><br><span class="line"> serialNo = count; <span class="hljs-comment">// Product인스턴스가 생성될 때마다 count 값을 1증가시켜 serialNo에 저장</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">product</span><span class="hljs-params">()</span></span>{}</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="6-변수의-초기화"><a href="#6-변수의-초기화" class="headerlink" title="6. 변수의 초기화"></a>6. 변수의 초기화</h2><h3 id="6-1-변수의-초기화"><a href="#6-1-변수의-초기화"