명품 JAVA Programming 1 제 6 장패키지개념과자바기본패키지
패키지개념과필요성 2 3명이분담하여자바응용프로그램을개발하는경우, 동일한이름의클래스가존재할가능성있음 -> 합칠때오류발생
디렉터리로각개발자의코드관리 ( 패키지 ) 3 Project FileIO Graphic WebFile.class FileCopy.class FileRW.class Tools.class DObject.class Line.class Rect.classclass Circle.class 이름은같지만경로명이달라서도다른파일로취급 Project/FileIO/Tools.classclass Project/UI/Tools.class UI Main.class GUI.class EventHandler.class Tools.class
자바의패키지 (package) 4 패키지란 서로관련된클래스와인터페이스의컴파일된클래스파일들을하나의디렉터리에묶어놓은것 하나의응용프로그램은여러개의패키지로작성가능 하나의패키지로만들고모든클래스파일을넣어둘수도있음 패키지는 jar 파일로압축할수있음 예 ) JDK 에서제공하는표준패키지는 rt.jar 에압축
JDK 에서제공되는패키지 5 클래스의이름 ( 경로명 ) java.awt.color 패키지명 패키지명 : java.awt java.awt 패키지에속한클래스
패키지사용하기, import 문 6 다른패키지에작성된클래스사용 bli l I te l { import를이용하지않는경우 소스내에서패키지이름과클래스이름의전체경로명을써주어야함 public class ImportExample { public static void main(string[] args) { java.util.scanner scanner = new java.util.scanner(system.in); import 키워드이용하는경우 소스의시작부분에사용하려는패키지명시 소스에는클래스명만명시하면됨 특정클래스의경로명만포함하는경우 import java.util.scanner; 패키지내의모든클래스를포함시키는경우 import java.util.*; * 는현재패키지내의클래스만을의미하며하위패키지의클래스까지포함하지않는다. import java.util.scanner; public class ImportExample { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); import java.util.*; public class ImportExample { public static void main(string[] args) { Scanner scanner = new Scanner(System.in);
클래스경로 7 클래스의위치 ( 경로 ) 지정 클래스탐색경로를지정하는방법 2 가지 클래스경로의환경변수 : 시스템환경변수 CLASSPATH java 의옵션 classpath 실행시클래스파일이존재하는패키지디렉터리정보를 -classpath 옵션에지정
8 CLASSPATH 지정방법 Jdk1.7.0_07은독자가설치할 JDK 버전에따라서디렉터리이름이달라질수있다.
이클립스에서쉽게패키지만들기 9 예제로사용할샘플소스 (5 장의예제 5-6) abstract class Calculator { public abstract int add(int a, int b);// 두정수의합을구하여리턴 public abstract int subtract(int a, int b);// 두정수의차를구하여리턴 public abstract double average(int[] a);// 배열에저장된정수의평균을구해실수로리던 class GoodCalc extends Calculator { public int add(int a, int b) { return a+b; public int subtract(int a, int b) { return a - b; public double average(int[] a) { double sum = 0; for (int i = 0; i < a.length; i++) sum += a[i]; return sum/a.length; public static void main(string [] args) { Calculator c = new GoodCalc(); System.out.println(c.add(2,3)); System.out.println(c.subtract(2,3)); System.out.println(c.average(new int [] {2,3,4 ));
10 프로젝트작성 ( 프로젝트이름 : PackageEx)
11 패키지 lib 작성
12 패키지 app 작성
패키지작성이완료된결과 패키지탐색창에 app 패키지와 lib 패키지가보인다. 13
클래스 Calculator 만들기 Calculator 클래스를 public abstract 속성으로생성한다. 14
Calculator 소스수정 다른패키지, 즉 app 패키지의클래스에서접근할수있도록하기위해클래스의접근지정자 public을반드시삽입. 15
GoodCalc.java 작성후소스수정 import 문삽입. Calculator l 클래스를사용하기위해서는패키지를포함하는정확한경로명을컴파일러에게알려줘야함. 16
푸시다운버튼을누르면아래메뉴가보인다. 실행을위한 Run Configurations 작성 main() 메소드를가진클래스를지정한다. 17
18 프로젝트 PackageEx 실행
패키지의특징 19 패키지의특징 패키지계층구조 클래스나인터페이스가너무많아지면관리의어려움 관련된클래스파일을하나의패키지로계층화하여관리용이 패키지별접근제한 default 로선언된클래스나멤버는동일패키지내의클래스들이자유롭게접근하도록허용 동일한이름의클래스와인터페이스의사용가능 서로다른패키지에이름이같은클래스와인터페이스존재가능 높은소프트웨어재사용성 오라클에서제공하는자바 API 는패키지로구성되어있음 java.lang, java.io 등의패키지들덕분에일일이코딩하지않고입출력프로그램을간단히작성할수있음
자바 JDK 의패키지구조 20 JDK 패키지 자바에서는관련된클래스들을표준패키지로묶어사용자에게제공자바에서제공하는패키지는 C언어의표준라이브러리와유사 JDK의표준패키지는 rt.jar에담겨있음 C:\Program Files\Java\jdk1.6.0_16\jre\lib\rt.jar rt jar 의 java awt 패키지에컴 rt.jar 의 java.awt 패키지에컴파일된클래스들이들어있다.
자바패키지구조 java 패키지이름 : 소문자로시작 클래스이름 : 대문자로시작 applet awt beans io lang math net nio rmi security sql text util beancontext spi color datatransfer dnd event font geom im image print channels charset spi renderable spi spi annotation instrument management ref reflect activation dgc registry server acl cert spec interfaces concurren t jar logging prefs regex spi zip 21 atomic locks
주요패키지 22 java.lang 자바 language 패키지 스트링, 수학함수, 입출력등자바프로그래밍에필요한기본적인클래스와인터페이스 ( 예 ) System.out.println() t tl 자동으로 import 됨 - import 문필요없음 java.util 자바유틸리티패키지 java.io 날짜, 시간, 벡터, 해시맵등과같은다양한유틸리티클래스와인터페이스제공 키보드, 모니터, 프린터, 디스크등에입출력을할수있는클래스와인터페이스제공 java.awt 자바 GUI 프로그래밍을위한클래스와인터페이스제공 javax.swing 자바 GUI 프로그래밍을위한스윙패키지
자바 API 참조 23 자바 API 의상세정보 Oracle Technology Network(http://docs.oracle.com/javase/8/docs/api/) 에서온라인제공
Object 클래스 24 특징 java.lang 패키지에포함 자바클래스계층구조의최상위에위치 모든클래스의수퍼클래스 주요메소드
객체속성 25 class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; public class ObjectProperty { public static void main(string [] args) { Point p = new Point(2,3); System.out.println(p.getClass().getName()); System.out.println(p.hashCode()); System.out.println(p.toString()); System.out.println(p); Point 12677476 Point@c17164 Point@c17164
객체를문자열로변환 26 String tostring() 객체를문자열로반환 Object 클래스에구현된 tostring() 이반환하는문자열 클래스이름 @ 객체의 hash code 각클래스는 tostring() 을오버라이딩하여자신만의문자열리턴가능 컴파일러에의한자동변환 객체 + 문자열 -> 객체.toString() + 문자열 로자동변환 Point a = new Point(2,3); String s = a + " 점 "; System.out.println(s); 변환 Point a = new Point(2,3); String s = a.tostring()+ " 점 "; System.out.println(s.toString()); Point@c17164 점
새로운 tostring() 만들기 27 class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; public String tostring() { return "Point(" + x + "," + y+ ")"; public class ObjectProperty ty { public static void main(string [] args) { Point a = new Point(2,3); System.out.println(a.toString()); System.out.println(a); 라고해도동일 Point(2,3)
객체비교 (== 과 equals()) 28 객체레퍼런스의동일성비교 : == 연산자이용객체내용비교 서로다른두객체가같은내용물인지비교 boolean equals(object obj) 이용 class Point { Point a = new Point(2,3); c int x, y; Point b = new Point(2,3); public Point(int x, int y) { Point c = a; this.x = x; this.y = y; if(a == b) // false a System.out.println("a==b"); if(a == c) // true System.out.println("a==c"); b a==c x=2 y=3 x=2 y=3 Point Point class Point { int x, y; public Point(int x, int y) { this.x =x;this this.y =y; public boolean equals(point p) { if(x == p.x && y == p.y) return true; else return false; Point a = new Point(2,3); Point b = new Point(2,3); Point c = new Point(3,4); if(a == b) // false System.out.println("a==b"); if(a.equals(b)) // true System.out.println("a is equal to b"); if(a.equals(c)) // false System.out.println("a t tl is equal to c"); a is equal to b a b c x=2 y=3 x=2 y=3 x=3 y=4 Point Point Point
예제 6-1 : Rect 클래스만들고 equals() 만들기 29 int 타입의 width, height의필드를가지는 Rect 클래스를작성하고, 두 Rect 객체의 width, dh height h 필드에의해구성되는면적이같으면두객체가같은것으로판별하도록 equals() 를작성하라. Rect 생성자에서 width, height 필드를인자로받아초기화한다. class Rect { int width; int height; public Rect(int width, int height) { this.width = width; this.height = height; public boolean equals(rect p) { if (width*height == p.width*p.height) return true; else return false; public class EqualsEx { public static void main(string[] args) { Rect a = new Rect(2,3); Rect b = new Rect(3,2); Rect c = new Rect(3,4); if(a.equals(b)) System.out.println("a is equal to b"); if(a.equals(c)) System.out.println("a is equal to c"); if(b.equals(c)) System.out.println("b is equal to c"); a is equal to b
Wrapper 클래스 30 자바의기본타입을클래스화한 8 개클래스 용도 int, double 등자바기본데이터타입은클래스가아님 ( 예 )3 3, a, 35 3.5 등은객체가아님 기본타입의값을사용할수없고객체만사용하는클래스등에기본타입의값을 Wrapper 클래스객체로만들어사용 Wrapper라는클래스는존재하지않음. 8개의기본데이터를객체형식으로다루기위해통칭으로사용함.
Wrapper 객체생성 31 기본타입의값을인자로 Wrapper 클래스생성자호출 Integer i = new Integer(10); Character c = new Character( c ); Float f = new Float(3.14); Boolean b = new Boolean(true); 데이터값을나타내는문자열을생성자인자로사용 Boolean b = new Boolean( false ); Integer I = new Integer( 10 ); Double d = new Double( 3.14 ); Float는 double 타입의값을생성자의인자로사용 Float f = new Float((double) 3.14);
주요메소드 32 가장많이사용하는 Integer 클래스의주요메소드
Wrapper 활용 33 Wrapper 객체로부터기본데이터타입알아내기 Integer i = new Integer(10); int ii = i.intvalue(); // ii = 10 Character c = new Character('c' '); char cc = c.charvalue(); // cc = c Float f = new Float(3.14); float ff = f.floatvalue(); // ff = 3.14 Boolean b = new Boolean(true); boolean bb = b.booleanvalue(); // bb = true 문자열을기본데이터타입으로변환 int i = Integer.parseInt("123"); // i = 123 boolean b = Boolean.parseBoolean("true"); // b = true float f = Float.parseFloat("3.141592" t("3 ); // f = 3.141592 기본데이터타입을문자열로변환 String s1 = Integer.toString(123); // 정수 123을문자열 "123" 으로변환 String s2 = Integer.toHexString(123); // 정수 123을 16진수의문자열 "7b" 로변환 String s3 = Float.toString(3.141592f); // 실수 3.141592를문자열 "3.141592" 로변환 String s4 = Charater.toString('a'); // 문자 a 를문자열 "a" 로변환 String s5 = Boolean.toString(true); // 불린값 true를문자열 "true" 로변환
예제 6-2 : Wrapper 클래스활용 34 다음은 Wrapper 클래스를활용하는예이다. 다음프로그램의결과는무엇인가? public class WrapperClassEx { public static void main(string[] args) ){ Integer i = new Integer(10); char c = '4'; Double d = new Double(3.1234566); System.out.println(Character.toLowerCase('A')); ( if (Character.isDigit(c)) System.out.println(Character.getNumericValue(c)); System.out.println(Integer.parseInt("-123")); System.out.println(Integer.toBinaryString(28)); y g( System.out.println(Integer.toHexString(28)); System.out.println(i.doubleValue()); System.out.println(d.toString()); System.out.println(Double.parseDouble("44.13e-6")); p ( a 4-123 16 11100 3 1c 10.00 3.1234566 4.413E-5
박싱과언박싱 35 박싱 (boxing) 기본타입의값을 Wrapper 객체로변환하는것 언박싱 (unboxing) Wrapper 객체에들어있는기본타입의값을빼내는것
자동박싱 / 자동언박싱 36 JDK 1.5 부터지원 자동박싱 (Auto boxing) 기본타입의값을자동으로 Wrapper 객체로변환 자동언박싱 (Auto unboxing) Wrapper 객체를자동으로기본타입값으로변환 Integer ten = 10; // 자동박싱. 10 -> new Integer(10) 으로자동박싱 int i = ten; // 자동언박싱. ten -> ten.getintvalue(); 로자동언박싱
예제 6-3 : 박싱언박싱의예 37 다음코드에대한결과는무엇인가? public class AutoBoxingUnBoxing { public static void main(string[] args) { int i = 10; Integer intobject = i; // auto boxing System.out.println("intObject = " + intobject); i = intobject t + 10; // auto unboxing System.out.println("i = " + i); intobject = 10 i = 20
String 의생성과특징 38 String - java.lang.string g String 클래스는하나의스트링만표현 // 스트링리터럴로스트링객체생성 String str1 = "abcd"; // String 클래스의생성자를이용하여스트링생성 char data[] = {'a', 'b', 'c', 'd'; String str2 = new String(data); String str3 = new String("abcd"); // str2와 str3은모두 "abcd" 스트링 String 생성자
스트링리터럴과 new String() 39 스트링생성 단순리터럴로생성, String s = "Hello"; JVM 이리터럴관리, 응용프로그램내에서공유됨 String 객체로생성, String t = new String("Hello"); ") 힙에 String 객체생성
스트링객체의주요특징 40 스트링객체는수정불가능 == 과 equals() 두스트링을비교할때반드시 equals() 를사용하여야함 equals() 는내용을비교하기때문
41 주요메소드
문자열비교 42 int compareto(string anotherstring) 문자열이같으면 0 리턴 이문자열이 anotherstring 보다사전에먼저나오면음수리턴 이문자열이 anotherstring 보다사전에나중에나오면양수리턴 String a = "java"; String b = "jasa"; int res = acompareto(b); a.compareto(b); if(res == 0) System.out.println("the same"); else if(res < 0) System.out.println(a +"<"+b); else System.out.println(a +">"+b); java>jasa "java" 가 "jasa" 보다사전에나중에나오기때문에양수리턴 비교연산자 == 는문자열비교에는사용할수없음
문자열연결 43 + 연산자로문자열연결 + 연산의피연산자에문자열이있는경우 + 연산에객체가포함되어있는경우 객체.toString() 을호출하여객체를문자열로변환한후문자열연결 기본타입값은문자열로변환된후에연결 System.out.print("abcd" + 1 + true + 3.13e-2 + 'E'+ "fgh" ); // abcd1true0.0313efgh 출력 String concat(string str) 를이용한문자열연결 "abcd".concat("efgh"); // abcdefg 리턴 기존 String 객체에연결되지않고새로운스트링객체생성리턴 다음슬라이드에서설명
concat() 은새로운문자열을생성 44 String s1 = "abcd"; String s2 = "efgh"; s1 = s1.concat(s2); s1 abcd s1 abcdefgh s2 efgh abcd s2 efgh
문자열내의공백제거, 문자열의각문자접근 45 공백제거 String trim() 문자열앞뒤공백문자 (tab, enter, space) 제거한문자열리턴 String a = " abcd def "; String b = "\txyz\t"; String c = a.trim(); // c = "abcd def" String d = b.trim(); // d = "xyz" 문자열의문자 char charat(int index) 문자열내의문자접근 String a = "class"; char c = a.charat(2); // c = 'a' // "class" 에포함된 s 의개수를세는코드 int count = 0; String a = "class"; for(int i=0; i<a.length(); i++) { // a.length() 는 5 if(a.charat(i) == 's') count++; System.out.println(count); // 2 출력
예제 6-4 : String 클래스메소드활용 46 String 클래스의다양한메소드를활용하는예를보여라. public class StringEx { public static void main(string[] args) { String a = new String(" abcd"); String b = new String(",efg efg"); // 문자열연결 a = a.concat(b); System.out.println(a); // 공백제거 a = a.trim(); System.out.println(a); // 문자열대치 a = a.replace("ab","12"); System.out.println(a); // 문자열분리 String s[] = a.split(","); for (int i=0; i<s.length; i++) System.out.println(" 분리된 " + i + " 번문자열 : " + s[i]); // 서브스트링 a = a.substring(3); System.out.println(a); // 문자열의문자 char c = a.charat(2); System.out.println(c); abcd,efg abcd,efg 12cd,efg 분리된 0번문자열 : 12cd 분리된 1 번문자열 : efg d,efg e
47 예제실행과정
StringBuffer 클래스 48 java.lang.stringbuffer g 스트링과달리객체생성후스트링값변경가능 append와 insert 메소드를통해스트링조작 StringBuffer 객체의크기는스트링길이에따라가변적 생성자 StringBuffer sb = new StringBuffer("java");
49 주요메소드
50 StringBuffer 의메소드활용예
예제 6-5 : StringBuffer 클래스메소드활용 51 StringBuffer 클래스의메소드를이용하여문자열을조작하는예를보이자. 다음코드의실행결과는? public class StringBufferEx { public static void main(string[] args) ){ StringBuffer sb = new StringBuffer("This"); System.out.println(sb.hashCode()); sb.append(" is pencil"); // 문자열덧붙이기 System.out.println(sb); sb.insert(7, " my"); // 문자열삽입 System.out.println(sb); sb.replace(8, 10, "your"); // 문자열대치 System.out.println(sb); sb.setlength(5); // 스트링버퍼내문자열길이설정 14576877 System.out.println(sb); System.out.println(sb.hashCode()); This is pencil This is my pencil This is your pencil This 14576877
StringTokenizer 클래스 52 java.util.stringtokenizer 구분문자를기준으로문자열분리 문자열을구분할때사용되는문자를구분문자 (delimiter) 라고함 String query = "name=kitae&addr=seoul&age=21"; StringTokenizer st = new StringTokenizer(query, "&"); 위의예에서 & 가구분문자 토큰 (token) 구분문자로분리된문자열 String 클래스의 split() 메소드를이용하여동일한구현가능
생성자와주요메소드 53 생성자 주요메소드
54 StringTokenizer 객체생성과문자열분리
예제 6-6 : StringTokenizer 클래스메소드활용 55 홍길동 / 장화 / 홍련 / 콩쥐 / 팥쥐 문자열을 / 를구분문자로하여토큰을분리하여각토큰을출력하라. import java.util.stringtokenizer; public class StringTokenizerEx { public static void main(string[] args) { StringTokenizer st = new StringTokenizer(" 홍길동 / 장화 / 홍련 / 콩쥐 / 팥쥐 ", "/"); while (st.hasmoretokens()) System.out.println(st.nextToken()); 홍길동장화홍련콩쥐팥쥐
Math 클래스 56 기본적인산술연산을수행하는메소드제공 java.lang.math 모든메소드는 static으로선언 클래스이름으로바로호출가능 a e
Math 클래스를활용한난수발생 57 난수발생 static double random() 0.0 이상 1.0 미만의임의의 double 값을반환 0에서 100사이의정수난수 10개시키는샘플코드 for(int x=0; x<10; x++) { double d = Math.random()*100; // [0.0 ~ 99.9999] 실수발생 int n = (int)(math.round(d)); // d를반올림하고정수로변환. [0~100] 사이의정수 System.out.println(n); 위의코드에서 round() 메소드는 Math. round(55.3) 은 55.0 을리턴하며, Math. round(55.9) 는 56.0을리턴 java.util.random 클래스를이용하면좀더다양한형태로난수발생가능
예제 6-7 : Math 클래스메소드활용 58 Math 클래스의다양한메소드활용예를보여라. public class MathEx { public static void main(string[] args) { double a = -2.78987434; // 절대값구하기 System.out.println(Math.abs(a)); System.out.println(Math.ceil(a)); // ceil System.out.println(Math.floor(a)); // floor System.out.println(Math.sqrt(9.0)); sqrt(9 // 제곱근 System.out.println(Math.exp(1.5)); // exp System.out.println(Math.rint(3.141592)); // rint // [1,45] 사이의난수발생 System.out.print(" 이번주행운의번호는 "); for (int i=0; i<5; i++) System.out.print(Math.round(1 + Math.random() * 44) + " "); System.out.println( println(" 입니다."); 2.78987434-2.0-3.0 3.0 4.4816890703380645 3.0 이번주행운의번호는 35 42 18 31 33
Calendar 클래스 59 Calendar 클래스의특징 java.util 패키지 시간과날짜정보관리 년, 월, 일, 요일, 시간, 분, 초, 밀리초, 오전오후등 Calendar 클래스의각시간요소를설정하기나알아내기위한필드들
Calendar 객체생성및날짜와시간 60 Calendar 객체생성 Calendar now = Calendar.getInstance(); 이용 now 객체는현재날짜와시간정보를가지고생성 Calendar 는추상클래스이므로 new Calendar() 하지않음 현재날짜와시간 int year = now.get(calendar.year); // 현재년도 int month = now.get(calendar.month) + 1; // 현재달 날짜와시간설정하기 내가관리할날짜와시간을 Calendar 객체를이용하여저장 Calendar 객체에날짜와시간을설정한다고해서컴퓨터의날짜와시간을바꾸는것은아님 -> 컴퓨터의시간과날짜를바꾸는다른방법이용 // 이성친구와처음으로데이트한날짜와시간저장 Calendar firstdate = Calendar.getInstance(); firstdate.clear(); // 현재날짜와시간정보를모두지운다. firstdate.set(2012, 11, 25); // 2012 년 12 월 25 일. 12 월은 11 로설정 firstdate.set(calendar.hour_of_day, 20); // 저녁 8 시로설정 firstdate.set(calendar.minute, 30); // 30 분으로설정
61 예제 6-7 Calendar를이용하여현재날짜와시간출력및설정하기 import java.util.calendar; public class CalendarEx { public static void printcalendar(string msg, Calendar cal) { int year = cal.get(calendar.year); // get() 은 0~30까지의정수리턴. int month = cal.get(calendar.month) + 1; int day = cal.get(calendar.day_of_month); l int dayofweek = cal.get(calendar.day_of_week); int hour = cal.get(calendar.hour); int hourofday = cal.get(calendar.hour_of_day); int ampm = cal.get(calendar.am_pm); int minute = cal.get(calendar.minute); int second = cal.get(calendar.second); int millisecond = cal.get(calendar.millisecond); public static void main(string[] args) { Calendar now = Calendar.getInstance(); printcalendar(" 현재 ", now); Calendar firstdate = Calendar.getInstance(); firstdate.clear(); t // 2012년 12월 25일. 12월을표현하기위해 month에 11로설정 firstdate.set(2012, 11, 25); firstdate.set(calendar.hour_of_day, 20); // 저녁 8시 firstdate.set(calendar.minute, 30); // 30분 printcalendar(" 처음데이트한날은 ", firstdate); System.out.print(msg + year + "/" + month + "/" + day + "/"); switch(dayofweek) { case Calendar.SUNDAY : System.out.print( print(" 일요일 "); break; case Calendar.MONDAY : System.out.print(" 월요일 "); break; case Calendar.TUESDAY : System.out.print(" 화요일 "); break; case Calendar.WEDNESDAY : System.out.print(" 수요일 "); break; case Calendar.THURSDAY : System.out.print(" 목요일 "); break; case Calendar.FRIDAY: System.out.print(" 금요일 "); break; case Calendar.SATURDAY : System.out.print(" 토요일 "); break; System.out.print("(" + hourofday + " 시 )"); if(ampm == Calendar.AM) System.out.print(" 오전 "); else System.out.print(" 오후 "); System.out.println(hour +" 시 "+minute +" 분 "+second +" 초 + millisecond +" 밀리초 "); 현재 2012/12/27/ 목요일 (20 시 ) 오후 8 시 22 분 28 초 889 밀리초처음데이트한날은 2012/12/25/ 화요일 (20 시 ) 오후 8 시 30 분 0 초 0 밀리초