모듈 모듈, 패키지 Java 9 Module System Project Jigsaw Modular JDK Modular Java Source Code Modular Run-time Images Encapsulate Java Internal APIs 514770 2018 년가을학기 10/15/2018 박경신 Java Platform Module System 편하고효율적인 Java 개발환경을만들기위해서시작 Jar 기반모노리틱방식을개선하여모듈지정및모듈별버전관리기능가능 필요한모듈만구동하여크기와성능최적화가가능 임베디드환경에서필요한모듈만탑재되어적은메모리로로딩가능 모듈 module-info.java 파일안에아래 3 가지를선언하는소프트웨어적인단위 모듈 module-info.java Module name ( 모듈이름 ) 모듈이름은충돌을피하기위해패키지명명규칙과유사 Export ( 어떤것을제공하는가?) 해당모듈이다른외부모듈에서사용할수있도록공개 API로간주되는모든패키지목록을제공 만약어떤클래스가 public이라할지라도 export된패키지에없으면 module com.mycompany { // 내모듈이름 exports com.mycompany; // com.mycompany 사용할수있음 requires com.yourcompany; // com.yourcompany 사용할것임 모듈외부의어떤것도이클래스에접근불가능 Require ( 어떤것들이필요한가?) 해당모듈과의존관계가있는다른모듈목록을명시
패키지개념과필요성 디렉터리로각개발자의코드관리 ( 패키지 ) 3명이분담하여자바응용프로그램을개발하는경우, 동일한이름의클래스가존재할가능성있음 -> 합칠때오류발생 Project FileIO WebFile.class FileCopy.class FileRW.class Tools.class Graphic UI DObject.class Line.class Rect.class Circle.class 이름은같지만경로명이다르면다른파일로취급 Project/FileIO/Tools.class Project/UI/Tools.class Main.class GUI.class EventHandler.class Tools.class 자바패키지 (package) 자바패키지 (Package) 서로관련된클래스, 인터페이스들을분류하여묶어놓은것 계층구조로되어있음 클래스의이름에패키지이름도포함 다른패키지에동일한이름의클래스존재가능 자바 API( 클래스라이브러리 ) 는 JDK 패키지형태로제공됨 필요한클래스가속한패키지만 import하여사용 개발자자신의패키지생성가능 import 다른패키지에작성된클래스사용 import 를이용하지않는경우 소스내에서패키지이름과클래스이름의전체경로명을써주어야함 import 키워드이용하는경우 소스의시작부분에사용하려는패키지명시 소스에는클래스명만명시하면됨 특정클래스의경로명만포함하는경우 import java.util.scanner; 패키지내의모든클래스를포함시키는경우 import java.util.*; * 는현재패키지내의클래스만을의미하며하위패키지의클래스까지포함하지않는다. public class ImportExample { java.util.scanner scanner = new java.util.scanner(system.in); import java.util.scanner; public class ImportExample { Scanner scanner = new Scanner(System.in); import java.util.*; public class ImportExample { Scanner scanner = new Scanner(System.in);
static import 클래스안에정의된정적상수나정적메소드를사용하는경우에 static import (JDK1.5) 문장을사용하면클래스이름을생략하여도된다. classpath 클래스의위치 ( 경로 ) 지정 클래스탐색경로를지정하는방법 2 가지 - JVM 은항상현재작업디렉토리부터찾는다. 1. 시스템환경변수 CLASSPATH 에설정된디렉토리에서찾는다. import static java.lang.math.*; double r = cos(pi * theta); 2. Java 의옵션 classpath 를사용할수있다. C:\> java -classpath C:\classes;C:\lib;. library.rectangle 실행시클래스파일이존재하는패키지디렉터리정보를 -classpath 옵션에지정 CLASSPATH 지정방법 예제소스코드 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 ));
프로젝트작성 패키지 lib 작성 패키지 app 작성 패키지작성이완료된결과 패키지탐색창에 app 패키지와 lib 패키지가보인다.
클래스 Calculator 만들기 Calculator 클래스의소스수정 Calculator 클래스를 public abstract 속성으로생성한다. 다른패키지, 즉 app 패키지의클래스에서접근할수있도록하기위해클래스의접근지정자 public 을반드시삽입. 17 GoodCalc.java 작성후소스수정 실행을위한 Run Configurations 작성 import 문삽입. Calculator 클래스를사용하기위해서는패키지를포함하는정확한경로명을컴파일러에게알려줘야함. main() 메소드를가진클래스를지정한다.
프로젝트 PackageEx 실행 패키지의특징 패키지의특징 패키지계층구조 클래스나인터페이스가너무많아지면관리의어려움 관련된클래스파일을하나의패키지로계층화하여관리용이 패키지별접근제한 default로선언된클래스나멤버는동일패키지내의클래스들이자유롭게접근하도록허용 동일한이름의클래스와인터페이스의사용가능 서로다른패키지에이름이같은클래스와인터페이스존재가능 높은소프트웨어재사용성 오라클에서제공하는자바 API는패키지로구성되어있음 java.lang, java.io 등의패키지들덕분에일일이코딩하지않고입출력프로그램을간단히작성할수있음 자바 JDK 의패키지구조 JDK 패키지 자바에서는관련된클래스들을표준패키지로묶어사용자에게제공 자바에서제공하는패키지는 C 언어의표준라이브러리와유사 Java8 까지 JDK 의표준패키지는 rt.jar 에담겨있음 C:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar 주요패키지 java.lang 자바 language 패키지 스트링, 수학함수, 입출력등자바프로그래밍에필요한기본적인클래스와인터페이스 자동으로 import 됨 - import 문필요없음 java.util 자바유틸리티패키지 날짜, 시간, 벡터, 해시맵등과같은다양한유틸리티클래스와인터페이스제공 java.io 키보드, 모니터, 프린터, 디스크등에입출력을할수있는클래스와인터페이스제공 java.awt 자바 GUI 프로그래밍을위한클래스와인터페이스제공 javax.swing 자바 GUI 프로그래밍을위한스윙패키지
Object 클래스 특징 java.lang 패키지에포함 자바클래스계층구조의최상위에위치 모든클래스의수퍼클래스 주요메소드 25 Object 의메소드활용예 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 객체를문자열로변환 새로운 tostring() 만들기 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 점 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 { public static void main(string [] args) { Point a = new Point(2,3); System.out.println(a.toString()); Point(2,3) System.out.println(a); 라고해도동일
객체비교 (== 과 equals()) 객체레퍼런스의동일성비교 == 연산자이용 객체내용 ( 즉, 서로다른두객체가같은내용물인지 ) 비교 boolean equals(object obj) 이용 class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; 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 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"); 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 is equal to c"); c a b a b c x=2 y=3 x=2 y=3 Point Point x=2 y=3 x=2 y=3 x=3 y=4 a==c a is equal to b Point Point Point 예제 : Rect 클래스만들고 equals() 만들기 int 타입의 width, height 의필드를가지는 Rect 클래스를작성하고, 두 Rect 객체의 width, height 필드에의해구성되는면적이같으면두객체가같은것으로판별하도록 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 { 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 클래스 자바의기본타입을클래스화한 8 개클래스 용도 기본타입의값을사용할수없고객체만사용하는컬렉션등에기본타입의값을 Wrapper 클래스객체로만들어사용 Wrapper 객체생성 기본타입의값을인자로 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);
주요메소드 가장많이사용하는 Integer 클래스의주요메소드 Wrapper 활용 Wrapper 객체로부터기본데이터타입알아내기 Integer i = new Integer(10); Float f = new Float(3.14); int ii = i.intvalue(); // ii = 10 float ff = f.floatvalue(); // ff = 3.14 Character c = new Character('c' ); char cc = c.charvalue(); // cc = c 문자열을기본데이터타입으로변환 Boolean b = new Boolean(true); // bb = true boolean bb = b.booleanvalue(); int i = Integer.parseInt("123"); // i = 123 boolean b = Boolean.parseBoolean("true"); // b = true float f = Float.parseFloat("3.141592" ); // f = 3.141592 Wrapper 활용 기본데이터타입을문자열로변환 // 정수 123 을문자열 "123" 으로변환 String s1 = Integer.toString(123); // 정수 123 을 16 진수의문자열 "7b" 로변환 String s2 = Integer.toHexString(123); // 실수 3.141592 를문자열 "3.141592" 로변환 String s3 = Float.toString(3.141592f); // 문자 a 를문자열 "a" 로변환 String s4 = Charater.toString('a'); // 불린값 true 를문자열 "true" 로변환 String s5 = Boolean.toString(true); 예제 : Wrapper 클래스활용 다음은 Wrapper 클래스를활용하는예이다. 다음프로그램의결과는무엇인가? public class WrapperClassEx { 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)); System.out.println(Integer.toHexString(28)); System.out.println(i.doubleValue()); System.out.println(d.toString()); System.out.println(Double.parseDouble("44.13e-6")); a 4-123 16 11100 3 1c 10.0 3.1234566 4.413E-5
박싱과언박싱 박싱 (boxing) 기본타입의값을 Wrapper 객체로변환하는것 언박싱 (unboxing) Wrapper 객체에들어있는기본타입의값을빼내는것 자동박싱 / 자동언박싱 JDK 1.5부터지원 자동박싱 (Auto boxing) 기본타입의값을자동으로 Wrapper 객체로변환 자동언박싱 (Auto unboxing) Wrapper 객체를자동으로기본타입값으로변환 Integer ten = 10; // 자동박싱. 10 -> new Integer(10) 으로자동박싱 int i = ten; // 자동언박싱. ten -> ten.getintvalue(); 로자동언박싱 예제 : 박싱언박싱의예 다음코드에대한결과는무엇인가? public class AutoBoxingUnBoxing { int i = 10; Integer intobject = i; // auto boxing System.out.println("intObject = " + intobject); i = intobject + 10; // auto unboxing System.out.println("i = " + i); String 의생성과특징 String - java.lang.string 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 생성자 intobject = 10 i = 20 40
스트링리터럴과 new String() 스트링생성 단순리터럴로생성, String s = "Hello"; JVM이리터럴관리, 응용프로그램내에서공유됨 String 객체로생성, String t = new String("Hello"); 힙에 String 객체생성 스트링객체의주요특징 스트링객체는수정불가능 == 과 equals() 두스트링을비교할때반드시 equals() 를사용하여야함 equals() 는내용을비교하기때문 41 String 클래스주요메소드 문자열비교 int compareto(string anotherstring) 문자열이같으면 0 리턴 이문자열이 anotherstring 보다사전에먼저나오면음수리턴 이문자열이 anotherstring 보다사전에나중에나오면양수리턴 String a = "java"; String b = "jasa"; int res = 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" 보다사전에나중에나오기때문에양수리턴 43 java>jasa 비교연산자 == 는문자열비교에는사용할수없음
문자열연결 concat() 은새로운문자열을생성 + 연산자로문자열연결 + 연산의피연산자에문자열이있는경우 + 연산에객체가포함되어있는경우 객체.toString() 을호출하여객체를문자열로변환한후문자열연결 기본타입값은문자열로변환된후에연결 System.out.print("abcd" + 1 + true + 3.13e-2 + 'E'+ "fgh" ); // abcd1true0.0313efgh 출력 s1 s2 String s1 = "abcd"; String s2 = "efgh"; abcd efgh s1 s1 = s1.concat(s2); abcdefgh abcd String concat(string str) 를이용한문자열연결 "abcd".concat("efgh"); // abcdefg 리턴 기존 String 객체에연결되지않고새로운스트링객체생성리턴 s2 efgh 문자열내의공백제거, 문자열의각문자접근 공백제거 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"; // a.length() 는 5 for(int i=0; i<a.length(); i++) { if(a.charat(i) == 's') count++; 47 System.out.println(count); // 2 출력 예제 : String 클래스메소드활용 String 클래스의다양한메소드를활용하는예를보여라. public class StringEx { String a = new String(" abcd"); String b = new String(",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 클래스메소드활용 예제실행과정 // 문자열분리 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 StringBuffer 클래스 StringBuffer 주요메소드 java.lang.stringbuffer 스트링과달리객체생성후스트링값변경가능 append와 insert 메소드를통해스트링조작 StringBuffer 객체의크기는스트링길이에따라가변적 생성자 StringBuffer sb = new StringBuffer("java");
StringBuffer 의메소드활용예 예제 : StringBuffer 클래스메소드활용 StringBuffer 클래스의메소드를이용하여문자열을조작하는예를보이자. 다음코드의실행결과는? public class StringBufferEx { 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); // 스트링버퍼내문자열길이설정 System.out.println(sb); System.out.println(sb.hashCode()); 14576877 This is pencil This is my pencil This is your pencil This 14576877 StringTokenizer 클래스 java.util.stringtokenizer 구분문자를기준으로문자열분리 문자열을구분할때사용되는문자를구분문자 (delimiter) 라고함 StringTokenizer 주요메소드 StringTokenizer 생성자 String query = "name=kitae&addr=seoul&age=21"; StringTokenizer st = new StringTokenizer(query, "&"); 위의예에서 & 가구분문자 토큰 (token) 구분문자로분리된문자열 String 클래스의 split() 메소드를이용하여동일한구현가능 주요메소드
StringTokenizer 객체생성과문자열분리 예제 : StringTokenizer 클래스메소드활용 홍길동 / 장화 / 홍련 / 콩쥐 / 팥쥐 문자열을 / 를구분문자로하여토큰을분리하여각토큰을출력하라. import java.util.stringtokenizer; public class StringTokenizerEx { StringTokenizer st = new StringTokenizer(" 홍길동 / 장화 / 홍련 / 콩쥐 / 팥쥐 ", "/"); while (st.hasmoretokens()) System.out.println(st.nextToken()); 홍길동장화홍련콩쥐팥쥐 57 Math 클래스 기본적인산술연산을수행하는메소드제공 java.lang.math 모든메소드는 static으로선언 클래스이름으로바로호출가능 a e Math 클래스를활용한난수발생 난수발생 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] 실수발생 // d를반올림하고정수로변환. [0~100] 사이의정수 int n = (int)(math.round(d)); System.out.println(n); 위의코드에서 round() 메소드는 Math. round(55.3) 은 55.0을리턴하며, Math. round(55.9) 는 56.0을리턴 java.util.random 클래스를이용하면좀더다양한형태로난수발생가능 59
예제 : Math 클래스메소드활용 Math 클래스의다양한메소드활용예를보여라. public class MathEx { 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)); // 제곱근 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++) 2.78987434-2.0-3.0 3.0 4.4816890703380645 3.0 이번주행운의번호는 35 42 18 31 33 System.out.print(Math.round(1 + Math.random() * 44) + " "); System.out.println(" 입니다."); Calendar 클래스 Calendar 클래스의특징 java.util 패키지 시간과날짜정보관리 년, 월, 일, 요일, 시간, 분, 초, 밀리초, 오전오후등 Calendar 클래스의각시간요소를설정하기나알아내기위한필드들 Calendar 객체생성및날짜와시간 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); // 63저녁 8시로설정 firstdate.set(calendar.minute, 30); // 30분으로설정 예제 : 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); 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); System.out.print(msg + year + "/" + month + "/" + day + "/");
예제 : Calendar 를이용하여현재날짜와시간출력및설정하기 예제 : Calendar 를이용하여현재날짜와시간출력및설정하기 switch(dayofweek) { case Calendar.SUNDAY : System.out.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 +" 밀리초 "); Calendar now = Calendar.getInstance(); printcalendar(" 현재 ", now); Calendar firstdate = Calendar.getInstance(); firstdate.clear(); // 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); 현재 2012/12/27/ 목요일 (20시) 오후8시 22분 28초 889밀리초처음데이트한날은 2012/12/25/ 화요일 (20 66 시 ) 오후8시 30분 0초 0밀리초