<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4157482598906673216</id><updated>2026-10-14T04:40:27.649-07:00</updated><title type='text'>&quot;강이&quot;의 JAVA 강좌</title><subtitle type='html'>자바를 처음 시작한다는 가정하에 사소한 것부터 하나하나 짚고 넘어가며 따라하기 쉽도록&lt;br&gt;&#xa;예제를 중심으로 모든 설명이 사용자의 관점에서 자세하게 기술되어 있는것이 특징입니다.&lt;br&gt;&#xa;&quot;강이&quot;의 자바 강좌는 본 블로그(alecture.blogspot.com)와 제휴를 통해&lt;br&gt;&#xa;독점적으로 공급될 예정이며 내용의 수정은 공급자의 제한으로 불가하고&lt;br&gt;&#xa;사이트 출처를 밝히는데 한해 어디서나 자유롭게 쓸수있도록 합의하였음을 알립니다.&lt;br&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>98</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-6933939712784479443</id><published>2012-11-18T09:41:00.002-08:00</published><updated>2012-11-20T10:54:25.827-08:00</updated><title type='text'>자바의 열거맵(EnumMap)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUJ2GIChEUdmwPcItVY_waFqGV_rG9RFNxUMlmuFnCTnm4M1ksaIJOPuPjKlAQNfQOxbpelPQ2RIiXqIC26AOCMspubYLqu5U13T8kHh5TX992ky16B4wxfXOTGyW9l6Izgj8S68tPoMiC/s1600/enum.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUJ2GIChEUdmwPcItVY_waFqGV_rG9RFNxUMlmuFnCTnm4M1ksaIJOPuPjKlAQNfQOxbpelPQ2RIiXqIC26AOCMspubYLqu5U13T8kHh5TX992ky16B4wxfXOTGyW9l6Izgj8S68tPoMiC/s400/enum.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSyHqWN_VkpQMWDKbbfKmSyJgmtp3WKHAXZ4qMRad2SBR-K5s4ZHDn6AQXFXIp8Irnhp5C5shByGZ8uVqY_p2zctzAbZ1kzYawOBzj5fwK_V8dNS99wApe7YKkVFnO3jwo_FC0C-NHCQH9/s1600/enummap.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;197&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSyHqWN_VkpQMWDKbbfKmSyJgmtp3WKHAXZ4qMRad2SBR-K5s4ZHDn6AQXFXIp8Irnhp5C5shByGZ8uVqY_p2zctzAbZ1kzYawOBzj5fwK_V8dNS99wApe7YKkVFnO3jwo_FC0C-NHCQH9/s400/enummap.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9j50xirkGNiZ4R0e6ffQe6FuWXh5Qw-Scxy2Rdh8qaJXIUZUPZ348Q7bTlPfKfK3X81gQJOwl-tsjcVMugH3yaKXGBt3B4cXrcGp5RkG-RFeL-8jjn1KaT5vcoMlneTHbb6jmK4CXFDeX/s1600/enummap.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;95&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9j50xirkGNiZ4R0e6ffQe6FuWXh5Qw-Scxy2Rdh8qaJXIUZUPZ348Q7bTlPfKfK3X81gQJOwl-tsjcVMugH3yaKXGBt3B4cXrcGp5RkG-RFeL-8jjn1KaT5vcoMlneTHbb6jmK4CXFDeX/s400/enummap.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
EnumMap 클래스는 자바 5에서 추가된 내용이므로 새로울지 모르나 저번 강의시간에 열거셋에 대해서 이미 공부하였으므로 필자의 핵심예제를 통해 바로 습득하는 시간을 가져보겠다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdJIS7oVOqwkvmXlys19vtdI32Hif1_bNsvmvlYGW6JuiqnhhguiJpp6QnFKZo2mLfgBxYbJrBeQ2YTCzNusfE6SPBe-5u4Xg8LBq_Uf_rQNH7mh8_SG4iOE1M4vqm2LSEua1DAQevNhFF/s1600/t119.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;303&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdJIS7oVOqwkvmXlys19vtdI32Hif1_bNsvmvlYGW6JuiqnhhguiJpp6QnFKZo2mLfgBxYbJrBeQ2YTCzNusfE6SPBe-5u4Xg8LBq_Uf_rQNH7mh8_SG4iOE1M4vqm2LSEua1DAQevNhFF/s400/t119.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
Map: {SUNDAY=S, MONDAY=M, TUESDAY=T, WEDNESDAY=W, THURSDAY=T, FRIDAY=F, SATURDAY=S}&lt;br /&gt;
Key: [SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY]&lt;br /&gt;
Value: [S, M, T, W, T, F, S]&lt;br /&gt;
&lt;br /&gt;
예제를 간략하게 보면 오늘 출력하는 부분은 총 3가지로 이루어져 있다. 하나는 키와 밸류를 함께 출력하는 Map이고 다른 하나는 키만 출력하는 Key이고 나머지 하나는 밸류만 출력하는 Value이다. 예제는 거부감(?)을 없애기 위해 예전에 썼던 Day 열거형을 사용하였으니 금방 예제에 동화(?)되리라 본다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
열거맵이므로 열거형을 사용하며 예제에서는 그로 Day를 만들어서 사용하였다. 열거맵을 사용하려면 열거셋과 마찬가지로 열거형이름에 확장자로 class를 명명하면 열거형에 있는 요소들을 해당맵의 key로서 사용이 가능해진다. 우리는 열거맵을 공부하고 있으므로 이 열거요소들, 즉 키에 해당하는 각각의 밸류값들을 put( ) 메소드를 통해 넣어주었다.^^&lt;br /&gt;
&lt;br /&gt;
다음 단락은 그렇게 고생고생(?)해서 만든 열거맵을 찍어주는 구문이다. 이제 이런 메소드들은 해보기도 하였지만 보기만봐도 다 이해가 될것이다. 그 이유중 하나는 필자가 이미 언급하였다시피 자바 컬렉션 프레임워크의 메소드들은 기능에 의미를 부여함은 물론 여러 컬렉션 클래스들에서 그 기능이 같거나 비슷할경우 해당 메소드 이름도 같거나 비슷하게 지었기 때문에 아주 생소한 이름이 아닌이상 의미파악이 어느정도 가능하기 때문에 그러하다.^^&lt;br /&gt;
&lt;br /&gt;
끝으로 한마디 덧붙이자면 자바의 열거맵(EnumMap)은 비동기화(not synchronized) 되어있고 물론 Collections.synchronizedMap( ) 메소드를 이용하면 동기화 가능하고 반복자는&amp;nbsp;fail-fast 방식이고 열거맵의 순서는 열거형의 키를 기반으로 자연적인 순서(natural order)를 따른다. 여기서 자연적인 순서라함은 enum Day에서 열거한 순서대로 나열한다는 것을 말한다. 예를 들어, enum DAY에서 열거요소의 SUNDAY와 MONDAY를 바꿔놓으면 모든 결과들은 이 둘의 순서가 뒤바뀌어서 출력될 것이다. 여러분이 put( ) 메소드를 이용해서 밸류값을 넣은 순서와 상관없이 말이다.ㅎㅎ 그냥 그렇구나하고 넘어가지 말고 직접 해보면서 알아가는 여러분이 되기 바란다. 복습 잘하기 바라면서 열거맵 강좌는 여기서 마무리하겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/6933939712784479443/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/11/enummap.html#comment-form' title='20개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/6933939712784479443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/6933939712784479443'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/11/enummap.html' title='자바의 열거맵(EnumMap)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUJ2GIChEUdmwPcItVY_waFqGV_rG9RFNxUMlmuFnCTnm4M1ksaIJOPuPjKlAQNfQOxbpelPQ2RIiXqIC26AOCMspubYLqu5U13T8kHh5TX992ky16B4wxfXOTGyW9l6Izgj8S68tPoMiC/s72-c/enum.gif" height="72" width="72"/><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-6297656528995439321</id><published>2012-11-13T13:46:00.000-08:00</published><updated>2012-11-13T13:49:24.396-08:00</updated><title type='text'>자바의 트리맵(TreeMap)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe19y2uRwyMCBxEkWl_XfGnbCzBZiJofaFvw-cwIWjdhQypvOk-r2hwIJjDjfHTKlh308j2r-UMPV97FQUDbua3tFD5rdqXLLTofwnCuRXDXMHdhKUoSSIOVFsmFdjihwKn150Pmg03AFa/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe19y2uRwyMCBxEkWl_XfGnbCzBZiJofaFvw-cwIWjdhQypvOk-r2hwIJjDjfHTKlh308j2r-UMPV97FQUDbua3tFD5rdqXLLTofwnCuRXDXMHdhKUoSSIOVFsmFdjihwKn150Pmg03AFa/s400/1.jpg&quot; width=&quot;263&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
요소들을 차례대로 정렬하는 기능을 제외하면 해쉬맵(HashMap)과 거의 같은 트리맵(TreeMap)에 대해서 공부하는 시간을 갖기로 하겠다. 이미 트리셋을 공부하였으니 트리맵도 이름처럼 정렬을 가미한 클래스라는 것을 알수 있을 것이다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE2QLYLURvbuuzt51QE8AF1-_58dDje3YqqnNaJ3zRRE9HQhzmwcpkMGPHSdCnL_x3f8r8TWbckKWCGOMGhnkAuSr9wAuVR9gGOeBOVJgwsTzxsForKwxgZsBy9u77E4EBgB4FwwKYWPie/s1600/2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;156&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE2QLYLURvbuuzt51QE8AF1-_58dDje3YqqnNaJ3zRRE9HQhzmwcpkMGPHSdCnL_x3f8r8TWbckKWCGOMGhnkAuSr9wAuVR9gGOeBOVJgwsTzxsForKwxgZsBy9u77E4EBgB4FwwKYWPie/s400/2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
자바 컬렉션 프레임워크의 멤버인 트리맵도 해쉬맵처럼 비동기화(not synchronized)되어 있고 Collections.synchronizedSortedMap 메소드를 이용해 wrapped해서&lt;br /&gt;
SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));&lt;br /&gt;
위의 구문을 이용해 동기화시키는 것이 가능하며&amp;nbsp;키(Key)값을 중심으로 밸류(value)값을 가지고 있고 NavigableMap 인터페이스와 SortedMap 인터페이스, 그리고 AbstractMap 클래스를 기본으로 계승하고 있다. 키값은 중복될수 없으며 밸류값은 여러개의 중복된 값을 가지는 것이 가능하다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcSU9yXHUSQw3PUMf3nmNvtSQI-n0pk7Y8ZXycBLZfGdMfP3bBHtSuklMSZNYMKgaGOQzZm_xThXNaG21PKhIO8AJ3qYUFM0PVsRHYLdNcZ5lbpJoEs78UTQJrcCNOo_yzwAFyv9ZAtQc2/s1600/3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcSU9yXHUSQw3PUMf3nmNvtSQI-n0pk7Y8ZXycBLZfGdMfP3bBHtSuklMSZNYMKgaGOQzZm_xThXNaG21PKhIO8AJ3qYUFM0PVsRHYLdNcZ5lbpJoEs78UTQJrcCNOo_yzwAFyv9ZAtQc2/s400/3.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
해쉬테이블과 해쉬맵까지 거쳐온 여러분들은 모두 알고있는 내용일테지만 워밍업(?) 차원에서 잠시 읊어보았다.ㅎㅎ 이제 필자의 예제를 보면서 트리맵에 대해서 살펴보기로 하겠다. 저번 강의를 들은 여러분은 아마 이런 생각을 하고 있을 것이다. 저번 예제 그냥 순서대로 정렬하는거 맞죠? 그래 맞당.ㅎㅎ 여러분이 다 이와같이 눈에 뻔한 예제에 식상할 것을 대비해 필자가 대규모 반전(?) 예제를 들고 나왔다. 간만에 대한민국 걸그룹들이 총출동하는 예제이니 눈에 쌍심지(?)를 켜고 들여다보면 얻는바가 클것이라 생각한다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK0FYIMbD-ep_8Br77pEDbU66nZVnG0pgrcWYfx5-aps7A0Az1h_FxfDVPyIl-eh2xUAyPIYbVJ1a_8nF3tQ_pRrOr0_O1c6pupRpiXHwovX2aojk7fFv5TSYgfk2DR_1hPpYkiXQJThC3/s1600/t118.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;337&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK0FYIMbD-ep_8Br77pEDbU66nZVnG0pgrcWYfx5-aps7A0Az1h_FxfDVPyIl-eh2xUAyPIYbVJ1a_8nF3tQ_pRrOr0_O1c6pupRpiXHwovX2aojk7fFv5TSYgfk2DR_1hPpYkiXQJThC3/s400/t118.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
2ne1=YG&lt;br /&gt;
소녀시대=SM&lt;br /&gt;
시크릿=TS&lt;br /&gt;
원더걸스=JYP&lt;br /&gt;
카라=DSP&lt;br /&gt;
=== 강이의 자바강좌 ===&lt;br /&gt;
{카라=DSP, 원더걸스=JYP, 시크릿=TS, 소녀시대=SM, 2ne1=YG}&lt;br /&gt;
{소녀시대=SM, 시크릿=TS}&lt;br /&gt;
&lt;br /&gt;
예제는 크게 두 파트로 나눴다. 기본적으로 트리맵을 이용해서 요소들을 돌리는 것이 첫번째 파트이고 두번째 파트는 응용편으로 한번 넣어보았다. 그럼 이제 예제로 들어가보자. 트리맵을 써야하니 처음에 불러들인 것이고 요소들을 트리맵에 넣어야하는데 요소갯수만큼의 put( ) 메소드들을 이용한 요소삽입은 해보았으니 이번엔 일반 배열을 통한 for 구문을 이용해 요소들을 트리맵에 위와같이 넣어보았다. 이렇게 하는거 궁금했었는데 필자가 보여준거라면 우린 통한거다.ㅎㅎ 여기까지가 첫번째 파트인데 잘 찍힌다. 그런데 여기서 중요한건 자알 찍히는 정도가 아니라 순서까지 맞춰서 찍혔다는 것이다. 트리맵이니깐......&lt;br /&gt;
&lt;br /&gt;
다음은 descendingMap( ) 메소드를 이용해서 tm 트리맵을 역순으로 정렬하는 구문이다. 이런건 메소드의 이름만 봐도 바로 알수 있어야한다.ㅎㅎ 그리고 마지막은 subMap( ) 메소드인데 트리맵에서 이게 하이라이트(?)일지도 모르겠다. 조금 어려워보이는 걸로 따지면 말이다.ㅎㅎ 알고나면 별거없으니 모르는 이들은 잠시 귀를 기울이기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
subMap( ) 메소드가 하는 일은 sub에서 느끼다시피 뭔가 일을 부분적으로 하는 것이다. 여기서는 해당 맵 요소들의 범위를 정해주면 그 해당 범위내의 정렬된 요소들 중에서 일부분을 부분적으로 돌려준다. 예제에서는 &#39;소녀시대&#39;와 &#39;원더걸스&#39;를 입력해서 소녀시대부터 원더걸스까지, 즉 &#39;소녀시대&#39;, &#39;시크릿&#39;, &#39;원더걸스&#39;를 돌려준다. 그런데 결과는 원더걸스가 빠져있다. 왜일까? 힘쎈 원더걸스(?)라서 사라진건가? ㅎㅎ 범위를 정해줄때의 시작요소가 &#39;소녀시대&#39;이고 끝요소가 &#39;원더걸스&#39;인데 시작요소와 끝요소의 옆을 보면 true와 false가 적혀있을 것이다. true일때는 지정요소를 포함하는 것이고 false일때는 지정요소를 포함하지 않는다. 따라서 소녀시대 옆에는 true라서 시작요소를 포함한 것이고 끝요소인 원더걸스 옆에는 false라 결과에서 누락된 것이다. subMap( ) 메소드의 기능을 알아놓으면 프로그램을 짤때 도움이 될것이다.^^&lt;br /&gt;
&lt;br /&gt;
이것으로 트리맵에 대해서 짧게나마 알아보는 시간을 가져보았다. 본 예제를 중심으로 응용하면서 다른 메소드들을 공부하면 전체적으로 무난할 것이라 생각한다. 다른 기능들은 대부분 여러분이 벌써 필자와 함께 훈련(?)한 부분들이거나 눈치코치(?)로도 다 이해가능한 수준일 것이기에 이 정도에서 오늘 트리맵 강의는 편안하게 접도록 하겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/6297656528995439321/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/11/treemap.html#comment-form' title='3개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/6297656528995439321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/6297656528995439321'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/11/treemap.html' title='자바의 트리맵(TreeMap)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe19y2uRwyMCBxEkWl_XfGnbCzBZiJofaFvw-cwIWjdhQypvOk-r2hwIJjDjfHTKlh308j2r-UMPV97FQUDbua3tFD5rdqXLLTofwnCuRXDXMHdhKUoSSIOVFsmFdjihwKn150Pmg03AFa/s72-c/1.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-8292904209476324392</id><published>2012-11-12T09:34:00.002-08:00</published><updated>2012-11-12T09:47:31.008-08:00</updated><title type='text'>자바의 해쉬맵(HashMap)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjBt3nnRbEyMhjKsIviFjIxweMIUjdt4Nj2PDi0KI1pHxNCPCrUeuLid71Ofde7fGLTCyPeqYk2afUEuChOdnI7bfL02uN5xP9V8c0wGhUYOgV59Ykin4MkQrtNmz0p2EB8U4NjZMv18fu/s1600/HashMap.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjBt3nnRbEyMhjKsIviFjIxweMIUjdt4Nj2PDi0KI1pHxNCPCrUeuLid71Ofde7fGLTCyPeqYk2afUEuChOdnI7bfL02uN5xP9V8c0wGhUYOgV59Ykin4MkQrtNmz0p2EB8U4NjZMv18fu/s400/HashMap.png&quot; width=&quot;392&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
자바의 해쉬테이블을 열심히 공부하였다면 오늘 배울 해시맵이 유사하므로 저번보다는 비교적 수월할 것이니 가벼운 마음으로 따라와주길 부탁하면서 강의를 시작해보겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8gCagqyuL9WSdic2OV8IdMLkeRXi0lfC2Ae0AwevyA866SX1pgM6or9ixD-xbc2tGFZ6xSzjx7i758sWCcWiK1UbnsDwYL37CRu7cl8Ts2X_bZMjKEDQdPuAysJ36VAGteXLJJRlAF0Ct/s1600/3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8gCagqyuL9WSdic2OV8IdMLkeRXi0lfC2Ae0AwevyA866SX1pgM6or9ixD-xbc2tGFZ6xSzjx7i758sWCcWiK1UbnsDwYL37CRu7cl8Ts2X_bZMjKEDQdPuAysJ36VAGteXLJJRlAF0Ct/s400/3.jpg&quot; width=&quot;376&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
JDK 1.2 버젼부터 컬렉션의 멤버로서 나온 해쉬맵(HashMap)은 해쉬테이블(Hashtable)과는 다르게 기본할당공간이 16이고 비동기화(not synchronized)되어 있어 thread-safety는 꽝이지만 null을 허용하며 단일쓰레드 환경이라면 해쉬테이블에 비해서 엄청나게 속도가 빠르다. 따라서 멀티쓰레드 환경이 아닌 단일쓰레드만 사용한다면 선택의 여지가 없다.&lt;br /&gt;
Map m = Collections.synchronizedMap(new HashMap(...));&lt;br /&gt;
위의 명령을 이용하면 해쉬맵에서도 객체에 대한 동기화(synchronized)가 가능해진다. 많은 이들이 맵을 공부할때 할당된 메모리 공간에 키에 대한 밸류값만 들어간다고 생각하는데 키값과 밸류값 모두 아래의 그림처럼 해당공간에 같이 저장하게됨을 알아두기 바란다.+&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI-griK8ugDH4M5utHyOxJSljzydPHo_ZlxHcD-NXDidTZ5kMYid0YHhikChd0qq_Yl6AXKXnCnMopAzBMDrotiVY_1GIZkdtzCkPAB8dIdiVgGlTlt6IvY-JaH8jEy2NIawavH9ZhIiy0/s1600/HashMap1.bmp&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI-griK8ugDH4M5utHyOxJSljzydPHo_ZlxHcD-NXDidTZ5kMYid0YHhikChd0qq_Yl6AXKXnCnMopAzBMDrotiVY_1GIZkdtzCkPAB8dIdiVgGlTlt6IvY-JaH8jEy2NIawavH9ZhIiy0/s400/HashMap1.bmp&quot; width=&quot;353&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
해쉬맵은 위에서 언급한 특이사항 몇가지만 빼고는 전에 배운 해쉬테이블과 비슷하니 바로 예제를 통해서 심화학습을 하기로 하겠다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMYzW0yix2cOF6AJJ_wosAkO1ney6u3sUvkiaO4J4ul7jlaTRg7JW4lZurE5ekLYzNNs62H-v5FRcZn3jsRqZ8gIQN0ywhkjTWRIxIcf4mngnBHxpOUOw_aklDTJyjUBcqLzp__CdSTBvu/s1600/t117.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;391&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMYzW0yix2cOF6AJJ_wosAkO1ney6u3sUvkiaO4J4ul7jlaTRg7JW4lZurE5ekLYzNNs62H-v5FRcZn3jsRqZ8gIQN0ywhkjTWRIxIcf4mngnBHxpOUOw_aklDTJyjUBcqLzp__CdSTBvu/s400/t117.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
다=C&lt;br /&gt;
가=A&lt;br /&gt;
마=E&lt;br /&gt;
라=D&lt;br /&gt;
나=B&lt;br /&gt;
=== 강이의 자바강좌 ===&lt;br /&gt;
다=C&lt;br /&gt;
가=A&lt;br /&gt;
마=E&lt;br /&gt;
라=D&lt;br /&gt;
나=B&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
&lt;br /&gt;
다=C&lt;br /&gt;
가=A&lt;br /&gt;
마=E&lt;br /&gt;
라=D&lt;br /&gt;
나=B&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
저번 강의를 열공(?)하였다면 그냥 보기만해도 이해가 팍팍가리라 생각한다. 보통 궁금해하는 것이 HashMap에서 어떻게 루프(loop)를 돌리는지에 대한 방법일텐데 대표적인 세가지 방법 모두 어떻게 돌리면 되는지 필자가 손수 필살예제(?)를 준비하였으니 마음껏 즐기기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
Enumeration 선언부분 명령이 약간 어려울수 있는데 java.util 패키지에 있는 Collections 클래스의 enumeration( ) 메소드를 이용하면 이렇게 루프를 돌릴수 있다. Iterator는 어떻게 사용하는지 다 알고 있으리라 보이지만 비교도 할겸 iterator( ) 메소드를 통해 다시 루프를 돌렸더니 아니나 다를까 같은 답이 나왔다.^^ 마지막에 있는 새로운 for loop 구문으로 돌리면 더 간단해진다.ㅎㅎ 저번 강의에서 공부하느라 지친 여러분들의 노고를 치하할겸 오늘은 여기서 끝내도록 하겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/8292904209476324392/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/11/hashmap.html#comment-form' title='224개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/8292904209476324392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/8292904209476324392'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/11/hashmap.html' title='자바의 해쉬맵(HashMap)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjBt3nnRbEyMhjKsIviFjIxweMIUjdt4Nj2PDi0KI1pHxNCPCrUeuLid71Ofde7fGLTCyPeqYk2afUEuChOdnI7bfL02uN5xP9V8c0wGhUYOgV59Ykin4MkQrtNmz0p2EB8U4NjZMv18fu/s72-c/HashMap.png" height="72" width="72"/><thr:total>224</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-7197561587907104636</id><published>2012-11-12T09:11:00.000-08:00</published><updated>2012-11-12T13:56:23.770-08:00</updated><title type='text'>자바의 해쉬테이블(Hashtable)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFfgMwOHXJhDNdchbVScXLLgfxU0EoRgbQ0NRdezrnZJvsDiBAx8lum4B68oHmsbS9Qd2fjHJF8OUdlaqYwja6tzW-rWM4D4sPpNpdN4B-63_ONj4AU9rWGwyCEUP3xarWvk6vJfRaoOHU/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFfgMwOHXJhDNdchbVScXLLgfxU0EoRgbQ0NRdezrnZJvsDiBAx8lum4B68oHmsbS9Qd2fjHJF8OUdlaqYwja6tzW-rWM4D4sPpNpdN4B-63_ONj4AU9rWGwyCEUP3xarWvk6vJfRaoOHU/s400/1.jpg&quot; width=&quot;317&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
기본적으로 JDK 1.0 버젼에서부터 쓰여왔고 자바 2에서부터 컬렉션의 멤버로서 등재되기 시작한 해쉬테이블(Hashtable)이 다른 컬렉션들과 다른점은 동기화되어 있다는 점이다. 그럼 이제 맵(Map) 인터페이스를 구현한 해시테이블에 대해서 알아보도록 하겠다. 자바 컬렉션 프레임워크를 공부한 여러분은 이미 알고 있겠지만 Map은 컬렉션 즉, 컬렉션(Collection) 인터페이스를 계승하고 있지 않으므로 컬렉션에 관계된 모든 기능을 구현하고 있지는 않다. 또한 그동안 손쉽게 써오던 반복자(iterator)도 여기엔 없다. 대신에 Enumeration을 손쉽게 쓸수 있도록 구비되어 있다. 물론 반복자도 우회해서 쓸수있는 방법도 있다. 둘다 어떻게 쓸수 있는지 예제에서 다룰것이므로 깊은 체념이나 상심(?)은 자제하기 바란다.ㅎㅎ 그동안 배워온 리스트(List)나 셋(Set)이 요소들의 집합이나 순서 개념이 강하다면 오늘 배울 맵(Map)은 검색의 개념이 본격적으로 가미된 인터페이스라고 말할수 있겠다. 전화번호부처럼 이름을 찾아 전화번호를 찾는 과정을 떠올려보면 될것이다. 맵을 구현한 클래스를 다루는 첫번째 시간인만큼 해쉬테이블에 대해서 비교적 자세히 살펴보기로 하겠다. 오늘 강의를 잘 따라오면 앞으로 공부할 다른 종류의 맵 클래스들에 대해서도 공부하기가 한결 수월해질 것이다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtGB-4K7JPkt2NDJG59GA6yOYQEJYFz7jbPOz6fmqDga8DQSyj4Y9N7bf8MHANurVQa_LOtzVFAfenMAHwoVSmNSfRwgwZAgyqkapJZi2CpEWC-bdHz_ySzv8uL6tOVdFjRwrP4rbLnExa/s1600/hashtable.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;153&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtGB-4K7JPkt2NDJG59GA6yOYQEJYFz7jbPOz6fmqDga8DQSyj4Y9N7bf8MHANurVQa_LOtzVFAfenMAHwoVSmNSfRwgwZAgyqkapJZi2CpEWC-bdHz_ySzv8uL6tOVdFjRwrP4rbLnExa/s400/hashtable.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
그림은 해쉬테이블에서 키를 활용해 값이 어떻게 저장되는지를 보여주고 있는데 들어가기전에 equals( ) 메소드와 hashCode( ) 메소드의 기본원리는 일단 알고 있어야한다. 두 객체가 equals( )의 결과가 같다면 해쉬코드는 반드시 같아야하며 두 객체가 equals( )의 결과가 다르다면 해쉬코드는 같을수도 있고 다를수도 있다. 압축설명하자면&amp;nbsp;해쉬테이블의 데이터구조에 대한 알고리즘은 key를 이용해서&amp;nbsp;내부적으로 equals( ) 메소드와 hashCode( ) 메소드가 연산하여 어느 주소를 가지는 메모리에 저장할지를 결정한다. 만일 해쉬코드가 같은 값을 가지게 된다면 같은 장소에 저장이 될것이다. 그럴경우 그림처럼 키값과 밸류값들을 연결리스트를 통해서 저장한다. 키가 달라도 해쉬코드는 같은 값을 가질수 있는데 해쉬테이블은 생성시 기본값으로 11개의 배열공간이 할당되며 이 배열공간의 길이로 방금 얘기한 해쉬코드 연산(키에 대한 해쉬코드값 % 11)을 통해 해당값들을 정해진 공간에 저장한다. 그림의 buckets는 값들을 저장할수 있는 메모리에 할당된 공간을 말하는데 배열구조랑 비교하자면 키(key)가 배열의 인덱스(index)라고 생각하면 이해가 쉬울 것이다. 그리고 그 키(key)와 관련 쌍을 이루어 저장되는 것이 값(value)이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
해쉬테이블의 원리는 여러분의 건강(?)을 감안하여 이 정도로 하고 이제 예제를 보기로 하겠다.^^ 아직까지 뭐가뭔지 잘 모르겠다하는 이들은 끝까지 따라오기 바란다. 예제를 보면 모든 걱정이 기우(杞憂)에 지나지 않았다는 것을 깨닫게 될것이다. 아래의 예제가 좀 길어보일지 모르나 같은 내용을 다른 방법을 써가면서 같은 결과를 도출해내는 것이므로 실제는 예제의 반 정도만 여러분이 집중하면 될것이다. 혹시나 길다고 여기서 중도포기하는 이들(?)을 막기위해 한마디 남기면서 예제풀이로 들어가겠다. 그럼 아래의 해쉬테이블 예제를 보자.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj46OWpGmyo8HZ0wRSI8kVuEk5nRpaBQcO2Kq4UDqbsznZQh21U1jW-eHc4c5-38-MVLnwsmHjSl8Cn7x7n7GfUz-PlNZcUJEBWHrh1OFMF7cMO_Po5YbhxzM4NsDFB3p0EusHU8Qrg6_hs/s1600/t116.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj46OWpGmyo8HZ0wRSI8kVuEk5nRpaBQcO2Kq4UDqbsznZQh21U1jW-eHc4c5-38-MVLnwsmHjSl8Cn7x7n7GfUz-PlNZcUJEBWHrh1OFMF7cMO_Po5YbhxzM4NsDFB3p0EusHU8Qrg6_hs/s400/t116.jpg&quot; width=&quot;230&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYd4Hznae4Vi3bqJwp8NPVPm1iYVRJk2214mkkCCiPs9PA_WTuw_wpc5bL198tO5ZZP0ND40Xsd9sYB-q-zE8uT3HXR6faVUPLMB2RJoaezRcaun-VQpNdNkjthtsZt9n2tWcqQVo3aoNr/s1600/r116.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYd4Hznae4Vi3bqJwp8NPVPm1iYVRJk2214mkkCCiPs9PA_WTuw_wpc5bL198tO5ZZP0ND40Xsd9sYB-q-zE8uT3HXR6faVUPLMB2RJoaezRcaun-VQpNdNkjthtsZt9n2tWcqQVo3aoNr/s400/r116.jpg&quot; width=&quot;286&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
자 시작해보겠다.ㅎㅎ 조금 설명이 길어질것 같은 불길한 예감(?)이 스쳐가고 있지만 최대한 간략하면서도 머리에 쏙쏙 들어오게 설명하겠으니 피곤하더라도 잠깐만 집중하기 바란다.^^ 먼저 프로그램에서 필요한 인터페이스나 클래스를 불러들이고 메인메소드에서 해쉬테이블의 인자 ht를 생성하고 키(key)와 값(value)을 put( ) 메소드를 이용해 집어넣었다. put 메소드안의 첫번째가 키이고 두번째가 값이다. 메소드의 형식을 빌어 다시 표현하자면 아래와 같다.&lt;br /&gt;
&lt;br /&gt;
V put(K key, V value)&lt;br /&gt;
&lt;br /&gt;
이 메소드 형식을 보면 참 재미있는 사실을 한가지 알수 있는데 앞에 V가 눈에 들어오지 않는가? (승리를 뜻하는게 아님.-) 당연히 value를 뜻하는 것이겠징? ㅎㅎ 키와 값을 넣어주면서 지금 넣어주는 키에 관련된 그전의 값이 있다면 리턴해 준다는 부분이다. 물론 없으면 null을 돌려준다. 조금 있다가 다시 나올텐데 미리 예고편(?) 때리고 있는거다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
다시 돌아가서 키와 값을 넣어주고&amp;nbsp;keys( ) 메소드와 elements( ) 메소드를 이용해&amp;nbsp;Enumeration과 함께 해쉬테이블을 돌려주니 키와 값이 자알~ 출력된다.^^ 순서는 해쉬테이블 마음가는데로 찍힌다.ㅎㅎ 열거에 대해선 안해본것도 아니니 별 어려움은 없을 것이라 보고 다음으로 가보겠다.&lt;br /&gt;
&lt;br /&gt;
각종 메소드들을 통해 키와 값들을 함께도 찍고 따로도 찍어보고 하는 예제이다. 보기 좋으라고 제목 자체를 메소드 이름으로 달아놨으니 거침이 없을 것이다.ㅎㅎ 자 그럼 이제 아까 예고했던 본방송편(?)을 시작하겠다.&lt;br /&gt;
&lt;br /&gt;
String s = (String)ht.put(3,&quot;OK&quot;);&lt;br /&gt;
&lt;br /&gt;
코드에 필자가 이렇게 만들어 놓았다. 키값으로 3을 주고 그 해당하는 키값으로 가서 OK를 value값으로 넣으라는거다. 그리고 그곳에서 쓰던 value값이 있었다면 넘겨주고 찍어보라는 예제인데 해보니까 C가 찍힌다. 키 3에 해당하는 값의 value값으로 C가 있었으니까 말이다. String은 Object 값을 넘겨받으므로 캐스팅 처리해준것 뿐이다. ht를 찍어보니 키 3의 위치에 방금 넣었던 OK가 제대로 출력되는 것을 알수 있고 또한 예전에 있던 키 대신에 같은 키를 넣으면 나중값을 받아들인다는 것을 여기서 캐치할수 있어야한다. value값은 상관없지만 key값은 중복을 허용하지 않으니까 말이다. 너무 당연한가? 혹시나 해서~ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
다음은 contains( ) 메소드를 이용해서 value값인 OK가 해쉬테이블에 들어있냐고 체크하라고 하니 있으니까 있다고 true 돌려준거고 containsKey( ) 메소드는 키값으로 0이 있냐고 물어보니까 없어서 false라고 돌려준 것인데 어려울건 없다고 본다.^^&lt;br /&gt;
&lt;br /&gt;
이번엔 putAll( ) 이라는 메소드가 나온다. 한마디로 괄호안에 있는 ht 해쉬테이블을 ht2로 카피하라는거다. 출력해보니까 잘 옮겨졌다. get( ) 메소드를 이용해서 키값으로 3에 해당하는 value값을 물어보니 OK라고 대답하고 너무 혹사시키는 것 같아 미안한 마음(?)에 편히 보낼려고 remove( ) 메소드를 이용해 키값인 3을 넣고 찍어보았더니 이제 해쉬테이블의 쌍(pair)이 예상대로 하나가 줄었다.ㅎㅎ 욕하는거 아니다.-&lt;br /&gt;
&lt;br /&gt;
오케이 드디어 마지막 구문이다. 조금만 참아라~ Iterator를 이용해서 기존의 ht 해쉬테이블을 찍어보도록 만든 것인데 하나는 keySet( ) 메소드를 이용해서 키값과 밸류값을 출력한 것이고 다른 하나는 entrySet( )을 이용해서 키값과 밸류값을 한번에 처리한 것이다. 이 부분은 Iterator도 사용할수 있다는 것을 보여줄겸 한번 적어보았으나 어떤 것을 사용할지는 상황을 고려해야한다.&lt;br /&gt;
&lt;br /&gt;
덧붙여 잠시 얘기해 보자면 컬렉션 클래스에서 저장된 요소들을 차례대로 접근하기 위한 방법을 컬렉션 뷰 메소드(collection view methods)라고 부른다. 그리고 fail-fast라는 것이 있는데 Enumeration(not fail-fast 방식)이나 Iterator(fail-fast 방식)를 사용하여 각 요소들에 대한 순차적 접근이 끝나기도 전에 해당 컬렉션에 대한 객체들에 대해서 요소가 추가되거나 삭제되거나 하는 어떤 변경이 가해질 경우 요소들에 대한 접근에 실패하게 되는데 이때 Enumeration과 Iterator가 대처하는 방식이 다르다. 멀티쓰레드 환경에서 이런 상황이 일어날수 있는데 이런 경우에 Enumeration은 그와 상관없이 요소들에 대한 순차적 접근을 끝까지 수행하는 not fail-fast 방식인 반면에 Iterator는 그럴 경우 예외(ConcurrentModificationException)를 발생시키며 안전할지 모르는 사태를 대비해 작동을 중지하는 fail-fast 방식을 취한다.&lt;br /&gt;
&lt;br /&gt;
해쉬테이블에 대해서 공부해 봤는데 그리 쉽지는 않았을 것이다. key와 value를 세트로 거기다가 해슁까지 소화(?)하기가 부담스러울걸 고려해 가급적이면 무난하게 읽을수 있도록 풍부한 해설과 다양한 예제를 담으려고 필자가 각고한 노력(?)을 기울인만큼 여러분도 그에 필적하는 노력(?)으로 응답해 주기를 기대하면서 오늘 강의는 여기서 마치겠다. 수고많았다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/7197561587907104636/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/11/hashtable.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/7197561587907104636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/7197561587907104636'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/11/hashtable.html' title='자바의 해쉬테이블(Hashtable)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFfgMwOHXJhDNdchbVScXLLgfxU0EoRgbQ0NRdezrnZJvsDiBAx8lum4B68oHmsbS9Qd2fjHJF8OUdlaqYwja6tzW-rWM4D4sPpNpdN4B-63_ONj4AU9rWGwyCEUP3xarWvk6vJfRaoOHU/s72-c/1.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-4703051678657486014</id><published>2012-11-06T14:58:00.000-08:00</published><updated>2012-11-06T15:28:18.048-08:00</updated><title type='text'>자바의 열거셋(EnumSet)</title><content type='html'>자바의 EnumSet은 이름에서 풍기듯이 Set 인터페이스를 기반으로 하면서 enum 열거요소들을 이용해서 보다 빠르고 강력하게 결과를 도출해낼수 있도록 자바 5에서 등장한 새로운 무기(?)중 하나라고 볼수 있다. JDK 1.5 이전 버젼에서 자바를 처음 접한 이들은 아직까지 생소할수 있겠지만 오늘 강이의 자바강좌와 함께 한다면 필자가 단언하건데 EnumSet을 어느정도 수준까지는 자유자재로 구사할수 있는 능력자(?)가 될 것이니 더도말고 30분만 본 강의에 집중해주기 바란다. 강이의 자바강좌와 함께 새로운 것을 계속해서 알아가고 있는 이들은 이런 신병기(?)가 출현했을 경우 눈을 더 크게 뜨고 강의를 집중해야 기존의 자바인들보다 뛰어난 능력을 한가지라도 보유할수 있는 기회의 장으로 만들수 있음을 명심해야 할것이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
enum에 대해서 아예 모르거나 처음 들어본 이들은 예전에 올린 enum 열거형 타입에 대한 강좌를 다시 듣고 이 자리로 돌아오기 바란다. 여러분의 빠른 이해를 위해 예제도 저번 열거형 강좌의 예제를 그대로 도입해 EnumSet 버젼으로 승화시켰음을 알리는 바이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
그럼 오늘 배울 EnumSet은 어떤 상황에 쓰는건지 궁금할텐데 말그대로 열거형 타입으로 지정해놓은 요소들을 가장 쉽고 빠르게 배열처럼 요소들을 다룰수 있는 기능을 제공한다. EnumSet은 기술상으로 원소갯수가 2^6 그러니까 64개를 넘지 않을 경우에 겉은 Set 기반이지만 내부적으로 long 데이터형의 비트필드를 사용하게 된다. 비트필드는 2의 제곱수들로 이루어져 메모리 공간도 적게 차지하고 속도도 빠른데 이런 원리를 기반으로 돌아가는 세트가 바로 EnumSet이다. HashSet의 경우에는 배열과 해쉬코드를 이용하는데 상황에 따라 다를수 있겠지만 통상 비트연산을 이용하는 EnumSet보다는 속도면에서 훨씬 뒤떨어질수 밖에 없다. 거기다 EnumSet은 Set을 기반으로 하지만 enum과 static 타입의 메소드들로 구성되어있어 안정성을 최대한 추구하면서도 편리한 사용이 가능하다.&lt;br /&gt;
&lt;br /&gt;
서론은 이 정도로 하고 이제 예제로 살펴보는 시간을 갖도록 하겠다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjbYN3LC81KHiHOjqTj8YmLq_a_OMXSclTEuS8uL06vAMcmYsW_AvcU6XCNyxJ4utd5qZOyaD7cH4DJAS_nOjfCAGY-xvWWXh151Xoew7IV2IxP-45qpvt6SN3T47vIrHTrUn3zNxobdOr/s1600/t115.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;263&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjbYN3LC81KHiHOjqTj8YmLq_a_OMXSclTEuS8uL06vAMcmYsW_AvcU6XCNyxJ4utd5qZOyaD7cH4DJAS_nOjfCAGY-xvWWXh151Xoew7IV2IxP-45qpvt6SN3T47vIrHTrUn3zNxobdOr/s400/t115.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
EnumSet Day: [SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY]&lt;br /&gt;
EnumSet Day: []&lt;br /&gt;
es: [WEDNESDAY, FRIDAY]&lt;br /&gt;
es2: [SUNDAY, MONDAY, TUESDAY, THURSDAY, SATURDAY]&lt;br /&gt;
es2: [TUESDAY, WEDNESDAY, THURSDAY, FRIDAY]&lt;br /&gt;
&lt;br /&gt;
위의 예제 하나로 EnumSet을 끝낼 것이다. 더도말고 메인메소드안에 있는 딱 12줄만 여러분이 이해하면 끝나는 것이다. 그냥 보기만 해도 알것이나 간략하게 부연설명을 해보도록 하겠다. 일단 첫 단락은 예전에 enum 타입으로 Day라는 열거형을 만들어본 적이 있는데 기억하는지 모르겠다. 일요일부터 토요일까지 요일을 기입하였는데 오늘 예제는 이를 토대로 플레이(?) 할것이니 잘 따라오기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
메인메소드의 첫 EnumSet을 보면 인자로 es를 만드는데 allOf( )라는 메소드를 이용해서 열거형 Day에 있는 요소들을 다 가져오라는 것이다. 쓰는 방식은 예제처럼 괄호안에 열거형 이름에다가 .class를 붙인 형태를 사용하면 된다. 이게 가능해지는 이유(?)는 컴파일한 지금 여러분의 자바파일이 있는 디렉토리에 가보면 해답을 찾을수 있을 것이다. 클래스명$Day.class라는 새로운 파일로부터 말이다. 열거형을 만들면 그와 관련된 .class가 이처럼 새로 생성된다. 둘째줄에 인자 es2는 es와 똑같은 세트를 만드는 것이다. 예제처럼 copyOf( )나 clone( ) 메소드를 이용해서 복사가 가능하다. 그래서 복사가 제대로 되었는지 es2를 찍어보니 열거세트 Day와 똑같이 출력되는 것을 보니 잘 되었다는 것을 알수 있다. 물론 카피했으니 es는 찍어보지 않아도 같은 세트임을 동시에 알수있고 말이다.^^ 그 다음에 noneOf( ) 메소드는 세트를 비우라는 것이다. 그래서 명령주고 찍어보니 세트가 제대로 텅 비게 되었다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
그럼 이제 다음 단락으로 넘어가 보겠다. of( ) 메소드는 해당 요소를 찾아서 넣으라는 것이다. 수요일과 금요일만 넣으라고 했으니 그것만 찍힌 것인데 당연하지만 여러분이 지정하는만큼 자유자재로 넣을수 있다. 그리고 열거형의 이름인 Day는 대문자나 소문자를 다르게 인식하므로 쓸때 주의하기 바란다. 다음은 complementOf( ) 라는 메소드인데 이건 괄호안의 요소들만 빼고 세트를 구성하라는 것이다. 예제에서는 es 즉 수요일과 금요일을 빼라고 하였으니 결과처럼 나머지 요일들만 출력된다. 그리고 마지막으로 range( ) 메소드를 이용하면 세트의 구간을 정해서 출력할수 있다. 어디부터 어디까지... 예제에서는 화요일부터 금요일까지 찍으라고 하였으니 화요일, 수요일, 목요일, 금요일 이렇게 구간에 해당하는 세트 요소들을 전부 출력하는 것이다. 만약 range( ) 메소드안에 반대로 금요일과 화요일 이렇게 순서를 달리해서 집어넣으면 어떻게 될까? ㅎㅎ 과연 이것도 받아들이고 정상적으로 작동할까? 이에 대한 해답은 여러분이 직접 알아내기 바란다.&lt;br /&gt;
&lt;br /&gt;
EnumSet의 명령들을 접하면서 한가지 의문이 드는 이들이 있었을 것이다. 왜 객체생성을 안하징? ㅎㅎ EnumSet의 메소드들이 static으로 구성되어 있어 이렇게 빠르고 손쉽게 접근이 가능한 것이다.^^ 본 예제를 통해서 EnumSet의 진수(?)를 맛보았길 바라면서 오늘로서 Set에 관련된 클래스들은 이 정도로 마무리하고 이제부터는 Map 인터페이스에 관련된 클래스들을 다루면서 컬렉션에 대해 공부해보는 시간을 계속적으로 갖도록 하겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/4703051678657486014/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/11/enumset.html#comment-form' title='5개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4703051678657486014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4703051678657486014'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/11/enumset.html' title='자바의 열거셋(EnumSet)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjbYN3LC81KHiHOjqTj8YmLq_a_OMXSclTEuS8uL06vAMcmYsW_AvcU6XCNyxJ4utd5qZOyaD7cH4DJAS_nOjfCAGY-xvWWXh151Xoew7IV2IxP-45qpvt6SN3T47vIrHTrUn3zNxobdOr/s72-c/t115.jpg" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-3891741982184657954</id><published>2012-11-02T23:46:00.004-07:00</published><updated>2012-11-04T19:28:07.185-08:00</updated><title type='text'>자바의 트리셋(TreeSet)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWN9K4RweM9aoz0fB-d-7lMUaoXsfUol5CwuGV8MT8SmSY2Jz4j045-L_vz_PVI87KjFkkBGN3Afv5krGOGJwNUn0QSS2qjyrKqW8RhbZV3WGe8ao0eW-SwfOp4CInuoooYSoegCojHp_U/s1600/treeset.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWN9K4RweM9aoz0fB-d-7lMUaoXsfUol5CwuGV8MT8SmSY2Jz4j045-L_vz_PVI87KjFkkBGN3Afv5krGOGJwNUn0QSS2qjyrKqW8RhbZV3WGe8ao0eW-SwfOp4CInuoooYSoegCojHp_U/s400/treeset.jpg&quot; width=&quot;307&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
java.util 패키지에 있는 트리셋(TreeSet)에 대해서 공부할텐데 강이의 자바강좌를 저번 시간에 들은 이들은 예고를 살짝(?) 했으니 아마도 오늘 내용에 대해서 벌써 알고 있을 것이라 생각한다. 그렇다! 요소들을 숫자든 문자든 자연적인 순서의 오름차순으로 정렬하는 것인데 그럴때 이용하는 클래스가 바로 트리셋이다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ2s8KczYKXXIz-n-l86wzC16PCkkFV2SoQpsOEV6-5BoFztik9psuaNhUhtFHGAoEYs7HGuYNWkpy-2E2Nmiz-ZhRrJEGB2oUW56lNCwFC6kXD-wL_t02op5Wme6gRaHPsCg34XX09hXE/s1600/Collections.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;305&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ2s8KczYKXXIz-n-l86wzC16PCkkFV2SoQpsOEV6-5BoFztik9psuaNhUhtFHGAoEYs7HGuYNWkpy-2E2Nmiz-ZhRrJEGB2oUW56lNCwFC6kXD-wL_t02op5Wme6gRaHPsCg34XX09hXE/s400/Collections.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
오늘 예제는 재탕(?)을 하였다. 저번 예제를 그냥 트리셋으로만 바꿔서 어떻게 결과가 달라지는지 아주 단순히 비교할수 있도록 하였다. 여러분이 이전 강좌를 기억하리라 기대 아닌 기대(?)를 하면서 예제와 그에 따른 결과를 보도록 하자.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj_Q1XtiwZxuuA0JJAW4SFfIa_iaSeASrSZize8dUyeEBN12gg7v1oMZx7gf3HX8lad_4HX0RvXE6kg_O4PfRbl8HvgA5F7sfg8qHAu1-VAmT-aAC8DUMZM0156n9TaKJs1kDNs7XnRwnC/s1600/t113.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj_Q1XtiwZxuuA0JJAW4SFfIa_iaSeASrSZize8dUyeEBN12gg7v1oMZx7gf3HX8lad_4HX0RvXE6kg_O4PfRbl8HvgA5F7sfg8qHAu1-VAmT-aAC8DUMZM0156n9TaKJs1kDNs7XnRwnC/s400/t113.jpg&quot; width=&quot;276&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
TreeSet={2,1,2,100,9,86}&lt;br /&gt;
ts size( ): 5&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
ts Number: 1&lt;br /&gt;
ts Number: 2&lt;br /&gt;
ts Number: 9&lt;br /&gt;
ts Number: 86&lt;br /&gt;
ts Number: 100&lt;br /&gt;
&lt;br /&gt;
TreeSet2={A,B,C,A,E,D}&lt;br /&gt;
ts2 size( ): 5&lt;br /&gt;
=== 강이의 자바강좌 ===&lt;br /&gt;
ts2 Alphabet: A&lt;br /&gt;
ts2 Alphabet: B&lt;br /&gt;
ts2 Alphabet: C&lt;br /&gt;
ts2 Alphabet: D&lt;br /&gt;
ts2 Alphabet: E&lt;br /&gt;
&lt;br /&gt;
예제 샘플은 저번이랑 똑같다. 결과에서 보다시피 트리셋 클래스도 해쉬셋처럼 중복은 허용하지 않는다. 하지만 트리셋 클래스를 이용하면 이렇게 쉽게 자연적인 순서대로의 정렬이 가능하다. 그런데 예제를 보면 필자가 HashSet을 TreeSet으로 바꾼거 이외에는 없는데 저번 예제의 해쉬셋을 건드리지 않고 그냥 해쉬셋 요소들을 트리셋에 넣을순 없을까...? 이렇게 속(?)으로 생각하고 있었다면 정말 자앙(?)하다. 잠시 라면이라도 끓여먹고 와라~ ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
해당 컬렉션내의 모든 요소들을 트리세트(크리쑤마쑤 트리아님.ㅎㅎ)에 넣을수 있는데 이럴때 이용하는 것이 Set 인터페이스에서 받아 구현한 addAll( )이라는 메소드이다. 예제를 기준으로 해쉬셋 요소들을 트리셋으로 옮기려면 숫자의 경우&amp;nbsp;ts.addAll(hs)를 쓰면 되고 문자의 경우 ts2.addAll(hs2)를 쓰면 된다.^^&lt;br /&gt;
&lt;br /&gt;
해쉬셋을 이미 통달(?)한 여러분이기에 쉽게 기억하라는 뜻에서 예제를 저번과 같게 하였으니 오늘 내용이 머리속에 제대로 박혔으리라 기대한다.ㅎㅎ 필자가 예제에 직접 실행해보지 않은 부분에 대해서는 관련 요소들을 트리셋으로 옮겨가면서 여러분이 직접 소스를 만들어서 해보기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
그럼 여기서 한단계 더 나아가서 생각해 보기로 하겠다. 자연적인 순서(natural ordering)는 TreeSet에서 이렇게 바로 구할수 있겠지만 아예 반대로.. 거꾸로 음.. 그래 역순으로 정렬할순 없을까라는 의구심(?)이 들것이다. 이런 요소셋을 그냥 역순으로 정렬하는거 정도는 이제 손쉽게 가능해졌지만 아직까지 모르는 이들이 많을 것이다.ㅎㅎ 그것은 자바 6부터 새로나온 부분이기 때문에 관심있게 다시 보지 않았으면 아직까지 생노가다(?) 작업을 하고 있을텐데 오늘 강이의 자바강좌를 통해 이런 노역(?)에서 해방되기를 바라면서 계속해 보겠다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_g8A7kD2hfEymNiivihCwLw_tfiMzJGmMU7XCzqgZ__024RGuAsi12Q5xmC16NKkL67e9XXjcxZPYIgIAhS5w35tmvURkTq361dZMnzDBwAnpxpSKVLc9fD6GXLCo08VgK0htJT2F8ggY/s1600/navigableset.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_g8A7kD2hfEymNiivihCwLw_tfiMzJGmMU7XCzqgZ__024RGuAsi12Q5xmC16NKkL67e9XXjcxZPYIgIAhS5w35tmvURkTq361dZMnzDBwAnpxpSKVLc9fD6GXLCo08VgK0htJT2F8ggY/s400/navigableset.jpg&quot; width=&quot;246&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
이제부터는 자바6에서 등장한 신기술(?)을 살펴보도록 하겠다. 자바 6에서는 NavigableSet 인터페이스가 위처럼 추가되었는데 알아두면 관련 요소들을 다루는데 많은 도움이 될것이니 한번 살펴보기 바란다. 여기서는 그 중에서도 몇가지만 압축해서 예제를 선보이도록 하겠다. 빠른 이해를 위해 기존 예제를 토대로 새로운 기능을 실험하여 어려운건 없을테니 긴장풀고 편안하게 아래의 예제를 보기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi828eLzcU6ssUKfHqNpgD9yvXDnK8DToi4TPQfnXGv6nHJIRu3YHA34u9l17mKCFEoorjyqj-Xi_JOkN2kczKGrRz51kKeqQNsuTVS5KgNaQ-LX_GVtEMhFWf-dSOF9uNGvqA3Vcd-yVi7/s1600/t114.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi828eLzcU6ssUKfHqNpgD9yvXDnK8DToi4TPQfnXGv6nHJIRu3YHA34u9l17mKCFEoorjyqj-Xi_JOkN2kczKGrRz51kKeqQNsuTVS5KgNaQ-LX_GVtEMhFWf-dSOF9uNGvqA3Vcd-yVi7/s400/t114.jpg&quot; width=&quot;266&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
내용이 길어보이지만 절반은 기존 예제이므로 아래의 절반만 이해하면 되니 잠시 걱정은 접어두기 바라고 결과를 보면서 해설을 따라오기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
TreeSet={2,1,2,100,9,86}&lt;br /&gt;
ts size( ): 5&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
ts Number: 1&lt;br /&gt;
ts Number: 2&lt;br /&gt;
ts Number: 9&lt;br /&gt;
ts Number: 86&lt;br /&gt;
ts Number: 100&lt;br /&gt;
내림차순 반복자를 이용해서 거꾸로 출력&lt;br /&gt;
ts Number: 100&lt;br /&gt;
ts Number: 86&lt;br /&gt;
ts Number: 9&lt;br /&gt;
ts Number: 2&lt;br /&gt;
ts Number: 1&lt;br /&gt;
요소세트 자체를 그냥 거꾸로 출력&lt;br /&gt;
원본: [1, 2, 9, 86, 100]&lt;br /&gt;
결과: [100, 86, 9, 2, 1]&lt;br /&gt;
=== http://alecture.blogspot.com ===&lt;br /&gt;
[1, 2, 9, 86, 100]의 원본 ts에서 원하는 요소 찾기&lt;br /&gt;
ts.ceiling(86): 86&lt;br /&gt;
ts.floor(9): 9&lt;br /&gt;
ts.higher(86): 100&lt;br /&gt;
ts.lower(9): 2&lt;br /&gt;
ts.first( ): 1&lt;br /&gt;
ts.last( ): 100&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
[100, 86, 9, 2, 1]의 결과 ns에서 원하는 요소 찾기&lt;br /&gt;
ns.ceiling(86): 86&lt;br /&gt;
ns.floor(9): 9&lt;br /&gt;
ns.higher(86): 9&lt;br /&gt;
ns.lower(9): 86&lt;br /&gt;
ns.first( ): 100&lt;br /&gt;
ns.last( ): 1&lt;br /&gt;
&lt;br /&gt;
여기서 우리가 보기 시작해야될 부분은 &quot;내림차순 반복자를 이용해서 거꾸로 출력&quot;한 곳이다. 말그대로 iterator를 통해서 출력하는데 이번엔 숫자가 역순으로 찍히는걸 볼수 있을 것이다. 이게 단 하나의 메소드만 바꿔주면 끝난다. 예제처럼 기존에 쓰던 iterator( ) 대신에 descendingIterator( ) 메소드만 넘겨주면 다른건 터치할 필요도 없이 원터치로 끝나버린다. 기가막히지 않는가? 거기다가 이것도 귀찮다 싶으면 아까전에 언급한 NavigableSet을 통해 관련셋을 바로 역순으로 정렬할수도 있다. 해당명령은 아래와 같다.&lt;br /&gt;
NavigableSet ns = ts.descendingSet( );&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRLkknqD0IlovuKJOhUex_YCmA0epb_NGZfL208_eWbfTV-n-dkle59El4BSp1FQWDN3UcDQoGbBxq6DAYcx1OKPF6DAiqFsUDspIOwaS0L-Iq1VHsEWzozT2H74eakItUVn8hBhcQbDZ-/s1600/javagenerics.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;268&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRLkknqD0IlovuKJOhUex_YCmA0epb_NGZfL208_eWbfTV-n-dkle59El4BSp1FQWDN3UcDQoGbBxq6DAYcx1OKPF6DAiqFsUDspIOwaS0L-Iq1VHsEWzozT2H74eakItUVn8hBhcQbDZ-/s400/javagenerics.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
예제를 직접 실행하면서 보면 바로 이해가 갈것이다. 그밖에도 새로 추가된 ceiling, floor등의 메소드들이 있어서 어떤 것인지도 보여줄겸 살짝 예제에 추가시켜보았다. first나 last 메소드는 세트에서 가장 첫번째 요소나 마지막 요소를 찾을때 쓰는 메소드인데 이건 새로운건 아니지만 종종 쓰이니 그것도 하는김에 넣어보았다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
원하는 요소찾기에서 보면 ts랑 ns의 결과값들이 다른걸 볼수 있는데 그 차이는 어떤 세트가 기준 세트로 작동했는지에 따라서 동작이 달라지는데 그 의미를 되새겨보라고 만들어 놓은 것이다. ts는 정순이고 ns는 역순인데 그 기준 세트에 따라서 결과값이 달라지니 관심있게 살펴보기 바란다. 예제에 있는 메소드 기능들을 간략하게 설명하면 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
ceiling 메소드나 floor 메소드는 세트에 넣어준 값과 같은 값이 있을시 그 해당값을 리턴한다.&amp;nbsp;허나 higher 메소드나 lower 메소드는 말그대로 -er이 붙었으니 같은 값은 무시하고 그 다음에 관련된 해당값을 리턴한다. 물론 모두다 관련값이 없을시엔 null을 리턴한다. 쉽게 생각하는 방법은 세트에 넣어준 값의 위치를 기준으로 위(ceiling/higher)인지 아래(floor/lower)인지 판단하면 된다. 예를 들어 메소드에 5를 넣어준다고 가정하면 ts 세트일 경우 숫자 2 뒤에 들어간다 생각해야되고 ns 세트일 경우 역순이니까 숫자 2 앞에 들어간다 생각하고 답을 유추하면 된다. 그러면 ts 세트의 경우 9와 2가 나올것이고 ns 세트의 경우 2와 9가 나올것이다.ㅎㅎ 조금 헤깔릴지 모르겠지만 숫자 바꿔가면서 놀다보면 감이 잡힐 것이다. 이 정도만 알고 있으면 이해하는데 큰 문제는 없으리라 본다.^^&lt;br /&gt;
&lt;br /&gt;
이로서 TreeSet을 공부해보는 시간을 가져보았다. 예제로 응용해 보고 싶은 부분들이 지금쯤 계속해서 생겨나고 있을것이라 생각한다. 그 욕망들(?)을 억누르지 말고 그대로 여러분의 자바머신에서 마음껏 뿜어내기 바라면서 오늘은 이만 마치겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/3891741982184657954/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/11/treeset.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/3891741982184657954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/3891741982184657954'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/11/treeset.html' title='자바의 트리셋(TreeSet)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWN9K4RweM9aoz0fB-d-7lMUaoXsfUol5CwuGV8MT8SmSY2Jz4j045-L_vz_PVI87KjFkkBGN3Afv5krGOGJwNUn0QSS2qjyrKqW8RhbZV3WGe8ao0eW-SwfOp4CInuoooYSoegCojHp_U/s72-c/treeset.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-9095345912316158617</id><published>2012-10-31T20:20:00.000-07:00</published><updated>2012-11-06T13:25:06.029-08:00</updated><title type='text'>자바의 해쉬셋(HashSet)과 연결해쉬셋(LinkedHashSet)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXfCyMUio-RxZhdMkWIzc5LCc4F-vaxywXfJ22auOn3SLUBn1pSTyQ7G7S3igALWzzNUz5vG6gPBjQxx9HyzT1_j3-ZyCQ2se6lBeNW138kdKIFyjPhuWEU1nBr99CeQfrJSsMdVlx8Ehc/s1600/hashset.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXfCyMUio-RxZhdMkWIzc5LCc4F-vaxywXfJ22auOn3SLUBn1pSTyQ7G7S3igALWzzNUz5vG6gPBjQxx9HyzT1_j3-ZyCQ2se6lBeNW138kdKIFyjPhuWEU1nBr99CeQfrJSsMdVlx8Ehc/s400/hashset.JPG&quot; width=&quot;190&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
중복을 용납하지 않고 순서도 제멋대로인 까칠(?)한 성격의 컬렉션인 자바의 해쉬셋(HashSet)과 그래도 넣은 순서는 기억하는 연결해쉬셋(LinkedHashSet)에 대해서 살펴보는 시간을 갖도록 하겠다.^^ 계보도는 그림대로고 해쉬셋은 이름에서 알수 있듯이 Set 인터페이스를 구현하고 있다. 자세히보면 도형들의 색깔이 다른데 인터페이스와 클래스를 구분한 것이고 맨위의 Iterable은 자바의 중심인 java.lang 팩키지에 있는 인터페이스이니 궁금하면 찾아보기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8r0En5C_ZjuyvylLKvmA9Xsf_lFqiDbUlWCmQIv0dZZjUtYYJM67oTFyJkLfyJpg9nkUkGD1BAhPc7o-ZJn1SaCbr3Sf3AmRPSa1rw2s1T1B66LNy93txnEd2UuwcEf1w39b0uOV1KbR_/s1600/images.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8r0En5C_ZjuyvylLKvmA9Xsf_lFqiDbUlWCmQIv0dZZjUtYYJM67oTFyJkLfyJpg9nkUkGD1BAhPc7o-ZJn1SaCbr3Sf3AmRPSa1rw2s1T1B66LNy93txnEd2UuwcEf1w39b0uOV1KbR_/s400/images.jpg&quot; width=&quot;286&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
각각의 인터페이스나 클래스가 어느 팩키지에 속해있는지 궁금해하는 이들을 위해 살펴보라고 올린 그림이다. 아님 말구..ㅎㅎ 아주 간단한 예제를 통해 어떤 경우에 해시셋을 쓸수 있는지 살펴볼 것이다. 금방 끝나니 잠시만 시선을 모아주기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCKwVLqyZFnT6H04Z4XuUco35IOoBMS8-x-kma3wMFWF0wK2Jmjy8FHeK747QpW33lICTBjs1-49qudLUZTASRtvrWPgkaX6oMnAcz0JEnZP15Xh50xjb1AEyyViXdohkNlIDM69Z5KcNh/s1600/set.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCKwVLqyZFnT6H04Z4XuUco35IOoBMS8-x-kma3wMFWF0wK2Jmjy8FHeK747QpW33lICTBjs1-49qudLUZTASRtvrWPgkaX6oMnAcz0JEnZP15Xh50xjb1AEyyViXdohkNlIDM69Z5KcNh/s400/set.jpg&quot; width=&quot;271&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
다른건 기억하지 못하더라도 오늘 강의에서 딱 하나는 기억하기 바란다. HashSet은 중복을 허용하지 않고 들어간 순서도 제멋대로다. 오케 버뤼~ 거기까지..ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
해쉬셋은 이렇게 중복을 허용하지 않고 또한 순서대로 값을 다루지도 않기 때문에 임의의 숫자나 문자열을 가지고 플레이할 대상에 쓰인다. 그 예로 로또같은 복권을 들수 있지 않을까? 이번주는 당첨되려나..ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
예제는 크게 각각 두가지 파트로 구성하였다. 첫번째는 해쉬셋 hs 변수를 이용해서 숫자를 넣고 출력해보는 예제이고 두번째는 해쉬셋 hs2 변수를 이용해서 문자를 넣고 출력해보는 예제이다. 그리고 또한 첫번째와 두번째에 연결해쉬셋(LinkedHashSet)을 적용했다. 쉽게 구별하라고 연결해쉬셋의 변수는 기존 해쉬셋 변수앞에다가 영문자 &quot;l&quot;만 추가하였으니 알아보기 쉬울 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsQmmRvkpbYmqw1VLGT7ojztNIFTudWqR8jYag-WJl__A06qWrMD-nN07OPqPvvonjitLkNUStYAZq4jiHM4bQ0MDBpCWDSHTfTEJQLwSadmV4LA3YxEMpdRvrbW0QjsTBib6aF8i7sJzf/s1600/fig2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;336&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsQmmRvkpbYmqw1VLGT7ojztNIFTudWqR8jYag-WJl__A06qWrMD-nN07OPqPvvonjitLkNUStYAZq4jiHM4bQ0MDBpCWDSHTfTEJQLwSadmV4LA3YxEMpdRvrbW0QjsTBib6aF8i7sJzf/s400/fig2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
연결해쉬셋은 위의 그림이나 이름에서 알수있듯이 Set 인터페이스를 계승함과 동시에 기존 해쉬셋을 보완하는 역활을 한다. 더 자세히 설명하자면 자바4에서 등장한 연결해쉬셋(LinkedHashSet)은 해쉬셋처럼 중복은 허용하지 않지만 해쉬셋과는 다르게 요소를 넣은 순서는 기억해서 출력한다는 점이다.ㅎㅎ 무슨 얘기인지 바로바로 캐취가 안된다면 아래의 예제를 보면 다 이해가 될것이니 이제 본격적으로 예제를 들여다 보자.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx1u2FdkMDiSt7kayKV4Zj-m1ENLMo4S7SIoXgkR-nfIbEy7izYC2uxfeQ_OIblToDNyXsvyIZmVbB3AEiGARjKWszg6XzYBHuWcs7HcO_RnL5M4zVOSQghu9VRhcwDZGIjyL0QpuG8kD8/s1600/t112.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx1u2FdkMDiSt7kayKV4Zj-m1ENLMo4S7SIoXgkR-nfIbEy7izYC2uxfeQ_OIblToDNyXsvyIZmVbB3AEiGARjKWszg6XzYBHuWcs7HcO_RnL5M4zVOSQghu9VRhcwDZGIjyL0QpuG8kD8/s400/t112.jpg&quot; width=&quot;243&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
여러분이 컬렉션의 리스트를 통해 열공(?)해 왔을터이니 Set도 그리 어렵지 않으리라 생각한다. 예제를 실행해보면 바로 내용을 알수 있도록 구성하였으니 막힘이 없을 것이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
첫번째 구문은 숫자가 무작위로 되어있는 셋인데 여기에 중복되는 숫자들이 있다. 이것들을 넣었을때 어떻게 해쉬셋과 연결해쉬셋이 만들어지는지 보는 것이다. 두번째 구문은 숫자 대신 문자를 넣은 예제이고 역시 중복되는 알파벳을 넣었을때 어떻게 해쉬셋과 연결해쉬셋이 만들어지는지 보라고 만들었다. size( ) 메소드는 셋에 들어있는 요소들의 갯수를 보라고 만든것인데 원래셋의 요소갯수보다 작아질 것이다. 중복되는 숫자나 문자는 셋에서 제외될테니 말이다. 여기서 셋(Set)에 들어있는 요소갯수를 우리는 영어로&amp;nbsp;cardinality라고 한다. 수학이나 데이터를 다룰때 종종 나오는 단어인데 이걸 유창(?)하게 영어로 한번더 해설하자면 # of elements of the set 되시겠다. 갑자기 생각나서 써봤다. 알아두면 써먹을데가 있을 것이다.ㅎㅎ 이제 예제의&amp;nbsp;결과를 보자.^^&lt;br /&gt;
&lt;br /&gt;
HashSet and LinkedHashSet={2,1,2,100,9,86}&lt;br /&gt;
hs size( ): 5&lt;br /&gt;
lhs size( ): 5&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
hs Number: 1&lt;br /&gt;
hs Number: 100&lt;br /&gt;
hs Number: 2&lt;br /&gt;
hs Number: 86&lt;br /&gt;
hs Number: 9&lt;br /&gt;
=== http://alecture.blogspot.com ===&lt;br /&gt;
lhs Number: 2&lt;br /&gt;
lhs Number: 1&lt;br /&gt;
lhs Number: 100&lt;br /&gt;
lhs Number: 9&lt;br /&gt;
lhs Number: 86&lt;br /&gt;
&lt;br /&gt;
HashSet2 and LinkedHashSet2={A,B,C,A,E,D}&lt;br /&gt;
hs2 size( ): 5&lt;br /&gt;
lhs2 size( ): 5&lt;br /&gt;
=== 강이의 자바강좌 ===&lt;br /&gt;
hs2 Alphabet: D&lt;br /&gt;
hs2 Alphabet: E&lt;br /&gt;
hs2 Alphabet: A&lt;br /&gt;
hs2 Alphabet: B&lt;br /&gt;
hs2 Alphabet: C&lt;br /&gt;
=== http://alecture.blogspot.com ===&lt;br /&gt;
lhs2 Alphabet: A&lt;br /&gt;
lhs2 Alphabet: B&lt;br /&gt;
lhs2 Alphabet: C&lt;br /&gt;
lhs2 Alphabet: E&lt;br /&gt;
lhs2 Alphabet: D&lt;br /&gt;
&lt;br /&gt;
결과만 봐도 예제 내용을 알수 있도록 정성아닌 정성(?)을 들였다.ㅎㅎ 결과의 처음 출력문은 해당요소들을 차례대로 관련 해쉬셋에 넣은걸 보여주는 것이고 아니다 다를까 size( ) 메소드를 이용해 체크해보니 요소갯수가 하나씩 줄었는데 결과에서 보면 숫자 2와 알파벳 A를 넣었을때 반응이 없다는걸 볼수 있을 것이다. 해쉬셋(HashSet)과 연결해쉬셋(LinkedHashSet) 모두 중복을 허용하지 않으니까 말이다.&lt;br /&gt;
&lt;br /&gt;
그럼 여기서 조금 어려운 질문을 한가지 던져보겠다.ㅎㅎ 그냥 생각만 해보기 바란다. 지금 해쉬셋에 숫자 2가 두개 들어있는데 그중 하나는 2 대신에 2.00 이 들어있다고 치자. 그럼 2와 2,00을 해쉬셋에서는 같다고 취급할까 아니면 다르다고 취급할까?ㅎㅎ 재밌게도 해쉬셋에서는 이것을 다르다고 취급하여 중복을 혀용한다. 물론 우리가 상식적인 관점에서 볼때는 말이 안되더라도 말이다.^^&lt;br /&gt;
&lt;br /&gt;
해쉬셋(HashSet)에서 내부적으로 중복여부를 검사할때 기본적으로 내재되어 있는 equal( ) 메소드를 통해 요소가 같은지를 체크하는데 같으면 true, 다르면 false를 돌려준다. 그런데 2와 2.00의 경우 equal( ) 메소드는 이것을 데이터형이 다를경우 다르다고 인식하기 때문에 false를 돌려준다. 하나는 int형이고 하나는 double형이고 말이다. 그래서 중복을 허용하는 이상한 사태(?)가 벌어진다. 후에 배울 트리셋(TreeSet)에서는 내부적으로 중복여부를 검사할때 기본적으로 equal( ) 메소드 대신에 compareTo( )라는 메소드를 이용한다. 이 메소드는 값의 같은지 다른지 여부에 따라 정수 -1, 0, 1을 리턴하는데 이 경우에는 0을 돌려준다. 즉 두값이 같다는 의미의 0을 돌려준다. 따라서 중복을 허용하지 않는다.^^&lt;br /&gt;
&lt;br /&gt;
방금 중복여부 검사에 대해서 언급한 부분은 대부분 이해가 되지 않을 것인데 그건 너무나 당연하다. 관련 메소드에 대해서 설명한 적이 없는데 어떻게 이해를 한단 말인가? 둘다 java.lang 패키지에 들어있어 기본적으로 필요할때 자동으로 내부에서 사용되고 있는 부분인데 갑자기 이를 짚고 넘어가는 것은 나중에 여러분의 이해를 돕기위한 포석(?)으로 삼기 위함이니 그런가보다 하고 그냥 넘어가기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
그리고 해쉬셋의 경우 값 순서들도 무작위로 출력되는데 반해 연결해쉬셋은 넣은 값 순서들이 같게 출력된다는 것을 알수 있다. 그런데 여기서 한가지 의문이 생겨나는 이들이 있을 것이다. 그럼 숫자나 알파벳을 넣은 순서가 아닌 자연적으로 커지는 그냥 일반적인 순서대로 정렬하는 방법은 없을까? ㅎㅎ 물론 있다. 그건 지면할애상 다음 시간에 하려고 한다. 좀만 기다려라.ㅎㅎ HashSet과 LinkedHashSet이 이렇게 작동된다는걸 필자가 온몸으로 보여줬으니 여러분도 성의를 생각해 답만 보지말고 직접 프로그램을 만들어서 이리저리 돌려보며 해쉬셋과 연결해쉬셋에 대해서 파고들기 바란다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/9095345912316158617/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/10/hashset-linkedhashset.html#comment-form' title='4개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/9095345912316158617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/9095345912316158617'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/10/hashset-linkedhashset.html' title='자바의 해쉬셋(HashSet)과 연결해쉬셋(LinkedHashSet)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXfCyMUio-RxZhdMkWIzc5LCc4F-vaxywXfJ22auOn3SLUBn1pSTyQ7G7S3igALWzzNUz5vG6gPBjQxx9HyzT1_j3-ZyCQ2se6lBeNW138kdKIFyjPhuWEU1nBr99CeQfrJSsMdVlx8Ehc/s72-c/hashset.JPG" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-2429180294032246184</id><published>2012-10-29T16:33:00.000-07:00</published><updated>2012-10-29T22:00:15.092-07:00</updated><title type='text'>자바의 스택(Stack)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfI0JO1iFq7rEiM-005y8czPspyGS0Fnwc1CRWBjG9E96PU54uFK2z6Jy9NoF59pNF0XOZ0xsywW4dq24U-60mGg7UR_aepFVx-KeROscV3J_Bytzz7WVj2a33Ll839DdZIdix8sQs4_4/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;287&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfI0JO1iFq7rEiM-005y8czPspyGS0Fnwc1CRWBjG9E96PU54uFK2z6Jy9NoF59pNF0XOZ0xsywW4dq24U-60mGg7UR_aepFVx-KeROscV3J_Bytzz7WVj2a33Ll839DdZIdix8sQs4_4/s400/1.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
java.util 팩키지에 있는 자바의 스택(Stack)에 대해서 공부해 보기로 하자. 스텍은 벡터를 상속받고 있으며 기본적으로 5가지의 기능과 함께 벡터를 스택으로 대체해 쓰는게 가능하다. 스택은 LIFO(Last-In-First-Out)로 표시하곤 하는데 그림에서 보다시피 나중에 들어간 아이템이 가장 먼저 나온다는 원리이다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXNkizhMqnx3O70U8T1ubKJGnoSRBZ0NTx7rDY0tnM22h6d-aoIcGWF0AvNfeoJCiyj30_v4UL88lyZXqq-z2Lf0yQEGP2Aqs_wJGASf2l7IYfupC1Par3Cq544jHSbupEq83FQseYLy9i/s1600/s.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;207&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXNkizhMqnx3O70U8T1ubKJGnoSRBZ0NTx7rDY0tnM22h6d-aoIcGWF0AvNfeoJCiyj30_v4UL88lyZXqq-z2Lf0yQEGP2Aqs_wJGASf2l7IYfupC1Par3Cq544jHSbupEq83FQseYLy9i/s400/s.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
스택은 방금 언급했다시피 총 5가지의 메소드를 지원한다. 몇개 안되니 아래에 써보기로 하겠다.&lt;br /&gt;
&lt;br /&gt;
boolean empty( )&lt;br /&gt;
int search(Object o)&lt;br /&gt;
E push( E item)&lt;br /&gt;
E pop( )&lt;br /&gt;
E peek( )&lt;br /&gt;
&lt;br /&gt;
위의 기능들을 한문장으로 정리하자면 비어있는지 확인하고 안에 특정 요소가 있는지 살펴보고 요소를 넣고 빼고 뭐가 있는지 살짝 보는게 위의 5가지 메소드들이 하는 일이다.^^ 예제를 보면서 어떻게 작동되는지 실험해 보기로 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7MSzZ1aUqhyb0I9j9inaUxcvW0PeO3UOjE761gF2PZelIEr0UekdOOXRGSkf9NhVO_ypzVetvjEuzQX9x7p8d58f-LM2nAmXrp3VR7SfRT8TANIiueqs9Qld36yH9C2ucVLY-JS8OpQvS/s1600/2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;335&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7MSzZ1aUqhyb0I9j9inaUxcvW0PeO3UOjE761gF2PZelIEr0UekdOOXRGSkf9NhVO_ypzVetvjEuzQX9x7p8d58f-LM2nAmXrp3VR7SfRT8TANIiueqs9Qld36yH9C2ucVLY-JS8OpQvS/s400/2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
오늘 코딩할 예제는 위와 같다. 기본적으로 5개의 요소들을 집어넣은 상태에서 pop( ) 메소드를 이용해 가장 나중에 넣은 요소 12를 꺼내고 다음에 새로운 요소 83을 넣는 예제이다. 그림만 봐도 이해가 될것이다. 스택을 사용할때는 위와같은 형태의 구조를 떠올리면 쓰기 쉬울 것이다.^^ 그럼 예제 코드를 보기로 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjzlYiMwIxBxdm-aJVPmdH5GlSyN4OeN-JBu-pouHT34KJCowsjXiEKOKmEdaDeDtKfycaoJDHCkCpdcBlM4YFyDWWlh3biKi15oJTkYdtv_ZFcR3we6NK6UBpc641cfOY-sbBREEqdMRJ/s1600/t111.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;331&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjzlYiMwIxBxdm-aJVPmdH5GlSyN4OeN-JBu-pouHT34KJCowsjXiEKOKmEdaDeDtKfycaoJDHCkCpdcBlM4YFyDWWlh3biKi15oJTkYdtv_ZFcR3we6NK6UBpc641cfOY-sbBREEqdMRJ/s400/t111.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
true&lt;br /&gt;
false&lt;br /&gt;
[17, 5, 123, 25, 12]&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
12&lt;br /&gt;
[17, 5, 123, 25]&lt;br /&gt;
[17, 5, 123, 25, 83]&lt;br /&gt;
4&lt;br /&gt;
=== 강이의 자바강좌 ===&lt;br /&gt;
&lt;br /&gt;
스택의 5가지 기능을 모두 넣어 예제를 구성하였으니 본 예제 하나로 스택의 기능들이 어떤게 있는지 다 알아볼수 있을 것이다.ㅎㅎ 많은 이들이 스택에 관련된 질문중에서 자주 틀리는 부분이 한가지 있다. 오늘 그 중요한 맥을 필자가 짚어줄 것이니 끝까지 예제에 집중해주기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
예제를 보면 그림처럼 스택에다가 관련 숫자들 5개를 for 구문을 통해 처음에 넣는다. 넣기전에 empty( ) 메소드를 이용해서 스택이 비어있는지 물어보니까 비어있어서 true라고 찍힌 것이다. 숫자들을 다 넣은후에 다시 물어봤더니 스택이 이제 차 있으니까 false라고 찍혔다. 그리고 관련 요소들을 출력하라고 하니 스택에 있는 요소들을 쭈욱 찍은 것이다. 화면상에는 결과에서처럼 옆으로 나열되어서 숫자들이 찍히지만 여러분은 위의 예제 그림처럼 숫자들이 들어있다고 생각하기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
그 다음에 peek( ) 메소드를 이용해 가장 위에 있는 요소를 살짝 엿보고 찍으라고만 하니 12가 찍힌 것이고 다음에 pop( ) 메소드를 실행하였다. 이 메소드가 하는 일은 스택에서 맨 상위 요소를 하나 꺼내는 것이다. 그래서 요소 12가 제거되고 난 후의 요소들 4개가 찍힌 것이고 push( ) 메소드를 이용해 83을 넣으니 스택에 총 5개의 요소들이 찍혔다.ㅎㅎ 여기까지는 여러분이 생각하는 그대로일거다. 오늘의 하이라이트인 마지막 출력 부분에 4라는 숫자가 찍혔다. 이 부분에서 막히는 이들이 많을 것인데 스택에서 가장 헤깔려하는 부분이므로 확실히 알고 넘어가기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
search( ) 메소드를 이용해서 관련요소 5를 찾으라고 했는데 아마 대다수가 1이 찍힐거라고 예상했을 것이다. 그것도 아니라면 2가 찍혀야 정답의 근사치가 아닐까 생각할텐데 이런 부분 때문에 특히 스택을 예제의 그림처럼 항시 생각해야 편한 것이다. 스택에서는 해당 요소를 찾으라고 검색할 경우 스택의 위쪽에서부터 카운트를 한다. 카운트도 가장 최상위의 아이템을 1로 잡고 카운트한다. 따라서 우리가 찾는 요소 5 위에 세개의 요소가 더 있으니 맨 위를 1로 잡고 아래로 세어 나가다보면 요소 5가 있는 위치가 4가 됨을 알수 있을 것이다. 이렇게 1부터 기본적으로 세어나간다고 해서 이를&amp;nbsp;1-based position이라고 표현한다.^^&lt;br /&gt;
&lt;br /&gt;
자바뿐만 아니라 Data Structure에 관계된 프로그래밍을 공부할때 항상 빠지지 않고 등장하는 것중에 하나가 스택이니 어떤 것인지 머리속에 정리해 두기 바라면서 스택 강의는 여기서 마치도록 하겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/2429180294032246184/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/10/stack.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/2429180294032246184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/2429180294032246184'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/10/stack.html' title='자바의 스택(Stack)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfI0JO1iFq7rEiM-005y8czPspyGS0Fnwc1CRWBjG9E96PU54uFK2z6Jy9NoF59pNF0XOZ0xsywW4dq24U-60mGg7UR_aepFVx-KeROscV3J_Bytzz7WVj2a33Ll839DdZIdix8sQs4_4/s72-c/1.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-4773781143823102070</id><published>2012-10-28T17:48:00.003-07:00</published><updated>2012-10-28T18:17:48.913-07:00</updated><title type='text'>자바의 연결리스트(LinkedList)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMh97-WKlVxXxOeBJy-Uldp3InnCIkLZUrJJTyQNA9j27PC3zcHQD-5kY-NMtP_EYyrbHaLUPGhVXxTvBUraWQXVlOuHn1VSV1t4VvD0wsiJgUE9tzATb3KNI36XI3uLSt4N0hkvjAnXjY/s1600/linkedlist.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;278&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMh97-WKlVxXxOeBJy-Uldp3InnCIkLZUrJJTyQNA9j27PC3zcHQD-5kY-NMtP_EYyrbHaLUPGhVXxTvBUraWQXVlOuHn1VSV1t4VvD0wsiJgUE9tzATb3KNI36XI3uLSt4N0hkvjAnXjY/s400/linkedlist.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
오늘은 컬렉션 중에서도 자바의 연결리스트인 LinkedList에 대해서 공부하는 시간을 가져보기로 하겠다. 연결리스트 즉 링크리스트(LinkedList)는 큐(Queue)의 기능을 활용한 클래스 중에서 가장 많이 쓰이는 클래스로서 리스트(List)의 기능도 구현하고 있으므로 다목적으로 사용이 가능하다. 컬렉션에서 ArrayList가 LinkedList에 비해서 훨씬 많이 쓰이긴 하나 프로그램에서 요소들의 잦은 삽입이나 삭제를 반복하는 경우가 빈번하게 발생한다면 프로그램의 효율성을 위해 연결리스트를 사용하는 것에 대해 고려해볼만 하다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQiNn_jSWKHrNGPIOumaGp9pofoeCyKoIrfpQeO7-F01HqwGDVZ9oXOmG2J8YXjZskzDeod8GRQd7mj0onPUDLCShxu3bzzqhg7NHyZ83JhXyTqpPwztwM6dV751iJ3WxwAr0i9Sj1NjSX/s1600/headtail.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;207&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQiNn_jSWKHrNGPIOumaGp9pofoeCyKoIrfpQeO7-F01HqwGDVZ9oXOmG2J8YXjZskzDeod8GRQd7mj0onPUDLCShxu3bzzqhg7NHyZ83JhXyTqpPwztwM6dV751iJ3WxwAr0i9Sj1NjSX/s400/headtail.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
위의 그림은 LinkedList의 구조에 대해서 표현한 것이다. Queue에 대해서 조금 아는 이들이라면 쉽게 이해가 될것인데 설명하자면 연결리스트의 head 부분은 당연히 첫번째 요소를 뜻하는 것이고 tail은 맨 마지막 요소를 뜻한다. 각 요소가 다음 요소와 링크로 연결되어 있으며 맨 마지막 요소의 링크는 그림처럼 아무것도 없는 허공(?null)을 지정하고 있다고 생각하면 이해가 쉬울 것이다.^^&lt;br /&gt;
&lt;br /&gt;
이렇게 링크로 연결되어 있는 연결리스트가 잦은 삽입시 배열리스트에 비해서 왜 효율적인지 지금부터 설명하겠다. 배열리스트의 경우에 요소를 삽입한다면 삽입한 그 자리 이후에 위치한 요소들은 전부 뒤로 한칸씩 밀어야한다. 삽입하는 자리가 거의 뒤쪽이라면 별 지장이 없겠지만 요소들이 많은데 거의 처음에 요소를 넣어야하는 상황이 발생할 경우 시스템에 엄청나게 부하(?)가 걸릴수 있다. 그건 요소를 삭제하는 경우에도 마찬가지일 것이다. 그때는 반대로 그 뒤의 요소들을 모두 한칸씩 앞으로 보내야하니까 말이다.ㅎㅎ 그에 반해 연결리스트를 사용할 경우 요소를 넣을 위치에 다음 요소를 가리키는 링크의 위치만 변경하면 다른 부가작업이 필요가 없다. 말로 표현하는 것보다 그림을 보면 훨씬 간단하니 아래를 보기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnv5ZX56j_VFHWS1x8YDNpLIJoCYER0MXq1wPJMCPrDU0VkWD3XfScdNyKA44m477BNaOgI_OrJk5YksLIRooubegfGu_OACtUlh6SA_OL7W29UhqydH0pwdi57V-EdHOR9zdUCmCSmWWC/s1600/b.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;95&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnv5ZX56j_VFHWS1x8YDNpLIJoCYER0MXq1wPJMCPrDU0VkWD3XfScdNyKA44m477BNaOgI_OrJk5YksLIRooubegfGu_OACtUlh6SA_OL7W29UhqydH0pwdi57V-EdHOR9zdUCmCSmWWC/s400/b.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
37이라는 새로운 요소를 12와 99 사이에 넣으려는 예제인데 그림에서 보는 것처럼 12의 링크를 새로 넣으려는 요소 37에 지정하고 새로운 요소 37의 링크는 12 다음에 있던 요소 99로 지정하면 요소의 삽입과정이 간단하게 끝난다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglb7H9LNgyj5JV3Wg6Qrc9eX7hF4DhzFHBXVwOE7lXo0L4j01NUZk7i8W-7oxhwOovoPX5G_5cef90i7H-qaN2ySVJSvOZGrPOgHSc-8iWGL3WpzzskhiXCZpspXmp5zPt87NBXWsCTSzr/s1600/c.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;142&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglb7H9LNgyj5JV3Wg6Qrc9eX7hF4DhzFHBXVwOE7lXo0L4j01NUZk7i8W-7oxhwOovoPX5G_5cef90i7H-qaN2ySVJSvOZGrPOgHSc-8iWGL3WpzzskhiXCZpspXmp5zPt87NBXWsCTSzr/s400/c.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
위는 반대로 중간에 있는 요소인 99를 삭제하는 과정이다. 이건 그림에서 보는 것처럼 단지 이전의 요소가 가리키고 있던 링크를 삭제하려는 요소를 건너뛰어 다음의 요소에 링크만 걸어주면 삭제과정이 끝난다. 물론 나머지 링크는 그대로 유지된다.^^&lt;br /&gt;
&lt;br /&gt;
보다시피 연결리스트가 이러하므로 수시로 요소들을 추가거나 삭제한다면 연결리스트가 훨(?) 나을수도 있다. 그럼 연결리스트의 작동원리는 이 정도로 하고 이제 예제를 보기로 하자. 이번 예제는 Queue에 포커스를 맞추어서 내용을 구성하였다. 어차피 이전강의들에서 리스트에 관계된 대부분의 메소드들은 공부하였으므로 큐에 대해서 건드려 보도록 하겠다. 연결리스트(LinkedList)가 큐(Queue)를 구현한 대표적인 클래스이니까 말이다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKKs9yFQFrtBkCl0c5GZr9NpkhfVy3Vbug7bBUFT09AzhZHqT4wlVcOLAaYUQ7BUZYp_2FMeUyBEPGvM35qAUvEq_ZPzX155JWncNy12Lztlbf__l87z8LUOnKWePIy5ytVQmJCsr3sElZ/s1600/t110.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;343&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKKs9yFQFrtBkCl0c5GZr9NpkhfVy3Vbug7bBUFT09AzhZHqT4wlVcOLAaYUQ7BUZYp_2FMeUyBEPGvM35qAUvEq_ZPzX155JWncNy12Lztlbf__l87z8LUOnKWePIy5ytVQmJCsr3sElZ/s400/t110.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
예제는 아주 심플하면서도 심오(?)하다. 이런걸 한마디로 표현하자면 누워서 떡먹기인데 결과는 아래와 같다.^^&lt;br /&gt;
&lt;br /&gt;
[A]&lt;br /&gt;
[A, B]&lt;br /&gt;
[A, B, C]&lt;br /&gt;
[A, B, C, D]&lt;br /&gt;
[A, B, C, D, E]&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
[A, B, C, D, E, A]&lt;br /&gt;
B&lt;br /&gt;
[B, C, D, E, A, B]&lt;br /&gt;
C&lt;br /&gt;
[C, D, E, A, B, C]&lt;br /&gt;
D&lt;br /&gt;
[D, E, A, B, C, D]&lt;br /&gt;
E&lt;br /&gt;
[E, A, B, C, D, E]&lt;br /&gt;
A&lt;br /&gt;
=== 강이의 자바강좌 ===&lt;br /&gt;
[A, B, C, D, E]&lt;br /&gt;
[A, B, C, D, E]&lt;br /&gt;
&lt;br /&gt;
특별히 어려운건 없을 것이나 위아래 표식이 있는 강이의 자바강좌 사이에 있는 결과값들에 의문을 표하는 이들이 조금 있을지도 몰라 혹시나 정말 혹시나 해서 해석을 곁들이니 이해가 잘 안갔던 이들은 함께 하기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
일단 연결리스트에 A, B, C, D, E 알파벳을 차례대로 넣어서 연결리스트를 만들었다. 초반에 언급했지만 연결리스트 또한 리스트를 계승하므로 add( ) 메소드를 자유롭게 쓸수 있다. 그럼 오늘 예제의 하이라이트(?)인 두번째 for 구문을 살펴보자.&lt;br /&gt;
&lt;br /&gt;
일단 아까처럼 요소 A를 add( ) 메소드를 통해 집어넣으니 결과처럼 연결리스트 맨 뒤에 A가 추가된다. 다음에 어째서 B가 출력되느냐인데 메소드가 하는 기능을 제대로 알면 금새 이해가 될것이다. poll( ) 메소드를 썼는데 이것의 뜻이 개표 또는 여론조사할때 쓰는 표현이다. 개표라는 말의 의미자체가 투표함에서 표를 꺼내서 열어본다는 것이니 연결리스트가 투표함이고 표가 요소라고 가정할 경우 요소를 꺼내서 열어보니 당연히 연결리스트에서는 더이상 꺼낸 그 표, 즉 요소가 없을 것이다. 그런데 poll( )의 메소드는 연결리스트 맨 앞의 요소 헤드, 즉 맨 처음 넣었던 요소를 끄집어내고 그 요소는 없애버린다. 따라서 poll( ) 메소드를 실행한 후의 연결리스트는 [B, C, D, E, A]가 될것이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
그 다음 peek( ) 메소드를 실행하고 출력하라고 했는데 peek의 뜻이 무언가를 엿보다 혹은 훔쳐보다라는 뜻이다. 즉 보기는 보지만 말그대로 그 요소를 삭제하거나 하는 행동은 취하지 않는다. peek( ) 메소드도 poll( )과 마찬가지로 맨 앞의 head 요소를 사용한다. 현재 연결리스트가 A를 끄집어낸 후이므로 가장 앞의 위치한 요소 B를 출력하게 되는 것이다. 이런 식으로 계속해서 반복되는게 두번째 for 구문이다.^^&lt;br /&gt;
&lt;br /&gt;
마지막으로 clone( ) 메소드로 연결리스트를 복사하는 것인데 clone( ) 메소드가 돌려주는 리턴값이 Object라서 연결리스트로 바꿔주느라 캐스팅을 사용한 것이다. 물론 예제처럼 연결리스트로 복사해서 다시 쓸 필요없을 경우 원래의 리턴값인 Object로 받아서 써도 된다. 그렇게 하려면 주석처리한 부분으로 현재의 코드를 수정하면 될것이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
짧게나마 연결리스트(LinkedList)에 대해서 공부해보는 시간을 가져보았다. 이밖에 여러 기능들이 있지만 그건 여러분이 조금만 응용해서 코딩해보면 쉽사리 습득하게 될것이다. 자바 라이브러리(API)는 자바의 바이블같은 존재이다. 내용이 방대하므로 전부다 실험은 못해보더라도 최소한 의문이 생기는 부분들에 대해서만이라도 여러분이 찾아보고 알아보는 정성을 쏟기 바라면서 오늘 강의는 이정도로 하겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/4773781143823102070/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/10/linkedlist.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4773781143823102070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4773781143823102070'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/10/linkedlist.html' title='자바의 연결리스트(LinkedList)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMh97-WKlVxXxOeBJy-Uldp3InnCIkLZUrJJTyQNA9j27PC3zcHQD-5kY-NMtP_EYyrbHaLUPGhVXxTvBUraWQXVlOuHn1VSV1t4VvD0wsiJgUE9tzATb3KNI36XI3uLSt4N0hkvjAnXjY/s72-c/linkedlist.gif" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-2672178578178982390</id><published>2012-10-26T08:31:00.000-07:00</published><updated>2012-10-28T16:17:39.243-07:00</updated><title type='text'>자바 컬렉션 프레임워크(Java Collections Framework)</title><content type='html'>오늘은 강이의 자바강좌에서 여러분과 약속한데로 자바 컬렉션 프레임워크에 대해 특강 형식으로 강의를 진행하려한다. 세계최초(?)로 공개되는 본 강좌를 들으면서 자바의 컬렉션에 대한 여러분의 궁금증들을 해소하고 그에 관한 폭넓은 사고와 이해를 통해 여러분의 지식을 한층 드높이는 계기가 되리라 단언한다. 특강이니만큼 자바소스나 프로그램은 제외할 것이고 읽는 도중에 아직 배우지 못한 내용들은 앞으로 진행될 강의에서 자세히 설명할 예정이니 그런게 있구나하고 편안하게 글을 읽어내려가기 바란다. 강이의 자바강좌에서 오늘 특강을 애독하는 이들은 아마 자바 컬렉션 프레임워크에 대한 전반적인 개요와 구조를 확실하게 이해하는데 큰 도움을 줄것이라 확신한다. 필자가 오늘 강의를 준비하기위해 도봉산과 관악산의 정기를 받으며 수개월동안 피와 땀이 맺힌 정신수양(?)을 한끝에 드디어 본 특강을 세상에 내놓으니 졸지말고 끝까지 함께해 주기를 희망하면서 본론으로 들어가보겠다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj8D_BLoI3MUaHlwCTliinfVe9y4k38ZRZC8oETwnJl_xP7MtKxNxNexngPLjStnyncLOj9pbt8y_GoBl220VXZ-PgGnzEIXsE_Y0sKF50H1R2B73y_AN_MhDQE1lZKSrTZu9QeoUcaxP6/s1600/javaframework.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;173&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj8D_BLoI3MUaHlwCTliinfVe9y4k38ZRZC8oETwnJl_xP7MtKxNxNexngPLjStnyncLOj9pbt8y_GoBl220VXZ-PgGnzEIXsE_Y0sKF50H1R2B73y_AN_MhDQE1lZKSrTZu9QeoUcaxP6/s400/javaframework.JPG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
자바 컬렉션 프레임워크(Java Collections Framework) 일명 JCF는 다수의 데이터와 객체지향적 시스템을 기반으로한 계층적 구조로서 여러 문제들을 풀기위해 서로 관련성이 있는 객체들을 통일하고 표준화된 설계들을 통해 유기적 관계들을 그룹화시키고 정형화시켜 보다 구체화된 다수의 데이터를 쉽게 처리할수 있는 방법을 제공하는 클래스들과 재사용할수 있는 컬렉션 데이터 구조들을 구현하는 인터페이스들의 집합을 말한다. 자바의 다형성을 이용해서 컬렉션 객체들의 메소드 형식과 형태를 동일하게 유지시켜 누구나 편하게 사용할수 있도록 일관성있게 제작된 자바 컬렉션 프레임워크는 자바2(JDK 1.2) 버젼에서 등장하여 많은 개발자들에게 자바 배열과 이와 관련된 여러 불편한 사항들과 단점들을 궁극적으로 보완할 최선의 대안책으로 제시되며 현재에 이르기까지 높은 성능과 뛰어난 상호운용성으로 크게 각광받고 있다. 거기다 기존의 1.4 버젼까지는 자료구조가 전부 Object를 넣어서 쓸수있도록 프레임워크가 설계되었으나 1.5인&amp;nbsp;자바5부터 제네릭을 지원하게 됨에따라&amp;nbsp;데이터형을 사전에 원하는데로 지정할수 있어 더욱더 편리한 사용이 가능해졌다.^^&lt;br /&gt;
&lt;br /&gt;
지금부터는 자바 컬렉션 프레임워크를 일반적으로 지칭하는 컬렉션이란 용어로 통일하여 사용하면서 이에 대해 심층분석해 보기로 하겠다. 컬렉션은 간단하게 말해 배열에 관련된 데이터를 다루는 인터페이스들과 이를 구현한 클래스들의 집합이라 할수 있을텐데 개발자 입장에서는 어떤 인터페이스들과 클래스들이 있는지 알아야할 것이고 이것이 어떻게 쓰이는지 기본이라도 알아야 써먹을수 있을 것이다. 따라서 이제부터는 여러분의 지루함도 달래줄겸 특별히 그림도 같이 보아가면서 공부해 보기로 하겠다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyGB2fFIxswhjNO-Ytq5fyL4426ww7QlMQl1wDHdFOlxfyE8HU8ZoJuwu_mEFD4yR_Y6vQvm1NN70eg7lqMJKYtJrx1SuezZwNRDdJXuZRmU4swGM2t8MOqQDW1o3TS4iVrc1RteUe3O3W/s1600/coreInterfaces.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;166&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyGB2fFIxswhjNO-Ytq5fyL4426ww7QlMQl1wDHdFOlxfyE8HU8ZoJuwu_mEFD4yR_Y6vQvm1NN70eg7lqMJKYtJrx1SuezZwNRDdJXuZRmU4swGM2t8MOqQDW1o3TS4iVrc1RteUe3O3W/s400/coreInterfaces.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
자바 컬렉션의 핵심 인터페이스들이다. 관련 클래스들은 어차피 인터페이스들을 알면 부수적으로 따라오는 것이므로 컬렉션에 대해서 논할려면 최소한 위의 계층구조 정도는 파악하고 있어야한다. 자바의 콜렉션 프레임워크는 크게 두개의 인터페이스(Collection과 Map)로 나뉘어진다. 보다시피 컬렉션의 뿌리인 Collection 인터페이스를 기반으로 이를 계승한 Set, List, Queue(자바5에서 등장)의 계층구조로 펼쳐지며 Collection 인터페이스를 계승하지 않고 독자적으로 존재하는 Map 인터페이스는 방식이 다르지만 성격은 같으므로 컬렉션에 속한다. 참고로 Map 인터페이스의 방식은 다른 컬렉션 인터페이스들과 다르게 키(Key)와 값(Value)을 이용 객체의 쌍(pair)으로 데이터를 짝지어 모아둔다. 여러분이 위의 인터페이스들만 다 이해하여도 자바 컬렉션 프레임워크의 대부분을 다 알고 있다고 해도 결코 과언이 아닐 것이니 다음 단락으로 가기전에 다시한번 위의 그림을 쳐다보고 아래로 이동하기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
컬렉션은 대부분이 객체를 어떻게 분류해 모아놓을지 다양한 연산을 수행하는 알고리즘으로 구성되어 있다고 볼수 있으며 구체적으로 표현해 보자면 컬렉션에서 원하는 객체를 찾는 Search 알고리즘과 객체를 특정한 순서대로 정렬하는 Sort 알고리즘을 중심으로 그 내용이 구성되어 있다고 간략하게 말할수 있겠다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
그럼 이제 각 컬렉션들에 대한 내용들을 요점정리해 보는 시간을 가져보겠다.&amp;nbsp;일단 컬렉션에서 맨상위 뿌리가 되는 Collection 인터페이스는 이를 계승하는 하위 인터페이스들에게 다음과 같은 메소드들을 지원한다.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;boolean&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;add(E e)&lt;br /&gt;
&amp;nbsp;boolean&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;addAll(Collection&amp;lt;? extends E&amp;gt; c)&lt;br /&gt;
&amp;nbsp;void&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;clear( )&lt;br /&gt;
&amp;nbsp;boolean&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;contains(Object o)&lt;br /&gt;
&amp;nbsp;boolean&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;containsAll(Collection&amp;lt;?&amp;gt; c)&lt;br /&gt;
&amp;nbsp;boolean&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;equals(Object o)&lt;br /&gt;
&amp;nbsp;int&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;hashCode( )&lt;br /&gt;
&amp;nbsp;boolean&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;isEmpty( )&lt;br /&gt;
&amp;nbsp;Iterator&amp;lt;E&amp;gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;iterator( )&lt;br /&gt;
&amp;nbsp;boolean&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;remove(Object o)&lt;br /&gt;
&amp;nbsp;boolean&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;removeAll(Collection&amp;lt;?&amp;gt; c)&lt;br /&gt;
&amp;nbsp;boolean&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;retainAll(Collection&amp;lt;?&amp;gt; c)&lt;br /&gt;
&amp;nbsp;int&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;size( )&lt;br /&gt;
&amp;nbsp;Object[ ]&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;toArray( )&lt;br /&gt;
&amp;nbsp;&amp;lt;T&amp;gt; T[ ]&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;toArray(T[ ] a)&lt;br /&gt;
&lt;br /&gt;
외우라고 쓴것은 아니니 그냥 자연스럽게 눈이 가는데로 놓아두기 바란다.^^ 어차피 관련 클래스들을 공부하면서 자연스럽게 쓰게 되므로 저절로 알게 된다. 더군다나 여러분은 벌써 컬렉션 List에 해당하는 Vector와 ArrayList 클래스에서 벌써 일부 메소드들을 써보았을 것이므로 설령 생소한 메소드가 보여도 비슷한 맥락이므로 그다지 어렵진 없을 것이다.ㅎㅎ 그럼 컬렉션을 구성하고 있는 하위 인터페이스들의 특징과 그와 관련된 대표적인 클래스들을 함께 살펴보기로 하자.^^ 필자가 식음(食飮)을 전폐(全廢)하며 여러분이 한방(?)에 이해할수 있도록 최대한 핵심만 간추려 보았다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;- 자바 컬렉션 프레임워크 Java Collections Framework 구성요소들 -&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Set&lt;/b&gt;: 요소들의 중복을 허용하지 않고 순서를 가지지 않는 요소들의 집합&lt;br /&gt;
Set 인터페이스를 구현해 가장 많이 쓰이는 대표적인 클래스: &lt;b&gt;HashSet&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;SortedSet&lt;/b&gt;: 요소들을 순서대로 꺼내 읽을수 있고 요소들이 증가되는 순서를 가지는 집합&lt;br /&gt;
SortedSet 인터페이스를 구현해 가장 많이 쓰이는 대표적인 클래스:&amp;nbsp;&lt;b&gt;TreeSet&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;List&lt;/b&gt;: 요소들의 중복을 허용하고 인덱스를 이용해 순서를 가지는 요소들의 집합으로 시퀀스(sequence)라고도 표현한다.&lt;br /&gt;
List 인터페이스를 구현해 가장 많이 쓰이는 대표적인 클래스:&amp;nbsp;&lt;b&gt;ArrayList&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Queue&lt;/b&gt;: FIFO(First-In-First-Out)의 형태로 첫번째로 넣은 요소가 첫번째로 나오는 방식&lt;br /&gt;
Queue 인터페이스를 구현해 가장 많이 쓰이는 대표적인 클래스:&amp;nbsp;&lt;b&gt;LinkedList&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Map&lt;/b&gt;: 키(Key)와 값(Value)이 쌍(pair)으로 즉 두개의 객체로 이루어져 있으며&amp;nbsp;키는 중복을 허용하지 않고 값은 중복을 허용하는 순서를 가지지 않는 요소들의 집합&lt;br /&gt;
Map 인터페이스를 구현해 가장 많이 쓰이는 대표적인 클래스:&amp;nbsp;&lt;b&gt;HashMap&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;SortedMap&lt;/b&gt;: 키에 해당하는 객체가 증가되는 순서대로 나열한 요소들의 집합&lt;br /&gt;
SortedMap 인터페이스를 구현해 가장 많이 쓰이는 대표적인 클래스:&amp;nbsp;&lt;b&gt;TreeMap&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
간략하게나마 자바의 컬렉션 프레임워크를 구성하고 있는 핵심 인터페이스들의 특징들을 살펴보았다. 어차피 처음보는 것이라면 이해하지 못해도 전혀 상관없다. 관련 강좌들을 차례차례로 듣다보면 퍼즐 맞추듯이 하나하나 깨닫게 될것이다. 조각이 어느정도 맞춰진 후에 본 특강을 다시 읽는다면 머리속이 깨끗하게 정리가 될것이니 오늘은 부담없이 가볍게 넘어가기 바란다. 위의 인터페이스들과 이를 구현한 클래스들의 연관관계를 아래 그림들을 통해 순차적으로 감상하기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtr0hHlI9mh7YxzyWwMb3nYaPxMa4jasDe81_Q7U4RPA8_TxSvtsPz-Ngj8suSRVV8xGV0GA4-KNCDbIRaOcze2afaMjCPrmPpJ6-PoB0UrOWc03d3H5T42IaY-qMVbijg0s3LEejlGFnP/s1600/java-collection.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;310&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtr0hHlI9mh7YxzyWwMb3nYaPxMa4jasDe81_Q7U4RPA8_TxSvtsPz-Ngj8suSRVV8xGV0GA4-KNCDbIRaOcze2afaMjCPrmPpJ6-PoB0UrOWc03d3H5T42IaY-qMVbijg0s3LEejlGFnP/s400/java-collection.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYqxdchpx-GT6iHWo8ZTPB0EjsBEowCJRRefWj8-s-QN2bZDJCAzeB75FmvyONWbe4je134flxn-2mogjnXcoXNwt7NnuOMYDDni8GjHhFgjFfeq1h7_Cjy3zGovPzCi7gdonheIkb8HfP/s1600/object.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYqxdchpx-GT6iHWo8ZTPB0EjsBEowCJRRefWj8-s-QN2bZDJCAzeB75FmvyONWbe4je134flxn-2mogjnXcoXNwt7NnuOMYDDni8GjHhFgjFfeq1h7_Cjy3zGovPzCi7gdonheIkb8HfP/s400/object.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMgFqVrosbAijgzaMO1wkVyDqGiJfODs8pOLkH_SNoMODChBw5Od0tvbeQPDTz1ZlK6S1Svq_vz9UMceO_QV1Acywh_aoZXTCFlLq4KoCPvNKXLlEEwL2fBcOWWg7Ct2bxuD2fxIU3qa-H/s1600/collections.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;305&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMgFqVrosbAijgzaMO1wkVyDqGiJfODs8pOLkH_SNoMODChBw5Od0tvbeQPDTz1ZlK6S1Svq_vz9UMceO_QV1Acywh_aoZXTCFlLq4KoCPvNKXLlEEwL2fBcOWWg7Ct2bxuD2fxIU3qa-H/s400/collections.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGwOciUEikARBBkrBae9fK5FS_0pw3EOJjmDhXzHmf921gn3rjDleZNzkWck5h1NwdwjvLoWyW7-WeGBQ3qqbnxnmEc1tvssxGQ-Olkc8WL7Ydk4E7hMUDPE0dHJ9TbMt5XsseGsfV8IkF/s1600/Java_collection2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;271&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGwOciUEikARBBkrBae9fK5FS_0pw3EOJjmDhXzHmf921gn3rjDleZNzkWck5h1NwdwjvLoWyW7-WeGBQ3qqbnxnmEc1tvssxGQ-Olkc8WL7Ydk4E7hMUDPE0dHJ9TbMt5XsseGsfV8IkF/s400/Java_collection2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
그림들을 순차적으로 보다보면 자바 컬렉션 프레임워크가 어떤 인터페이스들과 어떤 클래스들로 구성되어 있는지 눈에 들어오기 시작할 것이다. 마지막 그림은 자바4와 자바5 버젼에서 어떤 것들이 컬렉션에 추가되었는지 살펴보라고 올린 그림이다. 물론 이것 이외에도 더많은 인터페이스와 클래스가 컬렉션에 관계되어 있다. 그중에서도 자주 쓰이는 것들만 모아놓은 것이라 믿도록 하자.ㅎㅎ 그림으로 다 때운다고 필자를 원망하지 말아라. 때론 그림들로 커버가 가능할때가 있는데 바로 지금이 그런 경우라 하겠다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
예상보다 특강이 길어졌는데 그동안 List에 속해있는 Vector와 ArrayList를 접하면서 컬렉션에 대해 누적되어왔던 여러분의 궁금증들이 이번 특강을 통해 많이 해소되었길 바란다. 앞으로 펼쳐질 강의들은 컬렉션에 관계된 중요 클래스들을 하나하나 접하면서 여러분들의 프로그래밍 실력을 한단계 드높여줄 컬렉션의 세계로 안내할 것이다. 여러분의 끊임없는 성원을 기대하면서 오늘 특강은 여기서 마치도록 하겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/2672178578178982390/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/10/java-collections-framework.html#comment-form' title='5개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/2672178578178982390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/2672178578178982390'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/10/java-collections-framework.html' title='자바 컬렉션 프레임워크(Java Collections Framework)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj8D_BLoI3MUaHlwCTliinfVe9y4k38ZRZC8oETwnJl_xP7MtKxNxNexngPLjStnyncLOj9pbt8y_GoBl220VXZ-PgGnzEIXsE_Y0sKF50H1R2B73y_AN_MhDQE1lZKSrTZu9QeoUcaxP6/s72-c/javaframework.JPG" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-6648065835785892502</id><published>2012-10-22T13:28:00.000-07:00</published><updated>2012-10-26T07:58:53.064-07:00</updated><title type='text'>자바의 반복자(Iterator)와 리스트반복자(ListIterator)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh35sGon4ftdTueR0gA-SqBvXgRnGf8vTls6nW6lhGLQnphiEqFGC1j5qkfpzaRdhdel1ymhlzilXmLE8jkTum5DbSl1cAvSfe1ROCH28Hr6M0cGGdu5hcRIrTB49tbCB4n8wl-jjatfqFE/s1600/4496198_f520.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;157&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh35sGon4ftdTueR0gA-SqBvXgRnGf8vTls6nW6lhGLQnphiEqFGC1j5qkfpzaRdhdel1ymhlzilXmLE8jkTum5DbSl1cAvSfe1ROCH28Hr6M0cGGdu5hcRIrTB49tbCB4n8wl-jjatfqFE/s400/4496198_f520.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
오늘은 컬렉션에 관계된 자바의 반복자인 Iterator와 리스트반복자인 ListIterator에 대해서 들여다보는 시간을 갖도록 하겠다. 자바의 벡터 시간 이후로 컬렉션이란 말을 간간히 쓰고 있는데 대충 이전에 간략하게 언급은 했지만 사실 이것에 대해서 구체적인 개념이 정립되어 있지 않은 이들은 컬렉션이란 말만 나와도 머리속이 어지러운 공황상태(?)로 돌입하고 있을지도 모르겠다.ㅎㅎ 그러나 염려놓기 바란다. 어느정도 궁금증이 증폭되었을때 관련 강의를 듣게되면 그것이 머리속으로 솔솔찮게 들어올 것이니 말이다. 다음 강좌에서 자바의 컬렉션에 대한 특강을 할것인데 아마도 그것을 듣게되면 그동안 쌓였던 궁금증과 의문점들이 눈녹듯이 한순간에 사라져버릴 것이다.ㅎㅎ 여러분의 많은 기대 부탁드리면서 다음 강의 광고는 잠시 접도록 하고 다시 본론으로 들어가보기로 하겠다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvgM1MJSEaU3z79LKM7bIiHizwnvnPnPmLm8qf1zqOZ7fUX5YhXIrpHcZbXngyW0hcSUmP2uhlo3gdXhkPzTZWjH1RtEuuIArpF7dkrZ95QVUrrj2hEEh0Uv4C4dKX7nUPNsAxQsGKhW9d/s1600/Iterator_Java_Interface_Hierarchy.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;332&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvgM1MJSEaU3z79LKM7bIiHizwnvnPnPmLm8qf1zqOZ7fUX5YhXIrpHcZbXngyW0hcSUmP2uhlo3gdXhkPzTZWjH1RtEuuIArpF7dkrZ95QVUrrj2hEEh0Uv4C4dKX7nUPNsAxQsGKhW9d/s400/Iterator_Java_Interface_Hierarchy.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
java.util 팩키지에 들어있는 인터페이스 Iterator와 ListIterator를 공부해볼텐데 컬렉션이랑 관계되어 있으므로 배열을 떠올릴수 있을 것이고 반복이란 의미를 생각한다면 또한 자주 이용되고 계속 반복해서 뭔가(요소들)를 돌릴수 있구나라고 어거지(?)로 유추를 해보자.ㅎㅎ 또한 이름에서 보듯이 서로 연관성이 있음을 알수 있다. 어떻게 아냐고? Iterator란 단어가 둘다 들어가 잊지 않은가? ㅎㅎ 별거 아니라고 넘기는 이들이 많겠지만 자바의 모든 팩키지들, 인터페이스들, 클래스들, 메소드들, 기타등등,, 이름만 관심있게 보아도 반은 먹고 들어갈수 있다. 자바는 이름을 지을때도 기능과 연관이 있도록 심혈을 기울여만든 프로그래밍의 걸작(?)이기 때문에 그러하다.^^&lt;br /&gt;
&lt;br /&gt;
Iterator는 개체의 요소들을 출력할때 기존의 인덱스 증감인자에 의존하던 방식을 탈피해서 보다 편리하고 쉽게 출력이 가능하도록 만들어준다. Iterator는 자바 컬렉션 내부에서 자유롭게 쓸수 있으며 기존의 Enumeration의 기능을 완전히 대체함과 동시에 remove( ) 메소드를 장착하고 메소드명들도 줄여서 편리하게 쓸수 있도록 개선되었다. 따라서 구식인 Enumeration을 쓸 필요가 전혀 없다. 필자가 벡터 강의할때 잠시 어떻게 쓰는지 보여줬을텐데 이 시간 이후부터는 더 향상된 기능인 Iterator만 쓰기로 하니 여러분도 Enumeration은 깨끗이 잊어주기 바란다. 헐~ 그럼 처음부터 Iterator만 설명하지 왜 Enumeration을 보여줘서 혼란을 가중시키냐고 딴지거는 이들은 듣기바란다. 그럼 Iterator 나오기 이전에 작성된 프로그램들을 보았을때 이해는 할수 있어야하지 않겠느냐? 답이 됐나? ^^ 그럼 됐다.ㅎㅎㅎ&lt;br /&gt;
&lt;br /&gt;
여러분에 대한 사랑(?)이 깊어지는 관계로 자꾸 서론이 길어지고 있다. 이제 정신을 가다듬고 Iterator가 어떤 메소드들을 가지고 있는지 살펴보기로 하자.^^&lt;br /&gt;
&lt;br /&gt;
boolean hasNext( )&lt;br /&gt;
E next( )&lt;br /&gt;
void remove( )&lt;br /&gt;
&lt;br /&gt;
위의 딱 3가지 메소드 밖에 가지고 있지 않다. 따라서 여러분이 이 세가지 메소드들의 기능만 쓸줄 알면 Iterator의 종결자(?)로 바로 등극할수 있으니 더도말고 3분만 여기에 시간을 투자하기 바란다.ㅎㅎ 뭘 기대하는거냐? 여기에 대해서 부연설명은 하지 않겠다. 여러분이 강이의 자바강좌를 열공했다면 이 정도쯤이야 메소드 구조만 딱 봐도 탁탁~ 아닌감? ㅎㅎ&lt;br /&gt;
그래도 배려심(?)이 깊다리깊은 필자가 한마디 하자면 hasNext( ) 메소드를 보면 뭔가 다음꺼를 찾는다는 것이고 리턴타입을 보니 boolean이란다. 그럼 자동적으로 리턴값이 true나 false를 돌려준다는 것이니 if나 while문 같은 컨디션에 쓰기 딱 좋다는 것을 알아차릴수 있다.ㅎㅎ next( ) 메소드야 보자마자 다음껀데 리턴타입에 E가 떡하니 붙어있으니 어떤 데이터형인지는 모르겠지만 element값을 돌려주는구나 하고 생각하면 되고 remove( ) 메소드는 말그대로 없애는 기능이구나 생각하면 되시겠다. 한마디가 너무 길었나? ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
이제 ListIterator를 살펴보자. ListIterator는 상위계층의 Iterator를 그대로 계승한다. 따라서 Iterator의 기능은 기본적으로 갖추고 있으며 Iterator와 크게 다른점은 양방향으로 리스트를 돌면서 관련 요소들을 출력할수 있다는 것이다. 관련 메소드들은 다음과 같은 것들이 있다.&lt;br /&gt;
&lt;br /&gt;
boolean hasNext( )&lt;br /&gt;
E next( )&lt;br /&gt;
void remove( )&lt;br /&gt;
int nextIndex( )&lt;br /&gt;
boolean hasPrevious( )&lt;br /&gt;
E previous( )&lt;br /&gt;
void add(E e)&lt;br /&gt;
int previousIndex( )&lt;br /&gt;
void set(E e)&lt;br /&gt;
&lt;br /&gt;
아까 필자가 한것처럼 메소드들이 어떤 기능을 가지고 있는지 탁탁~ 보기 바란다. 대충 어떤 기능들이 있는지 쉽게 눈에 들어올 것이라 믿겠다.^^ 리스트반복자는 기존 반복자에 비해서 어떻게 동작하는지에 대한 구조정도는 머릿속으로 그릴수 있어야 하는데 그 이유는 양방향으로 움직이기 때문에 상황에 따라 앞으로 갔다 뒤로 갔다거리면 자칫 무한루프에 빠질수 있기 때문이다. 여러분의 이해를 돕기 위해 특별히 그림으로 설명하겠다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0ulhFyfEo-99Mzlahu5qEXW9AsuXRdKK0hIrNgdO17pCRvWDasZ6vkMHySq0sbYvhYb46PAIhT7Alat8EInidji9KkBYP_5v15OA5iKoZZVPJXjzjAHz-p4akKmoEutyh0yPIt-d0HixC/s1600/fivePossibleCursor.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;105&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0ulhFyfEo-99Mzlahu5qEXW9AsuXRdKK0hIrNgdO17pCRvWDasZ6vkMHySq0sbYvhYb46PAIhT7Alat8EInidji9KkBYP_5v15OA5iKoZZVPJXjzjAHz-p4akKmoEutyh0yPIt-d0HixC/s400/fivePossibleCursor.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
기존의 배열이라면 인덱스가 그냥 관련 요소를 지칭하지만 반복자에서는 위처럼 커서가 요소(Element)를 지칭하는게 아니라 요소들의 사이 사이를 지칭한다고 생각하여야 정확하다. 특히 이 개념은 리스트반복자(ListIterator)를 사용할때 더욱 중요한 개념으로 next( ) 메소드와 previous( ) 메소드를 연속해서 사용할시 기존에 쓰던 배열에서의 인덱스를 생각한다면 서로 다른 요소를 넘겨받는다고 생각하겠지만 위의 그림과 같은 인덱스 방식으로는 같은 요소를 주고받게된다. 이해가 안되면 아래 그림을 보면서 생각해보면 금새 알게 될것이다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi03qm7RiAZ_tG27KFRc7-_zo6E94pzrB5oX3Crsh0CVY6FhV0FEgWh3FXhN7wAFL1r6Mv1Y5RZCO6H7KVREPBWHW5ovMbHdLm-OROldYspqH8h7ixggEkf68MYthtPlfRfkJPkXQNWaKl-/s1600/Iterator+CoreJava.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;306&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi03qm7RiAZ_tG27KFRc7-_zo6E94pzrB5oX3Crsh0CVY6FhV0FEgWh3FXhN7wAFL1r6Mv1Y5RZCO6H7KVREPBWHW5ovMbHdLm-OROldYspqH8h7ixggEkf68MYthtPlfRfkJPkXQNWaKl-/s400/Iterator+CoreJava.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
이제 이해가 되는가? 지금 위의 그림은 반복자가 next( ) 메소드를 이용해 옆으로(?) 이동했을때 그 사이에 있는 요소를 돌려준다는 것을 그림으로 표현하고 있는 것이다. 많은 이들이 반복자를 사용하고 있지만 그 원리를 제대로 모르고서 그냥 무작정 사용하고 있는 이들이 많은데 그럴경우 원치않는 요소가 가끔 튀어나올 것이다. 그건 여러분이 반복자가 어떻게 작동하고 있는지 제대로 알고 있지 못하기에 그런 상황을 겪게 되는데 강이의 자바강좌를 필독하는 이들은 이 정도의 레벨(?)은 바로 뛰어넘어 다른 미지의 세계로 나아가야할 것이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
반복자를 공부하면서 혹시 이런 생각을 하는 이들이 있을지도 모르겠다. 아 그냥 루프는 기존의 for 룹으로 전부 다 통일하는게 오히려 더 편하지 않을까? 이런 신통방통(?)한 질문을 던지는 이들이 있을텐데 필자는 이런 여러분에게 박수를 치고 싶으나 이 사실을 알고나면 왜 반복자가 그렇게 많이 쓰이는지 알게 될것이다. 뭘까? ㅎㅎ 예를 들어 기존 배열에서 쓰는 for 룹으로 리스트를 출력한다고 치자. 그럼 이 for 룹은 인덱스 중심으로 읽히므로 리스트가 수정이 된다면 for 구문도 그에 맞춰서 같이 수정되야한다. 리스트의 길이가 어떻게 바뀔지 모르니까 말이다. 허나 반복자를 이용하면 리스트가 수정이 가해지든 않든 상관없이 최종 상태의 리스트를 넘겨받아 작동되므로 반복자를 이용한 루프 구문은 손댈 필요가 없게 되니 더 편하다.^^&lt;br /&gt;
&lt;br /&gt;
물론 확장된 enhanced for 루프(for-each)도 메카니즘이 반복자를 이용하는 것이기 때문에 마찬가지다.ㅎㅎ 그럼 또 이런 질문을 하는 이들이 있을 것이다. for-each 루프문을 쓰지 왜 Iterator를 이용하는냐고 말이다.ㅎㅎ 여러분이 리스트에 변형을 가하지 않고 단순히 리스트에서 요소들을 처음부터 끝까지 출력만 하는 경우에는 Java 5에서 새로 등장한 for-each 루프문을 쓰는게 최고라고 할수 있겠다. 왜냐하면 Iterator의 경우 hasNext( ) 메소드를 이용해서 다음 요소가 있는지 확인을 해야하는데 확장된 for 루프문은 이런 과정을 우리가 수동으로 체크하지 않아도 되도록 만들어놨기 때문이다. 이번 강의의 제목이 반복자여서 반복자를 이용해 출력한 것이지 만약 다른 곳에서 단지 리스트를 출력하기만 하면 되는 경우라면 당근 자바5 신무기(?)로 무장된 enhanced for 루프문을 쓰는게 현명할 것이다.^^&lt;br /&gt;
&lt;br /&gt;
이제 반복자에 대한 설명은 어느정도 정리된것 같으니 필자의 특화된 예제를 통해 Iterator와 ListIterator의 핵심동작원리를 깨우치기 바라면서 오늘의 강좌를 마치도록 하겠다. 본 예제는 반복자를 이용해 어떻게 요소들을 출력하는지 가장 기본적이면서도 빈번하게 쓰이는 방식이니 잘보고 앞으로 많이 써먹기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkTEfXaVdB_PYXz8G5MF9sGRnJjULy79TzANMnsb0cydEcP2woWOtr2pgzJSw0Rz7gs95s9iKMhexKiwUjuP0J7Q7RvfjKdsbbeifwmIPY_UaHu3UptbSCRKK4V6eEGB_21GjwCGDlNPtn/s1600/t109.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkTEfXaVdB_PYXz8G5MF9sGRnJjULy79TzANMnsb0cydEcP2woWOtr2pgzJSw0Rz7gs95s9iKMhexKiwUjuP0J7Q7RvfjKdsbbeifwmIPY_UaHu3UptbSCRKK4V6eEGB_21GjwCGDlNPtn/s400/t109.jpg&quot; width=&quot;272&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
오늘 예제는 아주 뜻깊은 예제라 할수 있겠다.- 필자가 강이의 자바강좌 예제 최초로 빨간줄을 도입한 혁신의 날(?)이기 때문이다. 그 전에 한적이 있었나? 그럼 말구~ㅎㅎ 어쨌거나 이번 예제에 빨간줄 치느라 무지 애먹었는데 그에 따른 피땀어린 노력(?)이 바래지지 않도록 더더욱 열심히 공부해주기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
예제에 있는 빨간박스 3개만 집중해서 보면된다. 나머지는 다 아는 내용일테고 첫번째 박스는 Iterator를 이용해 리스트를 출력하는 예제이고 두번째 박스는 ListIterator를 이용해 리스트를 출력하는 예제이고 마지막 세번째 박스는 ListIterator를 이용해 리스트를 거꾸로 출력하는 예제이다. 마지막 박스야말로 ListIterator가 Iterator와는 다르게 할수 있는 큰일(?)이라 할수 있겠다. 예제를 보면 그냥 이해가 될것이니 특별한 부연설명은 필요없겠지만 굳이 하나를 들춰보자면 al.iterator( )와 al.listIterator( ) 정도일꺼다. 필자가 제대로 궁금한거 찍었남? Arraylist의 al은 인터페이스 List와 관련되어 있다. 이 인터페이스 List를 구현한 클래스 중에 하나가 Arraylist인데 그 안에 위와 같이 반복자가 돌아다닐수 있는 Iterator나 ListIterator 형식으로 리스트를 받을수 있게 해주는 메소드가 들어있어서 기존의 리스트를 이렇게 그대로 쉽게 넘겨받을수 있는 것이다.^^ 이것 빼고는 여러분이 프로그램 돌려보면 별 어려운 사항이 없을테니 필자는 예제 결과값을 공개하면서 이번 강의를 마치도록 하겠다. 아래를 보기 전에 예제에 대한 결과값을 미리 예상해보고 여러분의 답과 맞춰보면서 공부하는 센스(?)장이가 되기를 희망하면서 물러가겠다.^^&lt;br /&gt;
&lt;br /&gt;
ArrayList(itr): A B C D E&lt;br /&gt;
=== 강이의 JAVA강좌 ===&lt;br /&gt;
ListIterator(forward): A B C D E&lt;br /&gt;
=== http://alecture.blogspot.com ===&lt;br /&gt;
ListIterator(backwards): E D C B A&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/6648065835785892502/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/10/iterator-listiterator.html#comment-form' title='3개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/6648065835785892502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/6648065835785892502'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/10/iterator-listiterator.html' title='자바의 반복자(Iterator)와 리스트반복자(ListIterator)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh35sGon4ftdTueR0gA-SqBvXgRnGf8vTls6nW6lhGLQnphiEqFGC1j5qkfpzaRdhdel1ymhlzilXmLE8jkTum5DbSl1cAvSfe1ROCH28Hr6M0cGGdu5hcRIrTB49tbCB4n8wl-jjatfqFE/s72-c/4496198_f520.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-5726542691736089216</id><published>2012-10-21T13:41:00.001-07:00</published><updated>2012-10-25T21:52:08.974-07:00</updated><title type='text'>자바의 배열리스트(ArrayList)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ7IQlBrCdO5YxBTLi5MDt6vQOKcTwoKdR75uONlkFcQIb-lv1NnpZky4Q39UcfSNi5xPylCVfnxht0cKLv3Pn8RP4XjaKdaz2GXvalKtOsTrI5W2uRvPOgaZ87w293SgagIpfCJ8CY7Tf/s1600/java_util.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;197&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ7IQlBrCdO5YxBTLi5MDt6vQOKcTwoKdR75uONlkFcQIb-lv1NnpZky4Q39UcfSNi5xPylCVfnxht0cKLv3Pn8RP4XjaKdaz2GXvalKtOsTrI5W2uRvPOgaZ87w293SgagIpfCJ8CY7Tf/s400/java_util.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiotFS4WhGfQMggldlWwukixRlWMvfpSHmT1D6WInTACPxLHBA9dFvZxWGyxo6Vxkt9F7ydzR8Q1LydhvCfY9P2C2D-CbGaeL1coxz876AVf_OLEeD28gXUSITNbVK0bTpfu7eIbTw0qK-Q/s1600/Collection_ArrayList.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;260&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiotFS4WhGfQMggldlWwukixRlWMvfpSHmT1D6WInTACPxLHBA9dFvZxWGyxo6Vxkt9F7ydzR8Q1LydhvCfY9P2C2D-CbGaeL1coxz876AVf_OLEeD28gXUSITNbVK0bTpfu7eIbTw0qK-Q/s400/Collection_ArrayList.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIHV1dRG8tTA_1NxOCmG-NZKlVwXrQNQ1FvBznSWSDrgFoibZjmTJ22ycxtK1wJlu1xnnKBcS1TQHzZIhu-ZPzkrhfa46E0gINpPJvqmts98ykM0w894TyDYG9Q_bgbZSvMN5gnqIzSx0G/s1600/336.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIHV1dRG8tTA_1NxOCmG-NZKlVwXrQNQ1FvBznSWSDrgFoibZjmTJ22ycxtK1wJlu1xnnKBcS1TQHzZIhu-ZPzkrhfa46E0gINpPJvqmts98ykM0w894TyDYG9Q_bgbZSvMN5gnqIzSx0G/s400/336.png&quot; width=&quot;387&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
자바 컬렉션 프레임워크(Java Collections Framework)에서 ArrayList 클래스는 실무에서 HashMap과 더불어 가장 빈번하게 쓰이는 클래스 중 하나이므로 이번 단원에서 어떤 관점으로 ArrayList를 강의할지 필자가 상당히 고뇌(?)하였음을 미리 알리는 바이다.ㅎㅎ 동기화(synchronized)가 Vector는 지원되고 ArrayList는 지원되지 않는 차이점을 빼고는 거의 대부분 같다고 볼수 있다. 물론 ArrayList에서도 Collections.synchronizedList라는 메소드를 이용해 List를 wrapped해서 보완해쓰는 방법이나 자바 5에서 등장한 CopyOnWriteArrayList를 쓰는 방법도 있겠지만 여러분이 멀티쓰레드 환경을 고려할 필요가 없다면 그냥 ArrayList를 쓰기 바란다.(동기화 부분에 대해서는 이미 강의한바 있으니 잘 기억이 나지 않는 이들은 예전 강의를 참조하기 바란다.) 메소드의 경우에도 벡터와 태반이 비슷하며 사소한 몇가지는 여러분이 자바 라이브러리를 보면서 필요할때 쓰면 되므로 이미 저번 강의에서 Vector를 어느정도 마스터(?)한 여러분이기에 이번 강의에서는 저번과 궤를 달리하겠다. 그래도 되겠지? ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
오늘은 여러분의 프로그래밍 기술을 한단계 업그레이드시켜주는 관점에서 본 강좌를 진행하려고 하니 주변에 모든것을 잠시 미루고 ArrayList 강의에 총력을 다해주기 바라는 바이다.^^&amp;nbsp;ArrayList는 이미 언급한데로 Vector와 유사하므로 역시 자동으로 배열 길이를 조정할수 있으며 리스트가 찰때 알아서 길이를 조정해주므로 여러면에서 편리하다. 그렇다면 동기화를 고려할 필요가 없을경우 둘다 써도 되는 상황일때 ArrayList를 쓰는게 나은건지 Vector를 써야되는게 좋은지 고민하는 이들이 상당수 있을 것이다. 물론 상황이나 속도등 효율성에 따라 다르겠지만 정답은 없다. 그 상황에서 여러분에게 가장 적합한 방식을 쓰면되고 어떤 방식으로 구현해도 무리가 없다면 새로 나온 ArrayList를 &amp;nbsp;쓰기 바란다. 옛것은 좋은 것이나 프로그래밍의 세계에서는 새로운 것을 쓰는게 여러모로 유리하다. 수고는 덜 들면서 기능은 예전보다 좋아지고 강력해지는데 점점더 편리해지는 방식을 마다할 이유가 없기 때문이다.&lt;br /&gt;
&lt;br /&gt;
다시 본론으로 돌아가서, 자바 5부터 등장한 대표적인 기능 가운데 제네릭(Generic)과 enhanced for 또는 for-each라 부르는 for loop 구문을 쓸수 있는데 이미 예전 강의에서 보여준적이 있지만 ArrayList에서 이를 접목시켜 구사함으로서 얼마나 코드가 간결해지고 명확해질수 있는지 예제를 통해 저절로 습득하게 될것이다.^^ 이번 예제에서는 ArrayList를 통해 어떻게 배열을 자유자재로 다룰수 있는지 주안점을 두어 구성하였다. 또한 고혈압이나 저혈압으로 고생하는 이들에게는 천금같이 귀중한 시간(?)이 될것이라 기대하면서 예제풀이를 시작하도록 하겠다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2P_lO1y5vjlT9vwIJyR23c3HmSGXFQPi_Yky-NudMI12YTFlvRYK1vcJnpAuJPYSzf2ADCWmL9U047CPhyvtCITNWCNKP3vzZHHOV5qILMUo2xHhk4Ko6zpWNIVPqtkW8GT0sCRwvRgY_/s1600/t108.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2P_lO1y5vjlT9vwIJyR23c3HmSGXFQPi_Yky-NudMI12YTFlvRYK1vcJnpAuJPYSzf2ADCWmL9U047CPhyvtCITNWCNKP3vzZHHOV5qILMUo2xHhk4Ko6zpWNIVPqtkW8GT0sCRwvRgY_/s400/t108.jpg&quot; width=&quot;386&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
고혈압에 좋은음식(al): 현미&lt;br /&gt;
고혈압에 좋은음식(al): 완두콩&lt;br /&gt;
고혈압에 좋은음식(al): 옥수수&lt;br /&gt;
고혈압에 좋은음식(al): 닭가슴살&lt;br /&gt;
고혈압에 좋은음식(al): 고등어&lt;br /&gt;
고혈압에 좋은음식(al): 고구마&lt;br /&gt;
고혈압에 좋은음식(al): 당근&lt;br /&gt;
고혈압에 좋은음식(al): 미역&lt;br /&gt;
고혈압에 좋은음식(al): 버섯&lt;br /&gt;
고혈압에 좋은음식(al): 양파&lt;br /&gt;
고혈압에 좋은음식(al): 김&lt;br /&gt;
1=== 강이의 JAVA강좌 ===1&lt;br /&gt;
고혈압에 좋은음식(copy): 현미&lt;br /&gt;
고혈압에 좋은음식(copy): 완두콩&lt;br /&gt;
고혈압에 좋은음식(copy): 옥수수&lt;br /&gt;
고혈압에 좋은음식(copy): 닭가슴살&lt;br /&gt;
고혈압에 좋은음식(copy): 고등어&lt;br /&gt;
고혈압에 좋은음식(copy): 고구마&lt;br /&gt;
고혈압에 좋은음식(copy): 당근&lt;br /&gt;
고혈압에 좋은음식(copy): 미역&lt;br /&gt;
고혈압에 좋은음식(copy): 버섯&lt;br /&gt;
고혈압에 좋은음식(copy): 양파&lt;br /&gt;
고혈압에 좋은음식(copy): 김&lt;br /&gt;
http://alecture.blogspot.com&lt;br /&gt;
완두콩,옥수수&lt;br /&gt;
고혈압에 좋은음식(array): 현미&lt;br /&gt;
고혈압에 좋은음식(array): 완두콩&lt;br /&gt;
고혈압에 좋은음식(array): 옥수수&lt;br /&gt;
고혈압에 좋은음식(array): 닭가슴살&lt;br /&gt;
고혈압에 좋은음식(array): 고등어&lt;br /&gt;
고혈압에 좋은음식(array): 고구마&lt;br /&gt;
고혈압에 좋은음식(array): 당근&lt;br /&gt;
고혈압에 좋은음식(array): 미역&lt;br /&gt;
고혈압에 좋은음식(array): 버섯&lt;br /&gt;
고혈압에 좋은음식(array): 양파&lt;br /&gt;
고혈압에 좋은음식(array): 김&lt;br /&gt;
2=== 강이의 자바강좌 ===2&lt;br /&gt;
저혈압에 좋은음식(al2): 고추&lt;br /&gt;
저혈압에 좋은음식(al2): 치즈&lt;br /&gt;
저혈압에 좋은음식(al2): 마늘&lt;br /&gt;
저혈압에 좋은음식(al2): 인삼&lt;br /&gt;
저혈압에 좋은음식(al2): 검은콩&lt;br /&gt;
3=== 강이의 자바강좌 ===3&lt;br /&gt;
고혈압에 좋은음식(sort): [고구마, 고등어, 김, 닭가슴살, 당근, 미역, 버섯, 양파, 옥수수, 완두콩, 현미]&lt;br /&gt;
&lt;br /&gt;
예제에 대한 결과값은 위와같다. 이처럼 강이의 자바강좌는 여러분의 건강까지도 챙기는 강좌이다.ㅎㅎ 조금 길어보일지 모르겠는데 배열이라 그런 것이니 긴장풀기 바라고 언제나 그렇듯 예제의 내용을 알게되면 이런거였군! 별거없네~.라는 감탄사를 연발할수 있게 될것이니 편안하게 따라오기 바란다.ㅎㅎ&amp;nbsp;예제를 통해 여러분의 건강도 되찾을수 있을것이라 기대하면서 본격적으로 예제속으로 들어가보도록 하겠다.^^&lt;br /&gt;
&lt;br /&gt;
일단 패키지에서 필요한것들을 import로 불러들였다. 어떤게 있는지 대충보기 바라고 본 소스에서 보면 ArrayList를 생성하는데 &amp;lt;String&amp;gt;이라는 문구를 썼다. 이렇게 뾰족한 괄호 &amp;lt; &amp;gt;가 나오면 여러분은 아~ 제네릭 등장이군!이라고 생각하면 되는데 그냥 안써도 되게 만들지 저렇게 데이터형을 쓰도록 했는지 질문하는 이들은 잘 듣기 바란다. &quot;안써도 된다.&quot; 허걱~ ㅎㅎ 그런데 왜 쓰는 것일까?&lt;br /&gt;
&lt;br /&gt;
반대로 그럼 쓰면 무슨 장점이 있을까? 제네릭의 강력한 무기 중 하나가 바로 저렇게 객체생성할때 타입을 지정해주면 지정된 타입이외에는 받아들이지 않는다. 이것은 여러분이 리스트를 구성할때 상당히 편리해지는데 간단한 예를 들어 사원들 이름을 입력받는다고 치자. 그럼 입력받을때 문자열이 아닌 정수나 부호들은 입력해도 그 즉시 거부할수 있는 프로그램 구성이 가능해진다. 그렇지 않을경우 저번처럼 입력받고 나서 후에 캐스팅을 통해 이게 문자인지 아닌지 검열해야하는데 반해 제네릭을 쓰면 컴파일시 사전에 이를 방지할수 있으니 얼마나 유리하겠는가? 이번 예제에서도 음식들이므로 아예 스트링 타입을 지정하고 쓴것이다. 이런 제네릭(Generics)의 기능을 우리는 type-safety에 유리하다고 표현한다.&lt;br /&gt;
&lt;br /&gt;
객체생성시 제네릭 쓰는 방법은 예제처럼 클래스 이름옆에 원하는 데이터형을 양옆에 적어주면 되고 나머지는 평상시 코드처럼 쓰면 된다. 그리고 ArrayList al 에다가 순서데로 현미부터 김까지 쭈욱 배열리스트에 추가하였다. 그리고 확장된 for 룹을 돌려서 출력하는 부분이다. 물론 인덱스를 이용해 인자를 증감시키면서 기존의 for 룹을 쓸수 있으나 좋은길 놔두고 외딴길로 갈 필요는 없다하겠다. 그럼 for-each 확장된 for 룹을 쓰는 방법을 설명하겠다. 괄호안에 데이터형과 변수명을 지정해주고 콜론 : (세미콜론이 아니다.)을 찍은후에 관련된 배열리스트명를 적어주고 출력란에는 초기 변수명을 다시 넣어주면 차례대로 요소를 출력한다. 이렇게 컬렉션 요소값들을 확장된 for 룹을 통해서 편하게 찍을수 있다. 자주 쓰이는 표현이니 이번 시간에 확실하게 자기것으로 만들기 바란다. 허나 외울 필요는 없다. 외우기 싫어도 저절로 외우게 될것이다. 계속해서 다음 예문에 나올것이니까 말이다.^^&lt;br /&gt;
&lt;br /&gt;
다음에 분리선을 찍고 이번에는 copyList라는 배열리스트를 만든다. 여기서는 ArrayList를 똑같이 카피해서 어떻게 쓸수 있는지 보여줄려고 만든 것이다. ArrayList의 addAll( ) 이라는 메소드를 이용하면 이렇게 똑같은 배열리스트를 만드는게 가능하다.&lt;br /&gt;
&lt;br /&gt;
다음은 ArrayList를 일반 배열로 넘겨받는 방법이다. 예제에서는 2가지 방법을 보여주고 있는데 ArrayList의 size( ) 메소드를 이용하는 방법과 toArray( ) 메소드를 이용하는 방법이다. 참고로 toArray( ) 메소드는 AbstractCollection 클래스에서 상속받은 메소드이다. 보는바와 같이 for 룹에서 array 리스트 대신에 a 리스트를 써줘도 결과는 같다. 그리고 다음에 보면&lt;br /&gt;
&lt;br /&gt;
System.out.println(a[1]+&quot;,&quot;+array[2]);&lt;br /&gt;
&lt;br /&gt;
이런 것이 나오는데 배열이 제대로 만들어졌는지 그냥 테스트해 볼려고 넣은 것이다. 결과값 두개이상 출력할때는 + 로 연결해주고 가운데 &quot; &quot; 쌍따옴표들은 결과값들 중간에 콤마를 넣어주려고 쓴것이다. 다 아는 것인데 설명한다고 하는 이들이 있겠지만 저게 뭐지? 한 이들도 분명히 있었을 것이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
다음은 일반배열의 요소값들을 바로 리스트로 만드는 과정이다. 총 3가지 방식으로 만들어 보았는데 지금 예제에서 실행하고 있는 방식이랑 주석처리해 놓은 두가지 방식중 하나를 여러분이 편한데로 써먹으면 될것이다. 필자가 추천하는 방식은&lt;br /&gt;
List&amp;lt;String&amp;gt; al2 = Arrays.asList(&quot;고추&quot;,&quot;치즈&quot;,&quot;마늘&quot;,&quot;인삼&quot;,&quot;검은콩&quot;);&lt;br /&gt;
요거다. 왜냐하면 가장 편하니까~ ㅎㅎ 그리고 for 룹을 이용해 출력하는 것인데 다 아는 것이니 다음으로 넘어가보자.&lt;br /&gt;
&lt;br /&gt;
벌써 마지막이다. 자바 컬렉션 프레임워크에 있는 Collections 클래스의 sort ( ) 메소드를 이용하면 예제처럼 리스트의 요소들을 차례대로 이렇게 순서데로 출력하는게 가능하다. 덧붙이자면 Collections 클래스의 메소드들은 빠른 접근을 위해 모두 static으로 구성되어 있으므로 이렇게 편하게 사용가능하다. 솔직히 sort( ) 쓸때 한글은 안될줄 알았는데 작동이 되길래 조금 놀랐다. 자바의 놀라운 위력(?)에 감탄을 금하지 않을수 없다.ㅎㅎ ArrayList에서 while문을 통해 많이 쓰이는 Iterator와 ListIterator가 있는데 이건 여러분의 정신건강(?)을 위해 다음시간으로 넘기겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/5726542691736089216/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/10/arraylist.html#comment-form' title='3개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/5726542691736089216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/5726542691736089216'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/10/arraylist.html' title='자바의 배열리스트(ArrayList)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ7IQlBrCdO5YxBTLi5MDt6vQOKcTwoKdR75uONlkFcQIb-lv1NnpZky4Q39UcfSNi5xPylCVfnxht0cKLv3Pn8RP4XjaKdaz2GXvalKtOsTrI5W2uRvPOgaZ87w293SgagIpfCJ8CY7Tf/s72-c/java_util.gif" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-3638037540251020146</id><published>2012-10-18T00:04:00.001-07:00</published><updated>2012-10-25T22:20:28.840-07:00</updated><title type='text'>자바의 벡터(Vector)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIQ6EbL_p5SzLpAUbMD_zZhLsHruHWfcuV27wSl6vvQ1CQCz7uERE-t25ySAndoWvD20186aIJfLfAzaTqeF0iPiAXAAmb97izNly7g2b1G9iUohAn-eFm13g-WUAAgRuC40OtBkXT_0xY/s1600/javautil.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIQ6EbL_p5SzLpAUbMD_zZhLsHruHWfcuV27wSl6vvQ1CQCz7uERE-t25ySAndoWvD20186aIJfLfAzaTqeF0iPiAXAAmb97izNly7g2b1G9iUohAn-eFm13g-WUAAgRuC40OtBkXT_0xY/s400/javautil.gif&quot; width=&quot;338&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhCMOEVNLBnqylMnrY3wmbJKTbaadlzNfUAA-EmAvb_z4nylts8h_AgLjeHByDZFdCidGrvw8-NPOzQQv3hHcrXDdT4j5i2AKmwB6Rpe2rO-bvjT4ZGSX0jvxfNn-XAdtSHYGMcqPwixVT/s1600/collection_hierarchy.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhCMOEVNLBnqylMnrY3wmbJKTbaadlzNfUAA-EmAvb_z4nylts8h_AgLjeHByDZFdCidGrvw8-NPOzQQv3hHcrXDdT4j5i2AKmwB6Rpe2rO-bvjT4ZGSX0jvxfNn-XAdtSHYGMcqPwixVT/s400/collection_hierarchy.gif&quot; width=&quot;301&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq1V45BQHm2MrRIYuBt8oiSZiSP9A976y1VrgrWVflAsY3BcfsaslNMnMS9bLCbe-XfImd20shSBVqLZ1D-THVdM_dK1hyqTY6AJqBcsgsM3jWLsRBrdqogO5nFN9rjDM-KSz9_TQFWXtl/s1600/vector.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;375&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq1V45BQHm2MrRIYuBt8oiSZiSP9A976y1VrgrWVflAsY3BcfsaslNMnMS9bLCbe-XfImd20shSBVqLZ1D-THVdM_dK1hyqTY6AJqBcsgsM3jWLsRBrdqogO5nFN9rjDM-KSz9_TQFWXtl/s400/vector.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
자바의 벡터 Vector 클래스에 대해서 공부해 보기로 할텐데 위의 그림들은 오늘 배울 자바의 벡터에 관련된 계보도이다. 자바의 벡터는 JDK 1.2 버젼부터 자바 컬렉션 프레임워크의 List를 구현한 멤버로서 재해석되었다. 컬렉션에 대해서는 차후에 설명할테니 궁금하더라도 지금은 넘어가기 바란다.ㅎㅎ 보는바와 같이 자바의 벡터 클래스는 java.util 팩키지에 들어있으므로 클래스를 만들기에 앞서 import java.util.Vector; 라고 먼저 관련 패키지를 불러들인후에 사용할 것임을 예측할수 있을 것이다. 예측하면서 본 이가 있으려나? ㅎㅎ&amp;nbsp;물론 클래스안에서 java.util.Vector를 직접적으로 불러서 쓸수도 있으나 보기 지저분하니 필자같이 청결한 이는 보통 쓰지 않는다.ㅎㅎ&amp;nbsp;더불어 Vector 클래스안에 어떤 메소드들이 있는지 눈요기좀 하라고 한것이고 다른 클래스들도 앞으로 하나둘씩 다루게 될것이라 미리 구경하라고 올려놓았는데 이런 필자의 뜨끈뜨끈한 배려심에 뭉클한 뭔가(?)가 전해졌길 바라면서 본론으로 들어가겠다.^^&lt;br /&gt;
&lt;br /&gt;
자바의 배열을 공부하고 나서 슬슬 눈에 띄기 시작하는 것이 바로 Vector라는 녀석일 것이다. 비단 이 녀석뿐 아니라 배열의 형태가 워낙 쓰이는 곳이 많으므로 배열에서 확장된 개념의 클래스들이 상당히 많은데 오늘은 그중에서도 배열의 길이와 데이터형을 자유자재로 주무를수 있는 벡터에 대해서 공부해 보겠다.^^ 시작하기전에 워밍업을 하자면 강이의 자바강좌에서 벡터를 처음보는 접하는 이도 있겠지만 그렇지 않고 벡터에 대해서 잘 모르는 태반은 아마도 너무 복잡해 보여서 아니면 이것저것봐도 이해가 잘 안되어서 망설이다 여기까지온 이들이 많을 것이다. 그렇다면 모두 환영한다. 벡터에 지친 자들아, 모두 내게로 오라~ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
오늘 잠시만 이 강의에 집중하면 여러분은 자바의 벡터에 대해서 상당한 자신감으로 무장하게 될것이라 단언한다. 더군다나 이번 강의는 다른걸 공부하라고 강요하지도 않겠다. 그냥 딱 한가지만 하면된다. 예제 딱 하나~ 이것만 공부하면 벡터에 대해서 어느정도 감을 잡게 될것이라 확신한다. 모든 것이 단 하나의 예제로 시작해서 예제로 끝나도록 필자가 이 예제 한편에 벡터의 초초초오 엑기쓰만 쎄리 퍼부었다는 점을 강력히 밝힌다. 따라서 다른건 몰라도 오늘 보여줄 이 예제에 대해서만큼은 필사적으로 타이핑(?)하고 가능하면 프린트까지해서 같이 따라오기 바란다.ㅎㅎ 자 시간 10분 주겠다. 딴짓하지 말고 아래 예제를 클릭해서 빨리 타이핑하고 실행해보기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpE5T2FQ70ambcYTyGquGePIpGJ1tdwaNgvZ5OlAhJ6VgJfru2VcXn0XuSAsQTv52SsckbEqSL1OpQKKngLFIXQ8jy6rIzHh0s3W3jKiT2-_X_3DK17_ngiiRHKQ6JLAbfKYydvRkUgoeG/s1600/t107.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpE5T2FQ70ambcYTyGquGePIpGJ1tdwaNgvZ5OlAhJ6VgJfru2VcXn0XuSAsQTv52SsckbEqSL1OpQKKngLFIXQ8jy6rIzHh0s3W3jKiT2-_X_3DK17_ngiiRHKQ6JLAbfKYydvRkUgoeG/s400/t107.jpg&quot; width=&quot;287&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
3&lt;br /&gt;
10&lt;br /&gt;
3&lt;br /&gt;
강이의 JAVA강좌&lt;br /&gt;
5&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
3&lt;br /&gt;
start&lt;br /&gt;
10&lt;br /&gt;
end&lt;br /&gt;
강이의 자바강좌&lt;br /&gt;
end&lt;br /&gt;
10&lt;br /&gt;
start&lt;br /&gt;
middle&lt;br /&gt;
true&lt;br /&gt;
false&lt;br /&gt;
5&lt;br /&gt;
true&lt;br /&gt;
0&lt;br /&gt;
&lt;br /&gt;
==========&lt;br /&gt;
예제를 실행하면 위와같이 결과값이 찍힐 것이다. 이제 본격적으로 예제분석에 들어가보기로 하겠다. import 부분은 관련 클래스 쓸려고 가져온 것이니 넘어가고 이제 메인메소드 안으로 들어가 보겠다. 일단 벡터를 사용하기 위해 벡터 클래스를 이용해서 객체생성을 하고 인스턴스 인자로 v를 만들었는데 괄호안에 (3,2)가 있다. 이게 무슨 뜻인가 하면 벡터의 길이를 3으로 하고 모자르면 길이를 2씩 증가시키라는 명령이다. 만약 괄호안에 아무것도 쓰지않고 벡터의 객체생성을 하였다면 기본적으로 길이는 10으로 할당된다. 그리고 모자르면 원래 기본길이의 두배씩 증가시킨다. 20 &amp;nbsp;40 &amp;nbsp;80 이런식으로 말이다. 따라서 어느정도 예측이 가능하다면 효율성을 고려해 제어시켜주는 것이 바람직하다. 옆에 주석을 달아놓은 것은 여러분이 이해하기 쉽도록 벡터가 어떻게 변해가는지 써놓은 것이니 조금이나마 벡터의 개념을 여러분이 이해하는데 도움이 되기를 간절히 희망한다.^^&lt;br /&gt;
&lt;br /&gt;
다음 코드에서는 v.capacity( ) 즉 벡터의 용량메소드를 이용해서 프린트하라는 것인데 이 메소드가 하는 일이 벡터의 용량 즉 얼마만큼의 요소를 집어넣을수 있는지 길이를 알려주는 메소드다. 벡터의 메소드들이 무엇이 있고 무슨 일을 하는지는 자바 API를 찾아보면 다 나오니 귀찮더라도 한번씩 보면서 쫒아오기 바란다.ㅎㅎ 하여간 그래서 결과에 3 이라는 숫자가 처음으로 찍히는거다.&lt;br /&gt;
&lt;br /&gt;
다음은 add 메소드를 쓰고 있다. 그럼 여러분은 바보가 아닌이상 강력한 자바삘(?)이 오고 있을 것이다. 뭔가를 집어넣는구나~ 그렇다. 예제에서는 start라는 문자를 집어넣고 있다. 그래서 주석에서 보는 것처럼 처음에 start라는 문자가 들어간거다. 자 여기서 여러분들이 놀라야하는 부분이 있다. 응?? 문자열을 넣는데 뭐 스트링을 이용해서 정의하거나 데이터형을 알려주는 과정도 없이 그냥 벡터에다가 넣어버렸다. 아 놀랍지 않은가? 그냥 놀랍다고 하자.ㅎㅎ 놀라움의 연속으로 다음 코드에 정수 10도 저렇게 그냥 넣어버릴수 있다. 캬하~ add( ) 메소드나 addElement( ) 메소드나 하는 일이 같은데 그 다음줄을 보면 add( ) 메소드가 더 뛰어나구나라는 것을 느낄수 있다. add( ) 메소드는 예제처럼 벡터의 인덱스를 지정하고 그곳에 원하는 요소를 집어넣을수가 있는데 예제에서는 인덱스 1에다가 ok라는 문자를 집어넣으라고 했으니 옆의 주석에서처럼 ok가 중간에 들어가게된다. 인덱스는 항상 0에서 시작하니까 말이다. 이거 너무 자세히 설명하니 진도 안나간다고 여기저기서 항의하는게 들려오는 것 같구만.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
다음은 벡터의 get( ) 메소드를 이용해서 프린트하라는 것인데 이 메소드가 하는일은 말그대로 얻어서 가져오는 것이다. 괄호안의 2는 인덱스 2의 위치에 해당하는 요소를 가져오라는 것이다. 따라서 10이라는 숫자가 출력된다.&amp;nbsp;그 다음에 다시 벡터길이에 대한 용량을 찍으라고 하니 변한게 없으니까 아까처럼 3을 찍을 것이다. 그리고나서 강이의 JAVA강좌를 찍는다.ㅎㅎ 광고가 아니라 공부할때 따라가면서 결과값 보기 좋으라고 써넣은 것이니 필자를 탓하지 말아라.^^&lt;br /&gt;
&lt;br /&gt;
자 이제 벡터의 새로운 마법(?)이 펼쳐진다. 20을 넣었는데 어라.. 다음 코드에서 벡터용량을 찍어보니 신기하게도 길이가 5로 증가하였다. 왜 벡터용량의 길이가 3에서 5가 되었을까? 기억이 안난다면 메인메소드의 첫째줄로 가보면 답이 있다. 객체생성을 할때 처음 길이용량을 3이라 놓고 모자르면 2씩 증가시키라고 하지 않았는가? 바로 그렇다. 벡터가 이미 꽉 차 있었으므로 20을 넣을때 우리가 설정해놓은 자동수치인 2를 증가시켜 총 길이용량 5가 되는 벡터를 자동으로 만든 것이다. 그리고 다음줄에 보면 size( ) 메소드를 이용해 프린트하라고 하였는데 4가 찍힌다. 여기서 size란 무엇을 뜻하는 것일까? 여기서 사이즈는 벡터에 있는 요소들의 갯수를 알려달라는 의미다. 지금 길이용량이 5인 벡터이나 안의 요소는 주석에서 보는 것처럼 하나가 모자란 4개의 요소들만 있다. 우리가 지금까지 4개의 요소들만 넣어왔으니까 말이다.^^&lt;br /&gt;
&lt;br /&gt;
다음 코드는 벡터에 end를 넣은 것이고 그 다음줄을 보면 처음봐도 감이 올것이다. remove( ) 메소드를 썼으니 뭔가 없애라는 것일텐데 괄호안에 ok를 써놨다. 여기에서 벡터의 또다른 놀라운 힘을 느낄수 있다. 이렇게 인덱스를 이용하지 않고 요소를 직접적으로 지정해도 관련 요소를 벡터에서 없애버릴수 있으니 말이다. 이렇게 요소가 제거되면 주석에서 보는 것처럼 벡터 요소들이 알아서 저렇게 정렬된다. 다음줄은 인덱스로 관련 요소를 제거하는 방법이다. 2를 넣었으니 정렬된 벡터에서 다시 인덱스 2에 해당하는 위치의 요소인 20을 없애게 되고 또다시 벡터 요소들이 알아서 정렬된다. 자유자재로 정렬하는 벡터의 기능이 기막히지 않는가? 놀라는 척이라도 혀~ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
다음줄은 벡터 길이용량을 찍으라는건데 보다시피 벡터의 요소가 제거된다고 해서 벡터의 길이가 줄어드는게 아니라는걸 알수 있다. 그러니 당연히 5가 찍힌다. 그런데 이제 넣을것도 없는데 용량이 아까우니 벡터 길이용량을 줄여버리자는 생각이 불현듯 든다. 그때 유용하게 써먹을수 있는 메소드가 바로 trimToSize( ) 메소드다. 이 메소드를 사용하면 주석에서 보는 것처럼 벡터의 요소들에 맞게 알아서 길이를 맞춰준다. 지금은 요소가 3개 있으니까 알아서 맞춰준다면 길이용량이 3이라고 찍혀야 되는데 아니나 다를까 아래에 출력되는 것을 보니 3이 찍히므로 제대로 작동되고 있다는 것을 알수 있다. 잠깐~ 필자가 지금 너무 힘들다.. 물좀 먹고 올테니 1분간만 쉬자.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
자 다시 예제로 와서 보면 Enumeration이 나온다. 아까 패키지 불러들일때 썼으니 이거 써먹을거라고 짐작하고 있었을텐데 사실 이 부분이 오늘 이해하기힘든 가장 심오(?)한 부분이겠지만 필자가 최대한 간략하게 설명해 보겠다. 자바의 JDK 1.2 다시 말해, 자바 2에서 많은 기능들이 추가되었는데 그중에 하나가 바로 Vector와 같은 컬렉션 클래스들(위의 계보도 그림 보면서 다른게 뭐가 있는지 찾아보기 바란다.^^)을 관리하는 컬렉션 프레임워크(Collections Framework)라는 것이다. 물론 벡터는 예전부터 있어왔었다. 이 컬렉션 프레임워크에서는 Collection 인터페이스를 상속받은 모든 컬렉션 클래스에서 Enumeration을 사용가능하게 해놓았다는 것이 요지라 할수 있겠다. Enumeration은 자바의 초창기 버젼 1.0부터 있어왔던 것인데 이걸 조금더 발전시켜서 객체요소를 제거할수 있는 기능까지 첨가한 Iterator 같은 인터페이스도 이때 나오게 된것이다. 지금 예제에서 Enumeration을 썼는데 새로 나온 Iterator를 쓰는것도 가능하니 그건 여러분이 한번 도전해보기 바란다. 예제 코드를 조금만 바꾸면 되니 그리 어렵지 않을 것이다. 번외편이 너무 길었던것 같으니 다시 예제로 돌아가자.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
이 Enumeration이라는 인터페이스는 Collection 인터페이스로 구현한 클래스안에 저장되어 있는 객체들을 손쉽게 꺼낼수 있도록 해준다. 우리가 지금 공부하고 있는 벡터 클래스가 바로 컬렉션 인터페이스 자체를 직접적으로 구현한 클래스이므로 앞서 말한바와 같이 이렇게 손쉽게 사용이 가능하다.^^ 옆을 보면 벡터의 elements( ) 메소드를 인자 e에 집어넣으라고 하는데 이 메소드가 하는 일이 벡터 안에있는 요소들을 모두 가져오라는 것이다. 그리고 안에 무엇이 있는지 프린트하려고 while문을 돌리고 있는데 Enumeration에 있는 hasMoreElements( )와 nextElement( ) 메소드를 이용해서 안에 값이 있는지 확인하고 있으면 true, 없으면 false값을 돌려주며 있을 경우 요소들을 차례차례 찍으라는 구문이다. 벡터의 get(i) 메소드 같은걸 이용해 증감인자를 써서 루프를 돌릴수도 있겠지만 보는바와 같이 예제처럼 Enumeration을 활용하면 아주 쉽게 처리가 가능하니 이렇게도 쓸수 있다는 것을 알아두기 바란다.^^ 그래서 결과값을 보면 벡터 요소들인 start &amp;nbsp;10 &amp;nbsp;end가 차례차례 찍힌다.&lt;br /&gt;
&lt;br /&gt;
다음줄로 와서보면 잠시 광고 아니 공부하기 좋으라고 신경쓴 문구(?)가 나오고 방금 얘기한 벡터 get( ) 메소드를 이용해서 괄호안의 각 인덱스에 해당하는 요소들을 출력한다. 그래서 순서데로 end &amp;nbsp;10 &amp;nbsp;start 가 찍히는 것이다.&lt;br /&gt;
&lt;br /&gt;
다음줄에 보면 insertElementAt( )이라는 메소드를 썼는데 이 메소드는 말그대로 어떤 위치에 요소를 집어넣으라는 것이다. 괄호를 보면 middle이라는 요소와 숫자 2가 적혀있는데 인덱스 2에 해당하는 위치에다 본 요소를 집어넣으라는 뜻임을 알수 있을 것이다. 그리고 주석에서 보는 것처럼 벡터의 길이용량이 이번에 또 5로 늘어난다. 저번처럼 middle을 넣기전에 이미 벡터 용량이 꽉 차 있었으니까 말이다. 아까 언급했으니 두번 설명 안하겠다.^^&lt;br /&gt;
&lt;br /&gt;
다음 코드를 보면 elementAt( ) 메소드를 이용하였는데 이건 어떤 위치의 요소를 가져오라는 것인데 예제에서는 인덱스 2에 해당하는 요소를 가져오라고 하였으니 middle을 가져오게 되는데 이걸 캐스팅해서 스트링 변수 s에다가 넣어주었다. 캐스팅은 데이터형을 변환할때 사용하는 방식인데 저렇게 앞에다가 바꾸고자 하는 데이터 타입명을 써주고 괄호로 감싸주면 된다. 여기서 의아해하는 이들이 있을지도 모르겠다. middle이 스트링이지 않느냐? 데이터형이 같은데 왜 캐스팅을 하냐고 말이다. 좋은 질문이다.ㅎㅎ 벡터는 요소들을 몽땅 Object 형태로 보관한다. 그래서 데이터형에 관계없이 저렇게 자유롭게 쓸수 있는 것이다. 허나 이걸 끄집어내서 쓰려면 요소값에 맞는 데이터형으로 다시 변환시켜줘야하므로 캐스팅을 이용한거다.^^ 그냥 벡터에 있는 메소드 이용해서 출력해도 되지만 이렇게 관련 변수로 넘겨받아 출력도 가능하다는 것을 보여주기 위해서 필자가 이처럼 어려운 길을 걷고 있는 것이다.ㅎㅎ 그래서 다음줄에 s를 출력하면 middle이 찍힌다.&lt;br /&gt;
&lt;br /&gt;
이번에는 boolean이 나왔다. 참인지 거짓인지를 알아보자는건데 변수를 bool로 만들고 값을 넘겨받으려고 보니 벡터의 contains( ) 메소드라는 것이 보인다. 이 메소드가 하는 일은 요소값을 넣어주면 벡터에서 그 요소가 있는지를 찾고 있으면 true, 없으면 false값을 돌려준다. 예제에서는 end가 있는지를 찾으라고 했는데 있으므로 처음엔 true가 출력되고 다음에 20이 있는지를 찾으라고 해서 찾아보니 이번엔 없어서 false를 출력하는 부분이다. 이제 다 끝나간다. 힘내자.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
다음 코드를 보니 removeAllElements( ) 메소드가 나온다. 이거야 하는일을 모르는 이가 없을거라 본다. 말그대로 모든 요소들을 제거하라는 것이니 주석에서처럼 텅텅 비게 된다. 그래서 다음줄에 벡터 길이용량을 체크하라고 했더니 5가 찍힌다. 요소들이 제거되어도 벡터 용량과는 상관없음을 알수 있고 이것 대신에 벡터의 clear( ) 메소드를 쓸수도 있다. 다음 코드도 뜻이 명확하다. 안에 비었냐? 당연히 안이 비었으니까 true값을 돌려준다. 다르게 설명하자면 isEmpty( ) 메소드는 사이즈가 0일 경우에만 true를 리턴하고 그 이외의 경우에는 false를 리턴한다. 여기서 사이즈란 아까 배웠다시피 객체요소들의 갯수를 의미하는 것이고 다음줄이 바로 그것을 물어보는 것인데 아까 요소들을 제거해서 벡터에 어떤 요소도 없으므로 size( ) 메소드 값은 0이 찍힌다. 벡터에서 size( ) 메소드는 벡터의 길이 사이즈를 물어보는 것이 아님을 알아두기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
이로써 오늘 벡터 강좌를 마치도록 하겠다. 해보니까 다 이해가 가는 자기자신에게 놀라고 있진 않은가? 만약 그렇다면 자기자신을 향해 박수 10번을 치며 자축하기 바란다. 이번달이 10월이니까 말이다.ㅎㅎ 무슨 헛소리를 하는지 모르겠다. 알아서 마무리 잘하고 필자는 급피곤한 관계로 박수칠때 물러가도록 하겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/3638037540251020146/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/10/vector.html#comment-form' title='8개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/3638037540251020146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/3638037540251020146'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/10/vector.html' title='자바의 벡터(Vector)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIQ6EbL_p5SzLpAUbMD_zZhLsHruHWfcuV27wSl6vvQ1CQCz7uERE-t25ySAndoWvD20186aIJfLfAzaTqeF0iPiAXAAmb97izNly7g2b1G9iUohAn-eFm13g-WUAAgRuC40OtBkXT_0xY/s72-c/javautil.gif" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-4670877286645808544</id><published>2012-09-19T16:13:00.003-07:00</published><updated>2012-10-18T07:50:29.853-07:00</updated><title type='text'>자바의 열거형(enum)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitmveuVN9_HnIRAAtYmaV7melwMqnXmED8Bpu-P92R68f7uUJ25w2rM7yoMnziyJFYayyH6-xQwo-AdzN6TuJWwuX908yC-iXEr-__ogT2Ml-ytWeTHXRjT4GAPTfLeCKJNdB9SJUahBhy/s1600/coins.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitmveuVN9_HnIRAAtYmaV7melwMqnXmED8Bpu-P92R68f7uUJ25w2rM7yoMnziyJFYayyH6-xQwo-AdzN6TuJWwuX908yC-iXEr-__ogT2Ml-ytWeTHXRjT4GAPTfLeCKJNdB9SJUahBhy/s400/coins.gif&quot; width=&quot;298&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
오늘부터 새로운 기분으로 시작한다는 의미에서 JDK 1.5버젼 이상, 즉 자바 5부터 새롭게 등장한 기능인 enum이란 타입에 대해서 알아보도록 하겠다. 자바 5 이상의 버젼이 아닐경우 enum이란 키워드를 이용해 클래스나 변수 혹은 메소드를 그 이전에 만든 프로그램에 쓰려면 여러분은 안타깝지만 새로운 버젼에서는 그 소스들을 다 수정해야한다. 물론 강이의 자바강좌로 자바의 시작을 함께한 이들은 필요가 없겠지만 말이다.^^&lt;br /&gt;
&lt;br /&gt;
enum이란 키워드를 처음본 이들도 있을테고 아니면 자바나 그외 언어를 공부해온 이들은 enum 이놈(?)에 대해서 들어는 보았겠지만 아직도 생소하거나 자유자재로 이용을 못하는 이들이 생각보다 많을 것이다. 그 이유는 단 하나! 이제서야 강이의 자바강좌에서 다루기로 했기 때문이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
농담이고 아직까지 enum에 대해서 익숙하지 않은 이들은 이번 필자의 강의를 집중한다면 여러분이 프로그래머로서 배열을 굳이 만들지 않고서도 간단하게 코드를 작성할수 있는 새로운 자바병기(?)를 하나 가지게 될것이다.^^&lt;br /&gt;
&lt;br /&gt;
enum은 그럼 어떨때 쓰는 것이 효과적일까?&lt;br /&gt;
일단 enum은 enumeration이라는 영어단어를 짧게 쓴것이라 보인다. 필자의 영어실력을 믿으므로 확인해본바 없으나 아마 그럴것이다.ㅎㅎ 우리말로 뜻이 &quot;열거&quot; 즉 길게 늘어뜨려놓은 형태를 뜻하는데 자바에서는 쉽게 그런 형태의 예로 배열을 떠올릴수 있을 것이다.&lt;br /&gt;
&lt;br /&gt;
enum을 쓰지않아도 코드 짜는것이 불가능한 것은 아니다. 그런데 이게 왜 등장했냐면 이유는 당연지사 더 편하게 코딩하라고 나온것이다. 프로그램을 만들다보면 배열은 배열인데 이게 우리가 임의로 만들 필요가 없는 아주 당연한 배열의 형태들이 있다. 그 예를 들어보자면, 월요일부터 일요일까지 요일을 쓴다던가, 아니면 위의 그림처럼 화폐의 동전들을 나열한다던가, 그것도 아니면 수금지화목토천해명 같이 행성들을 태양에서부터 차례로 놓기위함이라던지, 이런 식으로 아주 일상적으로 쓰이는 배열 형태들이 있는데 이것을 굳이 배열로 다 정의하려면 시간도 오래걸리고 코드도 상당히 복잡해 보일 것인데 이런 상황에 enum이란 키워드를 쓰면 시간도 시간이지만 그 효율성과 강력한 기능의 이놈(?)을 굳이 두고 어려운 길을 갈 필요는 없을 것이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
그럼 본격적으로 enum을 어떻게 쓰는지 공부해 보기로 하겠다. 그전에 한마디 덧붙이자면, enum을 공부하다가 지친 이들은 용어의 생소함과 더불어 복잡한 이론에 공부하다 지친 이들이 의외로 많을 것인데 그런 이들은 오늘 이 강의로 말미암아 어려운 설명없이도 그동안의 궁금증을 말끔히 씻어주도록 필자가 핵심중의 핵심만 찌르고 나머지는 모두 짤라버리는 초특급 핵심강의를 펼치려하니 이제부터 정신을 한곳에 모아주기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
뭐 대단한 걸 기대하고 있을지 모르는 이들에게는 김이 빠질지 모르겠지만 오늘도 아니나 다를까 딴거 다 필요없고 필자의 예제 하나만 보면 그동안 이해안되었던 모든 의문들이 눈녹듯이 사라질 것이고 새로 배우는 이들은 별거없어 손가락만 빠는 사태가 즐비할지 모르는 황당한 사태가 벌어질 것을 알면서도 필자의 공력을 아낌없이 쏟아부은 예제를 아래에 공개하노니 모두 눈깔빠지도록 쳐다보면서 직접 타이핑해 보기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqmipYhIa1Jn1r36a3V31tpZSDW1CjBkt0uBV4gHPmQkPsH7ura60YkTYF0lfpit1aaSZSIuxOIfc7DYtCAtz1h3cnCJgLDx3nSPm4oqdJnyiwvsMXql_IOI4y6qMjIW2reMuAg6Xw0Kw9/s1600/106t.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqmipYhIa1Jn1r36a3V31tpZSDW1CjBkt0uBV4gHPmQkPsH7ura60YkTYF0lfpit1aaSZSIuxOIfc7DYtCAtz1h3cnCJgLDx3nSPm4oqdJnyiwvsMXql_IOI4y6qMjIW2reMuAg6Xw0Kw9/s400/106t.jpg&quot; width=&quot;340&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
강이의 자바강좌 본 예제의 결과값은 아래와 같다.&lt;br /&gt;
&lt;br /&gt;
Today is Monday.&lt;br /&gt;
Today is not Monday.&lt;br /&gt;
Weekday is Monday to Friday.&lt;br /&gt;
NICKLE&lt;br /&gt;
5&lt;br /&gt;
5&lt;br /&gt;
&lt;br /&gt;
enum을 조금 공부해본 이들이라면 예제를 보면 필자의 설명없이도 저절로 이해가 될정도로 소스를 아주 쉽게 구성하였으나 처음 본 이들은 조금 주춤할지 모르나 필자가 여기에 조금만 강의양념을 쳐주면 역시 별거없다는 것을 깨닫게 될것이다. 그럼 지금부터 예제 설명에 들어가보기로 하겠다.&lt;br /&gt;
&lt;br /&gt;
지금 프로그램을 보면 enum을 이용해서 만든 것이 크게 2가지가 있다. 하나는 Day 열거형이고 또 다른 하나는 Currency 열거형이다. 내용은 안에 보다시피 하나는 일요일~토요일에 관한 요일을 열거한 것이고 또 다른 하나는 화폐통화중 동전들 페니부터~쿼터까지 모아놓은 것이다. 우리나라의 동전 10원, 50원, 100원, 500원처럼 외국에서는 동전이 1센트(페니), 5센트(니컬), 10센트(다임), 25센트(쿼터)라 하는데 그걸 쓴것이다. 우리나라 동전으로 예제를 만들까 하다가 이럴때라도 외국물(?) 먹어보자고 필자가 특별히 외국화폐를 가져왔다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
자 일단,&lt;br /&gt;
enum Day {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}&lt;br /&gt;
를 열거하였는데 이렇게 static final 상수처럼 enum &#39;이름&#39;을 넣어 관련항목을 위처럼 열거해서 써먹을수가 있다. 그밑에 있는 check 메소드는 필자가 그냥 간단히 오늘이 월요일인지 아닌지를 확인하는 간단한 예를 if~else 구문을 활용해 돌려본 것뿐이다.&lt;br /&gt;
&lt;br /&gt;
그럼 다음으로,&lt;br /&gt;
enum Currency를 들수 있는데 enum 이넘이 매력적인 이유중 하나가 위처럼 단순 열거에 그치지 않고 이렇게 이놈안에 메소드나 필드를 정의해서 쓸수가 있는데 이넘이 클래스나 객체로서도 강력한 성능을 발휘하는 것과 동전에서 보듯이 이처럼 물건의 의미가 바로 수치랑 연결되는 것들이 있을때 바로 예제처럼 수치까지 적용해서 써먹을수 있는 기능이 또한 매력적이다.&lt;br /&gt;
&lt;br /&gt;
지금 enum Currency에서는 value 변수를 이용한 생성자가 들어가 있는데 동전이 어떤 것이냐에 따라 그 값어치 즉 화폐단위를 바로 인식하도록 만든 것이다. 만약 PENNY(1) 이런식으로 쓰지 못하였다면 이것을 일일히 변수를 만들어 값을 하나하나 대입해야하는 번거로운 소스를 만들어야할 것이나 이넘(?) 덕분에 그 수고를 한번에 덜수 있었다 하겠다^^&lt;br /&gt;
&lt;br /&gt;
여러분이 지금 필자가 무슨 말하는지 이해가 잘 안되고 있을텐데 그건 당연한 것이다. 지금 필자는 이미 메인메소드의 내용을 알면서 설명을 하는 것이고 여러분은 아직 메인메소드 내용을 잘 모르는 상태로 설명을 듣고 있으니 이해가 잘 안되는 것은 당연하다. 그런데 왜 이렇게 먼저 설명부터 하냐고? 메인메소드를 지금부터 필자의 설명과 함께 보다보면 그 이유를 끝에 알게 될것이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
자 그럼 무엇을 테스트해 보려하는지 메인메소드의 내용을 보기로 하자.&lt;br /&gt;
일단 첫째줄에&lt;br /&gt;
Day today=Day.MONDAY;&lt;br /&gt;
라고 썼는데 말그대로 오늘이 월요일이라고 알려준 것이다.&lt;br /&gt;
여기서 알수 있는 것은 enum은 굳이 new라는 키워드를 이용해 레퍼런스로 접근하지 않고 바로 써먹을수 있다는 것이다. 그런 까닭에 check 메소드에 static을 쓴것인데 이 부분에 대해서는 그냥 넘겨도되고 궁금해서 못참겠거든 필자의 예전 static에 관련된 강의를 검색해서 찾아보기 바란다. 그럼 다시 돌아와서 다음줄을 보자&lt;br /&gt;
check(today);&lt;br /&gt;
오늘이 무슨 요일인지 체크해보라는 명령이다.&lt;br /&gt;
아까 오늘이 월요일이라고 알려줬으니 당연히&lt;br /&gt;
Today is Monday. 라는 값이 나와야 할것이다.&lt;br /&gt;
그 다음에는 토요일이냐고 물어봤으니&lt;br /&gt;
월요일이 아니라는 답이 나온 것이고&lt;br /&gt;
그 밑에 스위치문에는 오늘이 월요일이니&lt;br /&gt;
월요일은 case에 해당이 없으므로 default 구문의 값이 찍히는 것이다.&lt;br /&gt;
&lt;br /&gt;
자 그럼 이제 Currency에 관련된 enum 구문을 테스트해 보기로 하자.&lt;br /&gt;
Currency coin=Currency.NICKLE;&lt;br /&gt;
즉 coin이 5센트짜리 니컬이라고 정의해 주었다.&lt;br /&gt;
그럼 다음줄에 무슨 동전 들고있는지 찍어보라고 아래 명령을 줬더니&lt;br /&gt;
System.out.println(coin);&lt;br /&gt;
NICKLE이라고 찍힌 것이고&lt;br /&gt;
다음줄에 coin.value를 찍으라고 했는데&lt;br /&gt;
이게 생성자를 이용해 동전에 따라 수치를 나타내라고 한것이니&lt;br /&gt;
결과값에 보는 것처럼 숫자 5가 찍혔으니 enum의 강력한 힘(?)이&lt;br /&gt;
제대로 발휘하고 있다고 느낄수 있다.&lt;br /&gt;
그 다음줄은 똑같은 명령인데&lt;br /&gt;
그렇게 바로 지정해서 쓸수 있다는 것도 보여줄겸 적었을 뿐이다.&lt;br /&gt;
&lt;br /&gt;
뭐 거창한 프로그램 같은데 벌써 끝나버렸다.ㅎㅎ 예제에서 스위치 구문을 메인메소드 안에 바로 썼는데 사실 이건 좋은 예가 아니나 바로 이해가능하도록 핵심사항을 여러분께 바로 전달하기 위해 긴급조치한 부분이니 이점 양해하기 바란다.^ 아까 초반에 필자의 설명이 잘 이해되지 않은 이들도 지금 다시 보면 술술 모든 의문이 다 풀릴 것이다.&amp;nbsp;필자가 이 한 예제에 두개의 enum 구문을 넣어 이렇게도 저렇게도 쓸수 있다는 것을 보여준 이곳에선 아주 귀한 일석이조(一石二鳥)&amp;nbsp;자바공법(?)을 불어넣은 예제이니 확실히 복습해서 몽땅 자기걸로 만들기 바란다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/4670877286645808544/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/09/enum.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4670877286645808544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4670877286645808544'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/09/enum.html' title='자바의 열거형(enum)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitmveuVN9_HnIRAAtYmaV7melwMqnXmED8Bpu-P92R68f7uUJ25w2rM7yoMnziyJFYayyH6-xQwo-AdzN6TuJWwuX908yC-iXEr-__ogT2Ml-ytWeTHXRjT4GAPTfLeCKJNdB9SJUahBhy/s72-c/coins.gif" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-2835551127158985729</id><published>2012-09-09T15:45:00.000-07:00</published><updated>2012-09-09T15:45:00.771-07:00</updated><title type='text'>스윙으로 원본창 만들기(JRootPane)</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhcry7cXthSLEIkeR2iCEnGna18WogO3DEwo5mNHzXbR8g1sguuXkyaPbuVnqu4ogGlan-A6TR2Lrr77NNMLnMMGTovOcvOUMMlJlR8sFP_65DiUfLIUcFe1L9FfVmaESoHEWO4nIasqNV/s1600/JRootPane-1.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;307&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhcry7cXthSLEIkeR2iCEnGna18WogO3DEwo5mNHzXbR8g1sguuXkyaPbuVnqu4ogGlan-A6TR2Lrr77NNMLnMMGTovOcvOUMMlJlR8sFP_65DiUfLIUcFe1L9FfVmaESoHEWO4nIasqNV/s400/JRootPane-1.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
JRootContainer 클래스를 공부해 보도록 하겠다. 모든 스윙 컨테이너들은 JRootPane을 가지는데 JRootPane이라는 객체는 layeredpane과 glassPane으로 구성되어 있다. 그 중에서도 layeredpane은 contentPane과 optional menu bar를 가지고 있고 JRootPane의 틀안에서 보자면 JLayeredPane의 인스턴스인 layeredpane은 모든 컨테이너 자식들의 부모격 콤포넌트로 다층레이어로 이루어져 있어 여러 콤포넌트들이 내용을 담을수 있는 contentPane 위에 올수 있도록 만들어준다. JRootPane 틀안에서 JPanel의 인스턴스인 glassPane은 모든 콤포넌트들의 최상위에 위치하며 이것은 마우스의 이벤트나 콤포넌트 사이에서 dragging이나 drawing을 가능하게 만들어준다. 즉 마우스 동작의 반응여부를 컨트롤하거나 어떤 콤포넌트들의 위에서 그림을 그릴수 있다는 것이다. 기본적으로 glassPane은 보이지 않게 되어있다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUfnhwU7Qe68Elub9tCXi1X4O3Rb0wWCeq1YIu4Gta5ThkQ6hn56tPyRWnI5IGv5wMVsemTHCOBdd4JgY_KNqTbE0lpv0AI1TC-AueRpjvZQKHo14XSPYwIHwHWbLx7uI4cUVsy5dtDAmY/s1600/ui-rootPane.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;310&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUfnhwU7Qe68Elub9tCXi1X4O3Rb0wWCeq1YIu4Gta5ThkQ6hn56tPyRWnI5IGv5wMVsemTHCOBdd4JgY_KNqTbE0lpv0AI1TC-AueRpjvZQKHo14XSPYwIHwHWbLx7uI4cUVsy5dtDAmY/s400/ui-rootPane.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
컨테이너들의 컨텐츠들은 사실 그것들과 관계된 content pane에 저장되는데 스윙 컨테이너에 바로 add( ) 메소드를 이용하지 않고 대신에 컨테이너의 content pane을 거쳐서 add하게 된다. 다시 말해, content pane을 거친다는 의미는 코드상으로 getContentPane( ) 메소드를 이용한 중간단계가 있다는 것을 의미한다.&lt;br /&gt;
&lt;br /&gt;
이렇게 쓰면 컨테이너는 도대체 뭐냐고 하는 이들이 있을 것이다.^^ Root 한마디로 최상위 컨테이너들은 총 다섯가지가 있다. 나열해보면 JFrame, JDialog, JApplet, JWindow, JInternalFrame이 있는데 자바 애플리케이션 만들때 사용하는거라는건 다 알테고 JInternalFrame은 자바 애플리케이션 안에 여러개의 프레임을 만들때 필요하다. 다른 컨테이너들이야 이름지어진 뜻데로 생각하면 될테고 그전 강의들에서 필자가 다루어왔으니 다 알것이라 믿겠다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
컨테이너들은 JFrame, JDialog, JApplet, 별로 쓰이지 않아서 빼고 싶은 JWindow가 대표적인 컨테이너들이다. 그리고 light-weight 경량 컨테이너인 JInternalFrame이 있겠으나 이건 AWT 클래스를 계승하고 있지 않으므로 약간 동떨어진 삘을 받는다. 이해가 되지 않으면 그림을 살짝 들여다보면 이해가 될것이라 생각한다. 어차피 이번 강좌의 내용은 스윙의 구조도에 대한 기본적인 체계에 대한 설명이니 설령 어렵게 느껴지더라도 스윙을 많이 접하게 되면 이래서 되고 저래서 안되는구나하는 이치를 저절로 깨닫게된다. 한마디로 시간이 약이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1p29JcK2XFrZAFgVlJ17oEoR16_9QUSce3LrHP7eYE7sXkXEh1tGTpzJbGbUcCa5VG7XA9dvbwvKEkeNI-8SY_RqQ9JA0MkuAsil8uLq0y6hzE9eMVOJYlItMKrO2WlI3yJv8XhyRoTwN/s1600/JRootPane-2.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1p29JcK2XFrZAFgVlJ17oEoR16_9QUSce3LrHP7eYE7sXkXEh1tGTpzJbGbUcCa5VG7XA9dvbwvKEkeNI-8SY_RqQ9JA0MkuAsil8uLq0y6hzE9eMVOJYlItMKrO2WlI3yJv8XhyRoTwN/s400/JRootPane-2.gif&quot; width=&quot;361&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
하지만 필자가 누구더냐? 그런 이들을 위해 그냥 간단하고 심플한 예제 하나로 본 내용의 이치와 정석을 깨우치도록 해보겠다. 실행할 예제의 결과는 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKuagApO6ZDOsJdJEqXUCiisAt92E2U6_erc3IcAnH28S1kj1T53h6Zg901CkN5jEyPRK6BW3RV9Us3oJFBZXc4uVTgarmTltFqnfC_l8M2KSXnh96zMpBmhvkNK1YjBCCrurA1jrNCVMh/s1600/105r.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKuagApO6ZDOsJdJEqXUCiisAt92E2U6_erc3IcAnH28S1kj1T53h6Zg901CkN5jEyPRK6BW3RV9Us3oJFBZXc4uVTgarmTltFqnfC_l8M2KSXnh96zMpBmhvkNK1YjBCCrurA1jrNCVMh/s400/105r.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
사실 말로만 끝내도 상관없으나 프레임처럼 최상위 컨테이너에 해당하는 contentPane은 JRootPane의 인스턴스 객체안에서 생성되므로 사실 정의할 필요가 없으나 JRootpane의 클래스 인스턴스를 직접적으로 정의하고 쓴다면 그에 필요한 컨테이너를 정의하여야 한다.&amp;nbsp;바로 그것이 아까 초반부에 얘기한 중간단계라는 것이다. 사실 자바의 JRootPane을 공부하면서 가장 어렵게 느껴지는 부분이 이것이므로 이에 대한 예제를 핵심코드라인 2줄로서 그 차이점을 명쾌하게 파헤쳐본 것이 아래의 예제라 하겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTPpGJFQgEu2Liw08ZoasyPu1VQ5UZIUl_inIg18MYVOOXkux0rUo3QPHvcukFUx4j7tPK0-Al5CwGKjzZqHKvIGxP_rGK6AYr1Md0KXtJ-X8hKpjwO6iaFontJCG-jB4vt0WP_F-gJtJ9/s1600/105t.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;396&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTPpGJFQgEu2Liw08ZoasyPu1VQ5UZIUl_inIg18MYVOOXkux0rUo3QPHvcukFUx4j7tPK0-Al5CwGKjzZqHKvIGxP_rGK6AYr1Md0KXtJ-X8hKpjwO6iaFontJCG-jB4vt0WP_F-gJtJ9/s400/105t.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
예제를 보고 직접 해보면 무엇을 설명하고자 하는지 알게되리라 본다. 그럼 이로서 그동안 진행해온 스윙을 간략하게나마 이렇게 마무리하고 다음 시간부터는 새로운 주제와 내용으로 무장해서 여러분의 기대와 성원에 성심성의껏 부응해 보도록 하겠다. 그럼 좋은 하루~^^&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/2835551127158985729/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/09/jrootpane.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/2835551127158985729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/2835551127158985729'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/09/jrootpane.html' title='스윙으로 원본창 만들기(JRootPane)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhcry7cXthSLEIkeR2iCEnGna18WogO3DEwo5mNHzXbR8g1sguuXkyaPbuVnqu4ogGlan-A6TR2Lrr77NNMLnMMGTovOcvOUMMlJlR8sFP_65DiUfLIUcFe1L9FfVmaESoHEWO4nIasqNV/s72-c/JRootPane-1.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-7151496732437182376</id><published>2012-07-22T12:49:00.000-07:00</published><updated>2012-07-23T22:26:20.733-07:00</updated><title type='text'>스윙으로 레이어 만들기(JLayeredPane)</title><content type='html'>혹시 여러분은 자바의 마스코트가 무엇인지 아는가?&lt;br /&gt;
모르겠다면 여기를 보시라~ 쨔잔~&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg77-KD4OVKT3qwVC4FPbxDzNQLzGIyLdqKK4gDALDJPMP3o56TLKGkKoub3i5vb45_TPjmrWSUPMEE82_B692zoPd8i7jmp6aJE8wnqjiDX2D6kIPHviWpjKbZOlgANvH-NiUgzNYgXjtz/s1600/java_duke.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg77-KD4OVKT3qwVC4FPbxDzNQLzGIyLdqKK4gDALDJPMP3o56TLKGkKoub3i5vb45_TPjmrWSUPMEE82_B692zoPd8i7jmp6aJE8wnqjiDX2D6kIPHviWpjKbZOlgANvH-NiUgzNYgXjtz/s320/java_duke.gif&quot; width=&quot;311&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
자바(Java)의 공식 마스코트인 듀크(Duke)를 소개합니다당.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcjTq3fuaET4OK57sFETMsC7lMEd17Jnkl8yuioy7wxc1eqrPZI6aIjTsCEFBhfqzkP9nwvtReAzP166EC132iWf7Gr5MnCBsa97tOwpqF5aLcWdzVRY8x4yCv_BiDQnyqLGk-3ZDF-2Rp/s1600/Java_Duke.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcjTq3fuaET4OK57sFETMsC7lMEd17Jnkl8yuioy7wxc1eqrPZI6aIjTsCEFBhfqzkP9nwvtReAzP166EC132iWf7Gr5MnCBsa97tOwpqF5aLcWdzVRY8x4yCv_BiDQnyqLGk-3ZDF-2Rp/s400/Java_Duke.png&quot; width=&quot;370&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
크흐 역시 자바의 마스코트에 걸맞게 공부를 하고 있군요.^^&lt;br /&gt;
&lt;br /&gt;
듀크는 오래전 썬마이크로시스템스사에서 자바를 개발할 당시에 그린 프로젝트팀(Green Project Team)의 첫작품 스타7(Star7)이라는 홈 엔터테인먼트 기기의 유저인터페이스에 삽입된 만화캐릭터가 있는데 그게 바로 지금 소개한 듀크다. 당시 팀의 그래픽을 담당했던 멤버로서 듀크를 디자인한 조 팔랑(Joe Palrang)은 지금은 너무나도 유명한 애니메이션 영화 &quot;슈렉&quot;으로 널리 알려진 그래픽 아티스트다. 이런 듀크는 2006년 자바 테크놀로지의 공식 마스코트로 세상에 널리 알려지게 되면서 대표적인 오픈소스 시대의 아이콘으로 자리잡았다.&lt;br /&gt;
&lt;br /&gt;
필자가 갑자기 강의는 하다말고 도대체 왜 듀크를 소개하느냐고 부글부글 학구열에 불타오르는 이가 혹시 있을지도 모르겠는데 만약 만에 하나 혹시라도 만명중에 한명이라도 있다면 진정하라. 그건 다름아닌 필자의 강의에 JLayeredPane 특별게스트로 듀크가 등장하기 때문이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
지금부터 잠시 숨은 그림 찾기를 시작해 보겠다. 아래의 두 그림을 보면서 듀크가 어느 판떼기(?) 선상에 있는지 대답해보기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhgrvSEznUmLn5dSJNspbsGM28Ug6lCbKYnCc0M7EcKbjp8cEwnS7uEr0XuJoV3gXWMo07Dlr6vcl59DWfhiiRtp9eKOKZVlp2xD1faj4TiQJ56t0LJzGsPs8rWLnCw2ozfA98HnrrU_Av/s1600/ui-LayeredPaneM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;259&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhgrvSEznUmLn5dSJNspbsGM28Ug6lCbKYnCc0M7EcKbjp8cEwnS7uEr0XuJoV3gXWMo07Dlr6vcl59DWfhiiRtp9eKOKZVlp2xD1faj4TiQJ56t0LJzGsPs8rWLnCw2ozfA98HnrrU_Av/s400/ui-LayeredPaneM.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGDfjbBPKgg5Vr1roOrkdAHS-WKSqGPTJa-hOwwodwI3RwqsqJFFUbaLSZIWw78dUeZTAAvn0sDz9Jwju-iVJJp3T9xyNUffgPXvA-LFauoX4aTj-wZJHaabGaqMQPECYWmFszRs1yLifA/s1600/LayeredPaneDemoMetal.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGDfjbBPKgg5Vr1roOrkdAHS-WKSqGPTJa-hOwwodwI3RwqsqJFFUbaLSZIWw78dUeZTAAvn0sDz9Jwju-iVJJp3T9xyNUffgPXvA-LFauoX4aTj-wZJHaabGaqMQPECYWmFszRs1yLifA/s400/LayeredPaneDemoMetal.png&quot; width=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
자 위의 두 그림에 듀크가 여러분에게 손을 흔들고 있다. 듀크는 어느 판떼기 선상에 있는가? 첫번째 그림부터 보면 처음은 Yellow (0) 판떼기랑 같은 레벨에서 손을 흔들고 있고 두번째 다음 그림에는 Cyan (2) 판떼기랑 동일 선상에서 손을 흔들고 있다. 그림의 상단부분을 보면 이미 해답이 나와있는 것을 알수 있을 것이다. 여기서 필자가 진정 말하고자 하는 부분은 이렇게 판떼기를 겹겹히 쌓아놓은 것만으로도 입체감있게 화면구성이 가능하다는 점이다. 이런 구성은 여러분이 평소 알게 모르게 접하고 있는 프로그램들의 메뉴바나 툴바같은 화면을 상상하면 이해가 쉬울 것이다. 그림을 보면 듀크가 빨간 판떼기 뒤에서 손을 흔들고 있는것처럼 보이지 않는가? 바로 이렇게 원근감 있게 화면을 구성가능하도록 만들어주는 스윙 클래스가 바로 오늘 배울 JLayeredPane 되시겠다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
서론이 길었다만 자바 3D(3rd Dimension) 세계를 몸소 체험할수 있는 강의가 이제부터 전개된다. 그 이름하여 JLayeredPane 되시겠다. 자 영어가 약한 이들은 단어부터 찾아본다. layer랑 pane이 무엇인지를 말이다. 대충 감이 올텐데 간단하게 필자가 그냥 못박아서 말해주겠다. 층층이 쌓아놓은 판떼기로 해석하면 되겠다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
자바코드가 어쨌거나 영어로 만들어야되다보니 layer나 pane같은 용어가 나오면 말그대로 레이어 때문에 폐인이 되는듯한 금단현상(?)이 올지도 모르겠다. 여러분은 오늘 아마 시간이 지나면 지날수록 온몸의 사지가 마비되고 경직되어 심한 정보로 인한 심부전 및 심장마비등 호흡중추를 마비시키는 강한 부작용이 일어날수 있으나 그것은 모두 필자의 강의에서 비롯되는 엄청난 희열로 촉발된 엔돌핀에 유발되는 반응이기 때문에 안심해도 된다. 오늘 강의가 그 정도의 폭발력을 가진 강좌이기 때문에 그런 현상은 지극히도 당연한 것이다.ㅎㅎ 그러니 본 강의에 졸지말고 눈좀 뜨란 말여~ 껄껄 강좌가 진행될수록 필자의 농(?)만 들어가는구나.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
다시 돌아가서 위의 그림들을 보면 칼라 옆에 괄호로 숫자들이 적혀있을 것이다. 그게 무엇을 표시한거냐면 깊이(depth)다. 수치가 높을수록 점점더 층이, 레이어가 높아진다고 생각하면 쉽게 이해가 될것이다. 한마디로 위판떼기부터 아래판떼기까지의 깊이라 생각하면 된다. 유식한말로 Z order 젯 오더다. 오케? ^^&lt;br /&gt;
&lt;br /&gt;
그럼 언제나처럼 이제 필자가 한타 한타 하루가 일년같이 정성에 정성을 쏟아부은 명품(名品) 예제를 보는 시간을 갖겠다. 항상 그렇지만 이상하리만치 예제만 보아도 술술 이해되는 놀라운 경험을 하게 될것이다. 단 그를 위해선 한가지 조건이 있다. 타자좀 쳐라~ 그냥 눈으로 보지만 말고~~ 난 다 알고있다. 그(?)가 누군지. -.-; ㅎㅎ 그럼 어떤걸 만드는지 결과부터 보고 소스를 보기로 하자.&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA4Z298l3mWicG5i66R9ZU3nMG7_-T7_L8HJ7qQH96c3A-QddQtIDaO9lskM1gdmPFy7_oeNcOi2L28NWfXg5V4lTJYHIUraOzANspDVm5npaNjhjEvPdQ8CtRpzz-J2cBLT7UDopxfpEs/s1600/r103.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA4Z298l3mWicG5i66R9ZU3nMG7_-T7_L8HJ7qQH96c3A-QddQtIDaO9lskM1gdmPFy7_oeNcOi2L28NWfXg5V4lTJYHIUraOzANspDVm5npaNjhjEvPdQ8CtRpzz-J2cBLT7UDopxfpEs/s400/r103.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
총 다섯장의 판떼기를 만들었다. 어떻게 이렇게 판떼기를 겹겹히 쌓아놓은 것처럼 보이게 만들수 있을까? 다시 말해서 JLayeredPane 클래스를 어떻게 써야 이렇게 입체감이 나게 만들수 있을까? &amp;nbsp;여러분은 오늘 강좌를 통해서 이제 자바로 3D(?)를 구현할수 있게 된다. 개봉박두~ ㅎㅎ 그럼 소스를 보자.&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_1Bq_SYZap0g6hLMsevVprn8qWBd9LwDFApT2N_MS9ut1irtgonT-NrUCrgaMbVAKmDz-ymUMV_ahqVK2RhnNrIKcLnRN3mXNugrUMlk6V8zGMEgHPDrb9Fi1XyXp77oOQ-sg3bqO1rKR/s1600/t103.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_1Bq_SYZap0g6hLMsevVprn8qWBd9LwDFApT2N_MS9ut1irtgonT-NrUCrgaMbVAKmDz-ymUMV_ahqVK2RhnNrIKcLnRN3mXNugrUMlk6V8zGMEgHPDrb9Fi1XyXp77oOQ-sg3bqO1rKR/s400/t103.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
소스가 좀 길어서 그런지 눈이 침침하다 하는 이들은 클릭혀라. ㅎㅎ 소스가 길어보이나 여러분이 오늘 알아야할 내용은 단지 아래의 여섯줄에 불과하다.&lt;br /&gt;
&lt;br /&gt;
JLayeredPane jlp=frame.getLayeredPane( );&lt;br /&gt;
&lt;br /&gt;
jlp.add(one,new Integer(0));&lt;br /&gt;
jlp.add(two,new Integer(100));&lt;br /&gt;
jlp.add(three,new Integer(200));&lt;br /&gt;
jlp.add(four,new Integer(300));&lt;br /&gt;
jlp.add(five,new Integer(400));&lt;br /&gt;
&lt;br /&gt;
그래도 설명을 덧붙이자면 프레임을 만들고 판떼기를 간단하게 버튼으로 만들었다. 이미 JButton에 대해서 배웠으니 코드보고 이 정도는 손쉽게 진행가능하리라 생각한다. 그리고 오늘 배우려는 JLayeredPane에 대해서 덧붙이면 끝난다. 여기서도 조금 더 덧붙이자면 버튼만들때&amp;nbsp;setBackground( )랑 setBounds( ) 메소드는 어디서 튀어나온거야 하는 이들은 없겠징? 이미 써보기도 했을 것이고 이제 이런건 스스로 깨우칠때가 되었지만 다시 설명하자면 JButton에 대해서 곰곰히 들춰보면 대부분의 스윙 클래스가 그렇듯이 기존의 awt 콤포넌트(Component)와 컨테이너(Container) 내용을 다 쓸수 있도록 계승하고 있다. 이런 메소드들은 콤포넌트의 일종이므로 별다른 제약없이 필요하면 이렇게 그래픽 요소들을 편하게 쓸수 있도록 자바에서 배려해놓은 것이니 잘만 활용하면 될것이다. 말한김에 컨테이너는 콤포넌트를 보강하기 위해 만들어놓은 것이라 생각해도 무방하다. 그리고 이런 것들을 스윙에서는 JComponent에서 계승하고 있다. 사실 이런건 자바 클래스 족보를 열심히 보면 자연스레 습득되는 것이니 이거 또 외운다고 그러지는 말아라. 족보도 필자가 초반에 보여줬을텐데 언젠가 써먹게될꺼라고 말이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
자 사설 그만접고 다시 강의로 돌아가서 보면 setBackgound( )는 한마디로 판떼기 색깔 정하자는 것이고 setBounds( )는 판떼기 위치랑 사이즈 정하자는 것이다. 이건 예전 시간에 했으니 따로 설명하지 않겠다. 자 그럼 본격적으로 오늘의 핵심인 위의 코드 여섯줄을 분석해 보자.&lt;br /&gt;
&lt;br /&gt;
JLayeredPane jlp=frame.getLayeredPane( );
&lt;br /&gt;
&lt;br /&gt;
말그대로 JLayeredPane 쓰려고 jlp라는 인스턴스를 만들었다. 오른편은 지금 이 프레임에 레이어페인 쓰기위해 가져오자는 것이다.&amp;nbsp;JApplet, JDialog, JFrame, JInternalFrame, JRootPane, JWindow, RootPaneContainer 같은 클래스에서는 &amp;nbsp;이런 레이어 페인을 자동으로 쓸수 있게끔 되어있으므로 그냥 가져와서 편하게 쓰면 된다. 그리고나서 소스처럼 JLayeredPane에다가 add( ) 메소드를 이용해서 각 판떼기에 깊이를 Integer를 이용해서 수치를 지정하면 수치에 따라 화면에 판떼기가 층층이 쌓이는 것이다.ㅎㅎ 물론 수치는 아무거나 바꿔도 된다. 수치 바꿔가면서 어떻게 판떼기 배치가 바뀌는지 관찰하면서 공부하기 바란다. 필자가 수치를 이렇게 적어놓은것도 판떼기를 다섯장 만든것도 다 이유가 있는데 그 이유는 좀더 읽어보면 필자의 아낌없이 퍼주는 세심한 배려에 여러분의 마음은 장작불을 때듯 뜨겁게 타오를 것이다.^^&lt;br /&gt;
&lt;br /&gt;
잠깐, 아직 안 끝났다.ㅎㅎ 밑에 보면 코드 다섯줄 생략해 놓은 부분이 있는데 이것을 이제부터 설명하겠다. 정확히 위의 다섯줄과 대체가 가능한데 아래의 그림 한장을 보면 특별한 설명없이도 저절로 이해가 될것이다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaveNfj_z-O1PJWeA8e5kMS1oMoqWoMbgC0h3inUeksJ2UxzIxTPPx-h5qoQ9sIrSXjqFY5mDOI1Vp3x1S1j2d9rZu8qHNlVjUIF_d0IxWg_CkfauHGkTuvzpUBON6-HtJ24HiA5WeBFeT/s1600/JLayeredPane-1.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;392&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaveNfj_z-O1PJWeA8e5kMS1oMoqWoMbgC0h3inUeksJ2UxzIxTPPx-h5qoQ9sIrSXjqFY5mDOI1Vp3x1S1j2d9rZu8qHNlVjUIF_d0IxWg_CkfauHGkTuvzpUBON6-HtJ24HiA5WeBFeT/s400/JLayeredPane-1.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
자바에서는 판떼기를 편하게 배치하라고 이렇게 이름을 만들어 놓았다.&lt;br /&gt;
&lt;br /&gt;
한마디로&lt;br /&gt;
DEFAULT_LAYER랑 new Integer(0)랑 같고
&lt;br /&gt;
PALETTE_LAYER랑 new Integer(100)랑 같고&lt;br /&gt;
MODAL_LAYER랑 new Integer(200)랑 같고&lt;br /&gt;
POPUP_LAYER랑 new Integer(300)랑 같고&lt;br /&gt;
DRAG_LAYER랑 new Integer(400)랑 같다.&lt;br /&gt;
&lt;br /&gt;
일반적으로 레이어를 놓으면 DEFAULT_LAYER 깊이로 정해진다고 생각하면 된다. 그리고 사실 디폴트 레이어 밑에 FRAME_CONTENT_LAYER 즉 new Integer(-30000)에 해당하는 레벨의 레이어가 있는데 잘은 쓰지 않으므로 일단 참고로 있다고만 알아두기 바란다. 이런 명령어들은 편하게 쓰라고 자바에서 배려해놓은 코드인데 이 내용을 몰라서 저건 또 뭐지뭐지하는 이들이 많은데 오늘 강이의 자바 강좌를 정독한 이들은 이제 이런 늪에서 빠져나오기 바란다.^^ 그동안 스윙 강좌만 계속 진행하니 다른 논리 강좌 좀 해달라고 물밀듯이 밀려오는 성화에 필자는 여러분의 요청을 급겸허히 받아들여 다음 시간에 스윙에 관련된 강좌를 마지막으로 진행하고 다른 부분을 건드리기로 심사숙고해서 결정을 내렸다. 필자가 중대한 결정을 내린만큼 남은 마지막 시간까지 최선을 다해 강의에 임해주기 바란다. 이상은 원래 예정된 강좌 수순이므로 어차피 다음이 마지막 스윙 강좌인 것을 강조할겸해서 급과장을 한것임을 특별히 알리는 바이다. 장문의 글을 읽느라 수고 많았다. 모두 냉수나 한잔 마시자~ㅎㅎ&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/7151496732437182376/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/07/jlayeredpane.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/7151496732437182376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/7151496732437182376'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/07/jlayeredpane.html' title='스윙으로 레이어 만들기(JLayeredPane)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg77-KD4OVKT3qwVC4FPbxDzNQLzGIyLdqKK4gDALDJPMP3o56TLKGkKoub3i5vb45_TPjmrWSUPMEE82_B692zoPd8i7jmp6aJE8wnqjiDX2D6kIPHviWpjKbZOlgANvH-NiUgzNYgXjtz/s72-c/java_duke.gif" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-5999221801796592562</id><published>2012-06-17T18:27:00.001-07:00</published><updated>2012-06-17T18:27:21.682-07:00</updated><title type='text'>스윙으로 내부프레임 만들기(JInternalFrame)</title><content type='html'>&lt;br /&gt;
&lt;b&gt;Special-Purpose Containers&lt;/b&gt;&lt;br /&gt;
JInternalFrame&lt;br /&gt;
JLayeredPane&lt;br /&gt;
Root pane(JRootPane)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오늘부터는 UI에서 특정한 목적을 수행하기 위해 쓰이는 콤포넌츠에 대해서 공부해 보기로 하겠다. 위의 총 3가지 콤포넌트들을 살펴볼텐데 각각의 컨테이너들이 어떻게 쓰이는지 각 요소별로 필자의 예제와 곁들인 학습을 통해 여러분의 사고력을 증진시키는데 중요한 시간이 되리라 기대하면서 순서대로 오늘부터 학습하겠다. 그럼 오늘은 JInternalFrame에 대해서 알아보면서 슬슬 시작해보자.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn967lRHCWD0LHGqH3XxGCzJbTtFkJx7-MWWz_ZwwDDNXQi0HcpwsEPsGKF2BtArUJ5ZkjMQ_p35tecVQpMk6zuPlQ1514RhH39Hgs_Zh_W6FGW_-XYbI-tI1_sGeAzLVmf_jKtPERflnA/s1600/InternalFrameDemoMetal.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;258&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn967lRHCWD0LHGqH3XxGCzJbTtFkJx7-MWWz_ZwwDDNXQi0HcpwsEPsGKF2BtArUJ5ZkjMQ_p35tecVQpMk6zuPlQ1514RhH39Hgs_Zh_W6FGW_-XYbI-tI1_sGeAzLVmf_jKtPERflnA/s400/InternalFrameDemoMetal.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
JInternalFrame의 단어에서 풍기는 의미를 분석해보자. J로 시작하니 자바스윙이고 Internal이라고 하니 뭔가 안에 있는 것이고 Frame이라고 하니 프레임인가 보다. 그러니 자바스윙으로 내부프레임을 지칭하고 있는 함축적인 의미가 영어단어만 봐도 머리속에 팍팍오고 있을 것이라 기대하면서도 깊은 의심이 맴돌고 반신반의하는 마음이 교차하고 있지만 필자는 여러분을 굳게 믿고 묵묵히 강의를 진행해 보겠다.ㅎㅎ&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZwAe-Sx0qJ__HknjfYytj8c_MQy8r3JXv88B0t5XRhHTmo_Cjq8QP6zmO0APgzqpAWHe7JXQg0rzfpPIBg4V93xAtH2OeJP2e-VeC_Gut-BC2ai-rUbYKjdjvjCFrlLYu_0tf4nGUYaP9/s1600/r1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZwAe-Sx0qJ__HknjfYytj8c_MQy8r3JXv88B0t5XRhHTmo_Cjq8QP6zmO0APgzqpAWHe7JXQg0rzfpPIBg4V93xAtH2OeJP2e-VeC_Gut-BC2ai-rUbYKjdjvjCFrlLYu_0tf4nGUYaP9/s400/r1.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ96Zf_igG20b2vw1CCkHgbaSokq8ZOqatB76oL6Cxr-lfxjwX0gbAu5dceP3WUwja2mDsWjyrg_aB9F6OrnIgd_8_iDoSgxUztiEnyTSixyphPo4QTfM5XLCVC9VNDd-1ijUEJOmPsaFE/s1600/r2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ96Zf_igG20b2vw1CCkHgbaSokq8ZOqatB76oL6Cxr-lfxjwX0gbAu5dceP3WUwja2mDsWjyrg_aB9F6OrnIgd_8_iDoSgxUztiEnyTSixyphPo4QTfM5XLCVC9VNDd-1ijUEJOmPsaFE/s400/r2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9ZMahhX0kjOXmxojo8c3jwp3OUcpEEkp1w-LqnCzKsxxkaAQDs6fqcPAeT-Mfj_dpyNhIRz1l1Q76KXrGNsBYmXrXMlNPCr_C1ciKRo2XtYT7wQOSNjSxzcpUKwDZCRGMPKXAsXMFfZrH/s1600/r3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9ZMahhX0kjOXmxojo8c3jwp3OUcpEEkp1w-LqnCzKsxxkaAQDs6fqcPAeT-Mfj_dpyNhIRz1l1Q76KXrGNsBYmXrXMlNPCr_C1ciKRo2XtYT7wQOSNjSxzcpUKwDZCRGMPKXAsXMFfZrH/s400/r3.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
오늘 공부하게될 예제의 결과물을 여러분의 흥미를 돋구기 위해 미리 공개하였다. 위의 그림에서 보다시피 가장 바깥에 항상 있는 기존 프레임 안을 보면 총 5가지의 내부프레임이 보일 것이다. 이 5가지의 내부프레임을 통해 여러분은 내부프레임으로 구성할수 있는 5가지 핵심기능들의 정수들을 바로 오늘 이시간 필자의 예제를 통해 짜릿한 흥분과 엄청난 경외심을 느끼면서 공부하게 될것이라 내심 흠칫 기대해 보면서 슬슬 이야기 보따리를 풀어보겠다.^^&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
예제코드를 보기에 앞서 여러분의 이해도를 높이기 위해 JInternalFrame을 쓸때 항상 염두에 두면서 프로그램을 짜야하는 사항이 있는데 그중에서 가장 기본적인 사항들을 간략하게 설명하자면 첫째로 내부프레임을 쓰기위해서 컨테이너에 집어넣어야 하고, 둘째로 사이즈를 지정해야하고, 셋째로 위치를 지정해야하고, 넷째 마지막으로 이것을 보이게끔 설정해 주어야한다.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
지금 저게 무슨 말이지 정신이 멍한 이들이 있다면 그것은 너무도 당연한 것이다. 배우지도 않았는데 어떻게 벌써 다 이해한단 말인가? 원래 강의란 것이 좀 어렵다싶은 화두를 던져놔야 그게 나중에 그럴듯해 보인다.ㅎㅎ&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
자 설명 들어간다. 내부프레임을 만들려고 하는데 그럼 당연히 어느정도 크기로 만들어야지하는 기본적인 질문이 생길것이다. 그리고 프레임안에 넣으니 어디에 표시를 해야될지 생각하게 될거고 내부프레임 기본 설정이 자바에서는 기존 프레임처럼 원래 보이지 않게끔 되어있다. 따라서 이것을 보이게끔 바꿔줘야 써먹을수가 있도록 자바에서 만들어 놨으니 그냥 보이게끔 설정하는 방법만 알면된다. 너무 당연한걸 풀어서 설명하니까 어이가 없을 것이다. 이제 이 당연한 것을 예제코드로 보면서 여러분이 궁금해할만한 포인트만 콕콕 찝어서 풀어내도록 하겠다.^^&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqBxNjcyDDtGN8ElIlAqAvMhQFTzVhTB8oq0CqG0Vyz4RBRsZoa7VKLuj-4Nqi6dgANpXvrzkxuWVRCBkUCnYo7x-FYjUQQC383U5ya0Va515g7AVseXb0rhmzbYK3SuW4NF6xgiXQLPNy/s1600/t102.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqBxNjcyDDtGN8ElIlAqAvMhQFTzVhTB8oq0CqG0Vyz4RBRsZoa7VKLuj-4Nqi6dgANpXvrzkxuWVRCBkUCnYo7x-FYjUQQC383U5ya0Va515g7AVseXb0rhmzbYK3SuW4NF6xgiXQLPNy/s400/t102.jpg&quot; width=&quot;335&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
필자가 내부프레임에 대해서 핵심만 공부할수 있도록 정성에 정성을 담았으니 여러분은 온 힘을 기울여 필자의 정성을 쪽쪽 빨아가야 할것이다. 자 그럼 예제를 분석해 보도록 하자. 여러분이 위의 클래스 불러들인 것을 보면서 내부프레임 클래스 말고&amp;nbsp;JDesktopPane이라고 하는&amp;nbsp;생소한 클래스가 하나 보일 것이다. 아까 필자가 컨테이너에 넣어서 내부프레임을 만들어야 보인다고 했는데 보통 이 클래스에다가 내부프레임을 넣어서 보이도록 만든다.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
JDesktopPane은 JInternalFrame의 부모격으로 쓰인다고 생각하면서 이용하면 이해가 쉬울 것이다. 또한 JDesktopPane에서 기본적으로 유저인터페이스의 자바 룩앤필이 적용되어 있으니 내부프레임이 조금 그럴듯하게 기존 윈도우 프레임보다 멋있게 나온다.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
다시 프로그램으로 돌아가서 보면 이 예제의 핵심 부분은 바로 Enhanced For Loop 안에 있는 것이 지금 공부해야될 내부프레임의 요체라 할수 있겠다. 사실 포룹 위아래에 있는 것은 여태껏 지겹게 보아왔을 것이므로 설명 생략하고 본론으로 들어갸겠다. 그리고 향상된 포룹 형태인 enhanced for loop에 대해서 까먹었다면 필자가 예전에 강의했던 for loop 강좌를 다시 한번 숙지하고 이 자리로 돌아와서 보기 바란다. 필자 리바이벌은 안한다.ㅎㅎ&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
왜 필자는 For 룹을 굳이 이용했을까? 이런 의문이 드는가? 그럼 다시 한번 예제의 결과물을 쳐다보기 바란다. 내부프레임을 5개 만들려고 한다. 프레임이 다 비슷비슷하다. 그림처럼 코드도 거의 비슷한 것이 5번이나 반복될 것인데 이것을 왜 5배나 힘들게 생고생해야하나? 배운 것은 써먹자. 제발, 아끼지 말고~ ㅎㅎ&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;pre&gt;public &lt;b&gt;JInternalFrame&lt;/b&gt;(&lt;a href=&quot;file:///C:/Program%20Files/Java/docs/api/java/lang/String.html&quot; title=&quot;class in java.lang&quot;&gt;String&lt;/a&gt;&amp;nbsp;title,
                      boolean&amp;nbsp;resizable,
                      boolean&amp;nbsp;closable,
                      boolean&amp;nbsp;maximizable,
                      boolean&amp;nbsp;iconifiable)&lt;/pre&gt;
