실세계의인터페이스와인터페이스의필요성 인터페이스, 람다식, 패키지 514760-1 2016 년가을학기 10/13/2016 박경신 정해진규격 ( 인터페이스 ) 에맞기만하면연결가능. 각회사마다구현방법은다름 정해진규격 ( 인터페이스 ) 에맞지않으면연결불가 인터페이스의필요성 인터페이스를이용하여다중상속구현 자바에서클래스다중상속불가 인터페이스는명세서와같음 인터페이스만선언하고구현을분리하여, 작업자마다다양한구현을할수있음 사용자는구현의내용은모르지만, 인터페이스에선언된메소드가구현되어있기때문에호출하여사용하기만하면됨 110v 전원아울렛처럼규격에맞기만하면, 어떻게만들어졌는지알필요없이전원연결에사용하기만하면됨 사용자 인터페이스 구현 1 구현 2 자바의인터페이스 인터페이스 (interface) 모든메소드가추상메소드인클래스 인터페이스선언 interface 키워드로선언 ex) public interface SerialDriver { 인터페이스의특징 인터페이스의메소드 public abstract 타입으로생략가능 인터페이스의상수 public static final 타입으로생략가능 인터페이스의객체생성불가 인터페이스에대한레퍼런스변수는선언가능
인터페이스선언 인터페이스구성멤버 상수필드 (constant field) 추상메소드 (abstract method) 디폴트메소드 (default method) 정적메소드 (static method) 인터페이스선언 상수필드선언 인터페이스는상수필드만선언가능 데이터저장하지않음 인터페이스에선언된필드는모두 public static final 자동적으로컴파일과정에서붙음 상수명은대문자로작성 서로다른단어로구성되어있을경우에는언더바 (_) 로연결 선언과동시에초기값지정 static { 블록작성불가 - static { 으로초기화불가 interface Days { public static final int SUNDAY = 1, MONDAY = 2, TUESDAY = 3, WEDNESDAY = 4, THURSDAY = 5, FRIDAY = 6, SATURDAY = 7; 인터페이스선언 추상메소드 (abstract method) 선언 인터페이스통해호출된메소드는최종적으로객체에서실행 인터페이스의메소드는기본적으로실행블록이없는추상메소드로선언 public abstract 를생략하더라도자동적으로컴파일과정에서붙게됨 인터페이스선언 디폴트메소드 (default method) 선언 자바 8 에서추가된인터페이스의새로운멤버 인스턴스메소드와동일하게실행블록을가지고있는메소드 default 키워드를반드시붙여야함 기본적으로 public 접근제한 생략하더라도컴파일과정에서자동붙음 interface MyInterface { public void mymethod1(); default void mymethod2() { System.out.println("myMethod2()");
인터페이스선언 정적메소드 (static method) 선언 자바8에서추가된인터페이스의새로운멤버 static 키워드를반드시붙여야함 interface MyInterface { static void print(string msg) { System.out.println(msg + ": 인터페이스의정적메소드호출 "); public class StaticMethodTest { MyInterface.print("Java 8"); 인터페이스선언사례 public interface RemoteControl { int MAX_VOLUME = 10; // 상수 (constant fields) int MIN_VOLUME = 0; // 상수 (constant fields) // 추상메소드 (abstract method) void turnon(); void turnoff(); void setvolume(int volume); // 디폴트메소드 (default method) default void setmute(boolean mute) { if(mute) System.out.println(" 무음처리합니다."); else System.out.println(" 무음해제합니다."); // 정적메소드 (static method) static void changebattery() { System.out.println(" 건전지를교환합니다."); 인터페이스상속 인터페이스간에도상속가능 인터페이스를상속하여확장된인터페이스작성가능 인터페이스다중상속허용 interface MobilePhone { boolean sendcall(); boolean receivecall(); boolean sendsms(); boolean receivesms(); interface MP3 { void play(); void stop(); interface MusicPhone extends MobilePhone, MP3 { void playmp3ringtone(); public class MyPhone implements MusicPhone { public boolean sendcall() { ; public boolean receivecall() { ; public boolean sendsms() { ; public boolean receivesms() {.; public void play() {..; public void stop() {.; void playmp3ringtone() {.; 인터페이스구현 구현클래스정의 자신의객체가인터페이스타입으로사용할수있음 implements 키워드사용 여러개의인터페이스동시구현가능 상속과구현이동시에가능 추상메소드의실체메소드를작성하는방법 메소드의선언부가정확히일치해야함 인터페이스의모든추상메소드를재정의하는실체메소드를작성해야함 일부추상메소드만재정의할경우, 구현클래스는추상클래스
인터페이스구현예제 public class Television implements RemoteControl { private int volume; // 필드 //turnon() 추상메소드의구현 public void turnon() { System.out.println("TV를켭니다."); //turnoff() 추상메소드의구현 public void turnoff() { System.out.println("TV를끕니다."); //setvolume() 추상메소드의구현 public void setvolume(int volume) { if(volume>remotecontrol.max_volume) { this.volume = RemoteControl.MAX_VOLUME; else if(volume<remotecontrol.min_volume) { this.volume = RemoteControl.MIN_VOLUME; else { this.volume = volume; System.out.println(" 현재 TV 볼륨 : " + volume); public class RemoteControlExample { RemoteControl rc; rc = new Television(); rc = new Audio(); // 구현객체 // 구현객체 인터페이스구현및사용예제 public class Audio implements RemoteControl { private boolean mute; // 필드 @Override // 필요시디폴트메소드재정의 public void setmute(boolean mute) { this.mute = mute; if(mute) { System.out.println("Audio 무음처리합니다."); else { System.out.println("Audio 무음해제합니다."); public class RemoteControlExample { RemoteControl rc = null; rc = new Television(); rc.turnon(); // use abstract method rc.setmute(true); // use default method rc = new Audio(); rc.turnon(); // use abstract method rc.setmute(true); // use default method RemoteControl.changeBattery(); // use static method 인터페이스구현 익명구현객체 명시적인구현클래스작성생략하고바로구현객체를얻는방법 이름없는구현클래스선언과동시에객체생성 인터페이스의다중구현 다중인터페이스 (multi-interface) 구현클래스 구현클래스는다수의인터페이스를모두구현 객체는다수의인터페이스타입으로사용 인터페이스의추상메소드들을모두재정의하는실체메소드가있어야 추가적으로필드와메소드선언가능하나익명객체안에서만사용 인터페이스변수로접근불가 public class RemoteControlExample { RemoteControl rc = new RemoteControl() { // anonymous class public void turnon() { /* 실행문 */ public void turnoff() { /* 실행문 */ public void setvolume(int volume) { /* 실행문 */ ;
인터페이스의다중구현 interface USBMouseInterface { void mousemove(); void mouseclick(); interface RollMouseInterface { void roll(); public class MouseDriver implements RollMouseInterface, USBMouseInterface { public void mousemove() {... public void mouseclick() {... public void roll() {... // 추가적으로다른메소드를작성할수있다. int getstatus() {... int getbutton() {... 인터페이스사용 인터페이스의사용 클래스의필드 (field) 생성자또는메소드의매개변수 (parameter) 생성자또는메소드의로컬변수 (local variable) MyClass mc = new MyClass( new public class MyClass { Television() ); // field RemoteControl rc = new Television(); // constructor parameter MyClass(RemoteControl rc) { this.rc = rc; // method public method() { // local variable RemoteControl rc = new Audio(); 추상클래스와인터페이스비교 Comparable 인터페이스 Comparable 인터페이스는객체와객체의비교할때사용 public interface Comparable { // 이객체가다른객체보다크면 1, 같으면 0, 작으면 -1 을반환한다. int compareto(object other); public Object findlargest(object object1, Object object2) { Comparable obj1 = (Comparable)object1; Comparable obj2 = (Comparable)object2; if ((obj1).compareto(obj2) > 0) return object1; else return object2;
Ex : Comparable 인터페이스 Ex : Comparable 인터페이스 public class Rectangle implements Comparable { public int width = 0; public int height = 0; @Override public String tostring() { return "Rectangle [width=" + width + ", height=" + height + "]"; public Rectangle(int w, int h) { width = w; height = h; System.out.println(this); public int getarea() { return width * height; @Override public int compareto(object other) { Rectangle otherrect = (Rectangle) other; if (this.getarea() < otherrect.getarea()) return -1; else if (this.getarea() > otherrect.getarea()) return 1; else return 0; public class RectangleTest { Rectangle r1 = new Rectangle(100, 30); Rectangle r2 = new Rectangle(200, 10); int result = r1.compareto(r2); if (result == 1) System.out.println(r1 + " 가더큽니다."); else if (result == 0) System.out.println(" 같습니다 "); else System.out.println(r2 + " 가더큽니다."); ActionListener 인터페이스 ActionListener 인터페이스는액션이벤트가발생할때사용 public interface ActionListener { // 액션이벤트가발생할때호출된다. void actionperformed(actionevent other); Ex : ActionListener 인터페이스 class MyClass implements ActionListener { public void actionperformed(actionevent event) { System.out.println("beep"); public class CallbackTest { ActionListener listener = new MyClass(); Timer t = new Timer(1000, listener); t.start(); for (int i = 0; i < 1000; i++) { try { Thread.sleep(1000); catch (InterruptedException e) { beep beep beep // 1 초에한번씩 beep 출력
람다식 람다식 (lambda expression) 은나중에실행될목적으로다른곳에전달될수있는코드블록이다. 람다식을이용하면메소드가필요한곳에간단히메소드를보낼수있다. 람다식의구문 람다식은 (argument) -> (body) 구문을사용하여작성 람다식의예 () -> System.out.println("Hello World"); (String s) -> { System.out.println(s); () -> 69 () -> { return 3.141592; ; Ex : 람다식사용 import javax.swing.timer; public class CallbackTest { Timer t = new Timer(1000, event -> System.out.println("beep")); t.start(); for (int i = 0; i < 1000; i++) { try { Thread.sleep(1000); catch (InterruptedException e) { beep beep beep // 1초에한번씩 beep 출력 함수인터페이스와람다식 함수인터페이스는하나의추상메서드만선언된인터페이스, 예 : java.lang.runnable 람다식은함수인터페이스에대입할수있다. Runnable r = () -> System.out.println(" 스레드가실행되고있습니다.");
Ex : 함수인터페이스 패키지개념과필요성 @FunctionalInterface interface MyInterface { void sayhello(); 3명이분담하여자바응용프로그램을개발하는경우, 동일한이름의클래스가존재할가능성있음 -> 합칠때오류발생 public class LambdaTest1 { MyInterface hello = () -> System.out.println("Hello Lambda!"); hello.sayhello(); Hello Lambda! 디렉터리로각개발자의코드관리 ( 패키지 ) 자바의패키지 (package) Project FileIO Graphic WebFile.class FileCopy.class FileRW.class Tools.class DObject.class Line.class Rect.class Circle.class 이름은같지만경로명이다르면다른파일로취급 Project/FileIO/Tools.class Project/UI/Tools.class 패키지란 서로관련된클래스와인터페이스의컴파일된클래스파일들을하나의디렉터리에묶어놓은것 하나의응용프로그램은여러개의패키지로작성가능 하나의패키지로만들고모든클래스파일을넣어둘수도있음 패키지는 jar 파일로압축할수있음 예 ) JDK에서제공하는표준패키지는 rt.jar에압축 UI Main.class GUI.class EventHandler.class Tools.class
JDK 에서제공되는패키지 패키지사용하기, import 문 패키지명 : java.awt 클래스의이름 ( 경로명 ) java.awt.color 패키지명 java.awt 패키지에속한클래스 다른패키지에작성된클래스사용 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); 정적 import 문장 클래스경로 클래스안에정의된정적상수나정적메소드를사용하는경우에정적 import 문장을사용하면클래스이름을생략하여도된다. 클래스의위치 ( 경로 ) 지정 클래스탐색경로를지정하는방법 JVM은항상현재작업디렉토리부터찾는다. 시스템환경변수 CLASSPATH에설정된디렉토리에서찾는다. import static java.lang.math.*; double r = cos(pi * theta); java 의옵션 classpath 를사용할수있다. C:\> java -classpath C:\classes;C:\lib;. library.rectangle 실행시클래스파일이존재하는패키지디렉터리정보를 -classpath 옵션에지정
이클립스에서쉽게패키지만들기 프로젝트작성 ( 프로젝트이름 : PackageEx) 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 작성
패키지작성이완료된결과 클래스 Calculator 만들기 패키지탐색창에 app 패키지와 lib 패키지가보인다. Calculator 클래스를 public abstract 속성으로생성한다. 42 Calculator 소스수정 GoodCalc.java 작성후소스수정 import 문삽입. 다른패키지, 즉 app 패키지의클래스에서접근할수있도록하기위해클래스의접근지정자 public 을반드시삽입. Calculator 클래스를사용하기위해서는패키지를포함하는정확한경로명을컴파일러에게알려줘야함.
푸시다운버튼을누르면아래메뉴가보인다. 실행을위한 Run Configurations 작성 프로젝트 PackageEx 실행 main() 메소드를가진클래스를지정한다. 패키지의특징 자바 JDK 의패키지구조 패키지의특징 패키지계층구조 클래스나인터페이스가너무많아지면관리의어려움 관련된클래스파일을하나의패키지로계층화하여관리용이 패키지별접근제한 default로선언된클래스나멤버는동일패키지내의클래스들이자유롭게접근하도록허용 동일한이름의클래스와인터페이스의사용가능 서로다른패키지에이름이같은클래스와인터페이스존재가능 높은소프트웨어재사용성 오라클에서제공하는자바 API는패키지로구성되어있음 java.lang, java.io 등의패키지들덕분에일일이코딩하지않고입출력프로그램을간단히작성할수있음 JDK 패키지 자바에서는관련된클래스들을표준패키지로묶어사용자에게제공 자바에서제공하는패키지는 C언어의표준라이브러리와유사 JDK의표준패키지는 rt.jar에담겨있음 C:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar rt.jar 의 java.awt 패키지에컴파일된클래스들이들어있다.
자바패키지구조 java applet awt beans io lang math net nio rmi security sql text util beancontext spi JAR 압축파일 JAR 파일은여러개의클래스파일을디렉토리계층구조를유지한채로압축하여서가지고있을수있다. color datatransfer dnd event font geom im image print channels charset spi renderable spi spi annotation instrument management ref reflect Jar 파일을생성하는방법 activation dgc registry server acl cert spec interfaces atomic concurrent jar logging prefs regex spi zip locks c> jar cvf Game.jar *.class icon.png 주요패키지 java.lang 자바 language 패키지 스트링, 수학함수, 입출력등자바프로그래밍에필요한기본적인클래스와인터페이스 자동으로 import 됨 - import 문필요없음 java.util 자바유틸리티패키지 날짜, 시간, 벡터, 해시맵등과같은다양한유틸리티클래스와인터페이스제공 java.io 키보드, 모니터, 프린터, 디스크등에입출력을할수있는클래스와인터페이스제공 java.awt 자바 GUI 프로그래밍을위한클래스와인터페이스제공 javax.swing 자바 GUI 프로그래밍을위한스윙패키지 자바 API 참조 자바 API 의상세정보 Oracle Technology Network(http://docs.oracle.com/javase/8/docs/api/) 에서온라인제공
Object 클래스 특징 java.lang 패키지에포함 자바클래스계층구조의최상위에위치 모든클래스의수퍼클래스 주요메소드 Wrapper 클래스 자바의기본타입을클래스화한 8 개클래스 용도 기본타입의값을사용할수없고객체만사용하는컬렉션등에기본타입의값을 Wrapper 클래스객체로만들어사용 53 Wrapper 객체생성 기본타입의값을인자로 Wrapper 클래스생성자호출 Integer i = new Integer(10); Character c = new Character( c ); Float f = new Float(3.14); Boolean b = new Boolean(true); 데이터값을나타내는문자열을생성자인자로사용 주요메소드 가장많이사용하는 Integer 클래스의주요메소드 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);
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); Ex : 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(); 로자동언박싱 Ex : 박싱언박싱의예 다음코드에대한결과는무엇인가? 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); intobject = 10 i = 20 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" 스트링 스트링리터럴과 new String() 스트링생성 단순리터럴로생성, String s = "Hello"; JVM이리터럴관리, 응용프로그램내에서공유됨 String 객체로생성, String t = new String("Hello"); 힙에 String 객체생성 String 생성자 63 64
스트링객체의주요특징 String 클래스주요메소드 스트링객체는수정불가능 == 과 equals() 두스트링을비교할때반드시 equals() 를사용하여야함 equals() 는내용을비교하기때문 66 문자열비교 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 "java" 가 "jasa" 보다사전에나중에나오기때문에양수리턴 비교연산자 == 는문자열비교에는사용할수없음 문자열연결 + 연산자로문자열연결 + 연산의피연산자에문자열이있는경우 + 연산에객체가포함되어있는경우 객체.toString() 을호출하여객체를문자열로변환한후문자열연결 기본타입값은문자열로변환된후에연결 System.out.print("abcd" + 1 + true + 3.13e-2 + 'E'+ "fgh" ); // abcd1true0.0313efgh 출력 String concat(string str) 를이용한문자열연결 "abcd".concat("efgh"); // abcdefg 리턴 기존 String 객체에연결되지않고새로운스트링객체생성리턴
concat() 은새로운문자열을생성 문자열내의공백제거, 문자열의각문자접근 s1 s2 String s1 = "abcd"; String s2 = "efgh"; abcd efgh s1 s2 s1 = s1.concat(s2); abcdefgh abcd 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++; 70 System.out.println(count); // 2 출력 Ex : String 클래스메소드활용 Ex : 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 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
73 예제실행과정 StringBuffer 클래스 java.lang.stringbuffer 스트링과달리객체생성후스트링값변경가능 append 와 insert 메소드를통해스트링조작 StringBuffer 객체의크기는스트링길이에따라가변적 생성자 StringBuffer sb = new StringBuffer("java"); 주요메소드 StringBuffer 의메소드활용예
Ex : 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) 라고함 String query = "name=kitae&addr=seoul&age=21"; StringTokenizer st = new StringTokenizer(query, "&"); 위의예에서 & 가구분문자 토큰 (token) 구분문자로분리된문자열 String 클래스의 split() 메소드를이용하여동일한구현가능 StringTokenizer 주요메소드 StringTokenizer 객체생성과문자열분리 StringTokenizer 생성자 주요메소드 80
Ex : StringTokenizer 클래스메소드활용 Math 클래스 홍길동 / 장화 / 홍련 / 콩쥐 / 팥쥐 문자열을 / 를구분문자로하여토큰을분리하여각토큰을출력하라. import java.util.stringtokenizer; public class StringTokenizerEx { StringTokenizer st = new StringTokenizer(" 홍길동 / 장화 / 홍련 / 콩쥐 / 팥쥐 ", "/"); while (st.hasmoretokens()) System.out.println(st.nextToken()); 홍길동장화홍련콩쥐팥쥐 기본적인산술연산을수행하는메소드제공 java.lang.math 모든메소드는 static으로선언 클래스이름으로바로호출가능 a e 82 Math 클래스를활용한난수발생 Ex : 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 클래스를이용하면좀더다양한형태로난수발생가능 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); // 86저녁 8시로설정 firstdate.set(calendar.minute, 30); // 30분으로설정 Ex : Calendar 를이용하여현재날짜와시간출력및설정하기 Ex : 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 + "/"); 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 +" 밀리초 ");
Ex : Calendar 를이용하여현재날짜와시간출력및설정하기 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 89 시 ) 오후8시 30분 0초 0밀리초