명품 JAVA Essential 1 2 학습목표 1. 패키지개념이해 2. 사용자패키지만들기 3. 자바에서제공하는표준패키지 4. Object 클래스활용 5. 박싱 / 언박싱을이해하고 Wrapper 클래스활용 6. String과 StringBuffer 클래스활용 7. StringTokenizer 클래스활용 8. Math 클래스활용 1
패키지개념과필요성 3 * 3 명이분담하여자바응용프로그램을개발하는경우, 동일한이름의클래스가존재할가능성있음 -> 합칠때오류발생가능성 -> 개발자가서로다른디렉터리로코드관리하여해결 개발자가서로다른디렉터리로코드관리 4 이름은같지만경로명이달라서도다른파일로취급 2
자바패키지 5 패키지 (package) 서로관련된클래스와인터페이스를컴파일한클래스파일들을묶어놓은디렉터리 하나의응용프로그램은한개이상의패키지로작성 패키지는 jar 파일로압축할수있음 JDK 에서제공하는표준패키지는 rt.jar 에압축 클래스경로명 패키지이름과 클래스이름으로완성 클래스의이름 ( 경로명 ) java.awt.color 패키지명 자바표준패키지와클래스경로명 6 rt.jar 클래스의이름 ( 경로명 ) java.awt.color 패키지명 패키지명 : java.awt java.awt 패키지에속한클래스 3
패키지사용하기, import 문 7 다른패키지에작성된클래스사용 import를이용하지않는경우 소스에클래스이름의완전경로명사용 필요한클래스만 import 소스시작부분에클래스의경로명 import import 패키지. 클래스 소스에는클래스명만명시하면됨 패키지전체를 import 소스시작부분에패키지의경로명.* import import 패키지.* 소스에는클래스명만명시하면됨 import java.util.*; java.util 패키지내의모든클래스만을지정, 하위패키지의클래스는포함하지않음 public class ImportExample { public static void main(string[] args) { java.util.scanner scanner = new java.util.scanner(system.in); 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); 패키지만들기 8 클래스파일 (.class) 이저장되는위치는? 클래스나인터페이스가컴파일되면클래스파일 (.class) 생성클래스파일은패키지로선언된디렉터리에저장 패키지선언 소스파일의맨앞에컴파일후저장될패키지지정 package 패키지명 ; package UI; // 아래 Tools 를컴파일하여 UI 패키지 (UI 디렉토리 ) 에저장할것지시 public class Tools {... Tools 클래스의경로명은 UI.Tools 가됨 package Graphic; // 아래 Line 클래스를 Graphic 패키지에저장 import UI.Tools; // UI.Tools 클래스의경로명임포트 public class Line extends Shape { public void draw() { Tools t = new Tools(); 4
디폴트패키지 9 package 선언문이없는자바소스파일의경우 컴파일러는클래스나인터페이스를디폴트패키지에소속시킴 디폴트패키지 현재디렉터리 이클립스로쉽게패키지만들기 10 예제로사용할샘플소스 (5 장의예제 5-5) 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); lib 패키지에 class GoodCalc extends Calculator { app 패키지에 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 )); Calculator 클래스는 lib 패키지에 GoodCalc 클래스는 app 패키지에나누어저장하는응용프로그램을이클립스를이용하여만들기 5
프로젝트작성 ( 프로젝트이름 : PackageEx) 11 패키지 lib 작성 12 6
패키지 app 작성 13 패키지작성이완료된결과 패키지탐색창에 app 패키지와 lib 패키지가보인다. 14 7
lib 패키지에클래스 Calculator 만들기 Calculator 클래스를 public abstract 속성으로생성한다. 15 Calculator 소스작성후수정 주목 다른패키지, 즉 app 패키지의클래스에서접근할수있도록하기위해클래스의접근지정자 public 을반드시삽입. 16 8
app 패키지에 GoodCalc.java 작성후수정 import 문삽입. Calculator 클래스를사용하기위해서는패키지를포함하는정확한경로명을컴파일러에게알려줘야함. 17 푸시다운버튼을누르면아래메뉴가보인다. 실행을위한 Run Configurations 작성 main() 메소드를가진클래스를지정한다. 18 9
프로젝트 PackageEx 실행 19 JDK 표준자바패키지구조 : rt.jar 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 20 atomic locks 10
JDK 의주요패키지 21 java.lang 스트링, 수학함수, 입출력등자바프로그래밍에필요한기본적인클래스와인터페이스 자동으로 import 됨 - import 문필요없음 java.util 날짜, 시간, 벡터, 해시맵등과같은다양한유틸리티클래스와인터페이스제공 java.io 키보드, 모니터, 프린터, 디스크등에입출력을할수있는클래스와인터페이스제공 java.awt GUI 프로그램을작성하기위한 AWT 패키지 javax.swing GUI 프로그래밍을작성하기위한스윙패키지 Object 클래스 22 특징 모든자바클래스는반드시 Object를상속받도록자동컴파일 모든클래스의수퍼클래스 모든클래스가상속받는공통메소드포함 주요메소드 11
객체속성 23 Object 클래스는객체의속성을나타내는메소드제공 hashcode() 메소드 객체의해시코드값을리턴하며, 객체마다다름 getclass() 메소드 객체의클래스정보를담은 Class 객체리턴 Class 객체의 getname() 메소드는객체의클래스이름리턴 tostring() 메소드 객체를문자열로리턴 예제 6-1 : Object 클래스로객체속성알아내기 24 Object 클래스를이용하여객체의클래스명, 해시코드값, 객체의문자열을출력해보자. class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; public class ObjectPropertyEx { 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()); // 객체의문자열 Point 22279806 Point@153f67e 해시코드의 16 진수값. 이값은실행할때마다달라질수있음. 12
tostring() 메소드, 객체를문자열로변환 25 각클래스는 tostring() 을오버라이딩하여자신만의문자열리턴가능 객체를문자열로반환원형 public String tostring(); 컴파일러에의한 tostring() 자동변환 객체 + 문자열 -> 객체.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()); 예제 6-2 : Point 클래스에 tostring() 작성 26 Point 클래스에 Point 객체를문자열로리턴하는 tostring() 메소드를작성하라. 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 ToStringEx { public static void main(string [] args) { Point a = new Point(2,3); System.out.println(a.toString()); System.out.println(a); // a 는 a.tostring() 으로자동변환됨 Point(2,3) Point(2,3) 13
객체비교 (==) 와 equals() 메소드 27 == 연산자 객체레퍼런스비교 Point a = new Point(2,3); Point b = new Point(2,3); Point c = a; if(a == b) // false System.out.println("a==b"); if(a == c) // true System.out.println("a==c"); a==c boolean equals(object obj) 두객체의내용물비교객체의내용물을비교하기위해클래스의멤버로작성 예제 6-3 : Point 클래스의 equals() 작성 28 Point 클래스에 x, y 점좌표가같으면 true 를리턴하는 equals() 를작성하라. class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; public boolean equals(point p) { if(x == p.x && y == p.y) return true; else return false; 이 Point 객체와객체 p 가같은지비교 public class EqualsEx { public static void main(string[] args) { Point a = new Point(2,3); Point b = new Point(2,3); Point c = new Point(3,4); if(a == b) System.out.println("a==b"); if(a.equals(b)) System.out.println("a is equal to b"); if(a.equals(c)) System.out.println("a is equal to c"); a is equal to b 14
예제 6-4 : Rect 클래스와 equals() 메소드만들기연습 29 int 타입의 width( 너비 ), height( 높이 ) 필드를가지는 Rect 클래스를작성하고, 면적이같으면두 Rect 객체가같은것으로판별하는 equals() 를작성하라. class Rect { int width, height; public Rect(int width, int height) { this.width = width; this.height = height; 이사각형과객체 p의면적비교 public boolean equals(rect p) { if (width*height == p.width*p.height) return true; else return false; public class RectEx { public static void main(string[] args) { Rect a = new Rect(2,3); // 면적 6 Rect b = new Rect(3,2); // 면적 6 Rect c = new Rect(3,4); // 면적 12 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 a 와 b 는면적이같으므로 equals() 는같다고판단 Wrapper 클래스 30 Wrapper 클래스 자바의기본타입을클래스화한 8 개클래스를통칭 용도 객체만사용할수있는컬렉션등에기본타입의값을사용하기위해 -> Wrapper 객체로만들어사용 15
Wrapper 클래스의객체생성 31 Wrapper 객체로생성하는방법 Integer i = new Integer(10); Character c = new Character('c'); Boolean b = new Boolean(true); Boolean b = new Boolean("false"); Integer I = new Integer("10"); Double d = new Double("3.14"); 주요메소드 32 가장많이사용하는 Integer 클래스의주요메소드 다른 Wrapper 클래스의메소드는이와유사 16
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' 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 double d = Double.parseDouble("3.141592"); // d = 3.141592 기본타입값을문자열로변환 String s1 = Integer.toString(123); String s2 = Integer.toHexString(123); String s3 = Double.toString(3.14); String s4 = Charater.toString('a'); String s5 = Boolean.toString(true); // 정수 123을문자열 "123" 으로변환 // 정수 123을 16진수의문자열 "7b" 로변환 // 실수 3.141592를문자열 "3.141592" 로변환 // 문자 a 를문자열 "a" 로변환 // 불린값 true를문자열 "true" 로변환 예제 6-5 : Wrapper 클래스활용 34 다음은 Wrapper 클래스를활용하는예이다. 다음프로그램의결과는무엇인가? public class WrapperEx { public static void main(string[] args) { // Character 사용 System.out.println(Character.toLowerCase('A')); // 'A' 를소문자로변환 char c1='4', c2='f'; if(character.isdigit(c1)) // 문자 c1 이숫자이면 true System.out.println(c1 + " 는숫자 "); if(character.isalphabetic(c2)) // 문자 c2 가영문자이면 true System.out.println(c2 + " 는영문자 "); // Integer 사용 System.out.println(Integer.parseInt("28")); // 문자열 "28" 을 10 진수로변환 System.out.println(Integer.toString(28)); // 정수 28 을 2 진수문자열로변환 System.out.println(Integer.toBinaryString(28)); // 28 을 16 진수문자열로변환 System.out.println(Integer.bitCount(28)); // 28 에대한 2 진수의 1 의개수 Integer i = new Integer(28); System.out.println(i.doubleValue()); // 정수를 double 값으로변환. 28.0 // Double 사용 Double d = new Double(3.14); System.out.println(d.toString()); // Double 을문자열 "3.14" 로변환 System.out.println(Double.parseDouble("3.14")); // 문자열을실수 3.14 로변환 // Boolean 사용 boolean b = (4>3); // b 는 true System.out.println(Boolean.toString(b)); // true 를문자열 "true" 로변환 System.out.println(Boolean.parseBoolean("false")); // 문자열을 false 로변환 a 4 는숫자 F 는영문자 28 28 11100 3 28.0 3.14 3.14 true false 17
박싱과언박싱 35 박싱 (boxing) 기본타입의값을 Wrapper 객체로변환하는것언박싱 (unboxing) Wrapper 객체에들어있는기본타입의값을빼내는것 박싱의반대 자동박싱과자동언박싱 JDK 1.5 부터박싱과언박싱은자동으로이루어지도록컴파일됨 Integer ten = 10; int n = ten; // 자동박싱. Integer ten = new Integer(10); 과동일 // 자동언박싱. int n = ten.intvalue(); 와동일 String 의생성과특징 36 String String 클래스는문자열을나타냄 스트링리터럴 ( 문자열리터럴 ) 은 String 객체로처리됨 스트링객체의생성사례 String str1 = "abcd"; char data[] = {'a', 'b', 'c', 'd'; String str2 = new String(data); String str3 = new String("abcd"); // str2 와 str3 은모두 "abcd" 스트링 18
스트링리터럴과 new String() 37 스트링리터럴 자바가상기계내부에서리터럴테이블에저장되고관리됨응용프로그램에서공유됨 스트링리터럴사례 ) String s = "Hello"; new String() 으로생성된스트링 스트링객체는힙에생성스트링은공유되지않음 스트링객체의주요특징 38 스트링객체는수정불가능 리터럴스트링이든 new String() 을생성했든객체의문자열수정불가능 예 ) String s = new String("Hello"); String t = s.concat("java"); // s의스트링은수정불가능 // 스트링 s에 "Java" 를덧붙인스트링리턴 스트링비교 두스트링을비교할때반드시 equals() 를사용하여야함 equals() 는내용을비교하기때문 19
주요메소드 39 String 활용 40 스트링비교, int compareto(string anotherstring) 문자열이같으면 0 리턴 이문자열이 anotherstring 보다사전에먼저나오면음수리턴 이문자열이 anotherstring 보다사전에나중에나오면양수리턴 String java= "Java"; String cpp = "C++"; "java" 가 "C++" 보다사전에나중에 int res = java.compareto(cpp); 나오기때문에양수리턴 if(res == 0) System.out.println("the same"); else if(res < 0) System.out.println( java + " < " + cpp); else System.out.println( java + " > " + cpp); Java > C++ 공백제거, String trim() 키보드나파일로부터스트링을입력시, 스트링앞뒤공백이끼는경우가많다. -> trim() 을이용하면스트링앞뒤에있는공백제거 String a = " xyz\t"; String b = a.trim(); // b = "xyz". 빈칸과 '\t' 제거됨 20
예제 6-6 : String 을활용하여문자열다루기 41 public class StringEx { public static void main(string[] args) { String a = new String(" C#"); String b = new String(",C++ "); System.out.println(a + " 의길이는 " + a.length()); // 문자열의길이 ( 문자개수 ) System.out.println(a.contains("#")); // 문자열의포함관계 true 3 a = a.concat(b); // 문자열연결 System.out.println(a); a = a.trim(); // 문자열앞뒤의공백제거 System.out.println(a); a = " C#, C++ " a = "C#,C++" a = a.replace("c#","java"); // 문자열대치 System.out.println(a); a = "Java,C++" String s[] = a.split(","); // 문자열분리 s[0] = "Java" for (int i=0; i<s.length; i++) s[1] = "C++" System.out.println(" 분리된문자열 " + i + ": " + s[i]); a = a.substring(5); // 인덱스 5 부터끝까지서브스트링리턴 System.out.println(a); char c = a.charat(2); // 인덱스 2 의문자리턴 System.out.println(c); + a = "C++" C# 의길이는 3 true C#,C++ C#,C++ Java,C++ 분리된문자열 0: Java 분리된문자열 1: C++ C++ + StringBuffer 클래스 42 가변스트링을다루는클래스 StringBuffer 객체생성 StringBuffer sb = new StringBuffer("java"); String 클래스와달리문자열변경가능 가변크기의버퍼를가지고있어문자열수정가능 문자열의수정이많은작업에적합 스트링조작사례 StringBuffer sb = new StringBuffer("This"); sb.append(" is pencil."); sb.insert(7, " my"); sb.replace(8, 10, "your"); System.out.println(sb); // sb = "This is pencil." // sb = "This is my pencil." // sb = "This is your pencil." // "This is your pencil." 출력 21
StringTokenizer 클래스 43 구분문자를기준으로문자열을분리하는클래스 구분문자 (delimiter) : 문자열을구분할때사용되는문자 토큰 (token) : 구분문자로분리된문자열 예 ) 구문문자 '&' int count = st.counttokens(); String token = st.nexttoken(); 토큰개수알아내기. count = 3 다음토큰얻어내기. st = "name=kitae" StringTokenizer 로문자열분리사례 44 구문문자는 2 개 '&' 와 '=' int count = st.counttokens(); String token = st.nexttoken(); 토큰개수알아내기. count = 6 다음토큰얻어내기. st = "name" 22
예제 6-7 : StringTokenizer 를이용한문자열분리 45 "name=kitae&addr=seoul&age=21" 를 '&' 문자를기준으로분리하는코드를작성하라. import java.util.stringtokenizer; public class StringTokenizerEx { public static void main(string[] args) { String query = "name=kitae&addr=seoul&age=21"; StringTokenizer st = new StringTokenizer(query, "&"); int n = st.counttokens(); // 분리된토큰개수 System.out.println(" 토큰개수 = " + n); while(st.hasmoretokens()) { String token = st.nexttoken(); System.out.println(token); // 토큰얻기 // 토큰출력 토큰개수 = 3 name=kitae addr=seoul age=21 Math 클래스 46 기본산술연산메소드를제공하는클래스 모든메소드는 static 으로선언 클래스이름으로호출가능 Math.random() 메소드로난수발생 random() 은 0 보다크거나같고 1.0 보다작은실수난수발생 1 에서 100 까지의랜덤정수 10 개를발생시키는코드사례 for(int x=0; x<10; x++) { int n = (int)(math.random()*100 + 1); // 1~100 까지의랜덤정수발생 System.out.println(n); * java.util.random 클래스를이용하여난수발생가능 Random r = new Random(); int n = r.nextint(); // 음수, 양수, 0 포함, 자바의정수범위난수발생 int m = r.nextint(100); // 0에서 99 사이 (0과 99 포함 ) 의정수난수발생 23
예제 6-8 : Math 클래스활용 47 Math 클래스의메소드활용예를보인다. public class MathEx { public static void main(string[] args) { System.out.println(Math.abs(-3.14)); // 절댓값구하기 System.out.println(Math.sqrt(9.0)); // 9의제곱근 = 3 System.out.println(Math.exp(2)); // e 2 System.out.println(Math.round(3.14)); // 반올림 // [1, 45] 사이의정수형난수 5 개발생 System.out.print(" 이번주행운의번호는 "); for (int i=0; i<5; i++) System.out.print((int)(Math.random()*45 + 1) + " "); // 난수발생 3.14 3.0 7.38905609893065 3 이번주행운의번호는 14 44 21 36 17 24