&lt;pre&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Gulim; white-space: normal;&quot;&gt;지금 위의 코드는 바로 JInternalFrame의 생성자 중 하나인데 필자의 예제에 있는 internalFramesArray가 바로 이를 기초로 하고 있다. 첫째 매개변수는 제목을 쓰는데고, 두번째는 프레임에다가 마우스 갖다대면 화살표로 바뀌면서 폈다 줄였다 하는 기능이고, 세번째는 창을 닫게 하는 기능, 네번째는 보통 프레임 오른쪽 상단에 보면 중간에 있는 버튼으로 화면 확대와 줄임 기능이고, 다섯번째는 보통 프레임 첫번째에 위치하는 버튼으로 화면을 최소화할때 사용하는 기능을 말하는데 이게 boolean이다. 따라서 true나 false로 가능하게 만들지 아니면 사용하지 못하게 할지의 여부를 결정할수 있는 것이다. 예제의 배열에서 필자가 false를 각 요소마다 하나씩 넣은 이유가 이런 기능들을 프로그램을 구동시키면서 살펴보라고 고려한 끝없는 배려심이 담겨있는 것이니 그점 생각하면서 직접 버튼을 눌러보면서 차이점을 알아보는 시간을 필히 갖기 바란다.^^&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Gulim; white-space: normal;&quot;&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Gulim;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;그리고 필자가 예제의 핵심부분이라고 말했던 for 룹은 실상 가르칠게 없다. 여러분은 이미 알게모르게 내부프레임의 정수를 깨우치고 있을 것이기 때문이다. 필자가 내부프레임을 만들때 염두에 두어야 하는 사항 네가지를 이미 알려주었다. 그 네가지 사항이 바로 for 룹안에 있는 네단락에서 펼쳐지고 있는 것이다. 내부프레임을 어떻게 만드는지 프로그램의 흐름을 이미 알고있다면 그냥 보기만해도 저절로 이해가 될것이다. 굳이 들어가자면 사이즈와 크기를 지정하는 방법이 궁금할텐데 필자가 이미 그건 주석을 달아 한큐에 해결해 버렸으니 더 설명할 것도 없을 것이나 그래도 궁금해하는 이들이 혹여나 있을까봐 조금만 더더 설명하겠다.ㅎㅎ&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Gulim;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Gulim;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;사이즈와 크기를 한큐로 해결하는 방법이 콤포넌트에 있는 setBounds( )라는 메소드를 이용하는 방법이다. 물론 setSize나 setLocation같은 메소드를 이용할수도 있겠으나 좋은 길 놔두고 굳이 돌아갈 필요는 없다하겠다.&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Gulim;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Gulim;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;public void setBounds(int x, int y, int width, int height)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Gulim;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;pre&gt;&lt;span style=&quot;font-family: Gulim;&quot;&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;바로 위의 코드인데 x랑 y는 중심 좌표로 위치를 찍을수 있고 width랑 height을 통해 프레임의 가로와 세로 사이즈를 정할수 있다. 그리고 CENTER가 들어가 있는 것들은 원하는 곳에 위치를 설정해 주는 것인데 프레임을 최소화하거나 최대화시켰을때 내부프레임이 제대로 표시되도록 해주기위한 장치이다. 이게 말로 설명하는 것보다 이거 없애버리고 직접 실행해보면 저절로 알게된다. 마지막으로 setVisible( ) 메소드를 통해 보이게끔 만들어주는데 기존 프레임처럼 내부프레임도 이것이 있어야 볼수 있음을 잊지 말기 바란다. 한마디로 내부프레임을 만들면서 기본적으로 고려해야할 사항 네가지를 여러분이 숙지한다면 거침이 없을 것이다.^^&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/5999221801796592562/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/06/jinternalframe.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/5999221801796592562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/5999221801796592562'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/06/jinternalframe.html' title='스윙으로 내부프레임 만들기(JInternalFrame)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn967lRHCWD0LHGqH3XxGCzJbTtFkJx7-MWWz_ZwwDDNXQi0HcpwsEPsGKF2BtArUJ5ZkjMQ_p35tecVQpMk6zuPlQ1514RhH39Hgs_Zh_W6FGW_-XYbI-tI1_sGeAzLVmf_jKtPERflnA/s72-c/InternalFrameDemoMetal.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-6200004684059753870</id><published>2012-04-28T23:31:00.001-07:00</published><updated>2012-04-28T23:36:19.747-07:00</updated><title type='text'>스윙으로 도구바 만들기(JToolBar)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjroY4EStTCF_dIovfmq5aEm78gazVn_4LhWJfdx4mFPyDbw7mUcUyhDmWRhZyaFJCu7m2TLwSIm03FlIvxPHBmyiywj7qo0bhlV2WgxOEbkExUvlSox99JgRGpp2mfWx_yIscx1f-mJnC2/s1600/swing-hierarchy.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;283&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjroY4EStTCF_dIovfmq5aEm78gazVn_4LhWJfdx4mFPyDbw7mUcUyhDmWRhZyaFJCu7m2TLwSIm03FlIvxPHBmyiywj7qo0bhlV2WgxOEbkExUvlSox99JgRGpp2mfWx_yIscx1f-mJnC2/s400/swing-hierarchy.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
오늘은 자바 스윙중에서 JToolBar 클래스에 대해서 공부하는 시간을 가져보기로 할텐데 지금쯤이면 이제 스윙의 클래스 계보도는 아마 다 까먹었을 것이다. ㅎㅎ 필자가 예전에 보여준적이 있지만 보시다시피 다시 리마인드하라고 친절하게도 필자가 위에 멋진 스윙 클래스 개요도를 올려놓았으니 오늘 배우는게 어디에 있는지라도 찾아보기 바란다. 찾다보면 한번은 보겄지.^^&lt;br /&gt;
&lt;br /&gt;
자 다 봤으면 강이의 자바강좌 세계로 다시 돌아오기 바란다 오바~&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtsiO1v2kh6nQvlCIYlSVKbgMBiBvThYU055K11hVZ12cjxCzeZfnBk8Xhi7TpXwiCgfZDBKhorNS8FYuP7QLA0FZBjgD4zJ6CgwywTQXMeav6JaGWMM9i4X827gnbYCgi4d4D4wyk5Tr3/s1600/r101.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtsiO1v2kh6nQvlCIYlSVKbgMBiBvThYU055K11hVZ12cjxCzeZfnBk8Xhi7TpXwiCgfZDBKhorNS8FYuP7QLA0FZBjgD4zJ6CgwywTQXMeav6JaGWMM9i4X827gnbYCgi4d4D4wyk5Tr3/s400/r101.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
이번 시간에 배울 예제는 위와 같다. 일단 보면 알겠지만 기본 프레임이 아닌 데코레이션을 예쁘게 해놓았는데 어떻게 표현하는지 예전 시간을 기억한다면 대충 감이 올것이고 아니라면 그냥 필자의 내공이 무지막지하게 담긴 소스만 봐도 쉽사리 알게 될것이다. 사실 코드로 해결이 안되는 부분이 있는데 위의 예제 결과를 보면 그림이 삽입되어 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie6WPgq7EENjH0AdZ7Dz-gzBLaoLoNxOIQZZ9lmYUbn4y2Rrin1TW_IuA4DB76T3H7px3_bVoHf9u70r9hiSGBmCcgMMtSGwBgEHPM6-2McW-YWE9ach1agAqqYZnq85kHG7o9bGWuD2B1/s1600/cut.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie6WPgq7EENjH0AdZ7Dz-gzBLaoLoNxOIQZZ9lmYUbn4y2Rrin1TW_IuA4DB76T3H7px3_bVoHf9u70r9hiSGBmCcgMMtSGwBgEHPM6-2McW-YWE9ach1agAqqYZnq85kHG7o9bGWuD2B1/s1600/cut.gif&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFf_laukC051uPFDHfa6fiIfFonkjYDakxM3qCQpcyrp0dEy8BBvZhzisDDybBx6U72JKHgOqW4WLmfG3CkE9cFZEGKC0qNKCVrkroFooHdICay-0j6m1P3ukHj9TZvsGmAISAJ2kIC5gh/s1600/copy.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFf_laukC051uPFDHfa6fiIfFonkjYDakxM3qCQpcyrp0dEy8BBvZhzisDDybBx6U72JKHgOqW4WLmfG3CkE9cFZEGKC0qNKCVrkroFooHdICay-0j6m1P3ukHj9TZvsGmAISAJ2kIC5gh/s1600/copy.gif&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_FW0oGDYiIoqJzn6HjAZPABaZ-7-HpFKMmJ5i7LcS6cUnCMKXcrkqNuDZlmqmb_coXHTPP_Dpu9MiodUP8w-nQ0H1SAlBYwxcrFkSh_vtHjc1gLH6qqiVHyU1eUMibN3e9y6WOPHl9FJw/s1600/paste.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_FW0oGDYiIoqJzn6HjAZPABaZ-7-HpFKMmJ5i7LcS6cUnCMKXcrkqNuDZlmqmb_coXHTPP_Dpu9MiodUP8w-nQ0H1SAlBYwxcrFkSh_vtHjc1gLH6qqiVHyU1eUMibN3e9y6WOPHl9FJw/s1600/paste.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
설마 이런걸 코드로 쓰면 나오는걸로 착각하고 있었던 이는 없겄지? 오바하지 말아라. 그런건 없다.ㅎㅎ 당근 그림 이미지를 불러들여서 써야한다. 그럼 뭐가 필요할까? 이거 예전 강의에서 하는 방법을 알려줬는데 기억하는 이가 있남?? 허걱~ 없는거여?_? 음.. 일단 알아서 자진 꿀밤 한대씩 때리고 아래의 예제 소스를 보기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilr7XUdukRCnbcfpPmrm4h8_1H-_NGk1cIYRDwSt9JKGKUI1xh53Q8RoUnrd8AjgAxfP_TjHCmAZR5Xn-7BjRvUdBcvC3OKCepWuGYOQwkU2KTwgNcTgrOr4MXrv0IFVIKgH_sksykLAcZ/s1600/t101.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;235&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilr7XUdukRCnbcfpPmrm4h8_1H-_NGk1cIYRDwSt9JKGKUI1xh53Q8RoUnrd8AjgAxfP_TjHCmAZR5Xn-7BjRvUdBcvC3OKCepWuGYOQwkU2KTwgNcTgrOr4MXrv0IFVIKgH_sksykLAcZ/s400/t101.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
오늘 강의의 하이라이트인 예제 소스를 지금 막 공개하였다. 보기 좋으라고 가운데다가 중요한 내용이 눈에 쫘악 들어오도록 띄워쓰기까지 한 필자의 친절함에 심심한 감사를 표하길 기대하면서 오늘 자바 강의는 이만 마치도록 할까한다. 왜 설명이 없냐고? 예제를 자세히 보기 바란다. 너무 자세한 설명에 여러분은 심심하다못해 깊은 감사를 표하지 않을수 없을것이라 자못 다시한번 기대하면서 필자는 이만 물러갈까 한다.ㅎㅎ 다 배운거에 JToolBar에다가 기존에 배운 JButton을 어떻게 추가해 가는지 곰곰히 스텝(?)을 밟아보면 이해가 쏙쏙 될것이다. 원 투 원 투~ 이런 스텝 아니여~ㅎㅎ 이제 앞으로 자바 스윙 컴포넌츠에 대해서는 세번의 강좌만을 남겨두고 있다. 스윙의 전반적인 사항을 그렇게나마 마치려고 하니 힘들고 지친 여러분의 영혼을 세번만 더 다그치고 달리기 바란다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/6200004684059753870/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/04/jtoolbar.html#comment-form' title='4개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/6200004684059753870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/6200004684059753870'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/04/jtoolbar.html' title='스윙으로 도구바 만들기(JToolBar)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjroY4EStTCF_dIovfmq5aEm78gazVn_4LhWJfdx4mFPyDbw7mUcUyhDmWRhZyaFJCu7m2TLwSIm03FlIvxPHBmyiywj7qo0bhlV2WgxOEbkExUvlSox99JgRGpp2mfWx_yIscx1f-mJnC2/s72-c/swing-hierarchy.gif" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-8305199282995594380</id><published>2012-03-11T17:16:00.002-07:00</published><updated>2012-03-11T17:41:26.588-07:00</updated><title type='text'>스윙으로 책갈피 만들기(JTabbedPane)</title><content type='html'>오늘은 아주 특별한 날이다. 이유는 잠시뒤에 알게되니 집중하기 바란다.^^&amp;nbsp;자 스윙으로 책갈피를 만들어볼텐데 영어로 하면 tab이라고 하던가? 그래서 JTabbedPane 클래스를 이용하게 되는데 이해를 돕기위해 어김없이 오늘도 그림부터 살펴보겠다.ㅎㅎ&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX6Qkh-LEA0wqcU0n6VHE7wn8tS64vLipQBHzaFZ6FCkJltyH8mfr7BP8V07DiuuT8cTh6xRIXoXu5vtZR45COSXESmEnW3I1QIgQMYwtXkET_BoE8cN48Jb1Z8iG3PaMCH3ihkQGyXXHk/s1600/r100-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX6Qkh-LEA0wqcU0n6VHE7wn8tS64vLipQBHzaFZ6FCkJltyH8mfr7BP8V07DiuuT8cTh6xRIXoXu5vtZR45COSXESmEnW3I1QIgQMYwtXkET_BoE8cN48Jb1Z8iG3PaMCH3ihkQGyXXHk/s400/r100-1.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVmHpoG824t3eMj7eggXnb7kPQQKW87CK-7P0MQUqki6cGg1aVsecjL0N07ES_g5rivHityLqbRVia9WgyFkv-X6T90bctpEVqFbO3WDPYhyphenhyphenHr_TS5R98LKuK4gPttRQb3Qn0IbAmJJGDr/s1600/r100-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVmHpoG824t3eMj7eggXnb7kPQQKW87CK-7P0MQUqki6cGg1aVsecjL0N07ES_g5rivHityLqbRVia9WgyFkv-X6T90bctpEVqFbO3WDPYhyphenhyphenHr_TS5R98LKuK4gPttRQb3Qn0IbAmJJGDr/s400/r100-2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXCfH6OjvQVwjiQpjbfGy0nMAylliy9yd3UOuJ7ZV-oa0UDtNe_wzn8jV79DQxP4rkPfoBT5WTBUXamil6G6ibcarheVRXUvAjwbZBlXt-RksvcANRXsqewr42THqfp2y01AIahYECdPHZ/s1600/r100-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXCfH6OjvQVwjiQpjbfGy0nMAylliy9yd3UOuJ7ZV-oa0UDtNe_wzn8jV79DQxP4rkPfoBT5WTBUXamil6G6ibcarheVRXUvAjwbZBlXt-RksvcANRXsqewr42THqfp2y01AIahYECdPHZ/s400/r100-3.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;오늘 예제소스의 결과물은 위와 같다. 보다시피 위의 책갈피를 누르면 각 섹션에 해당하는 내용이 나오게된다. 요즘 여러분이 쓰고 있는 인터넷 브라우져를 생각하면 이해가 쉬울 것이다. 마이크로소프트사의 익스플로러나 구글의 크롬, 아니면 모질라의 파이어폭스가 이런 기능들을 기본적으로 사용하고 있다. &quot;새탭으로 열기&quot;가 바로 이 범주에 속하는데 이거를 자바로 어떻게 구현하는지를 필자가 예제로 보여줄 것이다. 저번에 한 패널을 분리해서 나누어 쓸수 있었다면 이번에는 한공간 전체를 공유하여 쓴다고 보면 될것인데 전체를 따로따로 활용할수 있어 공간 활용측면에서는 이게 짱(?)이라 볼수 있겠다. 따라서 쓰는 빈도수가 상당히 높으니 오늘 내용은 필사적으로 마스터하기 바란다.^^&amp;nbsp;자 그럼 소스를 보겠다. 소스를 보면 왜 오늘이 특별한 날인지 이유는 소스보면 알게된다.ㅎㅎ&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSiYQ6ui2_P_YDjU4S9UQlbk8sdR622T4403CEuXjpa8NbnwSNILZgxOlTSsuS8IcbVgpqxgtQMVFENyeDDlYBxZ2urVPOIzlB1cAct3ewhC8HI2Y3u5c0rvQMHWryzHBbgSEca3pwFuq7/s1600/t100.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;333&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSiYQ6ui2_P_YDjU4S9UQlbk8sdR622T4403CEuXjpa8NbnwSNILZgxOlTSsuS8IcbVgpqxgtQMVFENyeDDlYBxZ2urVPOIzlB1cAct3ewhC8HI2Y3u5c0rvQMHWryzHBbgSEca3pwFuq7/s400/t100.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;왜 오늘은 특별한 날인가? 필자가 예제를 만든지 100번째 되는 날이다. 오호~~&amp;nbsp;강이의 자바강좌 예제 &quot;100회 특집&quot;이다. 너무 어이없다고? 원래 특집은 그런 것이다.ㅎㅎ&amp;nbsp;예제로 돌아가서 오늘의 내용의 핵심을 보기좋게 역시 한가운데에 몰아놓았다. 보면서 어떤 식으로 코드를 만들어가는지 순서를 익히도록 하는데 주안점을 두기 바란다. 프로그래밍의 흐름을 자연스럽게 익힐수 있을 것이다. 각 탭에서 해당 내용을 보여주기 위해 Container 클래스를 이용하였는데 add 메소드를 이용해 어떻게 연결시키는지 관심있게 보면 소스를 분석하는데 도움이 될것이라 본다. for 룹에서는 인덱스를 1로 시작하였는데 보통 0으로 시작하나 보기 좋으라고 1이라고 한것이니 이런거 쓰잘데없이 깊이 파고들지 말아라. 날샐라... ㅎㅎ&amp;nbsp;한줄로 필살 정리하자면 컨테이너 만들고 탭 만들고 버튼 만들어서 갖다붙여대면 완성되는 프로그램이라 할수 있을 것이다.ㅎㅎ 그럼 곰곰히 연구해 보길 바라면서 100회 특집은 이것으로 마치겠다.^^&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/8305199282995594380/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/03/jtabbedpane.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/8305199282995594380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/8305199282995594380'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/03/jtabbedpane.html' title='스윙으로 책갈피 만들기(JTabbedPane)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX6Qkh-LEA0wqcU0n6VHE7wn8tS64vLipQBHzaFZ6FCkJltyH8mfr7BP8V07DiuuT8cTh6xRIXoXu5vtZR45COSXESmEnW3I1QIgQMYwtXkET_BoE8cN48Jb1Z8iG3PaMCH3ihkQGyXXHk/s72-c/r100-1.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-4613698834749264399</id><published>2012-03-10T12:29:00.001-08:00</published><updated>2012-03-10T12:59:24.651-08:00</updated><title type='text'>스윙으로 분리창 만들기(JSplitPane)</title><content type='html'>오늘은 패널을 말그대로 분리시키는 작업을 해보겠다. 아래의 그림을 보면 이해가 쉬울 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVlGw-oJEas7Mq_wRYxqv3Df5m6V83C2LsZGR_SG1SNXhyphenhyphenMBumdBn7jR8PnBy53ha71omkcnKKqIlRZ4S70oEnOt7IpVFwqwGF5F4KnwXEkvsyIlX5OjH841N6HWyksA2CAUAT8HNheEDr/s1600/r99-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVlGw-oJEas7Mq_wRYxqv3Df5m6V83C2LsZGR_SG1SNXhyphenhyphenMBumdBn7jR8PnBy53ha71omkcnKKqIlRZ4S70oEnOt7IpVFwqwGF5F4KnwXEkvsyIlX5OjH841N6HWyksA2CAUAT8HNheEDr/s400/r99-1.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiLzvrmSa8QrwV7YOoKU-Gji0b6c3pafTT6AoCWCrwDVb9ccnGhx4q7hol0LHmGuLYegYr1oxssbEaErwDuSmJWtOQJG5pWnltBfhy7ME9q9elKRNiuMhBFpgiTV_kzvKn7nUQLuJbnBv9/s1600/r99-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiLzvrmSa8QrwV7YOoKU-Gji0b6c3pafTT6AoCWCrwDVb9ccnGhx4q7hol0LHmGuLYegYr1oxssbEaErwDuSmJWtOQJG5pWnltBfhy7ME9q9elKRNiuMhBFpgiTV_kzvKn7nUQLuJbnBv9/s400/r99-2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
그럼 소스를 보자.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi16tTLc3KlLL3mUH-sKoeRNiBeKNf74N7vAWB0655JqHC9LYIFprhhZ1My4m8SDWu4K3yDVtc9Hvc1S9fJKXBfL_kqjh-_jJJxAGiOmZoSovuCCcxD9e_gce6jqkfou8n6bKXUPD65xktH/s1600/t99.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;203&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi16tTLc3KlLL3mUH-sKoeRNiBeKNf74N7vAWB0655JqHC9LYIFprhhZ1My4m8SDWu4K3yDVtc9Hvc1S9fJKXBfL_kqjh-_jJJxAGiOmZoSovuCCcxD9e_gce6jqkfou8n6bKXUPD65xktH/s400/t99.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
소스를 보다시피 JSplitPane이라는 클래스를 이용해서 좌우로 나누든지 아니면 위아래로 그림처럼 나누는게 가능하다. 결과를 보면 갸우뚱 갸우뚱 하는 이가 있을지도 모르겠다. 결과에 프린트된 텍스트는 바꿀수 없나? 라는 의문이 들지도 모르겠다. 그런 의문점이 생긴 이들은 본인의 손으로 머리를 쓰다듬기 바란다. 장하다. ㅠㅠ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOphniBjus9bGhMQN9lE5ZmHgJ-mfrYbgLzkPuQ9Rf6OQRwEtvZ1qbC13zxRWI1QEJ6yw8m0RnBWG4shOJhmj5-qHdYS3MRrhlmzWZARSt4eWaMBRlRM5kwzXjhus0iF0qaJwfhersWSwc/s1600/r99-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOphniBjus9bGhMQN9lE5ZmHgJ-mfrYbgLzkPuQ9Rf6OQRwEtvZ1qbC13zxRWI1QEJ6yw8m0RnBWG4shOJhmj5-qHdYS3MRrhlmzWZARSt4eWaMBRlRM5kwzXjhus0iF0qaJwfhersWSwc/s400/r99-3.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
위의 그림을 보다시피 물론 가능하다. 예전에 배운 JButton클래스와 JSplitPane클래스에 들어있는 콤포넌트를 셋업하는 메소드들을 잘 결합하면 이것이 가능하다. 어떻게 하는지 좌우에 있는 텍스트 바꾸는걸 보여줄 것이니 여러분은 그걸 응용해서 위아래에 있는 텍스트도 바꾸어 보기 바란다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB0_kTLydsMFmKEGTwQpjFvyuoQjTJmR7JPPfxpA3-l0XZ2ddLwjHj8L0lRxJnDm5sTmoUZou7g_sUaWr2O5Fcas3ZkwHrmWQWHiNYXUKDHj44SwKUZ3BfNQjqpeabU2mI21DAd8Cth7mB/s1600/t99-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB0_kTLydsMFmKEGTwQpjFvyuoQjTJmR7JPPfxpA3-l0XZ2ddLwjHj8L0lRxJnDm5sTmoUZou7g_sUaWr2O5Fcas3ZkwHrmWQWHiNYXUKDHj44SwKUZ3BfNQjqpeabU2mI21DAd8Cth7mB/s400/t99-2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
소스를 보면 쉽게 이해가 되리라 생각한다. 위아래의 텍스트는 좌우로 표시했던 부분을 위아래로 영어만 살짝(?) 고치면 가능할 것이다. 이런 방식이 어쩔때 필요할까? 여러분이 인터넷이나 아니면 프로그램을 보다보면 한쪽에는 인덱스가 있고 다른 한쪽에는 그에 따른 설명이 나온다든지, 한쪽에는 파일이름들이 있고 다른 한쪽에는 그 파일을 클릭하면 그림이 뜬다든지등등의 프로그램을 만들때 쓰면 유용하다. 하나의 패널을 두개로 나누어 효율적으로 쓰기 위함이다 생각하면 되겠다. 이상~^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/4613698834749264399/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/03/jsplitpane.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4613698834749264399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4613698834749264399'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/03/jsplitpane.html' title='스윙으로 분리창 만들기(JSplitPane)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVlGw-oJEas7Mq_wRYxqv3Df5m6V83C2LsZGR_SG1SNXhyphenhyphenMBumdBn7jR8PnBy53ha71omkcnKKqIlRZ4S70oEnOt7IpVFwqwGF5F4KnwXEkvsyIlX5OjH841N6HWyksA2CAUAT8HNheEDr/s72-c/r99-1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-3009435721899776631</id><published>2012-03-08T16:49:00.007-08:00</published><updated>2012-03-11T17:16:04.234-07:00</updated><title type='text'>스윙으로 스크롤바 만들기(JScrollPane)</title><content type='html'>오늘은 자바 스윙중에서 JScrollPane에 대해서 공부해 보기로 하겠다. 말이 디립게(?) 어려운데 이해하기 쉬운 용어로 다시 풀이하자면 &#39;스크롤바&#39;를 떠올리면 되겠다. 그럼 그림을 보자.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXM9zyxlosXk5rAZwKW6BR7uwE6XET08H1aZyMs7DrxGnDBoLCqLddNQavphoFhl7fRZjRA8vU_SLIl97g5kWF8sSUAGstXf8piZfKUElyCb4NWorIIRzFrDISJl7lYBoSGg-6LBuD_QOp/s1600/JScrollPane-1.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;387&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXM9zyxlosXk5rAZwKW6BR7uwE6XET08H1aZyMs7DrxGnDBoLCqLddNQavphoFhl7fRZjRA8vU_SLIl97g5kWF8sSUAGstXf8piZfKUElyCb4NWorIIRzFrDISJl7lYBoSGg-6LBuD_QOp/s400/JScrollPane-1.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
이젠 칼라로 볼까?&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRIN7rgFIHJjeMvC6V-TPiANS0IkpvK5P-dMfXPmpgT2Q4C4ZGxhbLXyk-M7tTd1Ve9gmj8_H3aoGJ1aZ1F-uma7BaiPOKQQZG85c2hGpCqdldV83rdtWcFTKAGljur6Q_qI24wlSN86Ln/s1600/scrollarchitecture.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;298&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRIN7rgFIHJjeMvC6V-TPiANS0IkpvK5P-dMfXPmpgT2Q4C4ZGxhbLXyk-M7tTd1Ve9gmj8_H3aoGJ1aZ1F-uma7BaiPOKQQZG85c2hGpCqdldV83rdtWcFTKAGljur6Q_qI24wlSN86Ln/s400/scrollarchitecture.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
그림 더 보기로 하자.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_y_txEGjzhZi7hHmVOW6-fVvo1482KXg5sH8FizAtci8AT66au81C-gtYof3g4OsW9rM3mdrBtAFDyxrqzvQl0KP9QibefuVo6L-0q42gTinBrAoLLaQ5fTKMD4HFoYcTmLuCBuK96HEl/s1600/scrollbarparts.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;227&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_y_txEGjzhZi7hHmVOW6-fVvo1482KXg5sH8FizAtci8AT66au81C-gtYof3g4OsW9rM3mdrBtAFDyxrqzvQl0KP9QibefuVo6L-0q42gTinBrAoLLaQ5fTKMD4HFoYcTmLuCBuK96HEl/s400/scrollbarparts.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
JScrollPane에 대해서 공부하다보면 자연스럽게 알게되는 용어들인데 해당 단어가 무엇을 뜻하는지 그림을 통하면 여러분이 보다시피 훨씬 쉬울 것이다. 위의 사진에서 아기가 외국 아가(?)인 것은 자바가 외국에서 만들어져서 그런 것이다. 아마 한국이였으면 한국 아가(?)를 예제로 써먹을 것이라는 우스갯 소리 아닌 소리를 하면서 본격적인 프로그램으로 들어가보겠다.^^&lt;br /&gt;
&lt;br /&gt;
이제 볼 예제 프로그램을 소개하자면 항상 그렇지만 필자는 오로지 핵심 그리고 초간단 예제, 즉 프로그래밍의 완전 초짜(?)도 신기하게 이해하는 프로그램을 제작하였다. 프로그래밍은 고수일수록 프로그램이 아주 간단하고 명료하며 하수일수록 프로그램이 아주 복잡하고 길다. 따라서 모르는 사람들이 보면 프로그램 길게 쓰는 사람이 고수인줄 아는데 큰 착각이다.ㅎㅎ 오늘 예제를 보면 필자에게서 고수의 풍모를 유감없이 느낄 것이라 본다.^^ 쉿~ 묻지도 말고 따지지도 말고 결과부터 자봐(JAVA)! ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU18SQHRC0gy86c3weykZMd40_8L4H57cbg0wbmoQFdN9kOqEPVwoqUkiQhWqVRHnVqdS6-vQ623wDKoO_trJHBoMXZbBHYrn61z-6gS_UtDxiog-_7nFsxa43b8wsER-UQPfuC_7kQOAy/s1600/r98.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU18SQHRC0gy86c3weykZMd40_8L4H57cbg0wbmoQFdN9kOqEPVwoqUkiQhWqVRHnVqdS6-vQ623wDKoO_trJHBoMXZbBHYrn61z-6gS_UtDxiog-_7nFsxa43b8wsER-UQPfuC_7kQOAy/s400/r98.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
허걱 웬 아가씨가~ ㅎㅎ 아주 눈들이 초롱초롱 빛나는구나 *_*&lt;br /&gt;
그냥 패널안에다가 text나 써놓고 JScrollPane 자바소스 공부하려다가 여러분의 의욕과 정열(?)을 고취시키기 위해 필자가 특별히 이쁜이(?)를 긴급 섭외해서 여러분께 소개하니 집중해서 소스를 보기로 하자. ㅎㅎ 오늘은 강조안해도 눈에 불을 키고 들고 팔것 같구나.^^&lt;br /&gt;
&lt;br /&gt;
다시 본론으로 가서 결과물 사진을 보면 오른쪽 옆과 아래쪽 밑에 스크롤바를 움직여 사진의 안보이는 쪽을 볼수 있게 하고 있다. 만약 JScrollPane이라는 클래스를 프로그램에서 구현하지 않았다면 사진이 그냥 짤려서 나오지 저렇게 스크롤바가 나오지 않는다. 그럼 어떻게 하면 스크롤바가 튀어나오게 해서 이쁜이(?)를 제대로 볼수 있을까? *_- 그것이 오늘의 핵심이다. 예제를 보기전에 미리 생각 좀 때려보고 모르겠거든 자기 머리를 힘차게 때린후에 아래 예제를 보도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdxjQqzhvHTt1DW6R7fiEAW03d-iA9Ac2_wUD7LZQNMgZiMpO9srRdZdEjoccCXTvjmA_2sKGSMR0Ny5fRDcEc8z2OXZQNSOTTQzSUEPi1i78JZdKJXTTL-rTQwOffTtttrxchvS0T27do/s1600/t98.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;296&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdxjQqzhvHTt1DW6R7fiEAW03d-iA9Ac2_wUD7LZQNMgZiMpO9srRdZdEjoccCXTvjmA_2sKGSMR0Ny5fRDcEc8z2OXZQNSOTTQzSUEPi1i78JZdKJXTTL-rTQwOffTtttrxchvS0T27do/s400/t98.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;소스를 보면 중간에 네줄이 오늘 배울 내용인데 보다시피 코드가 굉장히 심플하다. 왜냐? 강조안하겠다.ㅎㅎ 중간에 위의 ImageIcon 클래스를 불러들여 레이블에 저렇게 이미지를 집어넣고 있는데 그림파일을 스윙에서 구현할때 쓰이는 표현방식이니 어떻게 쓰는지 관심있게 보면서 익숙해지기 바란다. 그림파일은 소스와 같은 디렉토리에 두면 작동된다. 혹시 Icon이랑 ImageIcon이랑 매치가 안되는걸 이상하게 생각하고 있는 이들은 필자가 아주 오래전에 상속부분인가 거기에서 저렇게 다른식으로 쓰는 방법이 있다고 하였으니 찾아보기 바라고 여기선 Icon이 클래스가 아니라 인터페이스일텐데 그것도 라이브러리 찾아보면 나오는 것이니 게으름피지말고 확인해보기 바란다. 중간 밑에 두줄은 말 그대로 스크롤바 만들려고 객체생성해서 사진 넣고 셋팅하는 명령어다. 만약에 밑에 두줄 없이 바로 프레임의 add 메소드에다가 사진 집어넣으면 스크롤바가 당근 안뜬다. 궁금하면 확인해보길 바라면서 오늘은 이렇게 끝내겠다.^^ 아차 그리고 사진속 소녀의 이름이 궁금한 이들은 필자가 예제소스에다 이름써놓았으니 괜히 또 묻지말아라.ㅎㅎ</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/3009435721899776631/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/03/jscrollpane.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/3009435721899776631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/3009435721899776631'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/03/jscrollpane.html' title='스윙으로 스크롤바 만들기(JScrollPane)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXM9zyxlosXk5rAZwKW6BR7uwE6XET08H1aZyMs7DrxGnDBoLCqLddNQavphoFhl7fRZjRA8vU_SLIl97g5kWF8sSUAGstXf8piZfKUElyCb4NWorIIRzFrDISJl7lYBoSGg-6LBuD_QOp/s72-c/JScrollPane-1.gif" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-4871474069177262286</id><published>2012-02-17T14:49:00.000-08:00</published><updated>2012-02-17T14:56:29.080-08:00</updated><title type='text'>스윙으로 패널 만들기(JPanel)</title><content type='html'>오늘부터는 일반적으로 스윙에서 널리 사용되는 콤포넌츠들을 모아서 차례차례 학습하는 시간을 갖기로 하겠다. 아래와 같이 총 5개의 콤포넌트들을 순서대로 살펴볼텐데 이미 여러 스윙 예제를 지금까지 접하면서 친근한 것들(?)이 많을테니 공부하는데 그리 부담감은 없으리라 생각한다. 그럼 그 첫번째 시간으로 자바의 패널인 JPanel부터 공부해 보기로 하자.^^&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;General-Purpose Containers&lt;/b&gt;&lt;br /&gt;
JPanel&lt;br /&gt;
JScrollPane&lt;br /&gt;
JSplitPane&lt;br /&gt;
JTabbedPane&lt;br /&gt;
JToolBar&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifgfuInXsg362iOxNWPGbofWPlI22bVMZeLKmncF7c684SUKC0BfJNv0_O5JHuPVM8Cny3946YIcFYhGZpGx7AFePswSg2sJUG9TQl6YCvGDZJVxXuslR9dE12PtTXSnx9yn9AxegqhoDr/s1600/jpanel.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifgfuInXsg362iOxNWPGbofWPlI22bVMZeLKmncF7c684SUKC0BfJNv0_O5JHuPVM8Cny3946YIcFYhGZpGx7AFePswSg2sJUG9TQl6YCvGDZJVxXuslR9dE12PtTXSnx9yn9AxegqhoDr/s400/jpanel.jpg&quot; width=&quot;372&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
아마 많은 이들이 자바 스윙의 JFrame과 JPanel을 접하면서 도대체 뭐가 다른거지? 그냥 항상 자주 보던거긴한데 그게 그거 같고 막상 구분할려니 난감해 할것이다. 그런 이들에게 필자는 아주 클리어하게 위의 그림을 보여주고 싶다.^^ 그림을 보면서 영어의 사전적 의미를 되새겨보면 희한하게도 머리속이 깨끗하게 정리될 것이라 본다. 판넬? 오우 노오.. 패널~ ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
태반이 자바를 공부하면서도 자바의 뼈대인 이런 자바 가문(?)의 계보도를 홀대히 여기는 경향이 있는데 대부분 누군가에게 관심을 가지면서 뜻하든 뜻하지 않든 기본적으로 보게 되는 것이 가문이듯이 자바도 자연스럽게 이런 것을 가끔씩 쳐다보면 의외로 의문점이 자연스럽게 해결될때가 있다.&lt;br /&gt;
&lt;br /&gt;
이거 도무지 필자가 무슨 말을 하는지 모르겠다 하는 이들은 다 집어치고 아래의 예제를 보기 바란다. 언제나 그렇듯 필자의 예제를 보기만 해도 신기하게 술술 풀리는 것에 의문점을 가지는 이들이 많으나 이 의문점을 필자도 풀어줄수 없음에 안타까움을 금하는 바이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga1udg3cdVkOCPGd_NwRPrPpHRx4k7NAhhhyphenhyphenQCyoDz5TZ0ZyKYXV5aLxkhI5zcQM6M3TFzq0ZDcC9wG9X6UzKin6ruwlT4QzUVyoeehX80T52rn1cdIWkkLo2D7EDbK4_vC9FgcUT9avrX/s1600/t97.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga1udg3cdVkOCPGd_NwRPrPpHRx4k7NAhhhyphenhyphenQCyoDz5TZ0ZyKYXV5aLxkhI5zcQM6M3TFzq0ZDcC9wG9X6UzKin6ruwlT4QzUVyoeehX80T52rn1cdIWkkLo2D7EDbK4_vC9FgcUT9avrX/s400/t97.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
예제에서 나오는 JLabel은 패널에 글자쓰기 위한 곁다리라고 보면되고 역시 핵심은 JFrame과 더불어 오늘의 주제인 JPanel인데 아마도 그냥보고 실행시켜보면서 꼼지락꼼지락 대다보면 저절로 이해가 되는 자신에 놀라게 될것이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDgt0-asiPiri6fgrWb2RMEpSAoduRayK_CwB1QWwpMiYqB7XUHEjEBg_6pf8HywRFdsJNA-I7YpWGPC8FCJ6oxQlshnFByw9uhqcGNrJcRwSevM-v8LSLDqHQgfqv6_McUofHnk0Mop8l/s1600/r97.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDgt0-asiPiri6fgrWb2RMEpSAoduRayK_CwB1QWwpMiYqB7XUHEjEBg_6pf8HywRFdsJNA-I7YpWGPC8FCJ6oxQlshnFByw9uhqcGNrJcRwSevM-v8LSLDqHQgfqv6_McUofHnk0Mop8l/s400/r97.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
설명을 너무 안하면 서운한 이들을 위해 간단하게 설명을 아주 살짝만 해보도록 하겠다. JFrame은 그냥 밖에 창테두리쳤다 생각하고 안에다 뭐좀 써넣으려고 JPanel 좀 건드리고 JFrame과 JPanel의 연결고리를 만들어주기 위해 Container 클래스 불러들여 엮어묶어서 해결하는 예제다.&lt;br /&gt;
&lt;br /&gt;
본 예제의 이해 심층도를 높이기 위해서 한가지 덧붙이자면 add( ) 메소드를 각 클래스에 따라서 어떻게 이용하는지 유심히 살펴보면 전체적인 코드의 흐름이 느껴지기 시작할 것이다. 물론 그게 느껴지는 큰 이유중의 하나는 바로 필자가 만들었다고는 믿어지지 않는 아주 심플하고도 심오한 예제에 있을 것이나 필자가 시간이 없는 관계로 이에 대한 강조는 잠시 미루어두기로 하고 오늘은 이만 끝~^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/4871474069177262286/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2012/02/jpanel.html#comment-form' title='6개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4871474069177262286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4871474069177262286'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2012/02/jpanel.html' title='스윙으로 패널 만들기(JPanel)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifgfuInXsg362iOxNWPGbofWPlI22bVMZeLKmncF7c684SUKC0BfJNv0_O5JHuPVM8Cny3946YIcFYhGZpGx7AFePswSg2sJUG9TQl6YCvGDZJVxXuslR9dE12PtTXSnx9yn9AxegqhoDr/s72-c/jpanel.jpg" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-438009664145349556</id><published>2011-12-10T22:52:00.000-08:00</published><updated>2011-12-10T22:57:47.858-08:00</updated><title type='text'>스윙으로 프레임 만들기(JFrame)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ62e3x2jnOIXbYtowCmPwrEu5ConHzRBh3LNnDaegnu0d2Za1WbezvsDPemmBCtHnub6ThDpWJFPO9mdXguRKiHp-4jrbimAb71KE8XLPUhQOZoUB4RzchrKk9B_RifWGm7WN_ccNqFBb/s1600/JFrame.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;188&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ62e3x2jnOIXbYtowCmPwrEu5ConHzRBh3LNnDaegnu0d2Za1WbezvsDPemmBCtHnub6ThDpWJFPO9mdXguRKiHp-4jrbimAb71KE8XLPUhQOZoUB4RzchrKk9B_RifWGm7WN_ccNqFBb/s400/JFrame.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp_hcTDrkZPquXEtqUlLJ69IAm_nHFJaZ7BvenRkdhyphenhyphenEBZAiHUskYjNm_GXDosIWuW7moOgw0pA0Ql2jqHhkGOKAXZNYA3AhmwfIsnLavNr3k9C0wNmv38LhXedEC4OIYHJ8TH_R4RHgQT/s1600/JFrame_med.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp_hcTDrkZPquXEtqUlLJ69IAm_nHFJaZ7BvenRkdhyphenhyphenEBZAiHUskYjNm_GXDosIWuW7moOgw0pA0Ql2jqHhkGOKAXZNYA3AhmwfIsnLavNr3k9C0wNmv38LhXedEC4OIYHJ8TH_R4RHgQT/s400/JFrame_med.png&quot; width=&quot;310&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3QWc3Y34VgSTC7ebAdnVeXrJ9deWsEUcsACqBrJx2m5OCoN88HujmfXz1Daj5V2pJ1WMXAhTD5qdW6khzUmFAl0H8EOkV3CryL3XIajMoIgBGGQ889xo98RfAutUrPOvD_WGt2XpyYJut/s1600/FrameDemoMetal.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;292&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3QWc3Y34VgSTC7ebAdnVeXrJ9deWsEUcsACqBrJx2m5OCoN88HujmfXz1Daj5V2pJ1WMXAhTD5qdW6khzUmFAl0H8EOkV3CryL3XIajMoIgBGGQ889xo98RfAutUrPOvD_WGt2XpyYJut/s400/FrameDemoMetal.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
오늘은 스윙의 JFrame에 대해서 공부할텐데 그동안 강의를 쭈욱 본 이들은 알겠지만 그냥 맨 처음에 써놓고 시작하는거라고 무의식적으로 써왔을거라 본다. 이미 대부분 아는 내용이겠지만 오늘은 그동안 미처 설명하지 못한 아니, 아 그렇지 그런것도 컨트롤이 가능하구나라는 말이 나오도록 조금 아주 쪼금 깊이 들어가보도록 하겠다.^^&lt;br /&gt;
&lt;br /&gt;
JFrame은 최상위 탑레벨 클래스 중 하나로 스윙에서는 항상 자연스럽게 쓰는 클래스 중에 하나이며 창의 제목과 테두리의 사이즈를 컨트롤하는데 주로 써온것을 여러분은 기억하리라 본다. 바로 소스를 보면서 그동안 다루지 않았던 부분을 맛배기(?)로 공부해 보기로 하겠다. 그동안 배운거 재방송만 하면 엄청난 비난(?)이 쏟아질 것이기 때문에 울며겨자 먹기로 다른거 조금 건드려보기로 결정한 것이니만큼 군말없이 따라오기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxA7jqYqxXX8SZNA1jz1TjRSVw6l2Az4EuekDKV9axYfO-dtJq7YwEvnwlIvwdiLoDrOkgCtvAUmnib8nOnPqpx4GalLk7w97huAMOxiL1RGJl1egU4K4KWOa0hvQIaTvUKCdFwzOsEi5v/s1600/t96.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;306&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxA7jqYqxXX8SZNA1jz1TjRSVw6l2Az4EuekDKV9axYfO-dtJq7YwEvnwlIvwdiLoDrOkgCtvAUmnib8nOnPqpx4GalLk7w97huAMOxiL1RGJl1egU4K4KWOa0hvQIaTvUKCdFwzOsEi5v/s400/t96.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
프레임 즉 윈도우 창을 보면 오른쪽 구석에 미니마이즈 하는 즉 최소화 버튼이 있고 최대화 버튼 그리고 x 표시인 닫힘 버튼이 있는 것을 기억할 것이다. 거기서 닫힘 버튼을 눌렀을때 크게 네가지로 분류해서 각기 반응을 입맛에 맞게 만들어 볼수가 있다. 필자가 그동안 계속 써왔던 EXIT 어쩌구 하는 것 말고도&lt;br /&gt;
&lt;br /&gt;
//EXIT_ON_CLOSE (defined in the JFrame class)&lt;br /&gt;
//DO_NOTHING_ON_CLOSE&lt;br /&gt;
//HIDE_ON_CLOSE (the default for JDialog and JFrame)&lt;br /&gt;
//DISPOSE_ON_CLOSE (the default for JInternalFrame)&lt;br /&gt;
&lt;br /&gt;
위와 같은 명령들이 있는데 눌리면 반응없게도 만들수 있고 누르면 닫히긴 하는데 꺼지지 않고 계속 숨은채로 메모리에 상주하게 만들수도 있는 그런 기능들이 있다. 자세한 내용은 필자가 ( )를 사용하며 유창한 영어(?)로 표기해 놓았으니 알아서 번역해보기 바란다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
그리고 창이 뜰때 사이즈뿐만 아니라 그 창이 맨처음에 화면에 나타나는 위치까지도 지정할수가 있다. 소스를 실행해보면 알겠지만 위의 소스에서는 중앙에다가 배치하라고 명령해 놓은 것이니 정말 그런지 각자 실험해 보자.&lt;br /&gt;
&lt;br /&gt;
그럼 끝내기 전에 여기서 문제 하나를 내보겠다. 소스를 보면 닫는 명령을 여기선 쓰지 않았다. 그럴 경우 위의 네가지 닫는 명령중 자바는 어떤 것을 디폴트로 놓고 작동시키게 되는 과연 어떤 것일까? ㅎㅎ 실행해보면 알것이고 괄호안의 설명을 잘 읽어보면 자동적으로 알게 될것이다. 소스에 답을 써놨는데도 못찾는 이들은 없으리라 믿는다.ㅎㅎ 숙제니 알아서 파악하기 바라고 마지막으로 노파심에 한마디 더하자면, 위의 소스를 실행했는데 창을 닫았으나 완전히 닫히지 않을 것이므로 다시 프로그램을 작동하는데 애로(?) 많을 것이다. 그런 이들을 위해 특수 비법을 이 시간에 전수해 주겠다.^^&lt;br /&gt;
&lt;br /&gt;
윈도우의 작업 관리자로 들어가면 프로세스에서 java.exe라는 파일을 볼수 있을 것이다. 이것을 꺼주면 무리없이 원상태로 돌아갈 것이다. 우리는 자바를 배우고 있다. 당근 자바 실행파일을 무력화시키면 해결되는 것이다. 지금 필자의 말이 이해가 되지 않고 저거 도대체 무슨 이야기 하고 있는거야 하는 이들이 있다면 소스를 공부하고 실행해서 직접 겪어보다보면 저절로 알게 될것이리라 생각한다. 그럼 다음 시간에는 스윙의 대부분 프로그램에서 사용되고 일반적으로 쓰이는 컨테이너들에 대해서 공부할 것인데 다 배운 내용중 하나이니 무슨 클래스인지 한번쯤 생각해 보기 바라면서 오늘은 이만하겠다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/438009664145349556/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2011/12/jframe.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/438009664145349556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/438009664145349556'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2011/12/jframe.html' title='스윙으로 프레임 만들기(JFrame)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ62e3x2jnOIXbYtowCmPwrEu5ConHzRBh3LNnDaegnu0d2Za1WbezvsDPemmBCtHnub6ThDpWJFPO9mdXguRKiHp-4jrbimAb71KE8XLPUhQOZoUB4RzchrKk9B_RifWGm7WN_ccNqFBb/s72-c/JFrame.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-446518014665336474</id><published>2011-11-11T12:56:00.000-08:00</published><updated>2011-11-12T09:35:30.042-08:00</updated><title type='text'>스윙으로 대화창 만들기(JDialog)</title><content type='html'>오늘은 비단 자바 스윙에서 뿐만 아니라 여러가지 프로그램이나 소프트웨어상에서 흔히 접할수 있는 대화창을 어떻게 구현할수 있는지 다양한 종류에 맞는 쓰임새와 기능들에 대해서 공부해보는 시간을 가져보도록 하겠다. 거창하게 표현할려니 힘들구나. ㅎㅎ 한마디로 대화창 어떻게 띄우는지 알아보자는 것인데 오늘 강좌를 통해서 여러분은 스윙으로 약방에 감초처럼 자주 쓰이는 대화창(dialog)을 자유자재로 다룰수 있는 능력자(?)로 변신하게 될것이다.^^&lt;br /&gt;
&lt;br /&gt;
JDialog 클래스는 말그대로 Dialog 클래스를 계승하는데 이 JDialog 클래스를 이용하는 것보다 훨씬 편하고 손쉽게 쓸수 있는 방법이 있는데 바로 그것이 JOptionPane클래스안에 있는 많은 메소드들을 이용하면 다양한 기능을 보다 빠르고 효율적으로 쓰는것이 가능하다. 따라서 본 강좌에서는 JDialog 섹션이지만 이 기능들을 흡수(?)하고 있는 JOptionPane클래스를 집중적으로 조명한다. 따라서 여러분은 시작하자마자 대화창의 응용편으로 본격 진입하게 된다. ㅎㅎ 긴장되는가? 그러나 언제나 그렇듯 응용편인데도 불구하고 이 강좌가 끝날때쯤이면 여러분은 고작 이거였어? 라는 어처구니 없는 감탄사(?)를 연발하게 될것이다. 이런 어이없는 사태로 돌입하게 되는 이유는 오직 하나, 필자가 군더더기들은 홀라당 다까버리고 대화창에 대한 핵심(?) 비법만을 여러분께 전수할 것이기 때문이다.^^&lt;br /&gt;
&lt;br /&gt;
오늘 처음 이 내용을 공부하는 이들도 있을 것이고 아닌 이들도 있겠지만 소스를 접하다보면 JDialog라는 말은 눈씻고 찾아봐도 없는데 대화창은 화면에서 뜨는 사태가 비일비재할 것이다. 그 비밀의 키를 쥐고 있는 클래스가 바로 JOptionPane이라는 클래스인데 이런 대화창 같은 팝업창을 띄울때 상당히 유용하다. 경고 메시지나 질문 메세지 그 밖에 다양한 정보 메세지들을 JOptionPane이라는 클래스를 통해서 아주 간단하게 써먹을수 있다. 백문이 불여일견이니 오늘 배울 소스의 결과를 보여줄텐데 한편의 파노라마(?)를 보는듯한 착각에 빠질지도 모르므로 정신 똑바로 차리기 바란다. 졸지 말라는 뜻이야.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYttCIdw_W7i-_zQSYyWNZ8PVtNy2NE8Kcq2IkoM0zq-a0xPbMdAtX7bvkHDC-QyOWZqJ4vu0ZjFQ4HknsGqUw6EDA5BPex4nGg_cCXq8aCsLUcS39HN9VE9NQK7lycBkFtOND44mA2lau/s1600/r02.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYttCIdw_W7i-_zQSYyWNZ8PVtNy2NE8Kcq2IkoM0zq-a0xPbMdAtX7bvkHDC-QyOWZqJ4vu0ZjFQ4HknsGqUw6EDA5BPex4nGg_cCXq8aCsLUcS39HN9VE9NQK7lycBkFtOND44mA2lau/s400/r02.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL_SIUYOJZhWw7va1EYpwhWsfpLhEmYzglWLVc7Blvq7MxJ4j15ZSR03o6QDmvbKZk0DABq8qwcE8SJl6SWSAG5NjQovwnl30Q9uIJNAOODpIYwdPAPlklVoubUOxP2IzlCQFR3c14c5nT/s1600/r03.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL_SIUYOJZhWw7va1EYpwhWsfpLhEmYzglWLVc7Blvq7MxJ4j15ZSR03o6QDmvbKZk0DABq8qwcE8SJl6SWSAG5NjQovwnl30Q9uIJNAOODpIYwdPAPlklVoubUOxP2IzlCQFR3c14c5nT/s400/r03.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje6H0Kc79x0lr26UHv8uaRTJ9zzDLnsEnCTRj5nwXbHFN07JEF8wELXU3fQMZ_BdKnnKxoO7z8bh8HUarx_-dBYx2iSP9PudC-1cm6bfVg5KaWVysU4okz8wFofjUlTldFX5URGWxeok1i/s1600/r04.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje6H0Kc79x0lr26UHv8uaRTJ9zzDLnsEnCTRj5nwXbHFN07JEF8wELXU3fQMZ_BdKnnKxoO7z8bh8HUarx_-dBYx2iSP9PudC-1cm6bfVg5KaWVysU4okz8wFofjUlTldFX5URGWxeok1i/s400/r04.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJ0gbq8YT-77YTnKkivRPyhy1lR4aCDn1FOgMojvRd8A5OWzjpFI7aZYevyVqESG_955-gdv4qali0UoHLUpkBXj7sb-3qZyKNXa8ivNX9LL-LZkMctQZiu51466omnuXQtgvAjZEnwjQ/s1600/r05.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJ0gbq8YT-77YTnKkivRPyhy1lR4aCDn1FOgMojvRd8A5OWzjpFI7aZYevyVqESG_955-gdv4qali0UoHLUpkBXj7sb-3qZyKNXa8ivNX9LL-LZkMctQZiu51466omnuXQtgvAjZEnwjQ/s400/r05.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibJDjAS-M1ujCxYxZiKzZRv2Lx4NUSrEgBpbD5Zjy4-HZ9AtQH9k_-ao7s0UuST9kZ2wcoNAIxvO5iie5obqXcrI-OQwsShonr6C9z_XdXd6_KQtxXvSPim896uk0B0FE9H-r_yMtWPP3c/s1600/r06.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibJDjAS-M1ujCxYxZiKzZRv2Lx4NUSrEgBpbD5Zjy4-HZ9AtQH9k_-ao7s0UuST9kZ2wcoNAIxvO5iie5obqXcrI-OQwsShonr6C9z_XdXd6_KQtxXvSPim896uk0B0FE9H-r_yMtWPP3c/s400/r06.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMnNlg_PhMT21AJ12fVTm2P_4ORT7SH6Q8gijWCjpXSONu3MCdep9TNCCInsHNWoshTZdbK2hLRlH0wfpRP6y0e1DF33gD-YYTFvE2MrFxZHFc8qJE1-sYVsRh8ZMSIfYLoeNVEJ0UqiHr/s1600/r07.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMnNlg_PhMT21AJ12fVTm2P_4ORT7SH6Q8gijWCjpXSONu3MCdep9TNCCInsHNWoshTZdbK2hLRlH0wfpRP6y0e1DF33gD-YYTFvE2MrFxZHFc8qJE1-sYVsRh8ZMSIfYLoeNVEJ0UqiHr/s400/r07.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUkF-1PyzznHxwYVQy6zbow4TPQDn2w6FyrZKSeypI15269rZNAAse4kP5JZkFaSZuuo-8Vrc28AJxBYM8BFJnQFAHgDlAOWFnuL3cSMxUH8zw5w51UVMT_v5AKBL88fk7Fwg7wZ_6qomX/s1600/r12.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUkF-1PyzznHxwYVQy6zbow4TPQDn2w6FyrZKSeypI15269rZNAAse4kP5JZkFaSZuuo-8Vrc28AJxBYM8BFJnQFAHgDlAOWFnuL3cSMxUH8zw5w51UVMT_v5AKBL88fk7Fwg7wZ_6qomX/s400/r12.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik4J2sRcGJo-hTPkuNNINmUURMaV4_pU3K6VHdA_Zgs3PoAA40FCGzP7JZrjfSye1hMB1ODps0TFR689LZtjyBwFDfRrlC0aYb396KPnBR-lV3ZATZGhLUR8pvgoFoLClJ3rRp-55WJdCO/s1600/r13.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik4J2sRcGJo-hTPkuNNINmUURMaV4_pU3K6VHdA_Zgs3PoAA40FCGzP7JZrjfSye1hMB1ODps0TFR689LZtjyBwFDfRrlC0aYb396KPnBR-lV3ZATZGhLUR8pvgoFoLClJ3rRp-55WJdCO/s400/r13.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE1YDymDvu95HvKIEHTVXOl5Zd0x0ZiYj2KHtk0WeBVAym-oydwXUVf3LbQxRyf9jX-EL3CuS72prbw6p4yJ_mhZoailsNILQX3U5yR8whXHQOZ7aCe1KaHfiCwqSvI1_WJHiPBSfzDcCW/s1600/r14.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE1YDymDvu95HvKIEHTVXOl5Zd0x0ZiYj2KHtk0WeBVAym-oydwXUVf3LbQxRyf9jX-EL3CuS72prbw6p4yJ_mhZoailsNILQX3U5yR8whXHQOZ7aCe1KaHfiCwqSvI1_WJHiPBSfzDcCW/s400/r14.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoUDnhjsu0pSJQtfNqbIrb3RjDJrtCOXkInt-BJWd7cINXmpq5vDRnoFIXy983owiDxAqWvhysT-fezmGuWqhkz1uWQGOKoutX1aC0xl5tlAF2Wmt3lbnEvmf_nsvtXTWX35TBXSdKPN8p/s1600/r08.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoUDnhjsu0pSJQtfNqbIrb3RjDJrtCOXkInt-BJWd7cINXmpq5vDRnoFIXy983owiDxAqWvhysT-fezmGuWqhkz1uWQGOKoutX1aC0xl5tlAF2Wmt3lbnEvmf_nsvtXTWX35TBXSdKPN8p/s400/r08.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6V1KiXZg5M4Tf2BSosXjqpUAVvTVSSliDxUiUdF4KQUwb0lQT4SfzJtTKCyA1Sa1c5pv82CH-g2RkESGmXS0KITtpzmYcu_st7fT-Zs6l3ECmqvO_p06TjJNHQWGQKCWJ1n_FC6IWw6wQ/s1600/r09.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6V1KiXZg5M4Tf2BSosXjqpUAVvTVSSliDxUiUdF4KQUwb0lQT4SfzJtTKCyA1Sa1c5pv82CH-g2RkESGmXS0KITtpzmYcu_st7fT-Zs6l3ECmqvO_p06TjJNHQWGQKCWJ1n_FC6IWw6wQ/s400/r09.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI0PepV-mQDtbFt_ljdRWaAXWixAt_E-0ocSDmDk_kGke2vKIq1hvkuTpA_Q7rG-TTNgllKa8Ly5xnNttiGzFIdhDhK-T1bXZtDMTXF6OZqMTZC91jfajBqnuqN5CwVrMGmrdj0m90CsLK/s1600/r10.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;204&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI0PepV-mQDtbFt_ljdRWaAXWixAt_E-0ocSDmDk_kGke2vKIq1hvkuTpA_Q7rG-TTNgllKa8Ly5xnNttiGzFIdhDhK-T1bXZtDMTXF6OZqMTZC91jfajBqnuqN5CwVrMGmrdj0m90CsLK/s400/r10.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaO6cLQwVO0JdSqzXIAYa9Py-dU-8oMEaDVoxvm5iy2XBoTAnvLcSFBvIUaUFT6cfT69N2MWdQvEzBmldWZm7B4No3X8evBa9pIfCW9eYsGzsUyUM5WG_KZot-vDAxN-kWwP8Vd6dfgPJ_/s1600/r11.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;232&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaO6cLQwVO0JdSqzXIAYa9Py-dU-8oMEaDVoxvm5iy2XBoTAnvLcSFBvIUaUFT6cfT69N2MWdQvEzBmldWZm7B4No3X8evBa9pIfCW9eYsGzsUyUM5WG_KZot-vDAxN-kWwP8Vd6dfgPJ_/s400/r11.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
올릴게 많으니 굉장히 힘드는구먼. 자 바로 위의 그림들이 오늘 우리가 실행하면 나올 예제소스의 결과물들이다. 아마 여러분은 벌써부터 초긴장 모드로 돌입했을지도 모르겠다. 이거 대화창 일일이 하나하나 만들려면 소스는 도대체 얼마나 길게 써야 되는거지? 라고 말이다. 그러나 필자가 이미 여러분과 약조한바 오직 핵심비법만을 전수할 것이기 때문에 그런 오해는 금물이라는 점을 미리 밝혀두는 바이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
사실 대화창이 나오고 메세지만 전달하는 방법과 바로 위의 그림처럼 yes나 no로 선택하는 경우에 유저의 선택에 따라서 결과물에 해당하는 다음 경로가 달라져야 할것이나 그런것까지 구현할 경우 복잡해서 자포자기하는 이들이 많을 것 같아 오직 기본에 충실한 소스를 만들었다. 따라서 예스를 하든 노를 선택하든 결과의 차이가 없다. 이런 것은 액션퍼폼이나 액션리스너를 사용해서 만들수 있는데 필자가 여러분이 잊을만하면 건드리고 또 건드리고 해왔으므로 본 예제를 적절히 응용해서 접목시키면 선택에 따른 결과도출도 여러분이 스스로 쉽게 만들수 있으리라 생각한다. 그럼 여러분이 꿈(?)에 그리던 소스를 보여주기로 하겠다. 이해를 돕기 위해 정성스런 한줄 한줄 띄어쓰기를 통해 해당 결과물을 소스와 손쉽게 비교해볼수 있도록 세세한 신경(?)을 쓴점 여러분이 알아주기 바라면서 예제를 보기로 하자.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjviws9-8IxucjJXfnob8pKru5FANS0Z6q8VUB_W_KFthbmCCIYPM28o4_GYJ9QuYfRn39rj5dYldQCWW7zORw3bYwaNpD65dxkRjgbYUAH9WsFSQw6PiN4c1apRwzHsSiMADNDWr4nlR1h/s1600/t95.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjviws9-8IxucjJXfnob8pKru5FANS0Z6q8VUB_W_KFthbmCCIYPM28o4_GYJ9QuYfRn39rj5dYldQCWW7zORw3bYwaNpD65dxkRjgbYUAH9WsFSQw6PiN4c1apRwzHsSiMADNDWr4nlR1h/s400/t95.jpg&quot; width=&quot;301&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
소스를 보면 놀라운 일들이 벌어질 것이다. 그냥 보는 족족 이해가 될것이다. 왜 그런지는 필자도 알수가 없다.ㅎㅎ 처음에 프레임을 만드는 이유는 대화창을 띄우는 기본 베이스가 필요하기 때문이니 그런가보다 하고 넘기고 그 다음부터 나오는 대화창 소스를 관심있게 보면 되겠다. JOptionPane클래스안에 들어있는 showMessageDialog, showConfirmDialog, showOptionDialog, showInputDialog와 같은 메소드를 이용하면 이렇게 간단하게 대화창을 쓸수가 있는데 형식은 안에 들어있는 내용을 결과와 함께 비교해보면 이해하는데 어려움이 없을 것이다. 소스를 보면 아래와 같은 텍스트를 보게 된다.&lt;br /&gt;
&lt;br /&gt;
메세지 종류(message type)&lt;br /&gt;
WARNING_MESSAGE&lt;br /&gt;
ERROR_MESSAGE&lt;br /&gt;
INFORMATION_MESSAGE&lt;br /&gt;
QUESTION_MESSAGE&lt;br /&gt;
PLAIN_MESSAGE&lt;br /&gt;
&lt;br /&gt;
옵션 종류(option type)&lt;br /&gt;
YES_NO_OPTION&lt;br /&gt;
YES_NO_CANCEL_OPTION&lt;br /&gt;
DEFAULT_OPTION&lt;br /&gt;
OK_CANCEL_OPTION&lt;br /&gt;
&lt;br /&gt;
본 예제를 실행해보면서 결과와 비교해보면 느끼겠지만 위의 메세지와 옵션 타입 명령을 주는 것만으로도 아이콘을 상황에 따라 바꿀수 있고 또한 해당 아이콘을 여러분이 마음껏 교체하고 그 옵션 버튼에 대한 문구까지도 여러분이 손쉽게 바꿀수 있는 기능을 제공한다.&amp;nbsp;필자가 이번 예제 소스를 만들면서 둔 주안점은 그냥 여러분이 원하는 프로그램에 입맛대로 필요한 부분만 가져다가 바로바로 구현할수 있도록 최대한 배려해서 만든 대화창 소스이니 이보다 더 좋을순 없다 하겠다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
이 소스에서 재미있는 부분은 역시 배열(array) 요소가 가미된 부분이라 할수 있겠다. 대화창에서 버튼 누르는 이름까지도 object를 이용한 array 요소를 이용해서 여러분이 원하는데로 이름을 만들수 있고 맨끝에 options[1]이라는 부분은 커서를 CANCEL에다가 기본으로 놓아두라는 것을 의미한다. 아래의 선택 예제에서도 마찬가지로 커서의 위치가 어디에 놓여있는지 보면 뽀인트(?)가 무엇인지 저절로 알게 될것이다.^^</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/446518014665336474/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2011/11/jdialog.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/446518014665336474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/446518014665336474'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2011/11/jdialog.html' title='스윙으로 대화창 만들기(JDialog)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYttCIdw_W7i-_zQSYyWNZ8PVtNy2NE8Kcq2IkoM0zq-a0xPbMdAtX7bvkHDC-QyOWZqJ4vu0ZjFQ4HknsGqUw6EDA5BPex4nGg_cCXq8aCsLUcS39HN9VE9NQK7lycBkFtOND44mA2lau/s72-c/r02.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4157482598906673216.post-4231851845886422105</id><published>2011-10-15T09:30:00.000-07:00</published><updated>2011-10-16T05:02:38.807-07:00</updated><title type='text'>스윙으로 애플릿 만들기(JApplet)</title><content type='html'>오늘부터는 탑레벨 컨테이너들에 해당하는 콤포넌트들에 대해서 차례차례 살펴보겠다. 탑레벨이므로 말에서 풍기듯 스윙 프로그램을 제작할시 이제부터 배우는 콤포넌트들 중에서 최소한 하나는 들어갈 것인데 아래의 3가지 콤포넌츠를 공부해 보기로 하자. 여러분이 이제까지 무의식적으로 써왔을테지만 하나하나 다시 살펴보면서 더 심층적인 학습이 되리라 생각한다. 안다고 그냥 지나치는 일은 없기 바란다. 혹시나 건질게 있을지 모르니까 말이다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Top-Level Containers&lt;/b&gt;&lt;br /&gt;
JApplet&lt;br /&gt;
JDialog&lt;br /&gt;
JFrame&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVGlAWxMxk2UdIejG81LCBv0qQkBDe7mYE2PpMS_4KOSeIeiybOSESN0m7OHUaI2uw8Qf9Y2lbka4UbqB-ioUZZO-BGDxhzQUaaZm4o-hVV55WeH3BeM9PzhcgsARvY5q4fRlCwr5BsfoF/s1600/japplet.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;221&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVGlAWxMxk2UdIejG81LCBv0qQkBDe7mYE2PpMS_4KOSeIeiybOSESN0m7OHUaI2uw8Qf9Y2lbka4UbqB-ioUZZO-BGDxhzQUaaZm4o-hVV55WeH3BeM9PzhcgsARvY5q4fRlCwr5BsfoF/s400/japplet.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
자 그럼 자바에서 유명한 애플릿 그 중에서도 스윙을 위해 최적화되어있는 JApplet을 공부하는 시간을 가져보도록 하겠다. 애플릿을 공부하는 이들이라면 많은 의문들이 있을 것인데 그 중에 대표적인 것이 Applet 클래스도 있고 JApplet 클래스도 있는데 이것썼다 저것썼다 하니 도대체 뭐가 다른건지 궁금한 이들이 있을줄 안다. 맞나? 아님 말구..ㅎㅎ 간단하게 설명하자면 JApplet은 Applet의 subclass이다. 즉 Applet의 자식클래스가 JApplet이라는 넘(?)인데 말그대로 상속받았으니 부모(Applet)의 모든 기능을 포함하면서도 더 많은 다른 잔잔한 기능들(?)을 더 가지고 있는 것이 JApplet이라는 클래스인데 한마디로 요약하자면 스윙에서 애플릿을 멋드러지게 구현하기 위해 존재하는 것이라 보면 된다. 따라서 좀더 멋드러진 기능을 이용하기 위해 필자는 과감(?)하게 JApplet을 사용해 보기로 하겠다. ^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRAMIM9rpCs0eG8-TQF9WvactNoUqL9gYYOH5HPL25ymQMBUzf42GNUNU5yir9LZhf8hJ0nv70wmjc0biOlRRxNPKJcjloJAevwd-WqXSc_27MVV5ea6z7MS-OR5cw9flAjtvneyzQhkpw/s1600/ProgramHierarchy.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;231&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRAMIM9rpCs0eG8-TQF9WvactNoUqL9gYYOH5HPL25ymQMBUzf42GNUNU5yir9LZhf8hJ0nv70wmjc0biOlRRxNPKJcjloJAevwd-WqXSc_27MVV5ea6z7MS-OR5cw9flAjtvneyzQhkpw/s400/ProgramHierarchy.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
이미 예전에 자바의 애플릿에 대한 강의를 필자가 진행한바 있는데 그런 까닭에&amp;nbsp;이 강좌를 그냥 넘길까 하다가&amp;nbsp;자바애플릿 강좌부문 톱에 랭크되어 있어&amp;nbsp;여러분의 열화와 같은 성원(?)에&amp;nbsp;보답하고자 본 강의를 언제나 그렇듯 초정성으로 준비하였다. 그러나 내용은 아주 짧다. 이유는 오직 핵심만 강조할 것이기 때문이다.ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
자 그럼 예제결과를 보면서 오늘 배울 내용이 무엇인지 살짝 보기로 하겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie7Tf8PAkTqZmD2dBGYM-t7Gv8fCNSS0-2r5eEFWl9ktxqXnOtp-bdDlZXag8xwxMc3RditWYV9m_ehy89vPA1nW-4N19OjSrj2OLmXF4a0bTrCIRVDQRtXd27YSfRmI4xWibJfij9R2uu/s1600/r93-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;237&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie7Tf8PAkTqZmD2dBGYM-t7Gv8fCNSS0-2r5eEFWl9ktxqXnOtp-bdDlZXag8xwxMc3RditWYV9m_ehy89vPA1nW-4N19OjSrj2OLmXF4a0bTrCIRVDQRtXd27YSfRmI4xWibJfij9R2uu/s400/r93-2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
시작부터 풍기는 포스(?)가 대단하다. 클릭하면 여러분은 까무러칠지도 모른다. 따라서 부작용(?)을 우려해 필자가 특별히 주의메세지를 넣었다. 오늘 이 예제를 사용하는데 있어 여러분의 항의(?)가 거칠지도 몰라 한참 망설인 후에 필자가 큰 결단(?)을 내리고 예제를 공개하는 것이니만큼 여러분도 본 강의를 거침없이 따라와주길 부탁한다. ^^&lt;br /&gt;
&lt;br /&gt;
예제의 결과는 본 강좌의 맨 뒤에 공개하도록 하겠다. 욕을 하더라도 강의가 끝난 다음에 하라. ㅎㅎ 소스를 보기전에 예전 애플릿 강좌를 떠올려보기 바라고 잘 기억이 나지 않는다면 예전 강좌를 공부한 후에 다시 계속하면 이해하는게 누워서 떡(?) 먹기보다도 쉬울 것이다.^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi94D4GvKgHjy68fwbuA0g0dqbRMHEEjiGbk2mYaljqUnMfSKes70ukJ7zpVbssrVM1-AbTntIpp0UjFBRCFMvlQj3GDx1tr-dfxurHMJKC02C1OUkS1F5mhVeYm88V3goyg8CFytpV31BJ/s1600/t93.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;183&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi94D4GvKgHjy68fwbuA0g0dqbRMHEEjiGbk2mYaljqUnMfSKes70ukJ7zpVbssrVM1-AbTntIpp0UjFBRCFMvlQj3GDx1tr-dfxurHMJKC02C1OUkS1F5mhVeYm88V3goyg8CFytpV31BJ/s400/t93.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
강조한데로 애플릿을 이용한 아주 심플한 예제를 만들어 보았다. 내용을 보면 본 예제소스인 Test93 클래스에서&amp;nbsp;JApplet을 사용하기 위하여 해당 클래스를 상속하였고 ActionListener 즉 뭔가 여러분을 위한 이벤트를 만들기 위하여 특별히 이 인터페이스를 불러다 구현하였다. 본 예제의 핵심은 init( ) 메소드이다. 애플릿에서 초기화시킬때 쓰는 메소드가 바로 init( )이다. 공부했던 내용이니 특별한게 없을 것이다. 본 예제는 버튼 하나 만들어서 화면에 띄우고 상대방이 그 버튼을 클릭하면 새로운 팝업창이 나오면서 이벤트 메세지가 나오는 소스다. actionPerformed라는 메소드도 공부하였으니 단지 복습하는 부분에 지나지 않을 것이다. JOptionPane쩜 어쩌구저쩌구 하는 것은 새로운 팝업창 즉 메세지창 띄울려고 쓴 것인데 showMessageDialog라는 메소드는 말그대로 메세지창이다. 쓰는 방식은 괄호안처럼 쓰면 되고 그 안에 쓰일 내용은 위에다가 String을 이용해서 메세지를 기입하면 된다.&lt;br /&gt;
&lt;br /&gt;
알았으면 타이프하고 실행을 시켜보기 바란다. 그럼 여러분은 당황하게 될것이다. 왜? 예전 강좌를 제대로 공부하지 않았으니까 말이다. main 메소드가 없다고 에러날텐데 애플릿은 메인메소드가 없다고 하지 않았는가? 애플릿은 인터넷 브라우져에서 구현하기 위한 것이므로 이를 실행하기 위해서는 여러분이 따로 html 페이지를 만들어주어야 한다. 필자는 예제소스와 같은 Test93.html 을 만들어서 안에다가 아래와 같은 내용을 적고 실행한 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPsD-bbKdBrx4mPqPF3oQCSIRFznwTzQtcJqEuNlgdajodookWRnaEQmT4EPqhg2mAsXzrI1q_j-sWkvDpZk2L8hTDcvKzxz80kXIR6K9ur7eatWsOH1Mozgi28vO2b5agLJkZXgUlOdtp/s1600/t93-html.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;176&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPsD-bbKdBrx4mPqPF3oQCSIRFznwTzQtcJqEuNlgdajodookWRnaEQmT4EPqhg2mAsXzrI1q_j-sWkvDpZk2L8hTDcvKzxz80kXIR6K9ur7eatWsOH1Mozgi28vO2b5agLJkZXgUlOdtp/s400/t93-html.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
실행은 여러분의 인터넷 브라우져로 볼수도 있을 것이고 아니면 자바 프로그램 자체에 딸린 프로그램을 애용(?)하는 방법도 가능할 것이다. 방법은 여러분의 예제 소스가 있는 곳에서&lt;br /&gt;
&lt;br /&gt;
appletviewer Test93.html&lt;br /&gt;
&lt;br /&gt;
이라고 치면 작동된다. ^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBu_tQv6hwqTtkZApmSZJNPEjn5lCqOuP81hSMTEXl_j-B1idg0fhZ_ZX9QEpeAYbdCTy_HQynIBCEB3Z9ZAh1qJluFO_r3QSq2lUvCy703575zbFhkb1STLmk4ovDN5fAHGqS372KFbYC/s1600/r93-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBu_tQv6hwqTtkZApmSZJNPEjn5lCqOuP81hSMTEXl_j-B1idg0fhZ_ZX9QEpeAYbdCTy_HQynIBCEB3Z9ZAh1qJluFO_r3QSq2lUvCy703575zbFhkb1STLmk4ovDN5fAHGqS372KFbYC/s320/r93-1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
애플릿의 매력은 역시 여러분이 쓰고 있는 익스플로러나 크롬 또는 파이어폭스 같은 인터넷 브라우저에서 작동하는 점이 아닐까한다. 여러분이 만든 프로그램을 애플릿 형태로 변환한후에 해당 인터넷 브라우져에서 사용해보기 바란다. ^^&lt;br /&gt;
&lt;br /&gt;
자 여기서 오늘 특집으로 여러분의 프로그래밍 실력을 한단계 업그레이드 시키기 위해 특별히 똑같은 결과를 위해 다른 방식으로 소스를 써보기로 하겠다. 아마 이런 방식으로 쓰여진 코드를 많이 보게될텐데 이게 코드가 길어지면 길어질수록 내용도 없는 것이 여러분에겐 복잡해 보이기만 할것이다. 그럼 아래 소스를 보기 바란다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWfW_1KbcRRBaqIe0IkT9b2KFtgHJFZ2suwLj8SHyagTSwOrK1DUt1ZoHkFFG8MdvJlKQleioEECevFDOKe48HPKe0fP7eVKQfmEieWS9V5yWZ14yLfAuxuXcipfTlSFIkWzECFUF76Li-/s1600/t94-html.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;176&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWfW_1KbcRRBaqIe0IkT9b2KFtgHJFZ2suwLj8SHyagTSwOrK1DUt1ZoHkFFG8MdvJlKQleioEECevFDOKe48HPKe0fP7eVKQfmEieWS9V5yWZ14yLfAuxuXcipfTlSFIkWzECFUF76Li-/s400/t94-html.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhppGvuox8F9F9L3lKMa9ekoXJVaIDpzNrOGbhkRBmEiDni9tJHJqRnSpbHJqQBqm5ADGRKl4Hmhap2B8vaA8UCacE_5B36rYMYkKpbkhx5nh4g0NtAHKCeKtwn_X6wDtd7YfEAKY7wCA5c/s1600/t94.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;173&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhppGvuox8F9F9L3lKMa9ekoXJVaIDpzNrOGbhkRBmEiDni9tJHJqRnSpbHJqQBqm5ADGRKl4Hmhap2B8vaA8UCacE_5B36rYMYkKpbkhx5nh4g0NtAHKCeKtwn_X6wDtd7YfEAKY7wCA5c/s400/t94.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
어차피 애플릿이니까 아까처럼 html 파일을 만들어야하니까 위처럼 써야되고 아래의 소스가 내용은 같은데 표현방식이 다르다. 왜 어렵게 느껴지는걸까? 쉽게 느껴진다면 여러분을 오늘부터 강이의 자바강좌 장학생(?)으로 임명하겠다. 짝짝짝~ ㅎㅎ 아마 복잡하게 보이는 이유는 바로 내부클래스의 일종인 익명클래스를 썼기 때문일 것이다. 보다시피 이렇게 익명클래스를 쓰면 어차피 한번 쓰고 말것이기 때문에 번거롭게&amp;nbsp;메소드를 두개 따로 쓸 필요가 없어 코드가 간결해진다. 물론 소스를 분석하는 입장에서는 조금 불편할지 모르겠지만 말이다. 쉽게 설명하자면 익명클래스는 메소드 내부에서 관련 객체 생성하면서 관련 메소드를 오버라이드하면 바로 사용가능하다는 것인데 중괄호{ }를 어떻게 쓰는지 관심있게 보고 끝날때 메소드안에서 끝나는 것이니 보기는 이상하지만 }); 이런식으로 끝나게 된다는 것을 유념하면 될것이다. ^^ 이에 관한 더 상세한 내용은 필자가 호랑이 담배 꼴아물고 빨던시절에 강의한 내용을 참조하기 바란다. ㅎㅎ&lt;br /&gt;
&lt;br /&gt;
그럼 오늘의 이벤트 결과를 발표하면서 오늘 강의를 끝내도록 하겠다. 이미 소스를 공부한 이들은 무엇인지 파악했겠지만 여러분을 위한 강력한 필자의 메세지를 전파하고자 다시 한번 용기(?)를 내어 본 예제결과를 올린다. 다시 강조하지만 노약자나 임산부 혹은 19세 이하 어린이들은 보는 것을 삼가해주기 바란다.T 왜냐? 필자가 전하는 폭풍감동(?) 메세지에 여러분은 숨이벅차 쓰러질지도 모르기 때문이다. 그럼 아래의 결과로 인사를 대신하며 오늘 강좌는 여기서 마치겠다. ^^&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4_3Mehme5IcpcldYa9UVa_bSfRuzBbRZE-fI0rt0pLTdd0EwjvYjBDekilWKLkQCrtjyLq6IP88syuQsVy9U9hSjuPe8nXtknKFO9jOzyxZ5k23Wk57rNiNUYcIQguHW1ZyGGMJ-f76t2/s1600/r93-3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4_3Mehme5IcpcldYa9UVa_bSfRuzBbRZE-fI0rt0pLTdd0EwjvYjBDekilWKLkQCrtjyLq6IP88syuQsVy9U9hSjuPe8nXtknKFO9jOzyxZ5k23Wk57rNiNUYcIQguHW1ZyGGMJ-f76t2/s400/r93-3.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alecture.blogspot.com/feeds/4231851845886422105/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://alecture.blogspot.com/2011/10/japplet.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4231851845886422105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4157482598906673216/posts/default/4231851845886422105'/><link rel='alternate' type='text/html' href='http://alecture.blogspot.com/2011/10/japplet.html' title='스윙으로 애플릿 만들기(JApplet)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVGlAWxMxk2UdIejG81LCBv0qQkBDe7mYE2PpMS_4KOSeIeiybOSESN0m7OHUaI2uw8Qf9Y2lbka4UbqB-ioUZZO-BGDxhzQUaaZm4o-hVV55WeH3BeM9PzhcgsARvY5q4fRlCwr5BsfoF/s72-c/japplet.gif" height="72" width="72"/><thr:total>0</thr:total></entry></feed>