『성폭력, 성희롱, 성매매의 상관관계』‘성매매 방지법!!’ 얼마 전 신문, 인터넷 등 방송매체를 통해 우리사회를 떠들썩하게 했던 사회문화적 핫이슈다. 좋든 싫든 이 문제는 매춘부와 사회의 대립뿐만 아니라 성매매를 무조건적으로 불법화 하려고 가치판단을 내린 페미니스트들과 ‘성매매 방지법 철회’ 시위를 벌이는 매춘여성의 대립까지 야기되어 우리사회 구성원 모두에게 직면한 큰 과제가 되어 버렸다. 물론 이렇게 크게 당면하기 까지 오랜 시간 갈등과 논쟁을 벌여왔던 것이 사실이고 대다수 시민들은 묵과할 수밖에 없었던 풀기 어려운 문제이기도 하다. 여기서 논쟁의 초점은 단지 깊숙이 만연된 성매매 문제만을 왈가왈부 할 것이 아니라 이번엔 한번 근원적인 문제부터 끄짚어 나가기로 하자.우리는 매일매일 뉴스나 인터넷 매체 등을 통해 여성의 성적차별을 여러 가지 사건들로부터 들어온다. 예를 들어 여성이 학교나 직장에서 남성들로부터 성희롱을 당한일, 인적 없는 산골마을에서 동네 아저씨, 오빠들로 부터의 집단 성폭행 혹은 연예계 뉴스를 통해 ‘성 상납’이라는 악습이 이어져 오고 있었다는 이슈꺼리들. 이 모두 남성에 의해 여성만이 일방적인 피해자가 되어오고 있는 우리사회의 현실이라 할 수 있다. 마치 우리가 어디 가서 남자가 여자에게 성폭행을 당하거나 성희롱을 당했다는 사건은 있을 수 없듯이 문제는 모두 남성에 의해 일어난다.그리고 바로 그 문제란 바로 성희롱, 성폭행, 성매매 안에서 모두 말해진다.그렇담 우리가 생각하고 있는 성희롱, 성폭행, 성매매의 발생이 어디서부터 였는지 그리고 그 관계에 대해 정리해보자.성희롱은 여성에 대한 성적모욕이라 할 수 있는 우리 남자들이 가장 쉽게 범하면서도 간과하는 부분이다. 예를 들어 학교나 직장에서 남자들끼리 여자의 외모를 보고 ‘저여잔 가슴이 어쩌네 어쩌네~’하는 농담 따먹기부터 친구나 직장 여성동료, 혹은 학교후배에게 외모만 보고 위화감을 준 다던가 특정부위만을 의식해서 보며 희희낙락거리는 행위 모두가 포함된다고 할 수 있다.성희롱 문제가 대두되는 배경에는 먼저 옛부터 그래왔던 여성성을 관철시킨 가부장적 사회관습을 비롯하여 이는 오늘날에 와서 여성에 대한 일방적인 성적 비하로 이어져온 것이다. 이 ‘성적 비하’는 여성에 대한 외모지상주의 라고 생각하면 될 것이다. 외모적으로 좋지 못한 여성은 무시되고 그렇다고 외모가 출중하더라도 단지 여성의 외모만 재려하는 모습까지도 성적 비하라고 할 수 있겠다.그렇다면 이 모든 것이 단지 가부장적 사회관습에서 발전해온 것인가? 하지만 정말로 문제를 야기 시키는 것은 현재 우리사회에 더 많다는 것이다. TV나 인터넷 방송매체는 매일매일 몸매와 얼굴이 예쁜 몸짱, 얼짱 스타들의 핫 이슈 만을 기사화 하는 것이 대부분이다. 연예계 또 다른 핫이슈였던 ‘누드열풍’은 그야말로 여성의 성 상품화를 재촉시키는 증폭제, 하지만 어찌보면 아름다움(美)을 꿈꾸는 연예인들의 자유로운 자기표현이라 할 수 있는 그야말로 가치판단의 척도가 더 흐트러지는 문제이다.하지만 나는 이 ‘방송매체’가 우리사회 여성의 성 상품화를 가져오는 나쁜 도구로 쓰여 졌다고 생각한다. 정리해서 생각해보면 우리사회가 오랫동안 가부장적 사회제도를 통해 여성에 대한 기본적인 성적차별이 내려옴과 동시에 지금도 여러 부분에서 방송매체나 상업화가 가져온 악습이라 여겨진다. 그러므로 앞으론 TV방송 매체에서 외모를 중시하는 사회풍토를 바꾸기 위해 편향적으로 여성을 성 상품화하는 상업조성을 지양해야할 것이다.성폭력은 마찬가지로 여성에 대한 성적멸시와 더불어 음란한 대화에서 끝나지 않고 여성에 대한 직접적 육체적 폭력이 가해지는, 성희롱보다 강도가 높은 행동이라 할 수 있겠다. 성폭력 사건은 주로 법적인 조치가 많이 가해지는 경우이며 성폭력, 성폭행 모두 한마디로 남성이 여성을 무력으로 이기려는, 혹은 통제하려는 불법행위 이다. 성폭력은 바로 성희롱으로부터 출발하며, 성희롱부터 바로잡아야 성폭력까지 이어지는 사건을 방지할 수 있다.그러기 위해선 먼저 남성이 여성보다 단지 힘이 세다는 이유로 우월감에 빠져있어선 안된다는 인식을 올바른 성교육을 통해 어려서부터 못 박아야 할 것이다. 물론 지금 성인 남성들의 경우도 마찬가지일 것이지만 말이다.성차별로부터 나온 또 하나의 문제 ‘성매매’.이 문제는 현재 정확한 가치판단을 할 수 없을 만큼 논쟁, 논란꺼리 이다.성매매는 말 그대로 ‘돈을 주고 남성이 여성의 성을 산다’라는 행위이다.(일반적으로) 문제는 성매매가 가져오는 사회적 여파이다. 얼마전 성매매 방지법을 주장하는 장본인 ‘페미니스트들’과 성매매 방지법을 철회하라는 ‘매춘여성’들과의 대립이 TV를 통해 나오는 장면에서 가장 큰 인상을 받았다. 페미니스트들은 매춘여성의 불가피한 성 착취 모순을 고발하고 비인간적인 행위에 대한 사회적 보상을 주장했지만 정작 직업여성들이 마스크로 얼굴을 가리면서까지 시민들 앞에 나와 노동력 착취에 맞서 생존권을 주장하려는 모습에서 같은 여성 속에서의 엇갈린 가치판단 행동들이 우리 사회에서의 성문제에 대한 심각한 ‘모순성’을 확연히 드러내어 준다.
한.중.일 삼국의 역사분쟁과 대응방안◆ 한국과 중국의 역사분쟁1. 동북공정(1) 동북공정이란(2) 동북공정의 추진배경과 추진목적(3) 동북공정의 추진과정과 추진기구(4) 동북공정의 내용(5) 동북공정의 주요쟁점(6) 동북공정의 문제점과 대응방안◆ 한국과 일본의 역사분쟁1. 독도문제(1) 독도와 관련된 일본의 망언(2) 왜 일본은 독도를 자기네 땅이라고 우길까?(3) 일본은 무엇을 노리고 있는가?(4) 대처방안2. 임나일본부설(1) 임나일본부설이란?(2) 일본이 주장하는 임나일본부설의 근거(3) 우리나라의 반박과 근거◆ 중국과 일본의 역사분쟁1. 난징대학살(1) 난징대학살이란(2) 일본과 중국의 입장(3) 난징대학살의 문제점과 대응방안◆ 3국의 역사 교과서 왜곡1. 일본의 역사 교과서 왜곡2. 중국의 역사 교과서 왜곡3. 한국의 역사 교과서 왜곡4. 3국의 역사 교과서 왜곡의 문제점과 방안한국과 중국의 역사분쟁1. 동북공정 동북공정의 개념동북공정(東北工程)은 동북변강역사여현상계열연구공정(東北邊疆歷史與現狀系列硏究工程)의 줄임말로서, 중국 동북 지역의 역사와 현황에 관한 대형 학술 과제를 뜻하며, 우리말로 '동북 변강의 역사와 그에 따라 파생되는 현상에 대한 체계적인 연구 프로젝트'로 옮길 수 있다. 동북공정은 중국 정부의 승인을 받아 중국사회과학원과 랴오닝(遼寧) 지린(吉林) 헤이룽장(黑龍江) 등 동북 3성이 연합해 추진하는 국책사업으로, 2002년 2월부터 시작됐다. 구체적 연구 과제는 고대 중국 강역이론 연구, 동북 지방사 연구, 동북 민족사 연구, 고조선 고구려 발해사 연구, 중-조(中-朝) 관계사 연구, 한반도 정세 변화 및 그에 따른 중국 동북변강 안정에 대한 영향 연구 등이다. 연구비는 5년간 중국 정부에서 1000만 위안, 중국 사회과학원에서 125만 위안, 동북 3성에서 375만 위안을 조달할 계획이다. 이는 약 24억 원에 이르는 규모다. 2002년부터 2006년까지 5년 계획의 이 프로젝트는 중국 사회과학원 소속 변강사지연구중심(邊疆史地硏究中心) 유지할 수밖에 없다. 이 때문에 지금도 중국 정부는 조선족들에게 조국관·민족관·역사관에 대한 대대적인 사상교육을 시키고 있다. 한국은 고국일 뿐이지만, 태어나서 사는 곳은 중국이므로 그들이 충성을 바쳐야 할 곳은 중국이라는 점을 강조한다. 조선족들의 이탈을 방지하고, 자신들의 국경과 영토를 문화적이고 경제적인 것과 연계시키지 않으려는 정당성을 역사해석에서 확보하려는 것이 바로 동북공정이다.둘째, 동북공정의 목표는 남북한이 통일된 이후에 발생할 수 있는 영토분쟁에서 역사적인 선점을 해 두려는 것이다. 지금도 중국과 한국의 영토문제는 분쟁의 소지가 있다. 원래 간도는 조선과 청나라 사이에 영토분쟁단계로 남아 있었던 곳이다. 그런데 그것이 지금의 형태로 고착화 된 것은 1909년에 체결된 간도협약을 통해서였다. 그 이전 간도는 중국의 땅도 아니고 조선의 땅도 아니었다. 간도협약은 잘못된 조약인 을사조약에 근거해서 당사자인 조선이 빠진 채 일본과 청에 의해서 이루어졌던 것이다. 2005년까지 을사조약의 하자를 들어서 이것을 무효화시키게 되면, 여기에 기반해서 이루어졌던 간도협약 역시 무효가 된다. 이렇게 되면 간도는 중국과 한국 사이의 엄청난 영토분쟁으로 비화될 수 있다. 중국은 이러한 영토분쟁의 가능성을 역사 해석을 통해 미리 막으려는 것이다. 동시에 동북공정에서 목표하는 대로 역사가 해석되면, 한국의 역사적 영토는 대동강이남 혹은 최악의 경우 한강 이남으로 밀려나게 된다. 이것은 결국 급변하는 역사적 소용돌이에서 중국이 한반도 문제, 특히 북한의 문제에 개입할 수 있는 역사적 실마리를 마련해 주는 결과를 낳게 된다. 역사적으로 중국의 영토였으므로 그에 대한 개입 역시 정당할 수 있다는 논리가 얼마든지 가능하다.셋째, 중국은 동북공정을 통해서 중국의 신제국주의를 위한 역사적 근거를 확보하려고 한다. 중국은 그들의 역사를 한족 중심의 역사로 기술하면서, 동아시아의 역사를 '한족 팽창사'로 정리한다. 나머지 동아시아 국가들의 역사는 한족 팽창사의 주변사에 불과할 뿐이외적인 사회 현안과 문제들은 연구하는 중앙 학술기관이다. 중국이 경제면에서 사회주의 체제와 작동방식을 탈각하려는 노력을 상당정도 기울였다 하더라도 아직은 국가조직이나 행정조직에서 국가주도의 사회주의 체제의 특성을 현저하게 나타내고 있다고 할 수 있다. 따라서 체제의 메커니즘으로 볼 때 대규모 사업의 추진과 예산의 집행에서 국가의 관여와 영향력을 발견하기는 그리 어렵지 않다. 더군다나 동북공정의 국가적 관심과 중요성에 비추어 볼 때 어떤 측면에서든 국가의 공식적 관여를 부정할 수 없다. 동북공정이 국가적 사업이라는 것은 그들 스스로도 밝히고 있다.동북공정을 책임지고 있는 중국변강사지연구중심은 중국사회과학원 산하 직속의 개방성 연구기관이라고 할 수 있다. 여기서 개방성 연구기관이라 함은 변강사지연구중심 내의 자체인력도 있지만 제치 연구인력만이 관련 주제를 연구하는 것이 아니라 어떤 과제가 주어질 대 외부의 공모를 통해서 해당 주제에 대한 연구를 협동으로 진행한다는 의미이다. 1983년에 창건되어 웡두지엔, 뤼이란, 마다쩡이 주임을 지냈으며 2001년부터는 리성이 변강사지연구중심의 주임을 맡고 있다. 변강사지중심의 연구는 기초연구와 응용연구로 분류된다. 기초연구는 근대의 변계연구, 고대의 강역연구 및 중국변강연구사를 내용으로 하고 있다. 중국 근대의 변계의 변천, 중국통일 다민족 국가의 형성과 발전의 규율, 역사상 변경지역 정책의 경험과 교훈 및 중국변경연구의 역사적 유산을 중점 연구함으로써 연사로부터 교훈을 얻는 것을 목적으로 한다는 것이다. 응용연구는 당대중국변강지구의 쟁점문제와 중점문제에 대해 대책을 수립하고 예측하는 연구를 하는 것이다.한편 동북공정을 책임지고 있는 구성원들을 살펴보면 이 사업이 얼마나 국가적 관심을 가지고 있는지를 파악할 수 있다. 구성원들의 면면을 들여다보면 몇 가지 특징을 추론할 수 있다.첫째, 중앙 정부의 실력자라고 할 수 있는 중국공산당 정치국위원과 중앙위원들이 참여하고 있는 것으로 볼 때, 이 사업의 국가적 관심을 파악할 수 있다.근거로 들었다. 또한 고구려는 중국 군현인 집안에서 시작하였고 평양은 고조선을 멸망시킨 한이 낙랑군을 설치한 곳이라는 새로운 학설을 내놓고 있다.그러나 이러한 모든 주장들은 통일적 다민족 국가론이라는 중국의 역사인식에 위배되는 억지논리이다. 현재의 중국 땅 안에서 일어났던 일을 모두 중국사로 보는 것이 통일적 다민족 국가론인데 평양 일대는 현재 중국이 아닌 북한 땅이기 때문이다. 고구려가 중국 군현으로 된 고조선의 옛 땅 안에서 일어난 것은 사실이지만 이것은 오히려 고구려가 건국과정에부터 중국의 침략을 물리치면서 자주적인 발전을 이룬 나라였다는 것을 보여주는 증거다.(4) 고구려와 수·당의 전쟁은 중국의 집안싸움이었다.중국의 역사서인 , 에는 당 고조가 '고구려와 중국은 별개인데 굳이 지배하려 들 필요가 있느냐'라고 말한 내용이 기록돼 있다. 물론 고조의 이 견해는 신하들의 반대로 철회되고 결국 중국 중심의 천하 건립을 위해 고구려를 공격한다. 이처럼 고구려와 수·당 간의 전쟁은 두 국가 간, 두 세력권 간의 충돌과 갈등의 결과였다.(5) 중국으로 끌려간 고구려 유민들이 더 많기 때문에 그 역사도 중국사다.고구려가 멸망한 후 분산된 고구려 유민들 가운데 일본과 신라로 들어간 사람들보다는 중국으로 흡수된 사람들이 더 많았다. 그러나 국가의 성격은 멸망 이후 유민 흡수 숫자의 많고 적음으로만 따질 수 있는 단순한 숫자놀이가 아니다. 신라로 내려간 고구려 유민들은 신라의 힘을 빌어 고구려를 부흥시키기 위해 나·당 전쟁에 앞장섰고 신라는 당 침략군을 몰아내기 위해 고구려의 왕족 안승으로 하여금 금마저(전북 익산)에 보덕국이라는 나라를 세우도록 하였다.또 후삼국시대에는 후고구려로, 이후에는 고구려를 계승한다는 뜻의 국회를 가진 고려로 고구려 계승의식이 이어졌다. 하지만 중국에서는 고구려 계승의식을 가진 적이 한 번도 없었다. 그러므로 한나라의 역사는 유민 수의 많고 적음으로 정해지는 것이 아니라 유민들이 갖고 있던 자의식과 역사의식에 의해 결정되는 것이다.(6) 고구려에서 양국간 이익의 조화를 위하여 한국과 중국이 그 지위에 대하여 합의를 보아야 할 중요한 집단이다. 특히 최근의 한중일 3국 지역 지유무역협정(FTA)의 체결과 시베리아 철도의 한반도 연장에 관한 논의는 한국으로 하여금 직접적인 이해관계 지역인 동북지역에 거주하고 있는 조선족에 대한 관심을 요구하고 있다.한국에게 있어 조선족은 같은 혈통을 공유하는 한민족이며 재외동포이고, 중국에게 있어서 조선족은 국가의 공민이며 소수민족이다. 이러한 배경으로 인해 조선족이 갖는 정체성이 학문적 관심을 요구하며 조선족과 한·중 양국의 정치, 경제, 역사, 문화적인 관계양식도 차이가 있는 것이다.한국의 입장에서 볼 때 조선족은 정서적으로 같은 핏줄을 나눈 민족이며 실리적으로 한중관계에 긍정적인 기여를 할 수 있는 귀중한 자산이다. 조선족은 그 동안 한중관계의 협력과 발전에 중요한 매개자로 기능하였다. 한국인과 조선족의 언어 및 문화의 유사성은 한중간 거래비용을 크게 절감하고 있다.중국의 입장에서 조선족은 엄연한 중국의 시민이며 다민족 국가인 중국의 55개 소수민족 중의 하나이다. 더욱이 조선족은 몽골족과 더불어 그들의 모국이 지리적으로 인접한 지역에 위치하고 있다. 남북한은 국가규모가 인구 약 200만의 몽골과 비교가 되지 않을 정도로 크며, 조선족의 지리적 거주지역은 중국과 태평양의 중간지대에 위치하고 있다. 따라서 조선족의 지리적 거주지역은 중국과 태평양의 중간지대에 위치하고 있다. 따라서 조선족의 정치경제적 움직임은 중국의 對한국 및 對북한, 나아가 對한반도 정책의 수행에서 전략적 고려의 대상이 될 수밖에 없다. 따라서 조선족에 대한 객관적이고 실증적인 연구의 축적은 한중간 국가 관계의 긍정적인 발전을 위하여 반드시 필요하다.조선족은 논리적으로 그동안 한국과 중국의 저치, 경제, 사회문화적 관계에 영향을 미쳤으며 또 반대로 영향을 받아왔다고 볼 수 있다. 한중관계 12년은 양국간 관계가 협력과 갈등의 양면성을 가져왔으며, 앞으로도 이러한 협려고가 갈등은 반복하여 노정될 것.
제4장 AWT 프로그래밍4.1 AWT 각 컴포넌트 알아보기AWT(Abstract Window Toolkit) 자바에서 GUI를 작성 네이티브(native) 윈도우 바탕 윈도우즈 95/98에서는 윈도우즈 95/98의 윈도우를 사용 유닉스에서는 X 윈도우를 사용 실행되는 환경에 따라 모양이 약간씩 다를 수 있음 전체적인 형태는 동일 자바 AWT는 java.awt 패키지에 클래스들이 포함4.1 AWT 각 컴포넌트 알아보기AWT의 컴포넌트 AWT 컴포넌트 클래스들의 상속 관계 메뉴 컴포넌트 상속 관계4.1 AWT 각 컴포넌트 알아보기Component 클래스 AWT의 가장 상위 클래스 모든 AWT에 공통되는 특성과 메소드를 정의함 자주 사용되는 메소드들void add(PopupMenu) - 컴포넌트에 팝업메뉴를 붙인다. Container getParent() - 컴포넌트를 포함하는 컨터이너를 리턴 Dimension getSize() - 컴포넌트의 크기를 리턴 boolean isEnabled() - 컴포넌트가 현재 활성화되어 있나 알아본다. void setBackground(Color) - 컴포넌트의 배경색을 설정 void setEnabled(boolean) - 컴포넌트를 활성화/비활성화시킨다. void setFont(Font) - 컴포넌트의 폰트를 설정 void setForeground(Color) - 컴포넌트의 전경색을 설정 void setLocation(int, int) - 컴포넌트의 위치를 설정 void setSize(int, int) - 컴포넌트의 크기를 설정 void setVisible(boolean) - 컴포넌트를 화면에 보이도록/안보이도록 한다4.1 AWT 각 컴포넌트 알아보기4.1.1 프레임(Frame) 생성자 Frame() Frame(String title) 프레임을 생성한 후, 프레임의 크기를 결정해야 프레임의 크기는 setSize(int width, int height)라는 메소드를 이용 단위: 픽셀 윈도우를 화면에 보여주기 위해서는 setVisib하는 아이템 문자열을 리턴 int getItemCount() - 아이템의 개수를 리턴 int getSelectedIndex() - 현재 선택된 아이템의 인덱스를 리턴 String getSelectedItem() - 현재 선택된 아이템의 문자열을 리턴 void remove(int position) - 인덱스에 해당하는 아이템을 제거 void remove(String item) - 특정 문자열과 같은 아이템을 제거 void removeAll() - 모든 아이템을 제거 void select(int pos) - 인덱스에 해당하는 아이템을 선택 void select(String str) - 특정 문자열과 같은 아이템을 선택 void addItemListener(ItemListener l) - 아이템 이벤트를 받을 수 있는 ItemListener를 등록4.1 AWT 각 컴포넌트 알아보기예제 : ChoiceDemo.java …… 9 Choice choice = new Choice(); 10 choice.add( One ); 11 choice.add( Two ); 12 choice.add( Three ); 13 choice.add( Four ); 14 choice.add( Five ); 15 choice.add( Six ); ……4.1 AWT 각 컴포넌트 알아보기4.1.7 리스트 (List) 항목들 중에서 하나 혹은 여러 개를 선택할 수 있는 것 생성자 List() - 리스트를 생성 List(int rows) - rows 수 만큼 아이템이 보이도록 List(int rows, boolean multipleMode) - boolean 아규먼트는 리스트에서 다중 선택 허용 여부를 결정 true이면 다중 선택이 가능; false이면 단일 선택만 메소드들 void add(String item) - 아이템을 추가한다. void addActionListener(ActionListener l) – ActionEvent 이벤트를 받을 수 있는 ActionListener를 등록한다. void 컴포넌트 생성자 Scrollbar(Scrollbar.VERTICAL) Scrollbar(Scrollbar.HORIZONTAL) 생성자의 아규먼트는 스크롤바의 방향성을 결정 Scrollbar.VERTICAL - 세로 방향의 스크롤바를 생성 Scrollbar.HORIZONTAL - 가로 방향의 스크롤바를 생성4.1 AWT 각 컴포넌트 알아보기4.1.11 캔버스 (Canvas) 주로 그림을 그리는 경우에 많이 사용되는 컴포넌트 직접 사용되지 않고 상속받아서 사용한다. 생성자 Canvas()4.1 AWT 각 컴포넌트 알아보기예제 : CanvasDemo.java 1 import java.awt.*; 2 3 public class CanvasDemo extends Frame { 4 Canvas canvas; 5 6 public CanvasDemo() { 7 super( CanvasDemo ); 8 canvas = new Canvas(); 9 canvas.setSize(200,100); 10 canvas.setBackground(Color.yellow); …..4.1 AWT 각 컴포넌트 알아보기4.1.12 패널 (Panel) 다른 컴포넌트를 포함할 수 있는 컨테이너 다른 컨테이너에 원하는 형태로 컴포넌트를 붙이기 위해서 이용 보통 패널은 화면에 보이지 않는다. 생성자 Panel() Panel(LayoutManager layout)4.1 AWT 각 컴포넌트 알아보기예제 : PanelDemo.java 1 import java.awt.*; 2 3 public class PanelDemo extends Frame { 4 Panel panel; 5 6 public PanelDemo() { 7 super( PanelDemo ); 8 setLayout(null); 9 panel = new Panel(); 10 panel.setSize(80, 50); 11 panel.setBackground(Color.blue); 12 panel.setLocation(50, 50); 13 add(pat java.awt.*; 2 3 public class BorderTestOne extends Frame { 4 public BorderTestOne() { 5 super( BorderTestOne ); 6 setLayout(new BorderLayout(5, 5)); 7 add( North , new Button( North )); 8 add( Center , new Button( Center )); 9 add( South , new Button( South )); 10 add( West , new Button( West )); 11 add( East , new Button( East )); 12 setSize(300,200); 13 setVisible(true); 14 } ……4.2 AWT 컴포넌트 붙이기4.2.3 그리드 레이아웃 (GridLayout) 컴포넌트들을 행렬식으로 행과 열의 수에 맞게 배치할 때 사용 컴포넌트들의 위치는 맨 윗줄부터 시작해서 왼쪽에서 오른쪽으로 움직이며 각 줄을 이동 add() 메소드를 호출하는 순서에 따라 컴포넌트의 위치가 변경 그리드 레이아웃을 생성하기 위해서는 행과 열을 지정해야 각 행과 열의 크기가 동일하기 때문에 그리드 레이아웃에서는 각 컴포넌트는 동일한 크기를 갖는다 생성자 setLayout(new GridLayout(3,4)) - 3행 4열의 그리드 레이아웃을 이용해 컴포넌트를 붙인다. setLayout(new GridLayout(2,0)) - 0이 들어있는 경우는 행과 열의 수가 결정되지 않았음을 의미 이 경우에는 2행과 임의의 열을 갖는 그리드 레이아웃이다. setLayout(new GridLayout(3,4,10,15)) - 3행 4열 그리드 레이아웃에 각 컴포넌트의 가로 간격이 10 픽셀, 세로 간격이 15 픽셀4.2 AWT 컴포넌트 붙이기예제 : GridTestOne.java 1 import java.awt.*; 2 3 public class GridTestOne extends Frame { 4 publict(gridbag); 10 11 constraint.fill = GridBagConstraints.BOTH; 12 constraint.weightx = 1.0; 13 Button b1 = new Button( Button1 ); 14 gridbag.setConstraints(b1, constraint); 15 add(b1); 16 17 Button b2 = new Button( Button2 ); 18 gridbag.setConstraints(b2, constraint); 19 add(b2); 20 21 constraint.gridwidth = GridBagConstraints.REMAINDER; 22 Button b3 = new Button( Button3 ); 23 gridbag.setConstraints(b3, constraint); 24 add(b3); ……4.2 AWT 컴포넌트 붙이기4.2.6 레이아웃 매니저 사용 안 하기 setLayout(null) 각 컴포넌트의 크기와 위치를 프로그래머가 지정해주어야 플랫폼 환경이 변하거나 프레임의 크기가 변경되는 경우에 컴포넌트의 크기나 위치가 프로그래머가 원하는 것과 다르게 나올 수 있다 예제 : NoLayout.java …… 12 setLayout(null); 13 setSize(500, 400); 14 display = new TextArea(5, 15); 15 display.setSize(220, 200); 16 display.setLocation(210, 50); 17 add(display);4.2 AWT 컴포넌트 붙이기4.2.7 AWT 기타 관련 사항 1. 컴포넌트 크기 getPreferredSize()로 가장 적절한 크기를 결정 getPreferredSize() 메소드를 오버라이딩하여 적절한 크기를 변경할 수 있음. getInsets() 메소드를 오버라이딩하여 프레임내부와 컴포넌트의 간격을 조절. Insets 생성자. Insets(int top, int left, int bottom, int righ
제7장 이벤트 프로그래밍7. 이벤트 프로그래밍이벤트-드리븐 (event-driven) 프로그래밍 마우스 버튼 클릭, 더블 클릭, 마우스 이동 등의 모든 사용자 액션에 대해 응답하는 형태로 작동하도록 하는 프로그래밍 윈도우 환경에서는 대부분의 응용프로그램이 이벤트-드리븐 프로그래밍 방식으로 작성된다. 일반 프로그램 이벤트-드리븐 프로그램7.1 AWT 이벤트고수준 이벤트 여러 개의 작은 이벤트들로 이루어져 있는 의미 있는 것 예: “마우스를 클릭한다” 저수준 이벤트 작은 작업들로 세밀하게 표현되는 것 예: 마우스 클릭 -- “마우스를 이동한다.”, ”마우스를 누른다.”, ”마우스를 띤다.” 버튼에서 클릭에 따른 이벤트 처리과정 1. 버튼 객체를 생성한다. Button ok = new Button( OK ); 2. 버튼을 클릭하는 경우에 수행할 작업을 버튼에 등록한다. 버튼에 등록할 때 addActionListener()라는 메소드를 이용한다. ok.addActionListener(...)7.1 AWT 이벤트버튼에 수행내용 등록 addActionListener(..) 메소드 이용. 이 메소드의 매개변수는 버튼 클릭에 의해 작업할 내용을 갖는 객체임. 버튼을 클릭하면 actionPerformed(ActionEvent )가 수행되도록 약속되어 있음. 객체에 actionPerfomed(ActionEvent) 메소드가 있음을 보장하기 위해 ActionListener인터페이스를 임프리멘츠함.7.1 AWT 이벤트AWT 컴포넌트에서 발생할 수 있는 이벤트들LabelFrameDialogContainerComponentChoiceCheckboxMenuItemCheckboxCanvasButtonAWT 컴포넌트XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXwindowtextmousemotionmousekeyitemfocuscontainercomponentadjustmentaction발생할 수 있는 이벤트7.1 AWT 이벤트WindowTsuper( 텍스트필드 이벤트 ); 10 one = new TextField( How are you ? ); 11 one.addActionListener(this); 12 two = new TextField( Hello ); 13 two.addActionListener(this); 14 exit = new Button( Exit ); 15 exit.addActionListener(this);`7.2 이벤트 처리17 add( North , one); 18 add( South , two); 19 add( East , exit); ………………….. 24 public void actionPerformed(ActionEvent e) { 25 if(e.getSource() == one) { 26 String msg = two.getText(); 27 two.setText(one.getText()); 28 one.setText(msg); 29 }else if(e.getSource() == two) { 30 System.out.println(two.getText()); 31 String msg = two.getText(); 32 two.setText(one.getText()); 33 one.setText(msg); 34 }else if(e.getSource() == exit) { 35 setVisible(false); 36 dispose(); 37 System.exit(0); ………………7.2 이벤트 처리7.2.3 ItemEvent ItemEvent는 체크박스, 라디오버튼, 선택, 리스트에서 아이템이 선택되거나 선택이 해제되는 경우에 발생하는 고수준 이벤트이다. ItemEvent의 멤버 필드 static int DESELECTED - 선택이 해제된 것 static int ITEM_STATE_CHANGED - 아이템의 상태가 변경됨 static int SELECTED - 아이템이 선택된 것 ItemEvent의 생성자 ItemEvent(ItemSelectable source, ndler()); 10 addMouseMotionListener(new MouseMotionHandler());7.2 이벤트 처리…… 21 public class MouseMotionHandler extends MouseMotionAdapter { 22 public void mouseDragged(MouseEvent e) { 23 w = Math.abs(startX - e.getX()); 24 h = Math.abs(startY - e.getY()); 25 repaint(); …… 29 public class MouseEventHandler extends MouseAdapter { 30 public void mousePressed(MouseEvent e) { 31 startX = e.getX(); 32 startY = e.getY(); 33 } 34 35 public void mouseReleased(MouseEvent e) { 36 w = Math.abs(startX - e.getX()); 37 h = Math.abs(startY - e.getY()); 38 repaint(); ……7.2 이벤트 처리7.2.6 KeyEvent 1. InputEvent InputEvent는 KeyEvent와 MouseEvent의 부모 클래스로서, 모든 컴포넌트의 입력을 위한 이벤트의 가장 상위 클래스이다. InputEvent는 이벤트가 발생된 컴포넌트에서 기본적으로 처리되기 전에 리스너로 먼저 전달된다. 따라서, 필요한 경우에는 리스너(listener) 부분에서 먼저 이벤트를 처리하고, 이벤트가 발생한 컴포넌트가 디폴트 작업하지 못하도록 할 수 있다. InputEvent의 메소드 void consume() - 이벤트가 발생한 컴포넌트에서 디폴트로 작업하지 안도록 이벤트를 소비한다. int getModifiers() - 모디파이어 플래그값을 리턴한다.7.2 이벤트 처리long getWhen() - 이벤트가 발생한 시간의 타임 스탬프 값을 리턴한다. boolean isAltDownener, ComponentListener { 6 7 Scrollbar bar; 8 TestCanvas canvas; 9 Button exit; 10 11 public TestBar() { 12 super( 스크롤바 이벤트 ); 13 String msg = The VisMap system provides for + 14 visual manipulation of arbitray off-the-shelf + 15 applications, through an application's graphical + 16 user interface. ; 17 18 canvas = new TestCanvas(msg); 19 canvas.addComponentListener(this);7.2 이벤트 처리21 bar = new Scrollbar(Scrollbar.HORIZONTAL); 22 bar.addAdjustmentListener(this); 23 bar.setMaximum(canvas.getImageWidth() - 24 canvas.getSize().width); 25 26 exit = new Button( Exit ); 27 exit.addActionListener(this); ……………. 37 public void adjustmentValueChanged(AdjustmentEvent e) { 38 canvas.tx = bar.getValue(); 39 canvas.repaint(); 40 } 41 42 public void actionPerformed(ActionEvent e) { 43 setVisible(false); 44 dispose(); 45 System.exit(0); 46 }7.2 이벤트 처리48 public void componentResized(ComponentEvent e) { 49 bar.setMaximum(canvas.getImageWidth() - 50 canvas.getSize().width); 51 } 52 53 public void componemoved(TableColumnModelEvent) columnMarginChanged(ChangeEvent) columnSelectionChanged(ListSelectionEvent)noneTableColumnModelListenerListener MethodsAdapter ClassListener Interface7.3 스윙 이벤트windowActivated(WindowEvent) windowClosed(WindowEvent) windowClosing(WindowEvent) windowDeactivated(WindowEvent) windowDeiconified(WindowEvent) windowIconified(WindowEvent) windowOpened(WindowEvent)WindowAdapterWindowListenerundoableEditHappened(UndoableEditEvent)noneUndoableEditListenertreeWillCollapse(TreeExpansionEvent) treeWillExpand(TreeExpansionEvent)noneTreeWillExpandListenerListener MethodsAdapter ClassListener Interface7.3 스윙 이벤트대부분의 스윙 컴포넌트들은 AWT와 동일하거나 혹은 유사한 방법으로 이벤트 처리를 할 수 있다. 예를 들어 JButton은 AWT의 Button과 동일하게 ActionEvent를 이용해서 이벤트 처리를 한다. 예제: AddTableRow.java (JButton에서 ActionEvent를 사용하는 예제) 4 import javax.swing.event.*; 5 import javax.swing.table.*; 6 7 public class AddTableRow extends JFrame implements ActionListener { 8 JButton add; 9 DefaultTableModel model; 10 JTable table; 11 12 w}
제5장 애플릿과 Java2D5.1 애플릿 소개5.1.1 애플릿 소개 자바 애플릿 웹브라우저 내에서 수행되는 자바 프로그램 자바 애플릿은 main() 함수가 없다. cf) 일반 자바 어플리케이션은 main() 함수부터 수행 애플릿 프로그램을 작성하려면 Applet 클래스로부터 상속받아야 애플릿뷰어(appletviewer) 애플릿 프로그램을 작성하고 테스트하기 위해서 웹브라우저 대신 애플릿 클래스는 항상 public으로 선언되어야 자바 애플릿에는 다음과 같은 기본적인 함수가 정의 init(), start(), paint(), stop(), destroy(), update() 애플릿 프로그램을 개발하는 프로그래머는 이 함수들을 오버라이드해서 사용5.1 애플릿 소개1. 자바 애플릿을 웹 홈페이지에 등록하기 HTML에서 applet 태그는 웹에서 자바 애플릿을 등록하기 위한 태그 실제 애플릿은 .class 파일에 저장되어 있고, applet 태그는 애플릿 클래스 파일을 기술 applet code = classfile.class codebase = directory archive = archivefile.zip align = aligndirection name = appletname vspace = 20 hspace = 30 width = 200 height = 100 /applet applet 태그에서 code, width, height 어트리뷰트는 항상 존재해야5.1 애플릿 소개어트리뷰트 code - 컴파일된 자바 애플릿 클래스가 저장된 파일 이름 codebase - 자바 클래스 파일들이 존재하는 디렉토리 이름 codebase는 HTML 파일과 자바 클래스 파일이 다른 디렉토리에 저장되어 있는 경우에 사용 archive - 자바의 .class 파일들을 zip이나 jar 파일로 묶어서 파일의 다운로드 시간을 줄이기 위해 사용 Netscape 3.0 이상에서 지원 align - 애플릿 정렬 위치를 결정하는데 사용 name - 애플릿의 이름을 지정 애플릿 이름은 한 웹 페est extends Applet { 6 7 Image duke; 8 9 public void init() { 10 duke = getImage(getDocumentBase(), duke.gif ); 11 } 12 13 public void paint(Graphics g) { 14 g.drawImage(duke, 25, 25, this); 15 } 16 }5.3 오디오 파일오디오 클립의 재생 자바 언어는 확장자가 .au 파일인 오디오 클립을 플레이할 수 있는 방법을 제공 오디오 클립에 관련된 자바 클래스는 java.applet.AudioClip 클래스이다. Applet 메소드 getAudioClip(URL url, String file_name) 오디오 클립 메소드 play() 함수 - AudioClip 클래스를 플레이 loop() 함수 - 반복적으로 플레이 stop() 함수 - 플레이를 중지5.3 오디오 파일예제 : AudioTest.java 1 import java.awt.*; 2 import java.applet.*; 3 4 public class AudioTest extends Applet { 5 AudioClip sound; 6 7 public void init() { 8 sound=getAudioClip(getCodeBase(), bark.au ); 9 } ……. 14 public void start() { 15 sound.loop(); 16 } 17 public void stop() { 18 sound.stop(); 19 } 20 }5.4 자바 에니메이션자바 애니메이션 보통 여러 장의 그림은 일정시간 간격을 두고 화면에 디스플레이(display)시켜서 그림이 움직이는 듯하게 보여주는 방식 시계 프로그램은 매초마다 시간을 그래픽스 클래스의 drawString() 메소드를 이용해서 새로 그려서 작성 예제 : FClock.java …….. 5 public class FClock extends Applet implements Runnable { …….. int(); 20 } 21 } 23 public void setMsg(String msg) { 24 this.msg = msg; …….5.6 자바 애플릿간의 통신예제 : UsingAppletContextSender.java 18 public void actionPerformed(ActionEvent e) { 19 Component c = (Component) e.getSource(); 20 if(c == input) { 21 if(loaded) { 22 receiver.setMsg(input.getText()); 23 input.setText( ); 24 }else{ 25 receiver = (UsingAppletContextReceiver) 26 getAppletContext().getApplet( receiver ); 27 if(receiver != null) { 28 loaded = true; 29 receiver.setMsg(input.getText()); 30 } 31 input.setText( ); ……5.6 자바 애플릿간의 통신예제:UsingAppletContext.html …… 5 applet code=UsingAppletContextReceiver.class 6 name= receiver width=200 height=100 7 /applet 9 td 10 applet code=UsingAppletContextSender.class width=200 height=100 11 /applet 12 /tr ……5.6 자바 애플릿간의 통신5.6.2 static 변수/메소드를 이용하는 방법 객체지향 언어에서 static 변수는 클래스의 전역 변수로 사용된다. 따라서 클래스의 인스턴스 간에 의사 소통을 위해서 static 변수가 많이 사용 자바에서는 클래스 이름만으로 이러한 static 변수와 메소드를 접근할 수 있는 기능을 제공 static 변수/메소드를 이용한다면 웹브라우저에서 애플릿간의 통신이 가능5.7 자바와 자바스크립트5.7.1 자바스크립트에서 ; 12 13 Toolkit tk = Toolkit.getDefaultToolkit(); 14 img = tk.getImage( horse.gif ); 15 Point point = new Point(0,0); 16 cursor = tk.createCustomCursor(img, point, horse ); 17 area.setCursor(cursor); 18 19 setSize(400, 300); 20 setVisible(true); 21 }5.9 애플릿을 이용한 홈페이지 이동URL 클래스는 웹의 Uniform Resource Locator를 표현 URLConnection 클래스와 함께 HTTP 프로토콜을 통한 웹이나 file:// URL에 존재하는 자원에 접근할 수 있는 방법을 제공 URL의 일반적인 형태 protocol://hostname[:port]/path/filename#section 프로토콜 file : 하드 디스크에 있는 파일 ftp : FTP 서버에 연결 http : 웹서버에 연결 gopher : gopher 서버에 연결 news : usenet 뉴스 그룹에 연결 telnet : 텔넷 서비스를 이용 wais : wais 서버에 연결5.9 애플릿을 이용한 홈페이지 이동예제 : URLButton.java ……… 6 public class URLButton extends Applet implements ActionListener { 7 URL url = null; 8 String title = null; 9 10 public void init() { ………. 19 try { 20 url = new URL(urlString); 21 }catch(MalformedURLException e) { 22 System.out.println( Invalid URL: + urlString); 23 } 24 Button site = new Button(title); 25 site.addActionListener(this); 26 site.setActionCommandient = new GradientPaint(10, 10, Color.red, 200, 200, Color.yellow, true); 12 circle = new Ellipse2D.Double(10, 10, 200, 200); 13 rect = new Rectangle2D.Double(10, 10, 200, 200); 14 } 15 16 public void paint(Graphics g) { 17 Graphics2D g2 = (Graphics2D) g; 18 g2.setPaint(gradient); 19 g2.draw(rect); 20 g2.fill(circle); ……………5.10 자바 2DBasicStroke 클래스 선의 굵기나 스타일을 지정하기 위해서는 스트로크(stroke)를 이용 자바 2D에서 스트로크를 설정하기 위해서는 BasicStroke 클래스를 이용 생성자 BasicStroke() BasicStroke(float width) BasicStroke(float width, int cap, int join) BasicStroke(float width, int cap, int join, float miterlimit) BasicStroke(float width, int cap, int join, float miterlimit, float[] dash, float dash_phase)5.10 자바 2D예제 : StrokeTest.java 1 import java.awt.*; 2 import java.applet.*; 3 import java.awt.geom.*; 4 5 public class StrokeTest extends Applet { 6 Rectangle2D.Double rect; 7 Ellipse2D.Double circle; 8 9 public void init() { 10 rect = new Rectangle2D.Double(20, 20, 220, 220); 11 circle = new Ellipse2D.Double(20, 20, 220}