Your SlideShare is downloading. ×
Java기초 합본
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Java기초 합본

4,230

Published on

자바 자료 2

자바 자료 2

2 Comments
2 Likes
Statistics
Notes
No Downloads
Views
Total Views
4,230
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
101
Comments
2
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Java의 기본 소개 및 환경 설정 1
  • 2. Introductions  Name  Company affiliation  Title, function, and job responsibility  Programming experience  Reasons for enrolling in this course  Expectations for this course 2
  • 3. 자바언어의 특징  단순(simple)  자바는 C++ 언어를 기반으로 탄생하였지만, C나 C++에서 프로그래 머에게 많은 혼란을 주는 요소들을 제거  자바는 C++의 preprocessor, 포인터, 다중상속, 구조체, 전역변수, goto문, 연산자 중복 등의 기능을 제외하여 언어의 복잡성을 제거  자동적인 쓰레기 수집(garbage collection) 기능을 제공  객체지향(Object-Oriented)  자바는 객체지향 언어이다. 자바 프로그램의 모든 요소들은 객체로 표현된다. 객체지향은 소프트웨어의 재사용과 정보의 캡슐화 같은 많은 장점을 제공한다. 객체지향은 우리의 실세계와 유사한 프로그 램 방식이다. 3
  • 4.  인터프리터(Interpreted)에 의해 실행  자바는 독특한 실행 방식을 취하고 있다. 자바 소스는 자바 가상 기계에서 실행될 수 있는 바이트 코드로 번역되며, 번역된 바이트 코드는 바이트 코드 해석기가 있는 어떠한 기종의 컴퓨터 환경에 서도 실행될 수 있다. Java program 인터프리터 01 s las M 00 00 m.c yP 10 ro 11 gra gr 10 am Pro .ja My va 컴파일러 My Program Tip : 자바는 compiled interpreted language 4
  • 5. 자바의 OS에 대한 독립성 자바 프로그램 컴파일러 개발환경 바이트 코드 인터프리터 인터프리터 인터프리터 실행환경 Sun Ultra Solaris Mac 시스템 PC 호환 System Windows NT 5
  • 6. JDK환경 설정 및 설치(1)  JDK란?  Java Development Kit의 약자  일반적으로 Sun/ IBM사의 jdk사용  2007년 현재 JDK1.6버전 발표  jdk1.3이후에는 Java2라는 명칭 사용  jdk15  Java5.0 명칭사용  JRE , JVM  Java의 분야  J2EE  J2SE  J2ME 6
  • 7. Java SE(Standard Edition)  Java SE 플랫폼  자바 언어를 이용하여 응용프로그램, 애플릿 프로그램, 컴포넌트 등을 개발하고 실행할 수 있는 환경을 제공  Java HotSpot Performance Engine  Java Foundation Class(JFC)  Java2 Security Model  Java Plug-In  JavaBeans Component API  JDBC(Java DataBase Connectivity)  Java RMI(Remote Method Invocation)  Java IDL(Interface Definition Language) 7
  • 8. Java EE(Enterprise Edition) Java SE를 확장하여 구성한 자바 서버측 기술로서, 다중 구조(Multi- tier)의 응용 프로그램을 개발하고 실행할 수 있는 환경을 제공  Servlets  JSP(Java Server Page)  EJB(Enterprise JavaBeans)  JNDI(Java Naming and Directory Interface)  Java IDL & CORBA  RMI over IIOP  Java Connector for EIS(Enterprise Information System)  JDBC(Java DataBase Connectivity)  Message Service  Transaction Service  JavaMail 8
  • 9. Java ME 핸드폰이나 PDA 등 소형의 내장(Embeded) 기기에서 실행될 자바 플랫 폼 - J2ME 플랫폼은 KVM(Kilobytes Virtual Machine)이라는 작은 규모 의 자바 가상 기계를 제공하고 있으며, 소규모의 기계에 적합한 API 셋(Configuration)과 프로파일 등으로 구성되어 있다 9
  • 10. JDK환경 설정 및 설치(2)  JDK의 설치확인  java –version  java  javac  JDK의 다운로드  http://java.sun.com 사이트이용  JDK설치와 환경설정  JAVA_HOME 설정  PATH 의 설정 %JAVA_HOME%bin 10
  • 11. Eclipse와 편집기환경  Eclipse  Open Source로 개발되는 IDE  일반적으로 실무 개발자들이 거의 사용  http://www.eclipse.org이용  NetBeans  Sun에서 중점적으로 개발하는 IDE  JDK번들로 같이 포함해서 사용  기타  Editplus  UltraEdit  Notepad  etc 11
  • 12. 자바 프로그램 만드는 순서  확장자가 .java인 소스 파일 작 성  컴파일을 통해 .class파일 만들 기  실행 12
  • 13. HelloWorld.java public class HelloWorld{ public static void main(String[] arg){ System.out.println("Hello World!"); } } 13
  • 14. About HelloWorld(1)  1단계 자바코드만들기  HelloWorld.java  2단계 컴파일  javac HelloWorld.java  3단계 실행  java HelloWorld 14
  • 15. Compile  소스코드를 javac 명령어를 사용하여 bytecode를 생성하는 단계를 의미 합 니다. bytecode 란 인간이 아닌 기계가 알아 들을 수 있는 기계어 코드를 의 미. 15
  • 16. Load Java class file  모든 프로그램은 실행 되기 전에 우선적으로 메모리상으로 올라옵니다.  이 과정은 실제 디스크에선 메모리상으로 올려주는 클래스로더(ClassLoader)란 것에 의해 수행  클래스로더는 디스크,네트워크 상에 있는 어플리케이션과 애플릿을 실행가능한 상태로 만듭니다. 자바에서 는 Class, ClassLoader라는 API 를 사용해서 메모리상에 올라와 있는 자바프로그램을 제어할 수도 있다  Each Java class must be loaded by a class loader. When the JVM is started, three class loaders are used:-  Bootstrap class loader  loads the core Java libraries, i.e. core.jar, server.jar etc. in the <JAVA_HOME>/lib directory. This class loader, which is part of the core JVM  Extensions class loader  loads the code in the extensions directories (<JAVA_HOME>/lib/ext or any other directory specified by the java.ext.dirs system property  System class loader  loads code found on java.class.path, which maps to the system CLASSPATH variable.  all user classes are loaded by the default system class loader 16
  • 17. 17
  • 18. 바이트 코드 검증기  The code adheres to the JVM specification  The code does not violate system integrity  The code causes no operand stack overflows or underflows  The parameter types for all operational code are correct  No illegal data conversions (the conversion of integers to pointers) have occurred 18
  • 19. Applets and Applications  Application – Runs in the operating system  Applet – Runs in a browser, does smaller tasks  "Programs" – Applies to applications and applets 19
  • 20. Common Problems 1  Compiler Problems Not compiled. No .class file.  'javac' is not recognized as an internal or external command, operable program or batch file ->Update the PATH variable  Errors ->verify the program, fix any errors that you detect, and try again  testing.java:14: `;' expected. System.out.println("Input has " + count + " chars.") ^ 1 error  while (System.in.read() != -1) count++ System.out.println("Input has " + count + " chars."); testing.java:13: Invalid type expression. count++ ^ testing.java:14: Invalid declaration. System.out.println("Input has " + count + " chars."); ^ 2 errors  Greeting.java:4: cannot resolve symbol symbol : method printl (java.lang.String)  the compiler warns you each time you use a variable that has not been initialized testing.java:13: Variable count may not have been initialized. count++ ^ testing.java:14: Variable count may not have been initialized. System.out.println("Input has " + count + " chars."); ^ 2 errors  TestGreet.java:4: Public class TestGreeting must be defined in a file called "TestGreeting.java 20
  • 21. Common Problems 2  Runtime Problems  Not Run  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp -> change your CLASSPATH variable  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp/class -> the argument is the name of the class  Can’t find class XXX -> ex) public class TestGreet{ … =>TestGreet.class java TestGreeting  Exception in thread "main" java.lang.NoSuchMethodError: main -> every application must contain a main method, right main signature  The Java VM requires that the class you execute with it have a main method at which to begin execution of your application. 21
  • 22. WelcomeJava.java //code WelcomeJava.java 1 ://이 프로그램은 WelcomJava 입니다. 2 : 3 :public class WelcomeJava 4 :{ 5 : public static void main(String[] args) 6 :{ 7 : System.out.println("Welcome to Java World ^^ "); 8 : System.out.println("자바 세상에 오신걸 환영합니다. ^^ "); 9 :} 10 :}  the most basic form of a class definition is: class name { . . . }  a main method signature public static void main(String[] args) {}  Use semicolon at the end of an action 22
  • 23. Applet과 Java프로그램 import java.applet.*; import java.awt.*; public class HelloApplet extends Applet { public void paint(Graphics g){ g.drawString("Hello World", 100, 100); } } <html> <body> <applet codebase="." code="HelloApplet.class" name="HelloApplet" width="320" height="240"> </applet> </body> </html> 23
  • 24. Java 주석처리  주석이란 자신이나 다른 사람들이 보기 편하도록 프로그램에 달아두 는 설명.  자바에서 지원하는 주석 처리 방법은 세 가지가 있다.  1. // 한 라인만을 주석으로 처리하는 경우  2. /* … */ 여러 라인 혹은 한 라인을 주석으로 처리하는 경우  3. /** … */ Document 생성시 사용하는 주석 =>javadoc tool 24
  • 25. 클래스의 선언  Basic syntax of a Java class: <modifiers> class <class_name> { [<attribute_declarations>] [<constructor_declarations>] [<method_declarations>] } 예제: Elevator.java  {, }의 쌍은 정확히 일치해야 한다.  eclipse의 자동 검사 기능  모든 자바 프로그램의 가장 기본 요소 a class is a description of an object 25
  • 26. main()메쏘드(1)  라인 5는 main 메쏘드라고 부르는 부분  main() 메쏘드는 쉽게 생각해서 interpreter 인 java 명령 어를 실행하는 동안 가장 먼저 실행 되는 부분  만약 Application 에서 main() 메쏘드가 없다면 Application은 절대로 실행 될 수 없음  Application의 시작 = 특정 클래스의 main()실행 26
  • 27. main()메쏘드(2)  public : 영어 사전에 있는 의미 그대로 해석하시면 됩니다.  자바 프로그램에서는 범위(Scope)를 나타내는 단어 입니다.  static : 사전적인 의미로 정적인, 움직이지 않는 이라는 의미를 가지고 있습니다.  static은 객체에 대한 개념이 완성된 후에 자세히 살펴 볼 것입니다.  void : ‘텅 빈’이라는 의미로 리턴 값을 나타냅니다.  리턴 값이라는 것은 메쏘드의 실행결과로 어떤 결과를 출력하는 가를 의미합니다.  main() 메쏘드의 경우는 무조건 구문이 public static void main(String[] args){… }와 같이  고정되어 있으므로 신경 쓰지 않아도 됩니다.  String[] args : String 은 프로그램 상에서 나오는 문자열을 칭하는 단어 입니다.  [] 는 배열을 의미합니다. 27
  • 28. 기본 자료형과 연산자/제어 문 28
  • 29. 식별자와 예약어  식별자(Identifier)  프로그래머가 직접 만들어줘야 하는 이름  예: 변수명, 클래스명, 메쏘드명 등  대문자, 소문자, 숫자, _, $등, 숫자는 식별자의 첫 문자로 사용될 수 없음 =>식별자 예  예약어(Keyword)  프로그래밍 언어에 미리 정의된 의미있는 단어  예약어는 식별자로 사용하지 않음 29
  • 30. java keywords 30
  • 31. 변수(Variable)와 상수(Constant)  값(Value)  데이터(Data) 자체  예: 1, 0, 20.5, true, ‘a’  자료형(Type)  데이터(Data)의 종류  예: 정수(Integer), 실수(Float, Double), 문자(Character), 논리 (Boolean – True/False), 문자열(String) 등  Java의 모든 데이터 값들은 타입을 가짐  저장될 메모리와 저장 공간 결정  해당 값에 적용될 연산을 결정  프로그램의 에러 점검 31
  • 32.  변수(Variable)  데이터를 저장할 메모리의 위치를 나타내는 이름  데이터 자체는 아님  변수의 선언 (Declaration) • 변수를 사용하기 위해서는 사용 전에 미리 선언해야 함 • Type Variable1, Variable2, … ; • int numberOfItems, numberOfTitles; • Boolean isHoliday;  초기화(Initialization) • 변수에 최초의 값을 할당하는 것 1. numberOfItems = 0; // 오른쪽 표현의 값을 왼쪽 변수에 할당 2. isHoliday = false; • 보통 변수의 선언과 동시에 초기화를 함 1. float averageOfScores = 65.4; 2. String companyName = “Bit Academy”; • 초기화 후에 값이 변할 수도 있음  變數  같은 타입의 데이터만 저장할 수 있음 • isHoliday = 1; // COMPILE TIME ERROR 32
  • 33. 변수(Variable)와 상수(Constant)  상수(Constant)  변경될 수 없는 고정된 데이터  常數  코드의 이해와 변경이 쉬움  분산된 상수로 인한 에러를 방지  정의 • “final”키워드를 사용해서 대문자로 표현함  Final double PI = 3.1416;  Final int MAXIMUM_SPEEN = 240; 33
  • 34. 문자열 상수  n : 새로운 라인으로 이동한다.  t : tab 간격만큼 건너뛴다.  ” : “(쌍따옴표)를 표시할 때 사용  b : Backspace 를 의미한다.  r : Carriage 리턴을 의미한다.  ’ : ‘(Single quote )를 의미  : BackSlash 의미 34
  • 35. 자바의 자료형  기본 자료형(primitive data type)  최소 단위의 자료형  다른 자료형으로 분해되지 않음  메쏘드가 없이 값만 가짐  int, fload, double, char 등  참조 자료형(reference data type)  여러 자료형들의 집합으로 구성된 클래스의 객체를 참조  데이터와 메쏘드를 가짐  String, Vector, Integer 등 35
  • 36. 자바의 자료형 – 기본 자료형 36
  • 37. 자바의 자료형 – 기본자료형 VS 참조자료형 37
  • 38. 자료형 변환  자료형 변환  하나의 자료형을 다른 자료형으로 바꾸는 행위  자료형의 변화없이 하나의 변수에서 다른 변수로 값 할당 불가  Boolean isHoliday = 1; // COMPILE TIME ERROR  변환규칙  암묵적 자료 유형 변환(implicit casting) : 자료의 범위가 좁은 자료형에 서 넓은 자료형으로의 변환은 시스템이 자동으로 행함  명시적 자료 유형 변환(explicit casting) : 자료의 범위가 넓은 자료형에 서 좁은 자료형으로의 변환은 시스템에서 자동으로 수행할 수 없으며 프 로그래머가 강제로 변환해야 함 int i = 101; long l = 101L; l = i; // No Problem i = l; // Compiler ERROR i = (int) l; // Now, it’s OK. 38
  • 39. 연산자  연산자의 우선순위  최우선 연산자 . [] () ; ,  단항 연산자: +/-,++/--  산술 연산자: +,-,*,/,%  Shift 연산자: <<, >>, <<<  >>, >>>, <<  관계연산자: >,<,<=, ==, !=  비트연산자: &, ^, |  논리연산자: &&, ||  삼항연산자: 조건항? 항1: 항2  배정대입연산자: = , += - > sun 275 4-7 39
  • 40. 40
  • 41. 41
  • 42. 연산자(1)  수학적인 연산  + (더하기), - (빼기) , * (곱셈) , / (나눗셈) , % (나머 지)  %는 나머지를 구할 때 사용할 수 있습니다. int a = 9%2 로 하면 a 의 값은 1 이 됩니다. 42
  • 43. 관계 연산자(2)  >, >= , < , <=, ==, !=  앞의 넷과는 달리 ‘== ‘이나 ‘!= ’는 생소한 연산자 입 니다.  ‘A == B‘는 A 와 B 가 같은 가를 판단합니다. 만약 A 와 B 가 같다면 boolean 의 값으로 true 값을 가지게 됩 니다.  ‘A != B ‘는 A와 B 가 서로 다른 가를 검사합니다. 이것 은 A와 B 가 다른 값을 갖는 경우에 true 값을 가지게 됩 니다. 43
  • 44. 정수의 사칙연산 //code NumberEx.java 1 :public class NumberEx 2 :{ 3 :public static void main(String[] args) 4 :{ 5 : int num1 = 10; 6 : int num2 = 3; 7 : 8 : int num3 = num1 + num2; 9 : int num4 = num1 - num2; 10 : int num5 = num1 * num2; 11 : int num6 = num1 / num2; 12 : 13 : System.out.println("num1 과 num2 의 합 : "+num3); 14 : System.out.println("num1 과 num2 의 차 : "+num4); 15 : System.out.println("num1 과 num2 의 곱 : "+num5); 16 : System.out.println("num1 과 num2 의 나눗셈 : "+num6); 17 : 18 : } 19 :} 44
  • 45. char 하나의 글자 1 :public class CharEx 2 :{ 3 : public static void main(String[] args) 4 : { 5 : char a='J'; 6 : char b='A'; 7 : 8 : System.out.println(a + "AV" + b); 9 : 10 : } 11 :} 45
  • 46. boolean 참과 거짓 //소스 BooleanEx.java 1 :class BooleanEx 2 :{ 3 : public static void main(String[] args) 4 : { 5 : boolean a = true; 6 : boolean b = false; 7 : 8 : System.out.println(a); 9 : System.out.println(b); 10 : } 11 :} 46
  • 47. 문자로 자료형을 구분하는법  long 타입의 숫자 2 를 선언 할 때는 뒤에 ‘L’혹은 ‘l’을 붙여 줍니다.  long v = 2L;  float 타입의 숫자 2 를 선언 할 때에는 뒤에 ‘F’혹은 ‘f’ 를 붙여줍니다.  float v = 2F;  double 타입의 숫자 2 를 표현할 때에는 ‘D’혹은 ‘d’를 붙여 줍니다.  double v = 2D; 47
  • 48. //code RelationTest.java 1 :public class RelationTest 2 :{ 3 : public static void main(String[] args) 4 : { 5 : int a = 3; 6 : int b = 5; 7 : int c = 3; 8 : 9 : System.out.println("a 와 b 가 같은 값인가?"); 10 : boolean value= (a==b); //구분을 위해서 ( ) 사용 11 : System.out.println(value); 12 : 13 : System.out.println("b와 c는 다른 값인가?"); 14 : boolean value2 = (b!= c); 15 : System.out.println(value2); 16 : } 17 :} 48
  • 49. 조건연산 연산자 의미 사용법 && and A && B A 가 true 이고 B 역시 true 일때만 true (만약 A 가 false 이면 B는 계산하지 않는다) & and A&B A 가 true 이고 B 역시 true 일 때만 true ( A 값에 상관없이 B값이 true 인지 항상 검사한다.) || or A || B A 나 B 둘 중에 하나만 true 면 true (A 값이 true 이면 B값은 검사하지 않는다.) | or A|B A 나 B 둘 중에 하나만 true 면 true (A 값에 관계없이 B 값도 검사한다.) 49
  • 50. 조건연산의 사용처  각종 제어문(if)처리  데이터의 검사  로직의 처리 50
  • 51. If문을 통한 조건 처리 if(조건){ if(조건){ }else if(다른 조건1){ }else{ }else if(다른 조건2){ } }else{ } 51
  • 52. // code IfExample.java 1 :public class IfExample 2 :{ 3 : public static void main(String[] args) 4 : { 5 : int a = 10; 6 : int b = 20; 7 : int c= 20; 8 : 9 : if(a > b) 10 : System.out.println("a가 b 보다 큰 수입니다"); 11 : 12 : if(a < b ) 13 : System.out.println("a가 b 보다 작은 수 입니다"); 14 : 15 : if(b <= c) 16 : System.out.println("b는 c 보다 작거나 같은 수 입니다"); 17 : 18 : if(c >= a) 19 : System.out.println("c는 a 보다 크거나 같은 수 입니다"); 20 : } 21 :} 52
  • 53. switch(좀더 간단한 분기) switch(int 호환가능변수){ case (값1) : statement; . . break; case (값2) : statement; . . break; . . . default : break; } 숫자 혹은 문자로 분기문을 제어하는 방법 53
  • 54. //code SwitchEx.java 1 :public class SwitchEx 2 :{ 3 : public static void main(String[] args) 4 : { 5 : //0에서 10미만의 수를 임의로 (random)하게 생성한다. 6 : int target = (int)(Math.random()*10); 7 : 8 : System.out.println("나눌 대상 : "+target); 9 : 10 : int odd = target%3; 11 : 12 : switch(odd){ 13 : case 0 : 14 : System.out.println(" 나머지는 0 입니다"); 15 : break; 16 : case 1 : 17 : System.out.println(" 나머지는 1 입니다 "); 18 : break; 19 : case 2 : 20 : System.out.println(" 나머지는 2 입니다"); 21 : break; 22 : } 23 : } 54 24 :}
  • 55. for루프 for (초기화 조건 ; 조건문 ; 변환 조건) { // your code goes here } 55
  • 56. 자동증감연산 1 :public class AutoOperator 2 :{ 3 : public static void main(String[] args) 4 : { 5 : int a =0; 6 : int b=10; 7 : 8 : //자동 중가 연산 9 : // a 값은 0 이라고 출력하지만 값은 증가 됩니다. 10 : System.out.println("0에서 출력하고 증가하기 : "+ a++); 11 : // a 값 = 1 확인 하기 12 : System.out.println("증가한 결과 값 확인하기 : "+ a); 13 : // a 값을 일단 증가하고 출력하기 14 : System.out.println("1에서 증가 후에 값 출력하기 : "+ ++a); 15 : 16 : System.out.println("-------------------------------"); 17 : //자동 감소 연산 18 : //b 값은 10이라고 출력하고 값은 9 로 변한다. 19 : System.out.println("10에서 출력후 감소하기 : "+ b--); 20 : // 감소한 값 b= 9 로 출력하기 21 : System.out.println("감소한 값 확인하기 "+ b); 22 : // 우선 감소하고 출력하기 23 : System.out.println("9에서 감소한 후에 출력하기 : "+ --b); 24 : } 56 25 :}
  • 57. 루프연습(1) //code ForEx.java 1 :public class ForEx 2 :{ 3 : public static void main(String[] args) 4 : { 5 : //10번 동안 반복하겠다는 의미의 for 루프 6 : for(int i=0; i < 10 ; i++){ 7 : 8 : //10번 동안 실행될 부분 9 : System.out.println("Hello World "+ i); 10 : } 11 : } 12 :} 57
  • 58. for 루프의 다양한 형태 int i=0; for( ; i < 10 ; i = i+1){ System.out.println("Hello World "+ i); } int i=0; for( ; i < 10 ; ){ System.out.println("Hello World "+ i); i++; } 58
  • 59. while While 구문 for 구문 int a =0; for(int a=0; a<10; a++){ while( a< 10){ ---doSomething--- ---doSomething---- } a++; } 59
  • 60. //code WhileEx.java 1 :public class WhileEx 2 :{ 3 : public static void main(String[] args) 4 : { 5 : int a=0; 6 : 7 : while (a <= 10) 8 : { 9 : System.out.println("a 의 값 : "+ a); 10 : a++; 11 : } 12 : } 13 :} 60
  • 61. do~ while  //code DoWhileEx.java  1 :public class DoWhileEx  2 :{  3 : public static void main(String[] args)  4 :{  5 : int age= 16;  6 :  7 : do{  8 : System.out.println("무조건 실행됩니다.");  9 : }while(age > 20);  10 :}  11 :} 61
  • 62. break와 continue  break  루프의 중간에 벗어나는 방법  특정 조건에 맞으면 루프를 벗어나게 설정  continue  건너뛰게 하는 방법  특정조건일 경우에만 생략하고 싶을 때 쓰는 방법 62
  • 63. 1 :public class BreakEx 2 :{ 3 : public static void main(String[] args) 4 : { 5 : //10번 동안 반복하겠다는 의미의 for 루프 6 : for(int i=0; i < 10 ; i = i+1){ 7 : 8 : if(i == 4) //i가 4가 되었을때 루프를 벗어난다. 9 : break; 10 : 11 : System.out.println("Hello World "+ i); 12 : } 13 : 14 : System.out.println(" 루프를 벗어 났습니다 "); 15 : } 16 :} 63
  • 64.  1 :public class ContinueEx  2 :{  3 : public static void main(String[] args)  4 :{  5 : //10번 동안 반복하겠다는 의미의 for 루프  6 : for(int i=0; i < 10 ; i = i+1){  7 :  8 : if(i == 4){ //i가 4가 되었을때만 건너 뛴다.  9 : System.out.println("i 값이 4 이므로 건너 뜁니다.");  10 : continue;  11 : }  12 :  13 : System.out.println("Hello World "+ i);  14 : }  15 :  16 : System.out.println(" 루프를 벗어 났습니다 ");  17 : }  18 :} 64
  • 65. break와 continue  break  루프의 중간에 벗어나는 방법  특정 조건에 맞으면 루프를 벗어나게 설정  continue  건너뛰게 하는 방법  특정조건일 경우에만 생략하고 싶을 때 쓰는 방법 65
  • 66. 1 :public class BreakEx 2 :{ 3 : public static void main(String[] args) 4 : { 5 : //10번 동안 반복하겠다는 의미의 for 루프 6 : for(int i=0; i < 10 ; i = i+1){ 7 : 8 : if(i == 4) //i가 4가 되었을때 루프를 벗어난다. 9 : break; 10 : 11 : System.out.println("Hello World "+ i); 12 : } 13 : 14 : System.out.println(" 루프를 벗어 났습니다 "); 15 : } 16 :} 66
  • 67.  1 :public class ContinueEx  2 :{  3 : public static void main(String[] args)  4 :{  5 : //10번 동안 반복하겠다는 의미의 for 루프  6 : for(int i=0; i < 10 ; i = i+1){  7 :  8 : if(i == 4){ //i가 4가 되었을때만 건너 뛴다.  9 : System.out.println("i 값이 4 이므로 건너 뜁니다.");  10 : continue;  11 : }  12 :  13 : System.out.println("Hello World "+ i);  14 : }  15 :  16 : System.out.println(" 루프를 벗어 났습니다 ");  17 : }  18 :} 67
  • 68. Java의문자열과 API사용법 68
  • 69. 자바의 간단한 문자계산 1 :class AddString 2 :{ 3 : public static void main(String[] args) 4 : { 5 : String a = "Hello "; 6 : String b = "JAVA "; 7 : 8 : System.out.println(a+b); 9 : } 10 :} 69
  • 70. 문자열연산 1 :class StringEx 2 :{ 3 : public static void main(String[] args) 4 : { 5 : String a = "안녕 A입니다 "; 6 : 7 : String b = "이건 B입니다 "; 8 : 9 : String c = a + b; 10 : 11 : System.out.println(a); 12 : System.out.println(b); 13 : System.out.println(c); 14 : } 15 :} 70
  • 71. new를 이용한 문자열 생성 1 :class StringEx2 2 :{ 3 : public static void main(String[] args) 4 : { 5 : String a = new String("Hello"); 6 : String b = new String("Hello"); 7 : 8 : System.out.println(a); 9 : System.out.println(b); 10 : } 11 :} 71
  • 72. API문서  프로그램 작성시점에 참고하는 문서  자료구조 혹은 Sun에서 제공하는 여러기능을 설명한 문 서  각 버전별로 작성  필요한 경우에 javadoc명령어를 통해서 생성가능 72
  • 73. 73
  • 74. 문자열 주요 메쏘드(함수) String concat(String target) 문자열을 연결시켜서 새로운 문자열을 만들 수 있다. String substring(int start,int leng) 문자열을 start 위치에서부터 leng 길이 만큼 잘라낸다. int length() 문자열의 길의를 구할 때 사용한다. String toUpperCase() 문자열을 모두 대문자로 바꿔준다. String toLowerCase() 문자열을 소문자로 바꿔준다. char charAt(int I) 문자열중에 I 번째 있는 char 를 반환한다. int indexOf(String target) target 문자열이 있는 위치를 반환한다. boolean equals(String target) target 문자열의 내용과 같은지를 비교한다.( 매우 중요합니다.) void trim() 문자열 뒤의 공백을 제거한다. 74
  • 75. 문자열 메쏘드 연습 //code StringMethods.java 1 :public class StringMethods 2 :{ 3 : public static void main(String[] args) 4 : { 5 : String str1 = new String("emailaddress@company.co.kr" ); 6 : String str2 = "123-4567" ; 7 : //결과로 사용할 빈 문자열 8 : String str3 = new String(""); 9 : 10 : //문자열 붙이기 11 : str3 = str1.concat(str2); 12 : 13 : System.out.println(str3); 14 : //문자열 자르기 맨 처음 부터 5 글자를 자르자 15 : System.out.println(str1.substring(0,5)); 75 16 : //문자열 길이
  • 76. 문자열의 순서  String에서는 문자의 순서(index)를 따질때 0 에서 부터 시작합니다.  H e l l o (공백) W o r l d !  0 1 2 3 4 5 6 7 8 9 10  라인 15에서는 0에서부터 5 글자를 자르기 때문에 email 까지만 결 과가 나옵니다.  다만 length() 는 문자열의 길이를 세기 때문에 1에서부터 시작합니 다. 76
  • 77. Java의 배열 77
  • 78. 배열이란?  특정한 자료들을 담을 수 있는 바구니  동일한 형태의 자료만 들어갈 수 있다.  처음 초기화 할 때 미리 크기를 지정한다. 78
  • 79. 배열과 서랍장의 공통점  1. 서랍장에는 순서가 있다.  -- 다만 배열에는 0 에서 부터 시작한다.  2. 서랍장에는 특정물건만 수납한다.  -- 배열에는 같은 형의 자료만 들어간다.  3. 옷장 내부는 비어 있을 수도 내용물이 있을 수도 있다.  -- 선언된 배열의 내부가 비어있을 수 있다.  4. 옷장은 자신만의 크기를 가지고 있다.  ---옷장이 3단이면 4번째 서랍은 없다. 79
  • 80. 배열의 선언  int[] array = …  int array[] = …  []는 배열이라는 것을 의미 80
  • 81. 배열을 초기화 하는 방법(1)  직접 초기화 하기  {}; 를 이용해서 선언  String[] array = { “속옷 “, “양말 “, “바지”} ; - 뒤에 ; 이 붙습니다.  int[] intArray = {1,2,3,4,5};  일단 선언하고 나중에 하기 81
  • 82. 배열을 초기화 하는 방법(2) String[] array = new String[3]; --- 크기가 3 단으로 된 옷장 …. array[0] = “속옷 “; array[1] = “양말 “; array[2] = “바지 “; int[] intArray = new int[3]; intArray[0] = 1; intArray[1] = 2; intArray[2] = 3; 82
  • 83.  1 :public class ArrayEx  2 :{  3 : public static void main(String[] args)  4 : {  5 : //숫자 배열 선언  6 : int[] intArray={ 1,3,5,7 };  7 :  8 : System.out.println("Array's 0 : "+intArray[0]);  9 : System.out.println("Array's 0 : "+intArray[1]);  10 : System.out.println("Array's 0 : "+intArray[2]);  11 : System.out.println("Array's 0 : "+intArray[3]);  12 :  13 : }  14 :} 83
  • 84. 배열의 길이를 구하는 방법  int array = array.length;  n번째 배열의 요소를 꺼내는 법  array[n-1] 다차원배열  [][]과 같이 다차원배열선언 가능  [0][1]과 같은 인덱스 순서로 접근 84
  • 85. public class ArrayEx1 { public static void main(String[] args){ int[] arr = new int[10]; arr[3] = 3; arr[4] = 4; for(int i = 0; i < 10 ; i++){ System.out.println(arr[i]); } System.out.println("------------------"); String[] arr2 = {"A","B","C","D","E"}; for(int i = 0; i < arr2.length; i++){ System.out.println(arr2[i]); } } } 85
  • 86. 배열의 복사  System.arrayCopy()를 통해 복사 System.arraycopy( 원본배열,복사를 시작할 원본 요소위치(숫자),복사할 배열 , 복사를 받을 때 위치, 원본배열.length); public class ArrayEx2 { public static void main(String[] args){ String[] arr = {"봄옷","여름옷","가을옷"}; String[] arr2 = new String[arr.length + 1];//3+1 System.arraycopy(arr, 0, arr2, 0, arr.length); arr2[3] = "겨울옷"; System.out.println(arr + ":"+ arr.length); arr = arr2; System.out.println(arr + ":"+ arr.length); for(int i = 0; i < arr.length ; i++){ System.out.println(arr[i]); } } } 86
  • 87.  public class ArrayEx2 {  public static void main(String[] args){  String[] arr = {"봄옷","여름옷","가을옷"};  String[] arr2 = new String[arr.length + 1];//3+1  System.arraycopy(arr, 0, arr2, 0, arr.length);  arr2[3] = "겨울옷";  System.out.println(arr + ":"+ arr.length);  arr = arr2;  System.out.println(arr + ":"+ arr.length);   for(int i = 0; i < arr.length ; i++){  System.out.println(arr[i]);  }  }  } 87
  • 88.  public class ArrayEx4 {  public static void main(String[] args) {  int[][] arr = new int[6][];  arr[0] = new int[1];  arr[1] = new int[2];  arr[2] = new int[3];  arr[3] = new int[4];  arr[4] = new int[1];  arr[5] = new int[1];   int value = 0;   for(int i = 0 ; i < arr.length ; i++){  for(int j = 0;j < arr[i].length;j++){  arr[i][j] = value;  value++;  }  }  for(int i = 0 ; i < arr.length ; i++){  for(int j = 0;j < arr[i].length;j++){  System.out.println(arr[i][j]);  }  System.out.println("---------");  }  }  } 88
  • 89. OOP 클래스 만들기 89
  • 90. OOP프로그래밍  모든 것을 객체로 추상화해서 생각  현실세계를 객체라는 것으로 프로그램상으로 반영하는 방식  각 객체간의 통신을 통해서 결과를 처리하는 방식  현재 및 미래의 프로그래밍 언어의 패러다임 90
  • 91. 객체지향 프로그래밍의 절차  1. 우선 프로그램이 쓰이는 목적을 생각하여 어떤 객체들을 만들어 야 하는지 결정한다.  2. 각 객체들이 어떤 특징(속성과 동작)을 가지고 있을 지를 결정한 다.  3. 객체들 사이에서 메시지를 주고 받도록 만들어 준다. 중요1*For each object that you see, ask yourself two questions: “What possible states can this object be in?" "What possible behavior can this object perform?".  Ex) Desktop Lamp , desktop radio Software objects are conceptually similar to real-world objects 중요2*data encapsulation ( Information Hiding ) 91
  • 92. OOP를 위해 필요한 능력  필요한 프로그램의 적절한 표현능력  각 객체와의 관계를 정의하는 능력  객체와 객체를 연결해 나가는 능력  현실적인 상황을 프로그램으로 옮기는 추상화 능력 92
  • 93. 객체의 구성  속성(Attribute)  동작(Behavior)  모든 객체는 자신의 책임(Responsibility)을 가진다.  모든 객체는 서로 메시지(Message)를 주고 받는다. 93
  • 94. 추상화와 클래스  내가 필요한 객체를 설계해서 프로그램이 인식하게 하는 방법  클래스를 설계한다.  클래스로 부터 객체를 생성한다.  생성된 객체는 클래스에 정의한 속성과 동작을 가지고 동작한다. 94
  • 95. 클래스 = 객체를 생성하는 틀  추상화 를 통한 객체모델링  JVM이 인식하는 단위  모든 객체들의 생산처 A class is the blueprint from which individual objects are created. 95
  • 96. 클래스로 부터 객체를 생성하는 것의 의미  JVM이 프로그래머가 선언한 자료를 자신의 것으로 인정 하는 것  프로그래머가 선언한 모든 동작,속성을 프로그램상에서 실행 가능하게 하는 것  new 키워드를 통해 객체를 생성하고, 이것을 메모리 상 으로 옮겨서 모든 연산작업을 수행하게 준비하는 것 96
  • 97. 클래스의 선언  접근제한 (public, default, protected, private)  클래스의 타입 (static, nonstatic)  클래스의 이름  {  } <modifiers> class <class_name> { [<attribute_declarations>] [<constructor_declarations>] [<method_declarations>] } 예제: Elevator.java 97
  • 98.  Access Levels Modifier Class Package Subclass World public Y Y Y Y protected Y Y Y N no modifier Y Y N N private Y N N N 98
  • 99. 클래스와 객체의 관계 99
  • 100. 객체(object/instance)  클래스로부터 생성  지정된 속성의 값은 각 객체마다 다르게 만들 수 있다.  모든 객체는 클래스에 지정된 동작을 동일하게 수행한다.  각 객체의 속성 = 인스턴스 변수  각 객체의 동작 = 메쏘드(method) 100
  • 101. 인스턴스변수  각 객체마다 고유하게 가질 수 있는 속성들 의미  자료형 + 레퍼러스로 선언  클래스 선언시점에 초기화할 수도 있다.  동작에 의해서 변경되는 것이 바람직함 101
  • 102. 인스턴스 변수(instance variables)  추상화해서 클래스에 선언  객체의 속성을 의미  객체가 살아있는 동안 같이 유지될 속성  다양한 방식으로 초기화 가능  생성시점에 객체의 속성정의(생성자메쏘드)  메쏘드를 통한 속성변경 가능 102
  • 103. 메쏘드(method)  프로그램상으로 동작할 방법을 정의  접근제한을 통해서 내부/외부에서 접근 가능  객체와 객체간의 통신 = 메쏘드 호출  모든 OOP프로그램은 객체와 객체간의 메시지 전송이므 로, 필요한 데이터를 넘기거나 결과 데이터를 받을 수 있 다. 103
  • 104. 메쏘드의 선언구조  접근제한  리턴타입(넘겨줄 결과가 없으면 void)  메쏘드의 이름 (주로 동사로 표현)  메쏘드가 가공한 데이터(파라미터)  {  로직  리턴 타입이 있는 경우에는 return 구 문  } 104
  • 105. 메쏘드(Method)  메쏘드  객체의 행동을 정의하는 procedure or function  적용대상: 특정 객체(object) or 전체 클래스(class)  구문:  public return_type methodName(0+ parameters){..}  호출방식: “dot(.)” 연산자  objectName.methodName(arguments)  매개변수(parameters)  메쏘드를 선언할 때 괄호 안에 표현된 Input 값을 나타내는 변수: (type1 name1, type2 name2, … )  메쏘드 호출에서 들어가는 구체적인 값은 인자(Argument)라고 함  반환값 자료형(return_type)  메쏘드는 0개 혹은 1개의 값을 Output으로 반환할 수 있음  반환값이 없을 때: void  반환값이 있을 때: int, boolean, Car, …  반환되는 값은 메쏘드 선언에서 정의된 반환값의 유형과 일치해야 함 105
  • 106. 메쏘드(Method) 선언 예 호출 예 class Car { public class CarTest { … public static void main() public void setSpeed(int s) { { speed = s; Car mcqueen = new Car(); } … public int getSpeed() { mcqueen.setSpeed(300); return speed; System.out.println(mcqueen.name + } “ “ + mcqueen.getSpeed()); } } 106
  • 107. 메쏘드(Method) – 유형 및 예제 107
  • 108. 메쏘드(Method)-유형 및 예제 3. Return값과 매개변수가 있는 method class intOp { public class intOpTest { … … public int sum(int a, int b) public static void main() { { return a+b; intOp obj1 = new intOp(); } … … int sum = obj1.sum(3,9); … 108
  • 109. 객체(Object) 생성  객체(Object)의 생성 1. UML Diagram 등을 이용하여 클래스를 디자인한다 2. Editor 를 사용하여 Source 코드를 작성한 후 .java 파일로 저장한다. 3. 위에서 작성한 클래스를 사용할 main() method를 작성한다. § main() method는 해당 클래스 내부 혹은 다른 클래스에서 정의한다. § main() method 내에서 “new”연산자를 사용하여 객체를 생성한다. 4. javac 명령어를 사용해서 해당 Source를 컴파일하여 .class 파일을 생성한다. 5. java 명령어를 사용하여 .class 파일을 실행한다. 109
  • 110. 객체(Object) 생성 – Class 디자인 110
  • 111. 객체(Object) 생성 – Source 코드 생성 111
  • 112. 객체생성 – main() method 생성 class Car { String name; int speed; public void setName(String n) { name = n; } public void setSpeed(int s) { speed = s; } public int getSpeed() { return speed; public class CarTest { } public static void main(String[] args) } { Car mcqueen = new Car(); mcqueen.setName(“ Lightning Mcqueen” ); mcqueen.setSpeed(300); System.out.println(mcqueen.name + “ “ + mcqueen.getSpeed()); } } 112
  • 113. 객체생성 – main() method 생성 class Car { String name; int speed; public void setName(String n) { name = n; } public void setSpeed(int s) { speed = s; } public int getSpeed() { return speed; } } public class CarTest { public static void main(String[] args) { Car mcqueen = new Car(); mcqueen.setName(“Lightning Mcqueen”); mcqueen.setSpeed(300); System.out.println(mcqueen.name + ““+ mcqueen.getSpeed()); } } 113
  • 114. 실습 – Car.java Main 함수에 아래와 같이 Hudson, carrera, master 객체를 추가 생성하고 각 객체의 이름과 스피드를 출력해 보십시오. 114
  • 115. 실습 – TV.java /***************************************** * 아래 WatchTV 클래스의 main 메쏘드를 실행할 수 있도록, * 우측의 UML 그림을 참조하여 TV 클래스를 정의하십시오. * channel, volume, power의 초기값은 각각 7, 20, false임. ******************************************/ public class WatchTV { public static void main(String[] args) { TV tv = new TV(); tv.powerOn(); System.out.println("현재 TV 볼륨 : " + tv.getVolume()); System.out.println("현재 TV 채널 : " + tv.getChannel()); System.out.println(“채널 36번으로 변경” ); tv.setChannel(36); System.out.println(“채널 증가” ); tv.channelUp(); System.out.println("현재 TV체널 : " + tv.getChannel()); System.out.println("TV 시청 종료"); tv.powerOff(); } } 115
  • 116. 객체(Object) 생성 – Source 코드 생성 116
  • 117. 객체의 초기화 117
  • 118. 레퍼런스와 객체  String a = “aaa”라는 관계에서 a를 레퍼런스라고 한다.  객체와 레퍼런스의 관계  풍선과 연결끈과 같은 관계 키워드 new  클래스로 부터 객체를 생성  생성한 객체를 메모리상의 힙영역으로 로딩시킨다.  필요가 없어지면 자동적으로 메모리상에서 삭제(자바의 GC(가비지컬렉션)기능에 의해 자동삭제) 118
  • 119. new로 만드는 두 개의 객체  ‘==‘혹은 ‘!=‘연산의 차이  기본자료형은 무조건 같은 값을 가지면 true를 리턴  객체형 데이터(레퍼런스형 자료)는 가르키고 있는 객체 의 hashcode의 값이 같아야 true를 리턴 119
  • 120. 참고- null  참조하고 있는 객체가 없음을 의미  객체생성을 하지 않은 상태에서 레퍼런스만 준비해둔 상 태  String a = null;  a라는 레퍼런스만 준비해둔 상태  String 클래스 타입의 객체가 필요하다는 의미 120
  • 121. 인스턴스변수 vs 지역변수  인스턴스변수 = 전역변수  객체 전반에 걸쳐 영향력을 발휘하는 변수  객체의 메쏘드내에서 사용하는 변수  선언시점에는 null로 해도 상관없음  지역변수 = 로컬변수  메쏘드 내에서만 살아 있는 변수  선언시점에 값을 지정해야 하는 변수  {}단위에서 생사가 결정 121
  • 122. static 키워드  변수와 같은 영역으로 저장되는 메쏘드와 변수를 선언할 때 사용  main()함수  변수 – 상수를 선언할 때 사용  메쏘드 – 객체 생성없이 바로 접근하고 싶을 경우에 사용 122
  • 123. static의 특징  객체의 생성없이 사용하므로 편하다.  별도의 메모리 관리를 안하므로 항상 메모리를 차지하게 된다.  여러 객체에서 static으로 선언된 변수를 공유해서 쓴다.  상수로 선언해서 공유해서 사용한다. 123
  • 124. 참고 - Overloading  생성자 메쏘드(함수)처럼 메쏘 드의 형태가 동일하지만, 입려 되는 파라미터들(parameter, arguments)의 값들이 다른 경 우에 overloading이라고 한다.  즉 하나의 클래스에 여러 개의 overloading된 메쏘드들이 존 재가능하다.  Ex: print 메소드 124
  • 125. 생성자함수(Constructor) overloading  new 를 호출할때 파라미터(arguments)를 같이 전달해서 각 객체 생성시점에 정보를 같이 제공하는 방법  아무것도 없는 경우 기본생성자(default)  만들지 않아도 제공됨  원칙  생성자함수이름은 클래스의 이름과 같다.  리턴(반환) 값이 없다. 125
  • 126. this()를 이용한 생성자함수  하나의 클래스에 여러 개의 생성자 함수를 정의할 수 있 다.  같은 이름의 다른 파라미터를 가진 함수를 호출하고자 할때 this()를 사용  this라는 키워드 자체는 현재의 객체를 의미하고자 할 때 사용 126
  • 127. 127
  • 128. 참고 - instanceof  연산자 중에 객체단위에 적용되는 연산자  A instanceof B 는 A레퍼런스가 B타입의 객체를 가르키고 있는 가를 의미  객체의 타입을 검사하기 위해 사용 128
  • 129. 참고- this  객체형 변수(레퍼런스 자료형)에서 현재의 객체를 일컫 는 용어  String str = new String(“aaa”) 인 경우에는 현재 하나의 변수가 선언되어 그 변수를 이용해서 객체를 언급하는 것을 의미한다.  반면에 this.name = new String(“aaa”)와 같은 경우에는 현재 만들어 지고 있는 객체(즉, 풍선의 끈이 내부로 향 하는 형상)의 name이라는 속성의 값이 “aaa”라는 것을 의미하게 된다. 129
  • 130. 자바의 상속 130
  • 131. 상속(Inheritance)  부모의 속성과 동작을 자식에서 물려받을 수 있음  자바에서는 단일 상속만을 지원  extends키워드를 통해서 사용  일반적으로 ~ is a relationship 관계 131
  • 132. 상속의 사용  클래스 선언 뒤에 extends 키워드를 적는다.  부모가 되는 클래스를 superclass 혹은 부모클래스라고 한다.  상속을 통해 확장된 클래스를 subclass 혹은 자식클래스라고 부른다. 132
  • 133. 상속의 특징  타입으로 본 상속  부모 타입(클래스)는 자식 타입을 포함한다.  기능으로 본 상속  자식클래스는 부모클래스보다 많은 기능을 가질 수 있다. 133
  • 134. 상속의 실습 134
  • 135. 상속의 용어  extends  super  this  override 상속과 overriding  override: 올라타다, 덮어쓰다의 의미  자바에서는 method의 재정의를 의미  부모와 자식클래스 사이에서 부모의 method를 자식이 다시 정의함 135
  • 136. 상속의 실습 – 핸드폰의 상속 public class HandPhone { public void send(String otherPhoneNum){ System.out.println(otherPhoneNum +" 으로 전화를 건다."); } public void get(){ System.out.println("전화를 받는다."); } public static void main(String[] args){ HandPhone h = new HandPhone(); h.send("01010101010"); } } 136
  • 137. Override의 실습 public class MP3Phone extends CellPhone { public void get() { System.out.println("음악이 나옵니다."); } public void send(String phoneNum) { System.out.println("음악을 들려줍니다."+phoneNum); } } public class InternetPhone extends CellPhone { public void get() { System.out.println("인터넷을 보면서 통화합니다."); } public void send(String phoneNum) { System.out.println("동영상 통화합니다."); } } 137
  • 138. 추상클래스(Abstract class)  abstract키워드사용  new로 객체를 만들 수 없는 클래스  반드시 추상 메쏘드가 하나이상 존재  사용시점  객체생성을 할 필요는 없으나 상속하고 싶을때  상속받은 자식이 반드시 무언가 구현하도록 하고싶을때 138
  • 139. 추상클래스의 실습  Shape  draw(): 추상메쏘드  Circle  Rectangle  Triangle 139
  • 140. java.lang.Object  자바의 모든 객체들의 부모 클래스  모든 클래스 선언시에는 묵시적으로 extends Object라 는 구문이 같이 존재  고유의 메쏘드를 가지고 있음  toString()  equals()  hashcode() 140
  • 141. toString()/equals()  toString(): System.out.println()을 통해서 객체의 레퍼런 스 값을 의미할 때 동작  equals(): 필요한 경우에 다른 객체와 같은 데이터를 가 지고 있는지 검사하는데 사용 141
  • 142. Upcasting(Promotion)과 DownCasting  casting 실제 객체와 선언된 자료형(클래스/타입)간의 관 계를 명확히 하는 것  Object a = new HelloWorld();  타입이 더 큰 범위인 경우에는 자동적으로 Up  Animal a = new Dog();  Dog a = (Dog)a;  타입이 더 작은 경우에는 Down 142
  • 143.  Down은 반드시 앞에 ()로 처리해서 명시적으로 선언한 다.  기본자료형도 동일하게 적용된다.  int a = 10;  byte b = (byte)a; 143
  • 144. 상속을 막는 final  클래스 선언의 final  하위 상속 금지  메쏘드 선언의 final  overriding 금지  변수 선언의 final  상수선언 144
  • 145. 인터페이스 – 다중 상속과 세상을 보는 창  interface의 의미 – 어떤 객체들끼리 통신하는 하나 의 통신 창 (ex> USB, 키 패드, 키보드..)  자바에서의 인터페이스의 의미  다중상속을 지원하는 방 법  추상 메쏘드를 통한 강제 구현의 수단 145
  • 146. 추상클래스 VS 인터페이스  인터페이스는 여러 경로의 수퍼타입 계층을 허용한다.  인터페이스는 다중 상속이 가능하다.  인터페이스는 public 상수나 구현이 없는 메쏘드만 포함 할 수 있다.  추상 클래스는 메쏘드의 구현을 포함할 수 있고, protected나 static메쏘드를 가질 수 있다. 146
  • 147. 인터페이스의 생성 문법 접근제한자 + interface + 인터페이스명 + (extends super 타입 인터페이스들)  인터페이스간의 상속 public interface JobA{ … } public interface JobB{ … } public interface JobC extends JobA, JobB{ … }  클래스에서의 구현 public class A implements JobA, JobB{… } 147
  • 148. 인터페이스의 활용 예  인터페이스간의 상속 public interface JobA{ … } public interface JobB{ … } public interface JobC extends JobA, JobB{ … }  클래스에서의 구현 public class A implements JobA, JobB{… }  상속과 같이 사용 public class A {… } public interface JobA{… } public class B extends A implements JobA{… } 148
  • 149. 인터페이스 필드, 메쏘드  필드  public static final 로 선언  선언된 필드는 무조건 public static final로 인식한다.  메쏘드  인터페이스 자체가 객체 생성이 불가능하며, 외부에서 바라보는 역할만 하기 때문에 자동적으로 abstract 가 붙는다고 생각하면 된다. 149
  • 150. 중첩(inner) 클래스 150
  • 151. Inner Class 151
  • 152. 152
  • 153. 153
  • 154. 중첩클래스  클래스 선언 내부에 또 다른 클래스의 선언 1 :public class Outer1 2 :{ 3 : String name; 4 : 5 : private class Inner1{ 6 : 7 : public void print(){ 8 : System.out.println("이것은 "+name+" 의 Inner클래스 입니다. "); 9 : } 10 : } 11 : 12 : public void setName(String n){ 13 : name = n; 14 : Inner1 inner = new Inner1(); 15 : inner.print(); 16 : } 17 : 18 : public static void main(String[] args) 19 : { 20 : Outer1 outer = new Outer1(); 21 : outer.setName("홍길동"); 22 : } 23 :} 154
  • 155. static 중첩 클래스  클래스 내부에 static으로 선언된 중첩 클래스의 선언 1 : public class Outer { 2: 3 : private String name = "AAAA"; 4: 5 : static class SInner{ 6 : public void print(){ 7 : System.out.println("PRINT SINNER"); 8: } 9: } 10 : 11 : public static void main(String[] args){ 12 : 13 : Outer.SInner inner = new Outer.SInner(); 14 : inner.print(); 15 : } 16 : } 155
  • 156. 지역 중첩 클래스 1 : public class LocalInner { 2: 3 : private String name = "LocalInner"; 4: 5 : public void print(){ 6: 7: class Inner{ 8: public void print(){ 9: System.out.println(name); 10 : } 11 : } 12 : Inner inner = new Inner(); 13 : inner.print(); 14 : } 15 : 16 : public static void main(String[] args){ 17 : LocalInner test = new LocalInner(); 18 : test.print(); 19 : } 20 : } 21 : 156
  • 157. 익명클래스(Anonymous 클래스)  필요한 곳 어디서나 선언가능  클래스 선언뒤에 반드시 ; 필요  클래스나 인터페이스를 재정의 해서 사용 1 : interface Eatable { 2 : public void doA(); 3 : public void doB(); 4 :} 157
  • 158. //code Outer2.java 1 :public class Outer2 2 :{ 3 : String foodName; 4 : 5 : public Outer2(String name){ 6 : foodName = name; 7 : } 8 : 9 : public void cooking(){ 10 : System.out.println("내부 클래스 생성합시다"); 11 : 12 : new Eatable(){ 13 : 14 : public void doA(){ 15 : System.out.println(foodName+" 익혀 먹기"); 16 : } 17 : 18 : public void doB(){ 19 : System.out.println(foodName+" 조림으로 먹기"); 20 : } 21 : }.doA(); // - Eatable 한 익명 객체.doA() 의 의미 22 : } 23 : 24 : public static void main(String[] args) 25 : { 26 : Outer2 out = new Outer2("콩나물"); 27 : out.cooking(); 28 : 29 : 30 : } 31 :} 158
  • 159. Package, jar, 접근제한 159
  • 160. 자바의 패키지  클래스의 묶음 단위  일종의 네이밍룰  접근제한과 같이 쓰여 프로그램상에서 클래스들간의 관 계를 정리할 때 사용 160
  • 161. 패키지의 선언  클래스 선언 바깥쪽  package 패키지명  일반적으로 도메인이름의 역순으로 쓴다.  www.yahoo.co.kr  package kr.co.yahoo  javac –d 옵션을 써서 컴파일 할 수 있다. 161
  • 162. 패키지의 사용  다른 패키지내의 클래스를 사용할 때는 import라는 키워 드 사용  import 패키지명.클래스명;  여러 개의 클래스들을 쓸 때는 *로 표시  패키지를 import하더라도 접근제한에 따라 접근이 불가 능 할 수도 있음 162
  • 163. 접근제한자(Access Modifier)  외부에서 특정 클래스에 접근하거나, 객체변수에 접근하 거나, 메쏘드에 접근하려고 할 때 제약을 둘 수 있는 방 법  가장 기본적인 제어  pubilc: 모든 외부에서 접근 가능  private: 모든 외부에서 접근 불가  default 제한: 같이 패키지에서 사용  protected 제한: 동일 패키지, 상속구조에서 사용 163
  • 164. jar파일  zip, tar와 같이 자바 클래스 파일들을 압축파일 형태로 보관  별도의 위치에 두고 JVM이 참조할 수 있도록 사용  jar –cvf  jar –xvf  한글 파일이름은 사용할 수 없음 164
  • 165. 날짜와 시간, StringBuffer 165
  • 166. 날짜관련 클래스  Calendar  Date  DateFormat  SimpleDateFormat 166
  • 167. 자주쓰는 기능  년/월/일의 다양한 문자열 형태 표현  시간차 구하기  해당요일 혹은 마지막 날짜 구하기  특정일에 대한 요일 구하기 167
  • 168. 숫자 포맷  NumberFormat  DecimalFormat 168
  • 169. Wrapper 클래스  JDK1.5버전 이전까지 기본자료형과 객체형 자료형간의 변환을 처리 위한 클래스들  JDK1.5버전 이후에는 Auto boxing/unboxing개념이 도 입되어 필요하지 않음  Auto Boxing Conversion From type boolean to type From type Boolean to type boolean Boolean From type Byte to type byte From type byte to type Byte From type Character to type char From type char to type From type Short to type short Character From type Integer to type int From type short to type Short From type Long to type long From type int to type Integer From type Float to type float From type long to type Long From type Double to type double From type float to type Float Boxing type double to type From Unboxing Double 169
  • 170. 기본자료형 Wrapper 클래스 byte Byte클래스 short Short클래스 int Integer 클래스 long Long 클래스 double Double 클래스 float Float 클래스 boolean Boolean 클래스 char Character 클래스 170
  • 171. 문자를 기본 자료형으로 바꿀 때 기본 자료형을 문자형으로 바꿀 때 byte b = Byte.parseByte(문자열); Byte.toString(byte 값); short s = Short.parseShort(문자열); Short.toString(short 값); int I = Integer.parseInt(문자열); Integer.toString(int 값); double d = Double.parseDouble(문자열); Double.toString(double 값); long l = Long.parseLong(문자열); Long.toString(long 값); float f = Float.parseFloat(문자열); Float.toString(float 값); boolean b = Boolean.toString(boolean 값); new Boolean(문자열).booleanValue(); char c = Character.toString(char 값); String 클래스의 메쏘드 이용 171
  • 172. StringBuffer  String과 StringBuffer의 차이  String은 연산이 일어날때 마다 새로운 객체를 만들어서 사용하 기 때문에 객체생성이 많다.  StringBuffer는 하나의 객체로 처리  String보다 StringBuffer에서 처리할 수 있는 기능의 추가  문자열 연산이 많은 작업의 경우 반드시 StringBuffer를 이용 172
  • 173. java의 Collections 173
  • 174. Collection의 종류  java.util.Collection: 순서에 관 계없는 객체들의 단순한 모임  java.util.Set: 중복되지 않는 수 학적인 의미의 객체들의 집합, Collections를 상속  java.util.List: 순차적 나열에 의한 순서지정이 가능한 구조, Collections를 상속  java.util.Map: key와 value를 이루어진 구조  java.util.SortedSet: 값들이 정 렬된 Set  java.util.SortedMap: key가 정 렬된 Map 174
  • 175. 175
  • 176. Stack 1 : import java.util.*; 2: 3 : public class StackEx { 4: 5: Stack st = new Stack(); 6: 7: public void test(){ 8: 9: for(int i = 0; i < 10; i++){ 10 : st.push(String.valueOf(i)); 11 : } 12 : System.out.println("SIZE : "+st.size()); 13 : 14 : for(int i = 0; i < 10; i++){ 15 : System.out.println(st.pop()); 16 : } 17 : } 18 : 19 : public static void main(String[] args){ 20 : StackEx ex = new StackEx(); 21 : ex.test(); 22 : } 23 : } 176
  • 177. 1 : import java.util.*; 2: 3 : public class HashMapEx { 4: 5 : public void test(){ 6 : HashMap map = new HashMap(); 7: 8 : map.put("1", "하나"); 9 : map.put("2", "둘"); 10 : map.put("3", "셋"); 11 : map.put("4", "넷"); 12 : 13 : System.out.println("SIZE : "+map.size()); 14 : Object obj = map.get("1"); 15 : String str = (String)obj; 16 : //강제로 값만 출력하게 하는 방 17 : Iterator it = map.values().iterator(); 18 : while(it.hasNext() == true){ 19 : System.out.println( it.next() ); 20 : } 21 : } 22 : 23 : public static void main(String[] args) { 24 : 25 : HashMapEx he= new HashMapEx(); 26 : he.test(); 27 : } 28 : } 177
  • 178. JDK1.5에서의 변화 - 제네릭기능  Collection<>로 변화  다운캐스팅을 줄일 수 있는 구조로 변화  속도에서 개선을 이루며, 개발자들의 오류를 미리 방지 하는 기능 178
  • 179. Exception 처리 179
  • 180. 예외의 개요  예외 : 프로그램 실행 중에 발생하는 예기치 않은 사건  예외가 발생하는 예  정수를 0으로 나누는 경우  배열의 첨자가 음수 또는 범위를 벗어나는 경우  부적절한 형 변환이 일어나는 경우  입출력을 위한 파일이 없는 경우 등  자바 언어는 프로그램에서 예외를 처리할 수 있는 기법을 제공 180
  • 181. 181
  • 182. 182
  • 183. 예외의 개요 - 예외가 발생되는 예 class Error { public static void main(String[] args) { x(); // x() 메소드 호출 } static void x() { 에러 메시지 y(); // y() 메소드 호출 java.lang.ArithmeticException: / by } zero static void y() { at Error.z(Error.java:14) z(); // z() 메소드 호출 at Error.y(Error.java:9) } at Error.x(Error.java:6) static void z() { at Error.main(Error.java:3) int i = 1; int j = 0; System.out.println(i/j); // 1을 0으로 나눈다. 예외 발생 } // JVM의 묵시적인 예외 처리기 가동 } 183
  • 184. 예외 관련 클래스  자바는 예외를 객체로 취급  예외 관련 클래스를 java.lang 패키지에서 제공  예외 관련 클래스 : 그림 9-1 참조  자바 프로그램에서는 Error, RuntimeException 클래스의 하위 클래스들을 제외 한 모든 예외를 처리하여야 한다  일반적으로 Error, RuntimeException 클래스(하위 클래스 포함)들과 연관된 예 외는 프로그램에서 처리하지 않는다  이유 : 예외를 처리하여 얻는 이득보다 예외를 처리하기 위한 노력이 너무 크기 때문 184
  • 185. 예외 관련 클래스 - Exception 클래스  Exception 클래스의 하위 클래스 NoSuchMethodException 메소드가 존재하지 않을 때 ClassNotFoundException 클래스가 존재하지 않을 때 CloneNotSupportedException 객체의 복제가 지원되지 않는 상황에서 의 복제 시도 IllegalAccessException 클래스에 대한 부정 접근 InstantiationException 추상클래스나 인터페이스로부터 객체 생 성하려 할 때 InterruptedException 스레드가 인터럽트 되었을 때 RuntimeException 실행시간 예외가 발생할 때 185
  • 186. 예외 관련 클래스 - RuntimeException 클래스  RuntimeException 클래스의 하위 클래스 ArithmeticException 0으로 나누는 등의 산술적인 예외 NegativeArraySizeException 배열의 크기를 지정할 때 음수의 사용 NullPointerException null 객체의 메소드나 멤버 변수에 접근할 때 IndexOutOfBoundException 배열이나 스트링의 범위를 벗어난 접근. 하위클래스로 ArrayIndexOutOfBoundsException 클래스 와 StringIndexOutOfBoundsException 클래 스를 제공 SecurityException 보안을 이유로 메소드를 수행할 수 없을 때 186
  • 187. 예외 처리  Error 와 RuntimeException 클래스 관련 예외는 처리 효율보다는 처리에 드 는 노력이 너무 커 자바 프로그램에서 처리하지 않고 JVM에게 처리를 맡긴 다  Error 와 RuntimeException 외에 다른 클래스들과 연관된 예외들은 자바 프 로그램에서 직접 처리하여야 한다.  예외를 처리하는 방법은 두 가지  예외가 발생된 메소드 내에서 처리하는 방법(try, catch 절 사용)  예외가 발생된 메소드를 호출한 메소드에게 예외의 처리를 넘겨주는 방법 (throws 절 사용) 187
  • 188. 예외 처리 - 예외의 발생 import java.io.*; class IOExceptionError { public static void main(String args[]) { FileReader file = new FileReader("a.txt"); // 만일 a.txt 파일이 없다면? int i; while((i = file.read()) != -1) { System.out.print((char)i); } file.close(); } } 이 프로그램은 컴파일러에 의해 에러가 발생된다. 즉 컴파일러는 a.txt 파일이 없을 경우에 발생하는 예외의 처리를 요구한다. 188
  • 189. 예외처리 – 예외의 발생  컴파일러는 앞의 프로그램에 대해 다음과 같은 에러 메시지를 나타낸다 IOExceptionError.java:7: Exception java.io.FileNotFoundException must be caught, or it must be declared in the throws clause of this method. FileReader file = new FileReader("a.txt"); ^ IOExceptionError.java:11: Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method. while((i = file.read()) != -1) ^ 2 errors 189
  • 190. 190
  • 191. 191
  • 192. 예외 처리 - try, catch, finally 블록 사용  예외 처리 방법중 예외가 발생한 메소드 내에서 직접 처리하는 방법 : try, catch, finally 블록 사용 try { ...... // try 블록 : 예외가 발생할 가능성이 있는 문장을 지정한다 } catch(예외타입1 매개변수1) { ..... // 예외 처리 블록1 : 예외의 종류에 따라 처리하는 처리 블록 } .....… … . … … … .. catch(예외타입N 매개변수N) { ...... // 예외 처리 블록 N } finally { ...... // finally 블록 : 예외의 발생여부와 상관없이 무조건 수행되는 블록 } 192
  • 193. 예외 처리 - try, catch, finally 블록 사용 - 예 import java.io.*; class IOExceptionError { public static void main(String args[]) { try { // 예외가 발생할 가능성이 있는 문장을 try 블록으로 지정 FileReader file = new FileReader("a.txt"); int i; while((i = file.read()) != -1) { System.out.print((char)i); } file.close(); } catch(Exception e) { // 발생된 예외를 처리하는 부분 System.out.println("예외 처리 루틴 : " + e + " 예외 발생"); } } } 193
  • 194. 예외의 인위적인 발생  프로그램에서 인위적으로 예외를 발생시킬 수 있다  예외를 발생시키기 위해 throw 문 사용 throw 예외객체; 또는 throw new 예외객체타입(매개변수); 194
  • 195. 호출메쏘드에 의한 예외의 전달  예외를 직접 처리하지 않고 자신을 호출한 메소드에게 예외를 넘겨주는 방법(throws 절 사용)  메소드 선언시 다음과 같은 방법으로 지정 public void c() throws 예외클래스[, 예외클래스, … .] 예 void throws-test() throws ArithmeticException, SecurityException, NullPointerException 195
  • 196. 사용자 정의 예외  사용자는 새로운 예외를 정의하여 사용할 수 있다  새로운 예외는 Exception 클래스로부터 상속되어 생성되어야 한다 class UserException1 extends Exception { // 사용자 정의 예외는 Exception 클래스로부터 상속 public UserException1(String message) { // 생성자 메소드 super(message); // 상위 클래스인 Exception 클래스의 생성자를 호출하여 // 예외 객체 생성 } } 196
  • 197. Java를 이용한 UI 만들기 197
  • 198. AWT/Swing/Applet  자바를 이용해서 실행되는 UI를 가지는 프로그램 개발시 에 사용  AWT – (Abstract Windows Toolkits)  SWING – JDK1.1이후에 UI에 대한 다양한 컴포넌트 및 개선된 화면 제공 (JTable… )  개발 범위  단독 실행 프로그램 (UI Application)  인터넷 상의 실행 프로그램(Applet)  Applet  개발은 AWT/Swing과 동일하나 인터넷 브라우저에 실행되며, 보 다 엄격한 보안의 제약을 받는다. 198
  • 199. MyFrame.java 1 : package gui1; 2 : import java.awt.*; 3 : import java.awt.event.*; 4: 5 : public class MyFrame { 6: 7 : public static void main(String args[]){ 8 : Frame fr=new Frame("Hello COOKIE!"); 9: 10 : fr.setSize(500,500); 11 : fr.setVisible(true); 12 : 13 : fr.addWindowListener(new WindowAdapter(){ 14 : public void windowClosing(WindowEvent w){ 15 : System.exit(0); 16 : } 17 : }); //function end. 18 : } //main end 19 : } // class end. 20 : 199
  • 200. AWT 패키지의 기본 구조와 Frame Component 라는 최상위 클래스에서 부터 시작 Container계열의 객체는 주로 컴포넌트들을 추가하기 위해서 사용한다. Container계열의 객체중에서 단독으로 실행이 가능한 것은 Frame과 Applet쪽이다 200
  • 201. AWT 프로그램의 구조 201
  • 202. Frame객체  Frame 이라는 것은 하나의 프로그램을 실행하는 것처럼 실행되는 하나의 창(window)를 의미한다.  AWT를 이용하는 프로그램을 만들 때 자신의 컴퓨터에서 실행하고 싶다면 (즉, 어플리케이션으로 만들고 싶다면) Frame을 이용해 주어야 한다.  Frame 은 앞의 그림들에서 본 것 처럼 모든 AWT 요소들 중에서 가장 밑바닥에 위치하며, Frame 역시 객체이기 때문에 필요할 때에 Frame 객체를 생성해서 사용하면 된 다 202
  • 203.  Frame 의 생성  Frame 을 생성하는 것은 보통의 경우 두 가지 방식으로 사용.  Frame f = new Frame( );  Frame f = new Frame(String name );  두 번째의 경우에는 화면에 실행되는 프로그램의 이름을 지정하 고자 할 때 사용.  Frame 의 기능과 메쏘드  Frame 의 가장 큰 기능은 역시 컨테이너로의 기능. 즉, 다른 버 튼이나 리스트 같은 컴포넌트들을 Frame 에 포함시키거나 Panel 이나 Applet 같은 Container 객체를 자신에게 포함.  Frame 객체는 가장 밑바닥의 컨테이너.  AWT 패키지의 구조를 보면 Frame 은 상속의 구조로 되어 있기 때문에 실제로 Window 클래스, Container 클래스, Component 클래스의 메쏘드를 사용할 수 있다. 203
  • 204. void setBackground(Color c) Frame 의 색깔을 지정한다. void setTitle(String title) 타이틀 바(화면 가장 위의 활성 버튼들이 있는 바) 의 이름을 지정한다. void pack() 필요한 크기로 사이즈를 다시 조절한다. setSize( ) 대신에 사용할 수 있다. void setLocation(int x, int y) 프레임이 나타날 때 화면에서의 위치를 조정한다. 204
  • 205. 1 : package gui1; 2 : import java.awt.*; 3 : import java.awt.event.*; 4: 5 : public class FrameEx1 extends Frame { 6: 7 : public FrameEx1(String name){ 8 : super(name); 9: } 10 : 11 : public void showFrame(){ 12 : 13 : setSize(300,300); 14 : setLocation(100,200); 15 : setBackground(Color.yellow); 16 : setVisible(true); 17 : 18 : //종료 버튼을 누르면 종료하게 만들기 ---- 19 : addWindowListener(new WindowAdapter(){ 20 : public void windowClosing(WindowEvent w){ 21 : System.exit(0); 22 : } 23 : }); 24 : } 25 : 26 : public static void main(String[] args){ 27 : FrameEx1 ex1 = new FrameEx1("Frame을 보여주기1"); 28 : ex1.showFrame(); 29 : } 30 : } 31 : 205
  • 206. 화면에서의 좌표 206
  • 207. 1 : package gui1; 2 : import java.awt.*; 3 : import java.awt.event.*; 4: 5 : public class PanelEx1 { 6: 7 : Panel p1; 8: 9: 10 : public PanelEx1(String name){ 11 : p1 = new Panel(); 12 : p1.setName(name); 13 : p1.setBackground(Color.blue); 14 : } 15 : 16 : public Panel getPanel1(){ 17 : return p1; 18 : } 19 : 20 : public static void main(String[] args){ 21 : PanelEx1 ex1 = new PanelEx1("Panel"); 22 : 23 : Frame f = new Frame("패널 보여주기"); 24 : f.add(ex1.getPanel1()); 25 : 26 : f.setSize(200,200); 27 : f.setVisible(true); 28 : //종료 버튼을 누르면 종료하게 만들기 ---- 29 : f.addWindowListener(new WindowAdapter(){ 30 : public void windowClosing(WindowEvent w){ 31 : System.exit(0); 32 : } 33 : }); 34 : } 207 35 : }
  • 208. 컴포넌트와 레이아웃 208
  • 209. Label 컴포넌트 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*;  Label label = new Label( ); -- 그냥 생성 5: 하는 경우 6 : public class LabelEx1 { 7:  Label label = new Label(“Titie”); -- Title 8 : Panel p1; //라벨이 붙을 패널 이라고 쓰여진 Label 객체 생성 9 : Label label1;  Label label = new Label(“Title”,Label.LEFT); 10 : -- Title이라고 쓰여진 왼쪽 정렬 11 : public LabelEx1(){ 12 : p1 = new Panel(); 13 : p1.setLayout(null); //강제로 위치 지정을 위한 준비 14 : label1 = new Label("이것은 라벨입니다.^^"); 15 : label1.setBounds(0,30,150,20); 16 : p1.add(label1); 17 : } 18 : 19 : public Panel getPanel(){ 20 : return p1; 21 : } 22 : 23 : public static void main(String[] args){ 24 : LabelEx1 ex1 = new LabelEx1(); 25 : 26 : Frame f = new Frame("패널 보여주기"); 27 : f.add(ex1.getPanel()); 28 : 29 : f.setSize(200,200); 30 : f.setVisible(true); 31 : //종료 버튼을 누르면 종료하게 만들기 ---- 32 : f.addWindowListener(new WindowAdapter(){ 33 : public void windowClosing(WindowEvent w){ 34 : System.exit(0); 35 : } 36 : }); 37 : } 38 : } 209
  • 210. Button 컴포넌트  생성방법  new Button();  new Button(“버튼명”);  Button 컴포넌트는 Event 처리에 많이 사용된다.  setLabel(String name); 버튼의 라벨 변경  String getLabel(); 버튼의 이름을 리턴 210
  • 211. 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*; 5: 6 : public class LabelEx1 { 7: 8 : Panel p1; //라벨이 붙을 패널 9 : Label label1; 10 : 11 : public LabelEx1(){ 12 : p1 = new Panel(); 13 : p1.setLayout(null); //강제로 위치 지정을 위한 준비 14 : label1 = new Label("이것은 라벨입니다.^^"); 15 : label1.setBounds(0,30,150,20); 16 : p1.add(label1); 17 : } 18 : 19 : public Panel getPanel(){ 20 : return p1; 21 : } 22 : } 211
  • 212. CheckBox 컴포넌트  체크박스의 형태와 라디오 버튼의 형태 지원  CheckBoxGroup으로 만들면 라디오 버튼으로 생성  new Checkbox( ); - 라벨이 없는 체크박스  new Checkbox(String name); -- 라벨이 있는 체크박스  new Checkbox(String name, boolean state); -- 체크박스의 라벨, 체크되어 있는지 여부  new Checkbox(String name, boolean state, CheckboxGroup group); -- 만약 체크박스 그룹 객체가 존재한다면 라디오 버 튼이고, 아니라면 체크박스의 형태를 가진다. 212
  • 213. 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*; 5: 6 : public class CheckEx1 extends Panel{ 7: 8 : Checkbox ch1, ch2, ch3, ch4; 9 : CheckboxGroup group; 10 : 11 : public CheckEx1(){ 12 : 13 : ch1 = new Checkbox("체크박스 1 ",true, null); 14 : ch2 = new Checkbox("체크박스 2 ",true, null); 15 : 16 : group = new CheckboxGroup(); 17 : 18 : ch3 = new Checkbox("라디오형 박스 1",true, group); 19 : ch4 = new Checkbox("라디오형 박스 2 ",true, group); 20 : 21 : add(ch1); 22 : add(ch2); 23 : add(ch3); 24 : add(ch4); 25 : } 26 :} 213
  • 214. Choice 컴포넌트  드롭다운 컴포넌트  Item이라는 개념으로 추가/삭제해서 사용한다. 메쏘드 설명 void add(String item ) 새로운 item을 추가한다. String getSelectedItem( ) 현재 선택된 아이템을 문자열로 반환 int getSelectedIndex( ) 현재 선택된 아이템의 순서(index)를 반환 String getItem(int index) index 번째의 아이템을 문자열로 반환한다. void insert(String item, int index) Index 번째에 새로운 item 항목을 추가한다. int getItemCount( ) 현재 item의 수를 반환한다. 214
  • 215. 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*; 5: 6 : public class ChoiceEx1 extends Panel{ 7: 8 : Choice choice; 9: 10 : 11 : public ChoiceEx1(){ 12 : 13 : choice = new Choice(); 14 : 15 : choice.add("서울"); 16 : choice.add("부산"); 17 : choice.add("인천"); 18 : choice.add("광주"); 19 : 20 : add(choice); 21 : } 215
  • 216. 23 : public static void main(String[] args){ 24 : ChoiceEx1 ex1 = new ChoiceEx1(); 25 : 26 : Frame f = new Frame("초이스 테스트"); 27 : f.add(ex1); 28 : 29 : f.setSize(200,200); 30 : f.setVisible(true); 31 : //종료 버튼을 누르면 종료하게 만들기 ---- 32 : f.addWindowListener(new WindowAdapter(){ 33 : public void windowClosing(WindowEvent w){ 34 : System.exit(0); 35 : } 36 : }); 37 : } 38 : } 216
  • 217. List 컴포넌트  여러 개의 아이템을 화면에 보여주고 하나 혹은 그 이상 의 아이템을 선택할 수 있는 화면을 제공해 주는 방법  List lst = new List( ); -- 스크롤이 가능한 리스트 생성 기본적으로 4개의 아이템을 보여준다.  List lst = new List(int row); - 사용자에게 보여줄 행의 수를 지정한다.  List lst = new List(int row, boolean multi); -- 보여줄 행의 수와 다중 선택기능 217
  • 218. 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*; 5: 6 : public class ListEx1 extends Panel{ 7: 8 : List lst; 9: 10 : 11 : public ListEx1(){ 12 : 13 : lst = new List(4, true); 14 : 15 : lst.add("국어"); 16 : lst.add("영어"); 17 : lst.add("수학"); 18 : lst.add("생물"); 19 : lst.add("국사"); 20 : lst.add("윤리"); 21 : lst.add("세계사"); 22 : lst.add("불어"); 23 : lst.add("독어"); 24 : lst.add("고전"); 25 : add(lst); 26 : } 218 27 : }
  • 219. TextField 컴포넌트  화면에 사용자가 입력하는 문자열에 대한 처리를 위해서 사용  TextField와 TextArea로 구분  TextField tf = new TextField(); --- 비어 있는 TextField  TextField tf = new TextField(int column); --- column 의 크기를 가지는 TextField  TextField tf = new TextField(String text); --- 생성될 때부터 문자열 text 을 표현한다.  TextField tf = new TextField(String text,int column); --- 문자열 text를 표현하고, column크기를 가지는 TextField 219
  • 220. 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*; 5: 6 : public class TextFieldEx1 extends Panel{ 7: 8 : TextField tf1,tf2,tf3,tf4 ; 9: 10 : 11 : public TextFieldEx1(){ 12 : 13 : tf1 = new TextField(); 14 : tf2 = new TextField(20); 15 : tf3 = new TextField("가나다라마바사"); 16 : tf4 = new TextField("가다다라마바사", 20); 17 : 18 : add(tf1); 19 : add(tf2); 20 : add(tf3); 21 : add(tf4); 22 : } 23 : } 220
  • 221. TextField의 메쏘드 void setText(String text) 필드(입력창) 내부에 text의 문자열을 보여준다. String getText() 필드 내부의 문자열을 반환한다. void setColumn(int size) 필드의 길이를 size 만큼 조절한다. int getColumn() 필드의 길이를 반환한다.` void setEditable(boolean b) b를 false 로 해주면 필드가 사용자의 입력을 받을 수 있 도록 만들어 준다. void setBackground(Color color) color 색상으로 필드 내부를 채워준다. 221
  • 222. TextArea 컴포넌트  화면에 많은 양의 텍스트를 입력할 수 있는 컴포넌트로 가로의 길이 와 세로 행의 길이로 생성  스크롤바의 생성여부를 같이 결정  TextArea ta = new TextArea();  TextArea ta = new TextArea(int rows, int column );--- 세로 rows 라인, 가로 column 크기를 가진 TextArea  TextArea ta = new TextArea(String text); --- 처음부터 text 문자열을 가진 TextArea  TextArea ta = new TextArea(String text, int rows, int columns); --- text 문자열을 가진 세로 rows행, 가로 columns 크기를 가진 TextArea  TextArea ta = new TextArea(String text, int rows, int columns, int scrollbars); -- - 위의 생성자와 동일하지만 스크롤바의 위치를 지정할 수 있다.  SCROLLBARS_VERTICAL_ONLY : 스크롤 바가 생길 때 세로로만 생기게 만든다.  SCROLLBARS_HORIZONTAL_ONLY: 가로의 스크롤 바만 생성되게 한다.  SCROLLBARS_NONE : 스크롤 바가 생기지 않도록 강제로 지정한다.  SCROLLBARS_BOTH : 가로 , 세로 스크롤바를 만들 수 있도록 한다. 222
  • 223. 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*; 5: 6 : public class TextAreaEx1 extends Panel{ 7: 8 : TextArea ta1,ta2,ta3; 9: 10 : 11 : public TextAreaEx1(){ 12 : 13 : ta1 = new TextArea(5, 10); 14 : ta2 = new TextArea("가나다라마바사아",5,10); 15 : ta3 = new TextArea("가다다라마바사아",5,10,TextArea.SCROLLBARS_HORIZONTAL_ONLY); 16 : 17 : // ta3.insert("aaa",3); 18 : 19 : add(ta1); 20 : add(ta2); 21 : add(ta3); 22 : } 23 : } 223
  • 224. TextArea의 메쏘드 void append(String str) TextArea 에 새로운 문자열을 뒤에 추가시킨다. void insert(String str, int pos) TextArea 에 있는 문자열사이에 str을 추가시킨다. pos 는 현재있는 텍스트에서 삽입할 위치를 나타낸다. int getColumns() TextArea의 가로 사이즈를 반환한다. void setColumns(int size) TextArea를 지정된 size 로 만든다. int getRows() TextArea가 몇 개의 행을 가지는지 반환 void setRows(int rows) TextArea의 행을 rows 크기로 설정한다. 224
  • 225. Layout: 컴포넌트들의 배치 (Layout Manager)  화면을 구성하는 컴포넌트들에 대한 배치를 컨트롤 하는 방법  FlowLayout: 옆으로 정렬해주는 레이아웃  BorderLayout: 화면에 지정된 영역을 구분해서 정렬하는 레이아웃(동,서,남,북,중앙)  GridLayout: 바둑판 모양의 정렬을 하기 위한 레이아웃  CardLayout: 한 화면에 여러 개의 패널들을 전면에 보이 고, 감추는 방식의 레이아웃  GridBagLayout: 그리드레이아웃과 유사하나 좀더 세밀 한 제어가 가능한 레이아웃 225
  • 226. 226
  • 227. FlowLayout  아무런 레이아웃을 지정하지 않을 경우에는 디폴트로 지 정되는 레이아웃  화면의 넓이에 따라 컴포넌트들을 자동적으로 왼쪽으로 배치해 주는 방식  화면의 크기가 변경되면 컴포넌트들 역시 같이 변경된다. 227
  • 228. 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*; 5: 6 : public class FlowEx1 extends Panel{ 7: 8 : Label label1; 9 : Button btn1; 10 : Button btn2; 11 : 12 : 13 : public FlowEx1(){ 14 : 15 : //기본적으로 FlowLayout 이므로 지정하지 않아도 된다. 16 : 17 : label1 = new Label("버튼 라벨"); 18 : btn1 = new Button("누르는 버튼 1"); 19 : btn2 = new Button("누르는 버튼 2"); 20 : 21 : //버튼 라벨 누르는 버튼 순서로 보여진다. 22 : add(label1); 23 : add(btn1); 24 : add(btn2); 25 : 26 : } 27 : } 228
  • 229. BorderLayout  화면상에 경계를 지정하고 영역내에 컴포넌트들을 위치 시키는 레이아웃 BorderLayout.EAST 실제 값은 “East” BorderLayout.WAST “West” BorderLayout.CENTER “Center” BorderLayout.NORTH “North” BorderLayout.SOUTH “South”  BorderLayout을 지정하기 위해서는 반드시 Container객 체의 레이아웃을 미리 지정해야 한다.  컴포넌트를 추가할 때에는 반드시 위치를 같이 지정해 주어야 한다. (컴포넌트, BorderLayout.CENTER); 229
  • 230. 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*; 5: 6 : public class BorderEx1 extends Panel{ 7: 8 : Button b[]=new Button[5]; 9: 10 : public BorderEx1(){ 11 : 12 : setLayout(new BorderLayout()); 13 : 14 : for(int i=0; i<b.length; i++){ 15 : b[i]= new Button((i+1)+"번째 버튼"); 16 : } 17 : add(b[0],BorderLayout.NORTH); 18 : add(b[1],BorderLayout.SOUTH); 19 : add(b[2],BorderLayout.CENTER); 20 : add(b[3],BorderLayout.EAST); 21 : add(b[4],BorderLayout.WEST); 22 : } 23 : } 230
  • 231. GridLayout  화면을 바둑판의 모양으로 만들어 두고 이에 각 컴포넌 트들을 추가해 주는 방법  new GridLayout(); -- 하나의 column 과 하나의 row 를 가진 GridLayout.  new GridLayout(int rows , int column);-- rows 수만큼의 행 과 column 수 만큼의 column을 가진 GridLayout.  new GridLayout(int rows , int column, int hgap, int vgap); --지정된 rows와 column , 컴포넌트 사이의 가로 간격, 컴포 넌트 사이의 세로간격을 가진 GridLayout 컬럼(column) 행(row) 231
  • 232. 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*; 5: 6 : public class GridEx1 extends Panel{ 7: 8 : Button b[]=new Button[9]; 9: 10 : public GridEx1(){ 11 : 12 : setLayout(new GridLayout(3,3,10,5)); 13 : //버튼 만들기 14 : for(int i=0; i<b.length; i++){ 15 : b[i]= new Button((i+1)+"번째 버튼"); 16 : } 17 : //버튼 붙이기 18 : for(int i=0; i<b.length; i++){ 19 : add(b[i]); 20 : } 21 : } 22 : } 232
  • 233. CardLayout과 GridBagLayout  CardLayout  GridBagLayout  전체화면에 하나의 카드처럼  컴포넌트의 배치에 대한 보다 여러 개의 컨테이너중에 하나 세밀한 제어가 가능하다는 장 만 화면에 보이도록 만드는 방 점 법  다른 레이아웃보다 설정이 복 잡한 단점 233
  • 234. Layout을 사용하지 않는 방법  레이아웃이 적용되어야 하는 컨테이너에 setLayout()을 null로 지정하고, 각 컴포넌트마다 위치와 크기를 강제로 지정하는 방법을 사용할 수 있다.  주의할 것은 강제로 위치를 지정하는 것은 Panel을 상대 로 작업하는 것이 아니라 Frame 객체를 상대로 해서 작 업해야만 한다. 234
  • 235. 1 : package gui2; 2: 3 : import java.awt.*; 4 : import java.awt.event.*; 5: 6 : public class NoLayoutEx1 { 7: 8 : public static void main(String[] args){ 9: 10 : Button b = new Button("Test"); 11 : b.setBounds(15,20,30,20); 12 : Button b2 = new Button("Test2"); 13 : b2.setBounds(50,80,50,20); 14 : 15 : TextField tf = new TextField("abcde",30); 16 : tf.setBounds(0,120,100,30); 17 : 18 : 19 : Frame f = new Frame("NoLayout 테스트"); 20 : f.setLayout(null); 21 : f.add(b); 22 : f.add(b2); 23 : f.add(tf); 24 : 25 : f.setSize(200,200); 26 : f.setVisible(true); 27 : //종료 버튼을 누르면 종료하게 만들기 ---- 28 : f.addWindowListener(new WindowAdapter(){ 29 : public void windowClosing(WindowEvent w){ 30 : System.exit(0); 31 : } 32 : }); 33 : } 34 : } 235
  • 236. EventHandling 이벤트처리 236
  • 237. Event 처리란  컴포넌트에 특정한 반응(클릭,드롭 등)을 감지해 지정된 동작을 수행하게 하는 것을 Event 처리라고 한다.  Java의 이벤트처리는 Event처리 Handler라는 것을 이용 해서 이벤트를 처리해주는 객체를 따로 작성하는 방식을 이용한다.  용어정리  Event: 사용자가 취하는 행동에 대한 총칭  EventHandler: Event를 처리하는 객체를 칭한다.  Listener: 이벤트의 발생을 감지하고 이것을 EventHandler에게 전달하는 객체를 의미한다. 237
  • 238. Event의 종류 238
  • 239.  우선 이벤트를 처리해야 하는대상에게 EventListener를 붙여준다.  만일 여러가지 이벤트에 대한 처리를 하 고자 할 때에는 이벤트 리스트를 여러 개 붙인다.  이벤트가 실제로 발생하게 되면 이벤트 리스너는 이벤트의 발생을 감지하고 이 벤트를 처리해주는 이벤트핸들러 (EventHandler)에게 전달해주게 된다.  위임형 모델(Delegate Model)이라고 함 239
  • 240. Event의 종류 이벤트의 종류 설명 Action Event 컴포넌트가 Enter나 클릭했을 때 발생하는 이벤트 Item Event 리스트나 초이스로부터 선택된 아이템이 변했을떄 발생하는 이벤트 Mouse Motion Event 마우스의 드래그나 , 마우스의 움직임을 나타내는 이벤트 Mouse Button Event 마우스의 버튼을 누르거나 더블 클릭과 같은 움직임을 나타내는 이벤트 Key Event 키보드의 버튼을 누르거나 특정문자가 기록됐을때의 이벤트 Adjust Event 스크롤바와 같이 조정할 수 있는 컴포넌트 상에서 상태가 조정될 때 발생하는 이벤트 Focus Event 텍스트 필드나 텍스트 에어리어에 사용자가 입력하기 위해서 포커스를 주었을 때 발생 하는 이벤트 Component Event 컴포넌트가 화면에서 생성되거나 사라질 때 발생하는 이벤트 MouseWheel Event 마우스에서 휠을 사용할 때 발생하는 이벤트 Text Event 텍스트 필드나 텍스트 에어리어의 값이 변하는 경우 발생하는 이벤트 Container Event 컨테이너 객체에 컴포넌트가 추가되거나, 제거 될 때 발생하는 이벤트 240
  • 241. 주요 이벤트별 메쏘드 이벤트 메쏘드 설명 ActionEvent String getActionCommand() 이벤트가 발생한 컴포넌트의 라벨을 반환한다. ItemEvent Object getItem 이벤트가 발생한 아이템 객체를 반환한다. int getStateChange() 이벤트가 발생한 아이템의 체크여부를 알아낸다 MouseEvent int getX() 이벤트가 발생할 때의 마우스의 x좌표 int getY() 이벤트가 발생할 때의 마우스의 y좌표 KeyEvent int getKeyCode() 입력한 키보드의 값을 알아낸다. char getKeyChar() 입력한 키보드의 문자를 알아낸다. 241
  • 242. 이벤트 객체와 리스너와의 관계 이벤트의 종류 Action이벤트 Interface ActionListener 메쏘드 actionPerformed(ActionEvent e) Item이벤트 ItemListener itemStateChanged(ItemEvent) Mouse Motion이벤트 MouseMotionListener mouseDragged(MouseEvent) mouseMoved(MouseEvent) MouseButton 이벤트 MouseListener mousePressed(MouseEvent) mouseReleased(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mouseClicked(MouseEvent) Key 이벤트 KeyListener keyPressed(KeyEvent) keyReleased(KeyEvent) keyTyped(KeyEvent) Focus 이벤트 FocusListener focusGained(FocusEvent) focusTyped(FocusEvent) Adjustment 이벤트 AdjustmentListener adjustmentValueChanged(AdjustmentEvnet) Component 이벤트 ComponentListener componentMoved(ComponentEvent) componentHidden(ComponentEvent) componentResized(ComponentEvent) componentShown(ComponentEvent) MouseWheel이벤트 MouseWheelListener mouseWheelMoved(MouseWheelEvent e) Window이벤트 WindowsListener windowClosing(WindowEvent) windowOpened(WindowEvent) windowIconified(WindowEvent) windowDeiconified(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) Text 이벤트 TextListener textValueChanged(TextEvent) Container 이벤트 ContainerListener componentAdded(ContainerEvent) 242 componentRemoved(ContainerEvent)
  • 243. Event를 처리하는 단계  1. 이벤트 처리가 필요한 컴포넌트를 찾는다.  2. 컴포넌트에 처리해야 하는 이벤트에 따라 addXXXListener()를 추가한다.  컴포넌트가 발생하는 ActionEvent를 처리하고자 한다면 addActionListener()처럼 필요한 리스너를 부착한다.  자신이 원하는 방법으로 이벤트 처리를 담당하는 메쏘드 나 클래스를 생성한다.  내부 클래스나 익명클래스를 이용해서 처리하는 방법  클래스 자체에서 implements해서 사용하는 방법  이벤트 처리를 담당하는 클래스를 따로 만드는 방법 243
  • 244. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class ActionEx1 extends Panel { 5 : 6 : Button b; 7 : TextField display; 8 : 9 : public ActionEx1(){ 10 : b = new Button("나는 누구일까요?"); 11 : display = new TextField(20); 12 : //레이아웃 결정 13 : setLayout(new BorderLayout()); 14 : 15 : add(display,BorderLayout.CENTER); 16 : add(b,BorderLayout.SOUTH); 17 : } 18 : } 244
  • 245. ActionListener를 해당 클래스에서 처리하기  순서  해당클래스를 implements ActionListener 하도록 수정한다.  특정 컴포넌트에 addActionListener(this)로 지정한다.  인터페이스에 정의된 메쏘드를 구현한다.  public void actionPerformed(ActionEvent e){  display.setText("내 이름은 쿠키입니다");//-- setText()로 문자열을 표시한다.  } 245
  • 246. 익명클래스(Anonymous class)를 이용하는 방법  익명클래스를 이용하면 현재 클래스의 속성이나 메쏘드를 같이 이용할 수 있으므로 간단히 구성이 가능  b = new Button("나는 누구일까요?");  b.addActionListener(new ActionListener(){  public void actionPerformed(ActionEvent e){  display.setText("내 이름은 쿠키입니다");  }  }); 246
  • 247. 이벤트 처리 전용 객체를 만드는 방법  b.addActionListener(new ActionOperator(display));  Action과 관련된 인터페이스를 구현하는 클래스를 하나 만들어 주고, 컴포넌트에 리스너로 특정 클래스를 만들 어 주는 방법 class ActionOperator implements ActionListener { TextField target; ActionOperator(TextField actionTf){ target = actionTf; } public void actionPerformed(ActionEvent e){ target.setText("내 이름은 쿠키입니다"); } } 247
  • 248. 그래픽, 폰트, 사운드 처리 248
  • 249. 그래픽 처리  그래픽 처리를 하는 역할과 해당 객체  1.스케치북 – Frame, Panel, Applet, Canvas  2. 붓과 연필 - 자바에서는 java.awt.Graphics `  3. 물감 - java.awt.Color  Graphics 객체  Graphics객체는 화면에 컴포넌트를 구성해 주고, 이를 화면에 출력해 주는 역할을 담당한다.  개발자는 자신이 만드는 객체의 paint(Graphics g)메쏘드를 재 정의해서 화면을 구성한다.  java.awt.Component 부터 가지고 있는 메쏘드이므로 모든 컴포 넌트는 자신만의 paint()를 가지고 있다. 249
  • 250. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class Greeting extends Panel 5 :{ 6 : public Greeting(){ 7 : } 8 : 9 : public void paint(Graphics g){ 10 : g.drawString("안녕하세요 ^^ 만나서 반갑습니다.",30,40); 11 : } 12 : 13 : 14 : public static void main(String[] args) 15 : { 16 : Greeting ex1 = new Greeting(); 17 : 18 : Frame f = new Frame("문자열 그리기"); 19 : 20 : f.add(ex1); 21 : 22 : f.setSize(300,100); 23 : f.setVisible(true); 24 : //종료 버튼을 누르면 종료하게 만들기 ---- 25 : f.addWindowListener(new WindowAdapter(){ 26 : public void windowClosing(WindowEvent w){ 27 : System.exit(0); 28 : } 29 : }); 30 : } 31 :} 250
  • 251. 기본선과 사각형 그리기 메쏘드 설명 drawString(String msg, int x,int y) 문자열을 (x,y)의 위치에 그려준다. drawLine(int x1,int y1, int x2, int (x1,y1)에서 (x2,y2)까지 이은 직선을 그려준다. y2) drawRect(int x, int y, int width, int (x,y)에서부터 길이가 width, 높이가 height인 height) 비어있는 사각형을 그려준다. fillRect(int x, int y, int width, int (x,y)에서 width, height의 그림을 그려준다. 다 height) 만 비어있는 사각형이 아닌 채워진 사각형 251
  • 252. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class BasicGraphics extends Panel 5 :{ 6 : public BasicGraphics(){ 7 : } 8 : 9 : public void paint(Graphics g){ 10 : g.drawString("안녕하세요 ^^ 만나서 반갑습니다.",0,20); 11 : g.drawLine(30,30, 90,90); 12 : g.drawRect(20,100, 50,80); 13 : g.fillRect(20,200, 50,80); 14 : } 15 : 16 : 17 :} 252
  • 253. 타원과 호(부채꼴) 그리기  fillOval(): 내부가 색상을 채원 호를 그린다.  drawOval(): 선으로 된 호를 그린다.  drawOval(int x, int y, int width, int height);  fillOval(int x, int y, int width, int height); 253
  • 254. 부채꼴 그리기  호와 유사하지만 시작각도와 부채꼴이 펼쳐질 각도가 필 요하다.  drawArc(int x, int y, int width, int height, int startAngle, int arcAngle);  fillArc(int x, int y, int width, int height, int startAngle, int arcAngle); 254
  • 255. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class OvalGraphics extends Panel 5 :{ 6 : public OvalGraphics(){ 7 : } 8 : 9 : public void paint(Graphics g){ 10 : g.drawOval(10,20,100,50);//타원 11 : g.setColor(Color.red); 12 : g.fillOval(10,100,50,50);//원 13 : g.drawArc(10,170,50,50,0, 180);//부채꼴 14 : g.setColor(Color.blue); 15 : g.fillArc(10,200,50,50,30,280);//부채꼴 16 : 17 : } 18 :} 255
  • 256. 다각형(Polygon)그리기  drawPolygon(): 다각형 그리기  drayPolyLine(): 굴절선 그리기  drawPolygon(int[] x좌표, int[] y좌표, int 꼭지점의 수)  fillPolygon(int[] x좌표, int[] y좌표, int 꼭지점의 수)  drawPolyline(int[] x좌표, int[] y좌표, int 꼭지점의 수)  둥근 모서리 그리기  drawRoundRect(int x, int y, int width, int height , int arcwidth, int archeight );  fillRoundRect(int x, int y, int width, int height , int arcwidth, int archeight ); 256
  • 257. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class PolygonEx1 extends Panel 5 :{ 6 : int[] xs ={10,30,20,50 ,200,150,10}; 7 : int[] ys = {20,40,70,80,210,120,10}; 8 : 9 : public void paint(Graphics g){ 10 : g.drawPolygon(xs,ys,7); 11 : g.drawRoundRect(20,230,200,100,30,70); 12 : } 13 : 14 : public static void main(String[] args){ 15 : PolygonEx1 ex1 = new PolygonEx1(); 16 : Frame f = new Frame("다각형 그리기 "); 17 : f.add(ex1); 18 : f.setSize(300,400); 19 : f.setVisible(true); 20 : f.addWindowListener(new WindowAdapter(){ 21 : public void windowClosing(WindowEvent w){ 22 : System.exit(0); 23 : } 24 : }); 25 : } 26 :} 257
  • 258. 폰트(Font)와 컬러(Color)  Font객체  기본 지원 폰트 : Serif, Monospaced, SansSerif  GraphicsEnvironment: 현재 그래픽에 대한 정보  GraphicsEnvironment ge = GraphicsEnviroment.getLocalGraphicsEnvironment();  Font font = new Font (“폰트 이름”, 폰트 스타일, 크기);  Color객체  상수값을 이용해서 사용하는 방법  RGB 컬러의 값을 지정해서 사용하는 방법 258
  • 259.  1 :import java.awt.*;  2 :import java.awt.event.*;  3 :  4 :public class FontView extends Panel  5 :{  6 : Font currentFont;  7 :  8 : public FontView(){  9 : }  10 :  11 : public void paint(Graphics g){  12 :  13 : currentFont = g.getFont(); //현재 Graphics 가 사용하는 폰트를 구한다.  14 :  15 : g.drawString("현재 폰트 : "+currentFont.getName() ,10,20);  16 : g.drawString("폰트 크기 : "+currentFont.getSize() ,10,40);  17 : }  18 :} 259
  • 260. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class AllFontViewDetail extends Panel 5 :{ 6 : String[] fontNames; 7 : int y =20; //y 좌표 8 : GraphicsEnvironment ge; 9 : 10 : 11 : public AllFontViewDetail(){ 12 : 13 : ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 14 : fontNames = ge.getAvailableFontFamilyNames(); 15 : } 16 : 17 : public void paint(Graphics g){ 18 : 19 : Font currentFont = null; 20 : 21 : System.out.println("Fonts's length "+ fontNames.length); 22 : 23 : for(int i=0; i<fontNames.length; i+= 2 ){ 24 : 25 : currentFont = new Font(fontNames[i],Font.PLAIN,12); 26 : g.setFont(currentFont); 27 : g.drawString(fontNames[i], 10, y); 28 : 29 : if(i+1 != fontNames.length ){ 30 : currentFont = new Font(fontNames[i+1],Font.PLAIN,12); 31 : g.setFont(currentFont); 32 : g.drawString(fontNames[i+1], 310, y); 33 : } 34 : y+= 15;//y를 15씩 증가 35 : } 36 : y = 20; //다시 초기화 시켜둔다. 37 : } 38 : 39 : } 260
  • 261. Color기본 색상 상수 값 색상  Color클래스에 상수로 정의된 색상 Color.black 혹은 Color.BLACK 검정  RGB구성으로 제어하는 색상 Color.white 혹은 Color.WHITE 흰색  red (255,0,0)  green (0,255,0) Color.red 혹은 Color.RED 빨강  blue (0,0,255) Color.cyan 혹은 Color.CYAN 하늘색 Color.darkGray 혹은 Color.DARK_GRAY 짙은 회색 Color.green 혹은 Color.GREEN 녹색 Color.lightGray 혹은 Color.LIGHT_GRAY 옅은 회색 Color.megenta 혹은 Color.MEGENTA 진홍색 Color.orange 혹은 Color.ORANGE 오렌지색 261
  • 262. 오디오 클립과 음악파일  java.applet을 이용한여 .wav, .mid, .au확장자를 가진 음악 파일 실행 가능  AudioClip 객체로 표현되며 play(), stop(), loop() 기능  MP3와 같은 형태는 JMF를 사용해야 한다. 262
  • 263. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 :import java.applet.*; 4 :import java.io.File; 5 :import java.net.*; 6 : 7 :public class MusicBox extends Panel implements ActionListener 8 :{ 9 : Button play,stop,loop; 10 : String command; 11 : AudioClip clip; 12 : 13 : public MusicBox(){ 14 : try{ 15 : File file = new File("spacemusic.au"); 16 : clip = Applet.newAudioClip(file.toURL()); 17 : }catch(Exception ie){ 18 : ie.printStackTrace(); 19 : } 20 : 21 : setFont(new Font("Arial",Font.BOLD,12)); 22 : 23 : play = new Button("PLAY"); 24 : play.addActionListener(this); 25 : stop = new Button("STOP"); 26 : stop.addActionListener(this); 27 : loop = new Button("LOOP"); 28 : loop.addActionListener(this); 29 : 30 : add(play); 31 : add(stop); 32 : add(loop); 33 : } 34 : 35 : 36 : public void actionPerformed(ActionEvent e){ 37 : command = e.getActionCommand(); 38 : if(command.equals("PLAY")){ 39 : clip.play(); 40 : }else if (command.equals("STOP")){ 41 : clip.stop(); 42 : }else{ 43 : clip.loop(); 44 : } 45 : } 46 : } 263
  • 264. paint(Graphics g)의 호출 시점  자동적으로 화면이 변경되는 시점에 호출  화면 축소/확대  활성화/비활성화  화면 갱신의 순서  repaint(): 강제로 화면을 새로이 갱신하기 위해 사용  update(Graphics g): 두 가지 역할 수행  화면을 배경색과 동일한 색깔로 칠한다.  paing(Graphics g)를 호출한다.  paint(Graphics g): 264
  • 265. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class Greeting2 extends Panel implements ActionListener 5 :{ 6 : int x = 10; 7 : int y = 20; 8 : Button btn ; 9 : 10 : public Greeting2(){ 11 : setLayout(new BorderLayout()); 12 : btn = new Button("MOVE"); 13 : btn.addActionListener(this); 14 : add(btn,"South"); 15 : } 16 : 17 : public void paint(Graphics g){ 18 : System.out.println("paint 호출"); 19 : g.drawString("안녕하세요 ^^ 만나서 반갑습니다.",x,y); 20 : x += 10; 21 : y += 20; 22 : } 23 : 24 : public void actionPerformed(ActionEvent e){ 25 : 26 : repaint(); 27 : } 28 : } 265
  • 266. update(Graphics g): 화면의 갱신을 처리  update()의 기본 기능이 화면을 지우고 새로 그려주는 역할을 하므로 update()메쏘드를 재정의 하게 되면 화면 에 보여지는 현상을 다르게 만들 수 있다.  public void paint(Graphics g){  System.out.println("paint 호출");  g.drawString("안녕하세요 ^^ 만나서 반갑습니다.",x,y);  }  public void update(Graphics g){  //화면 갱신없이 그냥 paint()만 호출한다.  System.out.println("update 호출");  x += 10;  y += 20;  paint(g);  } 266
  • 267. Canvas 객체  화면에 그림을 그릴 수 있는 객체(Graphics 객체를 이용)  1 :import java.awt.*;  2 :  3 :public class MyCanvas extends Canvas  4 :{  5 : int x1,x2;  6 : int y1,y2;  7 :  8 : public MyCanvas(){  9 : }  10 :  11 : public void setValues(int x,int y, int xx,int yy){  12 : x1 = x;  13 : x2 = xx;  14 : y1 = y;  15 : y2 = yy;  16 : }  17 :  18 : public void paint(Graphics g){  19 : System.out.println("paint");  20 : g.drawLine(x1,y1,x2,y2);  21 : }  22 :} 267
  • 268. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class CanvasEx1 extends Panel 5 :{ 6 : MyCanvas cns; 7 : boolean first; //x1,y1이 우선 설정되도록 한다(시작점) 8 : int x1,y1,x2,y2; 9 : 10 : public CanvasEx1(){ 11 : setLayout(new BorderLayout()); 12 : cns = new MyCanvas(); 13 : add(cns,"Center"); 14 : cns.addMouseListener(new MouseAdapter(){ 15 : public void mouseClicked(MouseEvent e){ 16 : setXY(e.getX(),e.getY()); 17 : } 18 : }); 19 : } 20 : 21 : private void setXY(int xVal,int yVal){ 22 : 23 : System.out.println(xVal+" , "+yVal); 24 : 25 : if(!first){ 26 : x1 = xVal; 27 : y1 = yVal; 28 : first = true; 29 : }else { 30 : x2= xVal; 31 : y2= yVal; 32 : cns.setValues(x1,y1,x2,y2); 33 : cns.repaint(); //- 캔버스가 갱신되도록 한다. 34 : first= false; 35 : } 36 : } 37 :} 268
  • 269. 이미지처리와 애니메이션 269
  • 270. Image객체를 구하는 방법  Application의 경우  Image img = Toolkit.getDefaultToolkit().getImage(“dog.jpg”);  Applet의 경우  Image = getImage(getDocumentBase(), “dog.jpg”); 270
  • 271. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class PictureEx1 extends Panel 5 :{ 6 : Image img; 7 : 8 : public PictureEx1(){ 9 : img = Toolkit.getDefaultToolkit().getImage("imagessnow.jpg"); 10 : } 11 : 12 : public void paint(Graphics g){ 13 : g.drawImage(img, 0,0,this); 14 : } 15 : 271
  • 272. 화면에 ScrollPane 붙이기 272
  • 273. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class PictureEx2 extends Canvas 5 :{ 6 : Image img; 7 : 8 : public PictureEx2(){ 9 : img = Toolkit.getDefaultToolkit().getImage("images//snow.jpg"); 10 : setSize(500,500); 11 : } 12 : 13 : public void paint(Graphics g){ 14 : g.drawImage(img, 0,0,this); 15 : } 16 :} 273
  • 274. 이미지의 조작  이미지의 확대, 축소, 간단한 좌우상하의 반전 방법 drawImage( Image img , --- 이미지 객체 int dx1, --- d.. 로 시작하는 변수는 화면상의 좌표를 의미한다. int dy1, --- (dx1, dy1) 은 화면에서 그림을 그리는 시작점 int dx2, int dy2, --- (dx2, dy2)는 화면에서 그림을 그릴수 있는 최대좌표 int sx1, ----이미지 객체에서 화면에 그리기 시작할 부분의 위치 int sy1, ----(sx1, sy1) int sx2, int sx2, ---- (sx2, sy2) 이미지 객체에서 선택된 공간의 위치 ImageObserver observer); 274
  • 275. 275
  • 276.  원  축 본 소 이 미 지  좌  상 우 하 반 반 전 전  이  이 미 미 지 지 276
  • 277. 이미지 축소/반전  실제 이미지의 크기를 줄여주는 것이 아니라  화면에 축소된 형태의 이미지를 보여주는 것  좌표의 위치를 조정해서  이미지를 반전 277
  • 278. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class ImageHandler extends Canvas 5 :{ 6 : Image img; 7 : int dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2; 8 : int width, height; 9 : 10 : public ImageHandler(){ 11 : img = Toolkit.getDefaultToolkit().getImage("gogh.jpg"); 12 : setSize(700,700); 13 : } 14 : 15 : 16 : public void paint(Graphics g){ 17 : 18 : dx2 = img.getWidth(this); 19 : dy2 = img.getHeight(this); 20 : 21 : //원본 이미지 22 : g.drawImage(img, 0,0,dx2,dy2,//원본 23 : 0,0,dx2, dy2,this); 24 : //축소된 이미지 25 : g.drawImage(img, 350,0,(dx2/2+350),//원본 26 : dy2/2,0,0,dx2, dy2,this); 27 : //좌우 반전 28 : g.drawImage(img, 0,300,dx2,(dy2+300),//원본 29 : dx2,0,0, dy2,this); 30 : //상하 반전 31 : g.drawImage(img, 350,300,(dx2+350),(dy2+300),//원본 32 : 0,dx2,dy2, 0,this); 33 : 34 : } 35 : } 278
  • 279. ImageObserver와 paint()메쏘드  ImageObserver 대상이미지의 상태를 알고 있는 객체  쓰레드로 처리되며, 일정한 간격으로 이미지의 상태를 검사 279
  • 280. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class PictureEx3 extends Panel 5 :{ 6 : Image img; 7 : int paint_count; 8 : 9 : public PictureEx3(){ 10 : img = Toolkit.getDefaultToolkit().getImage("images//snow.jpg"); 11 : } 12 : 13 : public void paint(Graphics g){ 14 : System.out.println(Thread.currentThread().getName()+ " paint()횟수: "+ (++paint_count)); 15 : g.drawImage(img, 0,0,this); 16 : } 17 : 18 : public boolean imageUpdate(Image img,int infoFlags,int x, int y, int w, int h){ 19 : synchronized(System.out){ 20 : boolean b= super.imageUpdate(img,infoFlags,x,y,w,h); 21 : System.out.println(Thread.currentThread().getName()+" : "+b); 22 : return b; 23 : } 24 : } 25 : 26 : public static void main(String[] args) 27 : { 28 : PictureEx3 ex1 = new PictureEx3(); 29 : Frame f = new Frame("그림파일 보기 "); 30 : f.add(ex1); 31 : f.setSize(300,300); 32 : f.setVisible(true); 33 : f.addWindowListener(new WindowAdapter(){ 34 : public void windowClosing(WindowEvent w){ 35 : System.exit(0); 36 : } 37 : }); 38 : } 280
  • 281. 화면에 움직이는 공 -1  paint()를 이용해서 화면에 공이 조금씩 움직이는 방법 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class BallEx1 extends Panel 5 :{ 6 : int x, y,diameter ; //공의 좌표와 지름 7 : 8 : public BallEx1(int dia){ 9 : diameter = dia; 10 : } 11 : 12 : public void paint(Graphics g){ 13 : System.out.println("paint( ) 실행 "); 14 : g.fillOval(x,y,diameter,diameter); 15 : } 16 :} 281
  • 282. 화면에 움직이는 공 -2  지속적으로 paint()를 호출하는 법 – 지우지 않는 문제  1. paint()를 여러 번 호출하게 한다.  public void paint(Graphics g){  System.out.println("paint( ) 실행 ");  g.fillOval(x,y,diameter,diameter);  x += 10;  y += 10;  try{  Thread.sleep(100);  paint(g);  }catch(Exception e){ }  } 282
  • 283. 화면에 움직이는 공 -3  강제로 화면을 지우는 방식 – 종료가 되지 않는다.  //-------------처음생각 1---------  try{  Thread.sleep(100);  //--------------------처음 생각 2  g.setColor(Color.white);  g.fillRect(0,0,300,300);  g.setColor(Color.black);  //-----------------------------  paint(g);  }catch(Exception e){ } 283
  • 284. 화면에 움직이는 공 -4  종료되면서도 움직이는 공  두개의 작업을 동시에 처리하는 문제이므로 쓰레드 필요  AWT의 쓰레드  하나는 화면을 처리하는 쓰레드  다른 하나는 이벤트를 관리하는 쓰레드가 동작중 284
  • 285. 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class BallEx3 extends Panel implements Runnable 5 :{ 6 : int x, y,diameter ; //공의 좌표와 지름 7 : 8 : 9 : public BallEx3(int dia){ 10 : 11 : diameter = dia; 12 : Thread t = new Thread(this); 13 : t.setDaemon(true); // 프로그램 종료시 같이 종료되도록 데몬으 로 설정 14 : t.start(); 15 : } 16 : 17 : public void paint(Graphics g){ 18 : g.fillOval(x,y,diameter,diameter); 19 : } 285
  • 286. 20 : 21 : public void run(){ 22 : try{ 23 : for(int i = 0; i< 100 ; i++){ 24 : x += 10; 25 : y += 10; 26 : repaint(); 27 : Thread.sleep(300); 28 : } 29 : }catch(Exception e){} 30 : } 31 : 32 : public static void main(String[] args){ 33 : 34 : BallEx3 ex1 = new BallEx3(10); 35 : Frame f = new Frame("Ball - 1 "); 36 : f.add(ex1); 37 : f.setSize(300,300); 38 : f.setVisible(true); 39 : f.addWindowListener(new WindowAdapter(){ 40 : public void windowClosing(WindowEvent w){ 41 : System.exit(0); 42 : } 43 : }); 44 : } 45 :} 286
  • 287. 온전한 애니메이션의 처리  쓰레드를 이용해서 화면과 이벤트를 분리한다.  이미지의 깜빡임을 방지하기 위한 방법  update()의 재정의: 화면을 지우지 않고 그냥 paint()를 호출하 게 변경  MediaTracker의 이용: 이미지가 온전히 로딩되는 것을 감시하는 방법  Double buffering: 가상의 화면 뒤에 다음 이미지를 만드는 방 법 287
  • 288. Double Buffering 1 :import java.awt.*; 2 :import java.awt.event.*; 3 : 4 :public class AniCanvas3 extends Canvas implements Runnable 5 :{ 6 : Image[] images ; //이미지 파일이 사용할 이미지 7 : int index; //이미지 파일의 번호 8 : MediaTracker tracker; 9 : Image offScreen; //offScreen 이미지 10 : Graphics offGraphics; //offScreen에서 사용할 그래픽 객체 11 : 12 : public AniCanvas3(){ 13 : init(); 14 : } 15 : 16 : public void init(){ 17 : images = new Image[10]; 18 : tracker = new MediaTracker(this); 19 : for(int i = 0 ; i < images.length ; i++){ 20 : images[i] = Toolkit.getDefaultToolkit(). 21 : getImage("images//duke//T"+ (i+1) +".gif"); 22 : // 모든 이미지들을 같은 아이디로 등록 23 : tracker.addImage(images[i],0); 24 : } 25 : 26 : try{ 27 : tracker.waitForAll(); 28 : }catch(Exception e){ } 29 : 30 : Thread t = new Thread(this); 31 : t.setDaemon(true); 32 : t.start(); 33 : } 288
  • 289. 34 : 35 : public void run(){ 36 : 37 : for(int i=0; true ; i++){ 38 : try{ 39 : Thread.sleep(100); 40 : index = i%images.length; 41 : repaint(); 42 : }catch(InterruptedException ie){ 43 : } 44 : } 45 : } 46 : 47 : public void update(Graphics g){ 48 : paintOffScreen(); 49 : paint(g); 50 : } 51 : 52 : public void paintOffScreen(){ 53 : 54 : //현재의 화면크기와 동일한 offScreen을 만들어 준다. 55 : offGraphics.setColor(getBackground()); 56 : offGraphics.fillRect(0,0,getWidth(),getHeight());//현재화면의 크기 57 : offGraphics.drawImage(images[index],10,0,this); 58 : } 289
  • 290. 59 : 60 : public void paint(Graphics g){ 61 : 62 : if(offGraphics == null){ 63 : offScreen = createImage(getWidth(),getHeight()); 64 : offGraphics = offScreen.getGraphics(); 65 : } 66 : 67 : g.drawImage(offScreen, 10,0, this); 68 : } 69 : 70 : public static void main(String[] args){ 71 : AniCanvas3 cns = new AniCanvas3(); 72 : 73 : Frame f = new Frame("애니메이션 실습 3 "); 74 : f.add(cns); 75 : f.setSize(300,200); 76 : f.setVisible(true); 77 : f.addWindowListener(new WindowAdapter(){ 78 : public void windowClosing(WindowEvent w){ 79 : System.exit(0); 80 : } 81 : }); 82 : } 83 :} 290
  • 291. Java 입출력 프로그래 밍 291
  • 292. I/O의 개념  in – read 의 개념  키보드  파일  네트워크  out – write의 개념  화면  파일  네트워크 292
  • 293. java.io 패키지의 주요 클래스  File: 물리적인 파일과 directory 처리  InputStream 계열: 외부로 부터 읽어들이는 기능 관련 클래스들  OutputStream 계열: 외부로 데이터를 전송하는 기능 관 련 클래스들  Reader: 문자기반(2bytes)으로 읽어들이는 기능  Writer: 문자기반으로 출력하는 기능  RandomAccessFile 293
  • 294. 참고- Unicode와 Ascii  서양의 알파벳은 1바이트 범위로 모든 문자의 표현 가능 (Ascii)  한국,중국,일본어와 같은 문자들- double bytes체계 – 유니코드로 지정하여 공통된 값을 사용하도록 하는 방식 294
  • 295. 파일클래스  new File(파일명)  new File(디렉토리명, 파일이름)  폴더와 파일의 구분은 없다.  기능을 통해서 폴더와 파일 구분  File.seperator를 통해서 OS에 상관없이 디렉토리 구분 자로 이용 295
  • 296. boolean exists() 파일이 실제로 존재하는가를 검사 String getName() 파일의 이름을 알려준다. String getParent() 생성시에 자신의 상위 디렉토리 이름을 검색 String getPath() 파일의 경로 boolean isDirectory() 파일 객체가 디렉토리를 가르키는가를 판단 boolean createNewFile() 파일을 새로이 생성되었는지를 알려준다. boolean mkdir() 디렉토리를 새로이 생성 String[ ] list() 디렉토리내의 파일 이름을 배열로 생성 296
  • 297. FileNameFilter  // code MyFilter.java  1 :import java.io.*;  2 :  3 :class MyFilter implements FilenameFilter  4 :{  5 : private String keyword;  6 : private String fileExt;  7 :  8 : public MyFilter(String keyword, String fileExt){  9 :  10 : this.keyword = keyword;  11 : this.fileExt = fileExt;  12 : }  13 :  14 : public boolean accept(File dir, String fileName){  15 :  16 : if(fileExt.equals("all"))  17 : fileExt= "w*";  18 :  19 : return fileName.matches("w*"+keyword+"w*."+fileExt);  //정규표현식 사용방법  20 :  21 : }  22 :} 297
  • 298. 1 :import java.io.*; 2 : 3 :class FilterEx 4 :{ 5 : public void test(){ 6 : 7 : File dir = new File("D:javaExchap10"); 8 : 9 : MyFilter filter = new MyFilter("Test","java"); 10 : 11 : File[] files = dir.listFiles(filter); 12 : 13 : for(int i=0; i<files.length; i++){ 14 : System.out.println("File Name "+ files[i].getName()); 15 : } 16 : } 17 : 18 : 19 : public static void main(String[] args) 20 : { 21 : FilterEx fe = new FilterEx(); 22 : fe.test(); 23 : } 24 :} 298
  • 299. InputStream – 바이트 단위로 데이터를 읽 는다. 299
  • 300. int read( ) 스트림으로부터 한 바이트를 읽어서 결과를 숫자로 반환 읽은 데이터가 없으면 -1 을 반환한다. int read(byte[] ) 바이트의 배열만큼 입력정보를 읽고 몇 바이트를 읽었는지를 반환 int read(byte[],int s,int len,) 주어진 배열에 처음위치(s) 부터 지정된 길이(len) 까지 스트림을 읽 는다. 읽혀진 데이터는 바이트의 배열에 저장하고 몇 바이트를 읽었는지를 반환한다. int available() 현재 읽을 수 있는 데이터의 양을 반환 void mark(int mark) 현재 바이트를 읽는 중간의 위치를 설정한다. 마크를 설정한 후에는 reset() 을 이용해서 다시 지정한 위치로 이동할 수 있습니다. boolean markSupported() 스트림이 mark() 를 지원하는지를 알려준다. void reset() mark() 이전의 위치로 데이터를 이동시킨다. void skip(long n) 지정된 수만큼 스트림을 건너 뛴다. void close() 입력 스트림을 닫는다. 300
  • 301.  1 :class InputStreamEx2  2 :{  3 : public static void main(String[] args) throws Exception  4 : {  5 :  6 : byte[] bytes = new byte[10];  7 : java.io.InputStream in = System.in;  8 :  9 : int count = in.read(bytes);  10 : System.out.println("몇 바이트를 읽었는가? "+count);  11 :  12 : System.out.println("바이트의 배열이 저장된 내용 : "+new String(bytes));  13 :  14 : for(int i=0; i<bytes.length;i++){  15 : System.out.print(bytes[i]+ " ");  16 : }  17 : in.close();  18 : }  19 :} 301
  • 302.  1 :import java.io.*;  2 :  3 :class InputStreamEx3  4 :{  5 : InputStream in;  6 :  7 : public void test()throws IOException{  8 :  9 : in = System.in;  10 :  11 : readData(5); //무조건 5 개를 읽고 시작한다.  12 :  13 : in.mark(10); //현재위치를 표시를 해둔다. 10 바이트 까지만 읽을 수 있다.  14 :  15 : System.out.println("mark 한 후에 읽는 데이터 ");  16 : readData(3);  17 : System.out.println("------------------------------ ");  18 : System.out.println(" mark된 위치에서 다시 읽기");  19 :  20 : in.reset();  21 : readData(5);  22 : in.close();  23 : }  24 :  25 : public void readData(int limit)throws IOException {  26 :  27 : for(int i=0; i<limit; i++){  28 : System.out.print((char)in.read()+" ");  29 : }  30 : System.out.println('n');  31 : }  32 :  33 : public static void main(String[] args) throws Exception  34 : {  35 : InputStreamEx3 ex3 = new InputStreamEx3();  36 : try{  37 : ex3.test();  38 : }catch(Exception e){  39 : e.printStackTrace();  40 : }  41 : }  42 :} 302
  • 303.  //code ReadingFile.java  1 :import java.io.*;  2 :  3 :public class ReadingFile  4 :{  5 : public static void main(String[] args) throws Exception  6 : {  7 : int content = 0;  8 :  9 : InputStream input = new FileInputStream("sample.dat");  10 :  11 : while(true){  12 : content = input.read();  13 :  14 : if(content != -1){  15 : System.out.print((char)content);  16 : }else{  17 : break;  18 : }  19 : }  20 : }  21 :} 303
  • 304. OutputStream – 외부로 데이터를 전송하기 304
  • 305. void close() 스트림을 닫는다. void write(int value) 바이트 값인 value 를 기록한다. void write(byte[] bytes) 바이트의 배열을 스트림을 통해서 기록한다. void write(byte[] bytes, int s, int e) 바이트의 배열을 시작위치(s)에서 길이(e)만큼 기록 void flush() 스트림 상에 남아있는 데이터를 모두 밀어낸다.(설명참조) 305
  • 306.  1 :import java.io.*;  2 :  3 :class OutputStreamEx1  4 :{  5 : public static void main(String[] args) throws IOException  6 : {  7 : File file = new File("sample2.dat");  8 : OutputStream os = new FileOutputStream(file);  9 :  10 : os.write(97); //a  11 : os.write(98); //b  12 : os.write(99); //c  13 : os.write(100);//d  14 : os.write(101);//e  15 :  16 : os.close();  17 : }  18 :} 306
  • 307. Buffer .. 조금 더 편하게… 307
  • 308. DataInputStream/DataOutputStream 기본자료형 DataInputStrem DataOutputStream boolean readBoolean() writeBoolean() byte readByte() writeByte() char readChar() writeChar() short readShort() writeShort() int readInt() writeInt() long readLong() writeLong() double readDouble() writeDouble() float raadFloat() writeFloat() 308
  • 309. I/0프로그래밍의 일반적인 격언  열어둔 스트림은 반드시 닫아라.  try{ }catch(){} finally{}를 이용하라.  Buffered를 이용해서 성능의 향상의 고려해라.  byte[]을 이용해서 가능하면 데이터 스캔 수를 줄여라 309
  • 310. Reader 310
  • 311. Writer 311
  • 312.  Reader클래스의 메쏘드  void close()스트림을 닫는다.  int read()문자 하나를 읽어 그 값을 반환해 준다.예를 들어 ‘a’라는 문자를 읽으면 97 이라는 값을 넘겨준다.  int read(char[] cbuf)char 배열에 스트림으로부터 읽어 들인 데이터를 저 장하고,몇 개의 char를 읽었는지 알려준다.  Writer클래스의 메쏘드  void write(char[] cbuf)char 배열에 저장되어 있는 char들을 기록해 준다.  void write(int c)int 값에 해당하는 숫자를 기록해준다.  void write(String str)문자열 str 을 기록해 준다.  void write(String str, int off, int len)문자열 str중에서 시작위치로부터 길이 (len)만큼의 문자열을 기록한다. 312
  • 313. Stream과 Reader/Writer의 변환  InputStreamReader: InputStream을 Reader로 변환해주 는 역할을 담당해 주는 클래스  OutputStreamWriter: OutputStream을 Writer로 변환해 주는 역할을 담당해 주는 클래스 313
  • 314. RandomAccessFile  임의의 위치로 커서를 이동시켜 데이터를 기록할 수 있 는 방식  read와 write가 한 클래스내에 동시에 존재한다.  seek()를 이용해서 지정된 위치로 이동이 가능  메쏘드를 이용해 원하는 자료형들에 대한 입출력이 자유 롭게 설계 314
  • 315. Selializaiton  객체의 직렬화  객체 데이터 + 약간의 정보를 통해 객체데이터의 전송을 추구  실제로 객체의 직렬화는 메모리상에 있는 데이터를 복사 하는 개념  부가정보를 추가하도록 하는 Selializable 인터페이스 구 현을 통해 구현 315
  • 316. 자바 멀티쓰레드 프로 그래밍 316
  • 317. 쓰레드(Thread)프로그래밍  CPU가 연산 후에 남는 시간을 이용하여 별도의 다른 작 업을 수행하는 개념  프로세스와 구분되는 개념  인간의 지각능력으로는 동시에 수행되는 것으로 보이는 작업  지금껏 모든 main()메쏘드는 별도의 쓰레드로 동작한 프 로그램들 이었음 317
  • 318. 동기화  한번에 하나씩  작업을 처리하는데 있어서는 안전  인간의 지각능력과 비슷한 전략  동시처리 불가로 인한 문제  CPU자원의 낭비 318
  • 319. 비동기화  인간의 무의식적인 행태  듣는 동시에 보고, 느끼고, 먹는 등..  CPU의 남는 시간을 활용  작업에 안정성을 보장하지 않음 319
  • 320. 쓰레드의 생성  자바에서는 언어차원에서 쓰레드의 처리를 지원  extends Thread방식  implements Runnable 방식  start() 호출  기존 프로그래밍과 같이 인자를 넘기거나 동작을 제어할 수 있는 수단이 없다. 320
  • 321. main과 쓰레드 321
  • 322. 쓰레드의 생명주기 322
  • 323. 쓰레드와 경쟁조건 323
  • 324. sleep()과 join()/ interrupt()  지정된 시간만큼 CPU의 점유를 양보하는 개념 –sleep()  지정된 쓰레드의 종료까지 현재 쓰레드를 기다리게 하는 join()  지정된 쓰레드를 CPU점유에 우선권을 주도록 하는 interrupt() 324
  • 325. Mutual exclusion  특정한 객체에 대하여 N개의 쓰레드가 경쟁적으로 접근 작업을 수행할 때 안전한 방법을 제공하기 위함  Lock – 각 객체마다 가지고 있는 잠금장치  락은 각 인스턴스마다 존재  Monitor – 락을 취하는 것을 모니터를 소유한다라고 표 현 325
  • 326. synchronized 키워드  자바에서 배타제어를 가능하게 하는 키워드  인스턴스 단위의 처리  메쏘드 단위의 처리 가능 326
  • 327. synchronized 키워드  자바에서 배타제어를 가능하게 하는 키워드  인스턴스 단위의 처리  메쏘드 단위의 처리 가능 인스턴스 쓰레드A wait set synchronized 락 메쏘드 쓰레드 B synchronized 메쏘드 327
  • 328. Networking 프로그래 밍 328
  • 329.  OSI 계층과 프로토콜 329
  • 330. TCP/IP  Transmission Control Protocol  전달하고자 하는 데이터가 배달되는 것을 보장하는 프로 토콜  전달되는 데이터의 단위: 패킷(Packet)  매번 데이터의 전송여부를 확인하므로 속도가 조금 느리 다는 단점과 데이터의 안전성을 보장한다는 장점을 가짐 330
  • 331. UDP 방식  User Datagram Protocol  데이터를 전달받는 입장을 고려하지 않으며, 송신하는 쪽에서 일방적으로 데이터를 보내는 방식, 속도면에서는 빠르므로 주로 간단한 메시지를 전송하는 경우에 많이 사용  보내지는 데이터에 대한 수신의 책임을 지지 않는다. 331
  • 332. URL이란?  Uniform Resource Locator  인터넷 상에서의 자원의 위치를 알아내기 위해 사용 http://developer.java.sun.com:80/developer/onlineTraining/Programming/JDCBook/index.html 실제접근하는 자원의 이름(상세 경로) 서버와 연결을 시도하는 포트의 번호 호스트명 프로토콜 332
  • 333. java.net 패키지와 InetAddress  도메인정보로 부터 IP정보를 추출하기 위해 사용  1 :import java.net.*;  2 :  3 :public class IPTest  4 :{  5 : public static void main(String[] args) throws UnknownHostException  6 : {  7 : InetAddress host = InetAddress.getByName("www.naver.com");  8 :  9 : String name = host.getHostName();  10 : System.out.println("HOST NAME : "+ name);  11 : System.out.println("IPADDRESS : "+ host.getHostAddress());  12 : }  13 :} 333
  • 334. URL클래스  인터넷상의 URL정보를 자바의 클래스화  URL 자원에 대한 객체를 이미  URLConnection: 특정 URL을 통한 통신을 하고자 하는 경우에 주로 사용  URLEncoder, URLDecoder: URL상의 정보에 대하여 한 글이나 특정 문자 처리를 담당하는 클래스 334
  • 335. URL의 생성 및 사용  주로 문자열 이용  URL(String 주소)  URL(String 프로토콜, String 호스트, int 포트, String 상세주소) 335
  • 336. 1 :import java.net.*; 2 :import java.io.*; 3 : 4 :public class URLTest 5 :{ 6 : public static void main(String[] args) throws Exception 7 : { 8 : URL url = new URL("http","www.google.co.kr",80,"/index.html"); 9 : 10 : InputStream in = url.openStream(); 11 : 12 : byte[] buffer = new byte[1024]; 13 : 14 : int content =0; 15 : while( (content = in.read(buffer))!= -1){ 16 : System.out.println(new String(buffer,0,content)); 17 : } 18 : } 19 :} 336
  • 337. Socket 클래스  실제 네트워킹 프로그램을 만드는 경우에 가장 빈번하게 사용되는 데이터의 통신 방법  TCP/IP 네트워크에서 양쪽을 연결해 주는 역할을 담당 337
  • 338. Socket 프로그래밍의 구현절차(단일)  클라이언트  Server객체를 만들어 서버와 연결을 맺는다.  연결된 Socket을 통해서 InputStream, OutputStream을 얻어낸 다.  스트림을 통해서 IN/OUT기능을 수행한다.  서버의 경우  사용자들을 받아들이기 위해서 ServerSocket클래스를 이용한다.  accept()을 통해서 사용자가 연결되는 것을 Socket객체로 만들 어 낸다.  얻어진 Socket을 통해서 InputStream이나 OutputStream을 생 성한다. 338
  • 339. 339
  • 340. 클라이언트의 소켓  Socket생성시에 연결 서버의 ip주소와 함께 포트번호를 이용해서 연결을 시도한다.  Socket을 통해서 getInputStream(), getOutputStream() 메쏘드를 이용해서 I/O작업이 가능하도록 만든다.  만일 지속적으로 서버의 메시지를 실시간으로 읽어들여 야 하는 경우라면 Thread의 사용을 검토하는것이 좋다.  Socket socket = new Socket(String 호스트, int 포트)  Socket socket = new Socket(InetAddress, int 포트) 340
  • 341. ServerSocket  클라이언트와 서버와의 연결고리 역할을 담당  ServerSocket(int port) ;  ServerSocket(int port,int backlog);  ServerSocket(int port,int backlog, InetAddress bindAddr);  backlog: ServerSocket이 네트워크로부터 들어오는 소 켓의 양을 한정짓기 위해서 사용  accept(): 네트워크로 부터 클라이언트와 연결된 Socket을 얻어낸다. 341
  • 342. code SimpleClient.jva 1 :import java.net.*; 2 :import java.io.*; 3 : 4 :public class SimpleClient 5 :{ 6 : String name; 7 : Socket socket; 8 : 9 : public SimpleClient(String userName){ 10 : name = userName; 11 : } 12 : 13 : public void test(){ 14 : try{ 15 : socket = new Socket("localhost",3333); 16 : closeAll(); 17 : }catch(UnknownHostException uhe){ 18 : System.out.println(uhe.getMessage()); 19 : }catch(IOException ie){ 20 : System.out.println(ie.getMessage()); 21 : } 22 : } 23 : 24 : public void closeAll()throws IOException{ 25 : 26 : socket.close(); 27 : } 28 : 29 : public static void main(String[] args) 30 : { 31 : SimpleClient sc = new SimpleClient(args[0]); 32 : sc.test(); 33 : } 34 :} 342
  • 343. //code SimpleServer.java 1 :import java.net.*; 2 :import java.io.*; 3 : 4 :public class SimpleServer 5 :{ 6 : public void getMessage()throws IOException,Exception{ 7 : 8 : ServerSocket sc = new ServerSocket(3333); 9 : Socket socket = sc.accept(); 10 : 11 : System.out.println("Socket FROM : " + socket); 12 : 13 : socket.close(); 14 : sc.close(); 15 : } 16 : 17 : public static void main(String[] args) throws Exception 18 : { 19 : SimpleServer ss = new SimpleServer(); 20 : ss.getMessage(); 21 : } 22 :} 343
  • 344. 단일 클라이언트와 서버  1. 사용자의 입력을 받아 들어야 한다. 사용자가 입력한 메시지 를 소켓을 통해 전송한다.  2. 지속적으로 서버와 연결되어야 한다.  while 루프를 사용해서 지속적으로 메시지를 서버에 전달하도 록 해야 한다.  3. 원하는 메시지로 종료 시킬 수 있어야 한다.  while 루프를 사용하던 중 종료 메시지를 입력하면 종료 되어야 한다.  4. 프로그램을 위해서 사용되던 여러 스트림과 소켓역시 종료되 어야 한다. 344
  • 345. //code SimpleClient.java 1 :import java.net.*; 2 :import java.io.*; 3 : 4 :public class SimpleClient2 5 :{ 6 : String name; //사용자의 이름 7 : String message; //전송할 메세지 8 : Socket socket; // 서버와 연결된 소켓 9 : BufferedWriter writer; //네트워크를 통해 전송할 스트림 10 : BufferedReader reader; //사용자에게서 입력받는 스트림 11 : 12 : 13 : public SimpleClient2(String userName){ 14 : name = userName; 15 : 16 : try{ 17 : socket = new Socket("211.202.86.151",3333); 18 : writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 19 : reader = new BufferedReader(new InputStreamReader(System.in)); 20 : 21 : }catch(UnknownHostException uhe){ 22 : System.out.println(uhe.getMessage()); 23 : }catch(IOException ie){ 24 : System.out.println(ie.getMessage()); 25 : } 26 : } 27 : 28 : //가장 주된 메쏘드로 메시지를 전송한다. 29 : public void sendMessage()throws IOException{ 30 : while(true){ 31 : message = getInputMessage(); 32 : if(message.equals(name+" : byen")) 33 : throw new IOException("Ending Message"); 34 : writer.write(message); 35 : writer.flush(); 36 : } 37 : } 345
  • 346. //code SimpleClient.java 39 : public String getInputMessage()throws IOException { 40 : 41 : return name +" : "+ reader.readLine()+"n"; 42 : } 43 : 44 : public void closeAll(){ 45 : try{ 46 : reader.close(); 47 : writer.close(); 48 : socket.close(); 49 : }catch(IOException ie){ 50 : System.out.println(ie.getMessage()); 51 : } 52 : } 53 : 54 : public static void main(String[] args) 55 : { 56 : SimpleClient2 sc = new SimpleClient2(args[0]); 57 : try{ 58 : sc.sendMessage(); 59 : }catch(Exception e){ 60 : sc.closeAll(); 61 : System.out.println(e.getMessage()); 62 : } 63 : } 64 :} 346
  • 347. //code SimpleServer2.java 1 :import java.net.*; 2 :import java.io.*; 3 : 4 :public class SimpleServer2 5 :{ 6 : ServerSocket sc; 7 : 8 : public SimpleServer2(){ 9 : try{ 10 : sc = new ServerSocket(3333); 11 : }catch(IOException ie){ 12 : System.out.println(ie.getMessage()); 13 : } 14 : } 15 : 16 : public void getMessage()throws IOException { 17 : 18 : Socket socket = null; 19 : BufferedReader br = null; 20 : String message= null; 21 : 22 : socket = sc.accept(); 23 : br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 24 : while(true){ 25 : message = br.readLine(); 26 : System.out.println(message); 27 : if(message == null){ 28 : closeUser(br,socket,true); 29 : throw new IOException("프로그램이 종료됩니다."); 30 : } 31 : } 32 : } 347
  • 348. 33 : 34 : public void closeUser(BufferedReader br, Socket socket, boolean terminate){ 35 : try{ 36 : br.close(); 37 : socket.close(); 38 : if(terminate) 39 : sc.close(); 40 : }catch(IOException ie){ 41 : System.out.println(ie.getMessage()); 42 : } 43 : } 44 : 45 : public static void main(String[] args) 46 : { 47 : SimpleServer2 ss = new SimpleServer2(); 48 : try{ 49 : ss.getMessage(); 50 : }catch(IOException io){ 51 : System.out.println(io.getMessage()); 52 : } 53 : } 54 :} 348
  • 349. 멀티쓰레드로 여러명의 사용자 처리하기  쓰레드가 필요한 이유  클라이언트: 서버에서 다른 사용자가 보내는 메시지를 지속적으 로 들을 수 있어야 한다.  서버: 각 사용자가 보내는 메시지를 동시에 수신할 수 있어야 한 다. 349
  • 350. import java.awt.event.*; import java.io.*; import java.awt.*; public class ChatClient extends Frame implements ActionListener{ private Panel upper = new Panel(); private TextArea ta = new TextArea(10,30); private Panel lower = new Panel(); private TextField tf = new TextField(30); private ChatThread cth = new ChatThread(this); public ChatClient(){ upper = new Panel(); upper.add(ta); Thread t = new Thread(cth); t.setDaemon(true); t.start(); lower.add(tf); tf.addActionListener(this); setLayout(new BorderLayout()); add(upper, BorderLayout.CENTER); add(lower, BorderLayout.SOUTH); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent w){ System.exit(0); } }); } 350
  • 351. public void addMsg(String msg){ ta.append(msg+"n");//줄 바꿈을 위해서 추가한다. } public void actionPerformed(ActionEvent arg0) { String userMsg = tf.getText(); System.out.println(userMsg); tf.setText(""); cth.sendMsg(userMsg); } public static void main(String[] args){ Frame f = new ChatClient(); f.pack(); f.setVisible(true); } } 351
  • 352. import java.net.*; import java.io.*; public class ChatThread implements Runnable { private ChatClient view; private Socket socket; //inputStream private InputStream in; private InputStreamReader isr; private BufferedReader br; //outputStream private OutputStream out; private OutputStreamWriter osw; private BufferedWriter bw; private boolean runFlag = false; public ChatThread(ChatClient awtView){ this.view = awtView; this.runFlag = true;//실행되게 한다. try{ socket = new Socket("127.0.0.1",1234); in = socket.getInputStream(); isr = new InputStreamReader(in); br = new BufferedReader(isr); out = socket.getOutputStream(); osw = new OutputStreamWriter(out); bw = new BufferedWriter(osw); }catch(Exception e){ e.printStackTrace(); } } 352
  • 353. public void run() { while(runFlag){ try { String serverMsg = br.readLine(); view.addMsg(serverMsg); } catch (IOException e) { e.printStackTrace(); } } System.out.println("CLIENT TERMINATED"); } public void sendMsg(String userMsg){ try { System.out.println("Thread send Msg " +userMsg); bw.write(userMsg+"n"); bw.flush(); if(userMsg.equals("BYEBYE") == true){ terminate(); } } catch (IOException e) { e.printStackTrace(); } } public void terminate(){ sendMsg("BYEBYE"); this.runFlag = false; } } 353
  • 354. import java.net.*; import java.util.*; import java.io.*; public class Server { private ServerSocket ss; private ArrayList<ServerThread> clientList = new ArrayList<ServerThread>(); public Server(){ try{ ss = new ServerSocket(1234); while(true){ Socket clientSocket = ss.accept(); ServerThread aClient = new ServerThread(clientSocket, this); aClient.setDaemon(true); aClient.start(); clientList.add(aClient); } }catch(Exception e){ e.printStackTrace(); } } public void broadcast(String msg){ for(int i = 0; i < clientList.size() ; i++){ try{ clientList.get(i).sendMsg(msg); }catch(Exception e){ System.out.println(e.getMessage()); } } } 354
  • 355. public void exitRoom(ServerThread aClient){ synchronized(clientList){ clientList.remove(aClient); System.out.println("A client is exited"); broadcast("A client is exited"); } } public static void main(String[] args){ Server s = new Server(); } } 355
  • 356. import java.io.*; import java.util.*; import java.net.*; public class ServerThread extends Thread { private Socket client; private Server server; //inputStream private InputStream in; private InputStreamReader isr; private BufferedReader br; //outputStream private OutputStream out; private OutputStreamWriter osw; private BufferedWriter bw; public ServerThread(Socket clientSocket, Server realServer){ this.client = clientSocket; this.server = realServer; init(); } private void init(){ try { in = client.getInputStream(); isr = new InputStreamReader(in); br = new BufferedReader(isr); out = client.getOutputStream(); osw = new OutputStreamWriter(out); bw = new BufferedWriter(osw); } catch (IOException e) { e.printStackTrace(); } } 356
  • 357. public void sendMsg(String otherMsg)throws Exception{ bw.write(otherMsg+"n"); bw.flush(); } public void run(){ while(true){ try{ String msg = br.readLine(); System.out.println("MSSGE FROM USER " + msg); server.broadcast(msg); }catch(Exception e){ break; } } } } 357

×