Java 자바야놀자 클래스 String, StringBuffer, StringBuilder 자바에서문자열을사용할경우에성능을고려해야합니다. 자바에서문자열을사용 하기위해앞에서언급한 String 클래스만있는것은아닙니다. String 클래스는기본 데이

Similar documents
PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint Presentation

PowerPoint Presentation

07 자바의 다양한 클래스.key

PowerPoint Presentation

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

PowerPoint Presentation

Tcl의 문법

Microsoft PowerPoint - lec7_package [호환 모드]

JAVA PROGRAMMING 실습 02. 표준 입출력

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint 프레젠테이션

TEST BANK & SOLUTION

Microsoft PowerPoint - ch07 - 포인터 pm0415

JAVA PROGRAMMING 실습 08.다형성

Microsoft PowerPoint - 2강

PowerPoint Presentation

PowerPoint 프레젠테이션

Microsoft PowerPoint - Java7.pptx

12-file.key

gnu-lee-oop-kor-lec06-3-chap7

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

4장.문장

Microsoft Word - PJ_scjp_9_0_1-lang.doc

(Microsoft PowerPoint - CLXBUOPUGXNK.ppt [\310\243\310\257 \270\360\265\345])

chap 5: Trees

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

Design Issues

OCW_C언어 기초

Microsoft PowerPoint - 04-UDP Programming.ppt

작성자 : 김성박\(삼성 SDS 멀티캠퍼스 전임강사\)

02 C h a p t e r Java

쉽게

05-class.key

강의 개요

PowerPoint Presentation

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

PowerPoint Presentation

PowerPoint 프레젠테이션

02장.배열과 클래스

PowerPoint 프레젠테이션

Microsoft PowerPoint - C++ 5 .pptx

Java ...

JVM 메모리구조

Microsoft PowerPoint - Lect04.pptx

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

쉽게 풀어쓴 C 프로그래밍

제11장 프로세스와 쓰레드

Microsoft PowerPoint 웹 연동 기술.pptx

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

JAVA PROGRAMMING 실습 09. 예외처리

비긴쿡-자바 00앞부속

PowerPoint Presentation

자바 프로그래밍

JUNIT 실습및발표

PowerPoint Template

JAVA PROGRAMMING 실습 05. 객체의 활용

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

Microsoft PowerPoint - lec2.ppt

Microsoft PowerPoint - chap04-연산자.pptx

adfasdfasfdasfasfadf

쉽게 풀어쓴 C 프로그래밊

A Tour of Java III

Microsoft PowerPoint - additional01.ppt [호환 모드]

객체 Key Point 객체는그객체의특성을나타내는상태 (state) 와그객체의행동 (behaviors) 으로이루어진다. 좌표상의점 n 상태 : x 좌표값, y 좌표값 n 행동 : 점의이동 주사위 n 상태 : 표면값 n 행동 : 주사위굴리기 은행계좌 n 상태 : 예금주,

Microsoft PowerPoint - [2009] 02.pptx

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-1Array.ppt

11장 포인터

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

JAVA PROGRAMMING 실습 02. 표준 입출력

17장 클래스와 메소드

Microsoft Word - Crackme 15 from Simples 문제 풀이_by JohnGang.docx

쉽게 풀어쓴 C 프로그래밍

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

슬라이드 1

Microsoft PowerPoint - CSharp-10-예외처리

교육자료

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerPoint Presentation

Cluster management software

PowerPoint 프레젠테이션

슬라이드 1

Microsoft PowerPoint - e pptx

컴파일러

Java ~ Java program: main() class class» public static void main(string args[])» First.java (main class ) /* The first simple program */ public class

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Transcription:

14. 기본 API 클래스 이장에서는기본 API 클래스들에대해설명합니다. 14장의주요내용입니다. - 문자열다루기 - 정규표현식 - Object 클래스 - 날짜다루기 - 지역과시간대 - 형식화 - 수학관련클래스

Java 자바야놀자 14.1. 클래스 14.1.1. String, StringBuffer, StringBuilder 자바에서문자열을사용할경우에성능을고려해야합니다. 자바에서문자열을사용 하기위해앞에서언급한 String 클래스만있는것은아닙니다. String 클래스는기본 데이터유형처럼바로값을할당해서사용하기때문에편리하다는장점이있지만문 자열의내용이자주변경되는경우에는사용하는것을권장하지않습니다. 그이유는 String 은 immutable 클래스이기때문입니다. immutable 은문자열의내용이변경되면 기존의메모리공간에저장된데이터를수정하는것이아니고새로운문자열객체를 생성한다음새로운객체를참조함을의미합니다. 다음과같은코드를생각해볼수있습니다. concat() 은문자열을연결해주는메서드 입니다. 아래코드는 str 의내용에문자열을붙여줍니다. 그런데그림을보면문자열 의내용이변경될때힙메모리영역에새로운 String 객체가생성된다는것을알수 있습니다. String str = "abc" str = str.concat("123"); 문자열의내용이자주변경될경우에 StringBuffer 와 StringBuilder 를사용할것을권 장합니다. 다음표는 String, StringBuffer, StringBuilder 클래스를비교했습니다. API 정의 스레드공유 주요메서드 String StringBuffer StringBuilder String objects are immutable they can be shared. A thread-safe, mutable sequence of characters. A mutable sequence of characters. can be shared thread-safe can be shared concat, replace, substring append, replace, substring, insert append, replace, substring, insert 사용버전 JDK 1.0 JDK 1.0 JDK 1.5 StringBuffer 클래스는 String 클래스에서제공하지않는추가, 삭제등의기능을제공 합니다. 문자열을폭넓게사용할필요가있을때 StringBuffer 클래스를이용합니다.

Chapter 기본 API 클래스 14 클래스이름에서 buffer 는문자열을기억할메모리, 즉문자형배열 (char[]) 을의미합 니다. 문자열을추가하거나삭제하면 buffer 의크기가변한다는의미이며, 생성자에 따라버퍼의크기가달라집니다. 다음은 StringBuffer 클래스의생성자입니다. 생성자와설명 StringBuffer() buffer 의초기크기 (initial capacity) 가 16 character 크기인 string buffer 를생성합니다. StringBuffer(CharSequence seq) 인자로주어진 CharSequence 와같은문자열을갖는 string buffer 를생성합니다. StringBuffer(int capacity) buffer 의크기를지정하여 string buffer 를생성합니다. StringBuffer(String str) 주어진문자열의길이만큼초기화된 string buffer 를생성합니다. 다음은 String, StringBuffer, StringBuilder 클래스의주요메서드들입니다. String 클래스의주요메서드 메서드와설명 char int String boolean boolean boolean static String static String byte[] byte[] void int charat(int index) index 위치의문자를반환합니다. compareto(string anotherstring) 이문자열과주어진 anotherstring 문자열과알파벳순서를이용하여크기비교를합니다. concat(string str) 이문자열에주어진 str 문자열을연결합니다. contains(charsequence s) 주어진문자열을포함하는지테스트합니다. equals(object anobject) 이문자열과주어진객체와내용이같은지비교합니다. equalsignorecase(string anotherstring) 대 / 소문자를구분하지않고두문자열이같은지비교합니다. format(locale l, String format, Object... args) 주어진로케일, 포맷그리고인자들을이용하여문자열의포맷을지정합니다. format(string format, Object... args) 디폴트로케일, 포맷그리고인자들을이용하여문자열의포맷을지정합니다. getbytes() 이문자열을바이트배열로반환합니다. getbytes(string charsetname) 이문자열을주어진문자셋을갖는바이트배열로반환합니다. getchars(int srcbegin, int srcend, char[] dst, int dstbegin) 이문자열의 srcbegin 위치부터 srcend 위치까지문자열을 dst 배열의 dstbegin 위치에복사합니다. indexof(int ch)

Java 자바야놀자 int int int boolean int boolean String String String[] String String String String String 주어진문자의위치를반환합니다.. indexof(int ch, int fromindex) fromindex 위치이후부터주어진문자의위치를반환합니다. indexof(string str) 주어진문자열의위치를반환합니다. indexof(string str, int fromindex) fromindex 위치이후부터주어진문자의위치를반환합니다. isempty() length() 가 0 이면 true 를반환합니다. length() 문자열의길이를반환합니다. matches(string regex) 주어진정규표현식과일치하는지확인합니다. replace(char oldchar, char newchar) 이문자열에서주어진 oldchar 문자를새로운문자 newchar 로바꿉니다. replaceall(string regex, String replacement) 주어진정규표현식과일치하는모든문자열을 replacement 로바꿉니다. split(string regex) 주어진정규표현식으로문자열을쪼개어배열로반환합니다. substring(int beginindex) beginindex 위치이후의부분문자열을반환합니다. substring(int beginindex, int endindex) beginidex 위치부터 endindex 까지부분문자열을반환합니다. tolowercase() 소문자로변환한문자열을반환합니다. touppercase() 대문자로변환한문자열을반환합니다. trim() 문자열앞 / 뒤의공백을제거한문자열을반환합니다. StringBuffer 클래스의주요메서드 메서드와설명 StringBuffer char StringBuffer StringBuffer void int append(string str) 문자열에주어진문자열을연결합니다. charat(int index) 주어진위치문자를반환합니다. delete(int start, int end) 이문자열에서 start 위치에서 end 위치까지삭제합니다. deletecharat(int index) 주어진 index 위치문자를삭제합니다. getchars(int srcbegin, int srcend, char[] dst, int dstbegin) 이문자열의 srcbegin 위치부터 srcend 위치까지문자열을 dst 배열의 dstbegin 위치에복사합니다. indexof(string str)

Chapter 기본 API 클래스 14 StringBuffer int StringBuffer StringBuffer String String 문자열의위치를반환합니다. insert(int offset, String str) 주어진 offset 위치에주어진 str 문자열을추가합니다. length() 문자열의길이를반환합니다. replace(int start, int end, String str) start 위치부터 end 위치까지문자열을 str 문자열로바꿉니다. reverse() 이문자순서를순서의역으로바꿉니다. substring(int beginindex) beginindex 위치이후의부분문자열을반환합니다. substring(int beginindex, int endindex) beginidex 위치부터 endindex 까지부분문자열을반환합니다. StringBuilder 클래스의주요메서드들 메서드와설명 StringBuilder char StringBuilder StringBuilder void int StringBuilder int StringBuilder StringBuilder String String append(string str) 이문자열에주어진문자열을연결합니다. charat(int index) 주어진위치문자를반환합니다. delete(int start, int end) 이문자열에서 start 위치에서 end 위치까지삭제합니다. deletecharat(int index) 주어진 index 위치문자를삭제합니다. getchars(int srcbegin, int srcend, char[] dst, int dstbegin) 이문자열의 srcbegin 위치부터 srcend 위치까지문자열을 dst 배열의 dstbegin 위치에복사합니다. indexof(string str) 주어진문자열의위치를반환합니다. insert(int offset, String str) 주어진 offset 위치에주어진 str 문자열을추가합니다. length() 문자열의길이를반환합니다. replace(int start, int end, String str) start 위치부터 end 위치까지문자열을 str 문자열로바꿉니다. reverse() 이문자순서를순서의역으로바꿉니다. substring(int beginindex) beginindex 위치이후의부분문자열을반환합니다. substring(int beginindex, int endindex) beginidex 위치부터 endindex 까지부분문자열을반환합니다.

Java 자바야놀자 다음코드는위클래스들의내용을수정하기전 / 후해시코드값을출력하는예입니다. 실행결과를주의해서살펴볼필요가있습니다. StringExample.java 1: package string; 2: 3: public class StringExample { 4: public static void main(string[] args) { 5: String str = "abc"; 6: System.out.println(str.hashCode()); 7: str = str.concat("123"); 8: System.out.println(str.hashCode()); 9: 10: StringBuffer strbuf = new StringBuffer("abc"); 11: System.out.println(strBuf.hashCode()); 12: strbuf = strbuf.append("123"); // 할당문이없어도됩니다. 13: System.out.println(strBuf.hashCode()); 14: 15: StringBuilder strbld = new StringBuilder("abc"); 16: System.out.println(strBld.hashCode()); 17: strbld = strbld.append("123"); // 할당문이없어도됩니다. 18: System.out.println(strBld.hashCode()); 19: } 20: } 14.1.2. StringTokenizer java.util.stringtokeninzer는문자열을분리하기위한클래스입니다. 생성자의인자로분리하기위한문자열과구분자 (delimiters) 들을가질수있습니다. StringTokenizer 클래스는기본생성자가없으며구분자 (delimiters) 를지정하지않으면문자열을구분하는구분자는공백 ( \t\n\r\f ) 38) 입니다. 다음은 StringTokenizer 클래스의생성자입니다. 설명 StringTokenizer(String str), \t, \n, \r, \f 문자로 str 문자열을구분한객체를생성합니다. StringTokenizer(String str, String delim) 주어진 delim 문자열안의각문자로문자로 str 문자열을구분한객체를생성합니다. StringTokenizer(String str, String delim, boolean returndelims) 주어진 delim 문자열안의각문자로문자로 str 문자열을구분한객체를생성합니다. 구분자도토큰에포함하게할지 returndelims 값을지정할수있습니다. returndelims 기본값은 false 입니다. 38) space, tab, newline, carriage-return

Chapter 기본 API 클래스 14 다음은 StringTokenizer 클래스의주요메서드입니다. 메서드 int boolean boolean Object String String counttokens() 발생되기전에 nexttoken 메서드가호출될수있는횟수를계산합니다. hasmoreelements() hasmoretokens 메서드와같은값을반환합니다.. hasmoretokens() 현재토크나이저문자열로부터더이상의토큰이있는지테스트합니다. nextelement() nexttoken 메서드와같은값을반환합니다. 선언된리턴타입은 String 이아니고 Object 입니다. nexttoken() 현재토크나이저로부터다음문자열을반환합니다. nexttoken(string delim) 현재문자열에서 delim 으로구분되는다음문자열을반환합니다. 다음은 StringTokenizer 클래스를이용하여문자열을분리한예입니다. StringTokenizer.java 1: import java.util.stringtokenizer; 2: 3: public class StringTokenizerExample { 4: 5: public static void main(string[] args) { 6: 7: StringTokenizer st = new StringTokenizer("this is a test"); 8: System.out.println("*****Tokenizing by space"); 9: while (st.hasmoretokens()) { 10: System.out.println(st.nextToken()); 11: } 12: 13: String accesslog = "2017.03.11,SAT,/board?bbsno=30,USER123;GROUP1;"; 14: 15: StringTokenizer accesstokens1 = new StringTokenizer(accessLog, ","); 16: System.out.println("*****Tokenizing by,"); 17: while(accesstokens1.hasmoretokens()) { 18: System.out.println(accessTokens1.nextToken()); 19: } 20: 21: System.out.println("*****Tokenizing by,"); 22: StringTokenizer accesstokens5 = new StringTokenizer(accessLog); 23: while(accesstokens5.hasmoretokens()) { 24: System.out.println(accessTokens5.nextToken(",")); 25: } 26: 27: System.out.println("*****Tokenizing by.,;"); 28: StringTokenizer accesstokens2 = new StringTokenizer(accessLog, ".,;"); 29: while(accesstokens2.hasmoretokens()) { 30: System.out.println(accessTokens2.nextToken());

Java 자바야놀자 31: } 32: 33: System.out.println("*****Tokenizing by.,;/?"); 34: StringTokenizer accesstokens3 = new StringTokenizer(accessLog, ".,;/?"); 35: while(accesstokens3.hasmoretokens()) { 36: System.out.println(accessTokens3.nextToken()); 37: } 38: 39: System.out.println("*****Tokenizing by,( 토큰에포함 )"); 40: StringTokenizer accesstokens4 = new StringTokenizer(accessLog, ",", true); 41: while(accesstokens4.hasmoretokens()) { 42: System.out.println(accessTokens4.nextToken()); 43: } 44: } 45: 46: }

Chapter 기본 API 클래스 14 14.1.3. split() split() 메서드는 String 클래스에있는메서드입니다. split() 메서드는정규표현식을 이용하여문자열을분리할수있습니다. split() 메서드는 JDK 1.4 부터사용할수있 습니다. 다음은 split() 메서드에대한설명입니다. 메서드 String[] String[] split(string regex) 정규표현식을이용하여문자열을분리하고그결과를문자열배열로반환합니다. split(string regex, int limit) 주어진정규표현식을이용하여문자열을분리하고그결과를문자열배열로반환합니다. 결과의수를 limit 개수로제한합니다. 다음코드는 StringTokenizer 클래스와 split() 메서드를비교설명하기위한예제입니다. StringSplitExample.java 1: import java.util.stringtokenizer; 2: 3: public class StringSplitExample { 4: 5: public static void main(string[] args) { 6: String accesslog = "2017,03,11,,,USER123,GROUP1"; 7: System.out.println("*****Tokenizer"); 8: StringTokenizer accesstokens = new StringTokenizer(accessLog, ","); 9: System.out.println(" 토크수 : " + accesstokens.counttokens()); 10: while(accesstokens.hasmoretokens()) { 11: System.out.println(accessTokens.nextToken()); 12: } 13: 14: System.out.println("*****split"); 15: String[] splits = accesslog.split(","); 16: System.out.println(" 배열개수 : " + splits.length); 17: for(string str : splits) { 18: System.out.println(str); 19: } 20: 21: System.out.println("*****split"); 22: String[] splits2 = accesslog.split(",", 3); 23: System.out.println(" 배열개수 : " + splits2.length); 24: for(string str : splits2) { 25: System.out.println(str); 26: } 27: } 28: 29: }

Java 자바야놀자 StringTokenizer를이용하여문자열을분리할경우에는구분자사이에아무것도없을경우토큰이생성되지않습니다. 그러나 split() 메서드는구분자사이에아무것도없더라도 ( 널스트링 ) 을생성하기때문에같은문자열을분리하였을경우분리되는문자열의개수가다릅니다.

Chapter 기본 API 클래스 14 14.2. 표현식 String 클래스의 split() 와 replaceall() 메서드는정규표현식을이용하여문자열을처리할수있습니다. 정규표현식 (regular expression) 은특정한규칙을가진문자열을표현하는데사용하는형식언어입니다. 정규표현식은여러텍스트편집기와프로그래밍언어에서문자열을찾거나바꾸기위해지원하고있습니다. 자바언어에서도문자열을다루는여러클래스와메서드에서정규표현식을지원하고있습니다. 14.2.1. 정규표현식 표현식기본개념 정규표현식은패턴 (pattern) 또는정규식으로불리기도합니다. 정규표현식은특정 목적을위해필요한문자열집합을지정하기위해사용합니다. 다음표는정규표현식의기본개념에대한설명입니다. 수직선 ( ) 기능 또는 (or) 괄호 (()) 그룹묶기 물음표 (?) 별표 (*) 덧셈기호 (+) 0 회또는 1 회 0 회이상 1 회이상 설명 항목들중하나를선택하기위해구분합니다. 예를들면 "gray grey" 는 "gray" 또는 "grey" 와일치합니다. 연산자의범위와우선순위를지정할수있습니다. 예를들면 "gray grey" 와 "gr(a e)y" 는 "gray" 또는 "grey" 집합둘다의미하는같은패턴입니다. 0 번또는 1 번까지의발생을의미합니다. 예를들면 "colou?r" 는 "color" 와 "colour" 둘다일치시킵니다. 0 번이상발생을의미합니다. 예를들면 "ab*c" 는 "ac", "abc", "abbc", "abbbc" 등을일치시킵니다. 1 번이상의발생을의미합니다. 예를들면 "ab+c" 는 "abc", "abbc", "abbbc" 등을일치시킵니다. 그러나 "ac" 는일치시키지않습니다. {n} n 회정확히 n 번만큼일치시킵니다. {m, } m 회이상 m 번이상만큼일치시킵니다. {m, n} m회이상 n회이하 적어도 m 번만큼일치시킵니다. 그러나 n 번을초화하여일치시키지는않습니다. "a{1,3}b" 는 "ab", "aab", "aaab" 를포함하지만, "b" 나 "aaaab" 는포함하지않습니다

Java 자바야놀자 표준문법 문자들과 "[" 와 "]" 사이에포함된문자집합외부에서는 12 개문자가, 내부에서는오 직 5 개의문자 ("\", "^", "-", "[", "]") 만특수문자를의미합니다. 기능 설명. 문자한개와일치시킵니다. [ ] 문자들 여러문자들중하나의문자와일치시킵니다. [^ ] 부정 해당문자들을포함하지않는문자들을찾습니다. ^ 처음 처음시작하는부분을의미합니다. $ 끝 끝나는부분을의미합니다. ( ) 하위식 하위식을정의합니다. \w "_" 와영숫자 "_" 를포함한영문자와숫자를일치시킵니다. \W \w 반대 "_" 와영문자그리고숫자를제외한다른문자열들을일치시킵니다. \s 공백 공백문자와일치시킵니다. \S 공백제외 공백을제외한어떤것이든일치시킵니다. \d 숫자 숫자와일치시킵니다. \D 숫자제외 숫자가아닌항목을일치시킵니다. 다음코드는정규표현식의메타문자들에대한예입니다. 자바에서 \ 를문자열안에 사용하기위해서는 \\ 처럼 \ 를하나더붙여줘야합니다. RegularExpressionExample.java 1: public class RegularExpressionExample { 2: public static void main(string[] args) { 3: String str1 = "HelloWorld"; 4: if(str1.matches("helloworld")) { 5: System.out.println("HelloWorld"); 6: } 7: if(str1.matches("hello...")){ 8: System.out.println("Hello..."); 9: } 10: if(str1.matches("hel+oworld")) { 11: System.out.println("Hel+oWorld"); 12: } 13: str1 = "NiceWorld"; 14: if(str1.matches("(hello Nice)World")) {

Chapter 기본 API 클래스 14 15: System.out.println("(Hello Nice)World"); 16: } 17: if(str1.matches("\\w*")) { 18: System.out.println("_ 포함한영숫자 "); 19: } 20: if(str1.matches("\\w*")) { 21: System.out.println("_ 를포함한영숫자 "); 22: }else { 23: System.out.println("_ 를포함한영숫자가아님 "); 24: } 25: } 26: } 다음코드는문자열에서정규표현식을이용해서전화번호를마스크처리하는예입니 다. StringMaskExample.java public class StringMaskExample { public static void main(string[] args) { String custinfo = " 홍길동, 서울,010-1234-5678,30,M"; } custinfo = custinfo.replaceall("\\d{3}-\\d{4}-\\d{4}", "***-****-****"); System.out.println(custInfo); } 14.2.2. Pattern & Matcher Pattern 클래스와 Matcher 클래스를이용하면문자열에서정규표현식을이용하여원 하는형식을갖는문자열을추출할수있습니다. 두클래스모두 JDK 1.4 에추가되었 으며 java.util.regex 패키지안에정의되어있습니다. Pattern Pattern 클래스는정규표현식을컴파일한객체입니다. Pattern 클래스의 API 문 서 39) 를참고하면자바의정규표현식문자열들에대해더많은예를볼수있습니다. Pattern 클래스는 static 메서드를이용해서객체를생성합니다. 39) http://docs.oracle.com/javase/8/docs/api/

Java 자바야놀자 다음표는 Pattern 객체를생성하기위한메서드입니다. static Pattern static Pattern 메서드와설명 compile(string regex) 정규표현식을이용하여패턴으로컴파일합니다. compile(string regex, int flags) 주어진플래그값과정규표현식을이용하여패턴으로컴파일합니다. 플래그값은 CASE_INSENSITIVE, MULTILINE, DOTALL, UNICODE_CASE, CANON_EQ, UNIX_LINES, LITERAL, UNICODE_CHARACTER_CLASS 그리고 COMMENTS 등을가질수있으며비트연산자를이용하여여러개지정할수있습니다 Pattern 클래스의 matcher() 메서드를이용하여 Matcher 객체를생성할수있습니다. 리턴타입 Matcher 메서드와설명 matcher(charsequence input) 이패턴과지정한입력을매치하는정규표현엔진을만듭니다. Matcher Matcher 클래스는패턴을이용하여찾기위한클래스입니다. 다음표는 Matcher 클 래스의주요메서드들에대한설명입니다. 리턴타입 boolean boolean String 메서드와설명 find() 문자열에서다음매치하는문자열을찾습니다. find(int index) 문자열의 index 위치이후부터다음매치하는문자열을찾습니다. group() 이전 match 에서찾은문자열을반환합니다. 다음코드는 Pattern 클래스와 Matcher 클래스를이용하여문자열에서전화번호만뽑 아내는예입니다. RegexMatcherExample.java 1: import java.util.regex.matcher; 2: import java.util.regex.pattern; 3: 4: public class RegexMatcherExample { 5: 6: public static void main( String args[] ) { 7: String customerinfo = 8: " 홍길동은 30세이며서울시강남구에거주합니다. " 9: + " 그의집전화번호는 02-234-5678 이며 " 10: + " 휴대폰번호는 011-234-5678 입니다."; 11:

Chapter 기본 API 클래스 14 12: String pattern = "\\d{2,3}-\\d{3,4}-\\d{4}"; 13: 14: Pattern r = Pattern.compile(pattern); 15: 16: Matcher m = r.matcher(customerinfo); 17: int count = 0; 18: while(m.find()) { 19: count++; 20: System.out.print(" 위치 : " + m.start() + "\t"); 21: System.out.println(" 전화번호 : " + m.group()); 22: } 23: System.out.println(" 발견된전화번호수 : " + count); 24: } 25: }

Java 자바야놀자 14.3. Object Object 클래스는모든클래스의최상위클래스입니다. Object 클래스의메서드는모든 메서드가재정의할수있습니다. Object 클래스의주요메서드들의메서드선언입니다. - protected Object clone() throws CloneNotSupportedException - public int hashcode() - public boolean equals(object obj) - public String tostring() - public final void wait(long timeout) throws InterruptedException - public final void wait(long timeout, int nanos) throws InterruptedException - public final void wait() throws InterruptedException - public final void notify() - public final void notifyall() - protected void finalize() throws Throwable 14.3.1. 객체동등비교 == 연산자는두변수의값을비교하여같은값이면 true를반환합니다. 그러나비교하는변수가객체일경우에는객체의값을이용하여비교하는것이아니고객체의주소 ( 해시코드 ) 값을비교하기때문에내용이같더라도다른객체이면 false를반환합니다. 동등비교에사용하는변수가객체변수일경우 equals() 메서드를이용하여비교할수있습니다. 대부분 Java API에서제공하는클래스들은 equals() 메서드를재정의하고있으므로 equals() 메서드를사용할수있습니다. 다음코드는 String 객체를이용하여 == 연산자와 equals() 메서드차이점을보겠습 니다. StringEqualsExample.java 1: public class StringEqualsExample { 2: public static void main(string[] args) { 3: String s1 = "Hello"; 4: String s2 = "Hello"; 5: String s3 = new String("Hello"); 6: String s4 = new String("Hello"); 7: System.out.println("s1 == s2 : " + (s1 == s2));

Chapter 기본 API 클래스 14 8: System.out.println("s1 == s3 : " + (s1 == s3)); 9: System.out.println("s3 == s4 : " + (s3 == s4)); 10: System.out.println("s1.equals(s2) : " + s1.equals(s2)); 11: System.out.println("s1.equals(s3) : " + s1.equals(s3)); 12: System.out.println("s3.equals(s4) : " + s3.equals(s4)); 13: } 14: } 위코드에서 s1, s2, s3, s4 변수는모드 String 객체입니다. 그런데 s1과 s2는문자열상수를직접변수에대입시켰습니다. 그러나 s3, s4는 new 키워드를이용하여객체를생성시켰습니다. 자바는 new 키워드를이용하연항상새로운객체를생성합니다. 그러므로 s3, s4 객체는값은같지만두객체의주소는다릅니다. s3과 s4 변수의내용이같은지비교하려면 String 클래스에재정의되어있는 equals() 메서드를이용하면됩니다. 실행결과에서도보듯이 s3, s4 문자열변수의내용을비교하기위해서는 equals() 메서드를이용해야합니다. 14.3.2. equals() 와 hashcode() String 클래스에는 equals() 메서드가재정의되어있기때문에 equals() 메서드를이 용하여객체의동등비교를할수있습니다. 그러나직접클래스를정의하고객체동 등비교를하기위해서라면 equals() 메서드를재정의해야합니다. 그런데, 객체동등비교를위해재정의하는메서드가 equals() 만있는것은아닙니다. 객체동등비교를매번 equals() 메서드를이용한다면객체가가진모든속성들을모두비교해야하기때문에성능이저하될수있을것입니다. 만약에두객체의해시코드값을계산하여두객체의해시코드값이다를경우는두객체가다른객체이므로 equals() 메서드를이용해서객체동등비교를할필요가없을것입니다. 해시코드는 Object 클래스의 hashcode() 메서드를이용해반환된값을이용합니다. 그러므로사용자정의클래스에 hashcode() 메서드를재정의하고 equals() 메서드와

Java 자바야놀자 hashcode() 메서드를객체동등비교에사용합니다. hashcode() 메서드는리턴한해 시코드값이다르면두객체는다름을보장하도록구현하면됩니다. 객체동등을위해 hashcode() 메서드와 equals() 메서드를재정의하는것은어렵지 않습니다. 아이디와색상정보를갖는펜클래스를정의해예를들겠습니다. 펜클래스는아래와같이작성할수있습니다. Pen.java 1: public class Pen { 2: String id 3: String color 4: public Pen(String id, String color) { 5: this.id = id 6: this.color = color 7: } 8: // hashcode 메서드와 equals() 메서드재정의 9: } Pen 클래스의인스턴스를생성하고이를비교하는코드를작성하면다음과같습니다. PenEqualsExample.java 47: public class PenEqualsExample { 48: public static void main(string[] args) { 49: Pen p1 = new Pen("p0001", " 빨간팬 "); 50: Pen p2 = new Pen("p0001", " 빨간팬 "); 51: System.out.println("p1 == p2 : " + (p1 == p2)); 52: System.out.println("p1.equals(p2) : " + p1.equals(p2)); 53: } 54: } Pen 객체 p1, p2는아이디 (id) 와색상 (color) 이같습니다. 만일아이디와색상이같을경우두객체는같은객체임을보장하고싶습니다. 그런데실행결과에는 == 연산자와 equals() 메서드모두 false를출력하고있습니다. 이코드는아직 Pen 클래스에 equals() 메서드와 hashcode() 메서드를구현하지않았으므로실행결과는모두 false가출력됩니다. 그래서 Pen 클래스에 equals() 메서드와 hashcode() 메서드를추가합니다. 이클립스를사용한다면소스코드에서마우스오른쪽버튼을클릭한다음 Source > Generate hashcode() and equals()... 메뉴를선택하면 equals() 메서드와 hashcode() 메서드를쉽게재정의할수있습니다.

Chapter 기본 API 클래스 14 Generate hashcode() and equals() 창이뜨면객체동등비교에사용할변수들을체크한다음 [OK] 버튼만클릭해주면됩니다. 완성된 Pen 클래스는다음과같습 니다. Pen.java( ) 1: public class Pen { 2: String id; 3: String color; 4: public Pen(String id, String color) { 5: this.id = id; 6: this.color = color; 7: } 8: @Override 9: public int hashcode() { 10: final int prime = 31; 11: int result = 1; 12: result = prime * result + ((color == null)? 0 : color.hashcode()); 13: result = prime * result + ((id == null)? 0 : id.hashcode()); 14: return result; 15: } 16: @Override 17: public boolean equals(object obj) { 18: if (this == obj) 19: return true; 20: if (obj == null) 21: return false; 22: if (getclass()!= obj.getclass()) 23: return false; 24: Pen other = (Pen) obj; 25: if (color == null) { 26: if (other.color!= null)

Java 자바야놀자 27: return false; 28: } else if (!color.equals(other.color)) 29: return false; 30: if (id == null) { 31: if (other.id!= null) 32: return false; 33: } else if (!id.equals(other.id)) 34: return false; 35: return true; 36: } 37: } PenEqualsExample.java 파일을다시실행하면 equals() 메서드를이용한객체동등비교시 true가출력됩니다. 그런데 Pen 클래스 hashcode() 메서드는필요없을것같습니다. 사실위예제에서 hashcode는필요없습니다. 그런데만일같은객체는한개만저장하는것을보장하는자료구조에 Pen 객체를저장할때는어떨까요? 다음 PencaseExample 클래스에서는 HashSet 클래스를이용해 Pen 객체를저장하는 예를보여주고있습니다. HashSet 은동일객체를저장하지않도록하는자료구조클래 스중하나입니다. PencaseExample.java 1: import java.util.hashset; 2: 3: public class PencaseExample { 4: public static void main(string[] args) { 5: Pen p1 = new Pen("p0001", " "); 6: Pen p2 = new Pen("p0001", " 빨간팬 "); 7: 8: HashSet<Pen> pens = new HashSet<Pen>(); 9: System.out.println(pens.add(p1)); 10: System.out.println(pens.add(p2)); 11: for(pen pen : pens) { 12: System.out.println(pen); 13: } 14: } 15: } 위코드를실행시키면오른쪽결과처럼 add(p1) 의결과는 true 이지만 add(p2) 는 false 가출력됩니다. 이것은두객체가같은객체로판별되고그래서두번째 add 한객체는 HashSet 엘리먼트에추가가되지않음을의미합니다. 실제 pens 세트에저장되어있는엘리먼트를출력할때에도 Pen 객체가하나만출력되는것을확인할수있습니다.

Chapter 기본 API 클래스 14 그러면, Pen.java 파일의 hashcode() 메서드를주석처리하고실행해보세요. 여러줄주석처리는블록을설정한다음 Ctrl+/ 를누르면쉽게주석을생성할수있습니다. Pen 클래스에서 hashcode() 메서드를주석처리하고 PencaseExample 클래스를실행시키면 HashSet에 Pen 객체가둘다저장되는것을확인할수있습니다. HashSet 클래스의 add() 메서드는객체저장을성공하면 true, 그렇지않다면 falsue를반환합니다. 즉, 동일객체가이미 HashSet에저장되어있어같은객체가저장되지않을경우 false를반환합니다. 14.3.3. tostring() 가끔프로그램을작성하다보면객체가가진값을화면에출력해봐야할경우가있습니다. 그럴경우에 println() 메서드를사용할수있는데 println() 메서드인자가객체일경우자동으로.toString() 을붙여실행시켜줍니다. tostring() 메서드도 Object에정의되어있는메서드이며모든클래스에서재정의할수있습니다. 이클립스에서는 tostring() 메서드도자동을생성시킬수있습니다. 소스코드화면에서마우스오른쪽버튼을클릭한다음 Source > Generate tostring()... 을선택하면다음과같이 Generate tostring() 창이보입니다. 이곳에서화면에출력하고싶은필드들을선택한다음 [OK] 버튼을클릭하면 tostring() 메서드가자동으로만들어집니다.

Java 자바야놀자 다음은 Pen.java 에추가된 tostring() 메서드입니다. Pen 클래스에 tostring() 메서드를추가한다음 PencaseExample.java 파일을실행하 면다음과같이 Pen 의정보가출력됩니다.

Chapter 기본 API 클래스 14 14.4. 클래스 프로그램에서날짜와시간을다루는것은매우중요한일입니다. 자바는시스템의날 짜와시간을알수있도록 java.util 패키지에 Date 클래스와 Calendar 클래스를제공 합니다. 14.4.1. Date Date 클래스는컴퓨터의날짜정보를읽어 Date 객체로만들어줍니다. Date 클래스의생성자는현재날짜정보를 Date 객체로만들어주는 Date() 기본생성자와 1970 년 1월 1일 00:00:00 초이후의시간을밀리초단위로입력해서 Date 객체로만들어주는 Date(long date) 생성자가있습니다. Date 클래스의주요메서드는 tostring() 과 gettime() 입니다. tostring() 은현재날짜와시간정보를문자열로반환하며, gettime() 메서드는현재날짜시간을 1970년 1월 1일 0시를기준으로현재시점을밀리초값으로반환합니다. DateExample.java 1: import java.util.date; 2: 3: public class DateExample { 4: public static void main(string[] args) { 5: Date now = new Date(); 6: System.out.println(now); 7: System.out.println(now.getTime()); 8: Date after = new Date(); 9: System.out.println(after.getTime()); 10: } 11: } Date 클래스는주로객체들사이에날짜및시간정보를주고받기위해사용합니다. 현재시간정보를출력하기위해서라면 Calendar 클래스를사용할것을권합니다. 현재날짜및시간을조회할때마다 Date 객체를생성해야하기때문에날짜시간정보를반복적 / 주기적으로조회하는경우라면 Calendar 클래스가더좋습니다. 그리고 Date 클래스는 java.util 패키지에만있는것은아닙니다. java.sql 패키지에도 Date 클래스가있습니다. JDBC 프로그래밍할때에는 java.sql 패키지의 Date 클래스가사용될수있습니다.

Java 자바야놀자 14.4.2. Calendar Calendar 클래스는달력을표현한추상클래스입니다. Date 클래스처럼 new 를이용 하여직접객체를생성할수없고 getinstance() 메서드를이용하여 Locale 또는 TimeZone 에따른 Calendar 객체를얻을수있습니다. 다음은 Calendar 클래스의 getinstance() 메서드들입니다. 메서드와설명 static Calendar static Calendar static Calendar static Calendar getinstance() Gets a calendar using the default time zone and locale. getinstance(locale alocale) Gets a calendar using the default time zone and specified locale. getinstance(timezone zone) Gets a calendar using the specified time zone and default locale. getinstance(timezone zone, Locale alocale) Gets a calendar with the specified time zone and locale. 기본적으로 getinstance() 메서드를이용하면현재운영체제에설정되어있는 TimeZone( 시간대 ) 를기준으로 Calendar 객체를얻을수있습니다. Calendar 객체를얻었다면 get() 메서드와 Calendar 클래스의여러상수변수들을이용하여날짜및시간정보를얻을수있습니다. 다음코드는 Calendar 클래스를이용하여날짜및시간정보를출력하는프로그램입 니다. CalendarExample.java 1: import java.util.calendar; 2: import java.util.timezone; 3: 4: public class CalendarExample { 5: public static void main(string[] args) { 6: Calendar cal = Calendar.getInstance(); 7: System.out.print(TimeZone.getDefault().getID() + " : "); 8: System.out.print(cal.get(Calendar.YEAR) + " "); 9: System.out.print(cal.get(Calendar.MONTH)+1 + " 월 "); 10: System.out.print(cal.get(Calendar.DATE) + " 일 "); 11: System.out.print(cal.get(Calendar.AM_PM) == 0? " 오전 " : " 오후 " ); 12: System.out.print(cal.get(Calendar.HOUR) + " 시 "); 13: System.out.print(cal.get(Calendar.MINUTE) + " 분 "); 14: System.out.println(cal.get(Calendar.SECOND) + " 초 "); 15: System.out.println(cal.getTimeInMillis()); 16: 17: TimeZone timezone = TimeZone.getTimeZone("America/Los_Angeles"); 18: cal = Calendar.getInstance(timeZone);

Chapter 기본 API 클래스 14 19: System.out.print(timeZone.getID() + " : "); 20: System.out.print(cal.get(Calendar.YEAR) + " "); 21: System.out.print(cal.get(Calendar.MONTH)+1 + " 월 "); 22: System.out.print(cal.get(Calendar.DATE) + " 일 "); 23: System.out.print(cal.get(Calendar.AM_PM) == 0? " 오전 " : " 오후 " ); 24: System.out.print(cal.get(Calendar.HOUR) + " 시 "); 25: System.out.print(cal.get(Calendar.MINUTE) + " 분 "); 26: System.out.println(cal.get(Calendar.SECOND) + " 초 "); 27: System.out.println(cal.getTimeInMillis()); 28: } 29: } 연도와날짜, 시간, 분, 초는조회한값을그대로사용해도되지만월은 1 을더해줘야 합니다. Calendar.MONTH 상수를이용해월을출력하면 1 월일경우 0, 2 월일경우 1 이출력됩니다. 사용가능한시간대를알고싶다면다음 TimeZone.getAvailableIDs() 메서드를이용 하면됩니다. PrintTimeZoneIDs.java 1: import java.util.timezone; 2: 3: public class PrintTimeZoneIDs { 4: public static void main(string[] args) { 5: for(string id : TimeZone.getAvailableIDs()) { 6: System.out.println(id); 7: } 8: } 9: }

Java 자바야놀자 14.5. 시간대클래스 14.5.1. Locale Locale 객체는특정지리적, 정치적또는문화적영역을나타냅니다. 로케일이작업을 수행하는데필요한작업을로케일구분이라고하며로케일을사용하여사용자정보 를조정합니다. 다음표는 Locale 클래스의주요생성자입니다. 설명 Locale(String language) 주어진언어코드로로케일객체를생성합니다. Locale(String language, String country) 주어진언어와국가코드로로케일객체를생성합니다. 다음코드는 Locale 을지정하는예입니다. Locale 은단독으로사용되는경우는많지 않습니다. 뒤에서설명하는형식화예에서 NumberFormat 클래스등과같이사용되는 경우가많습니다. LocaleExample.java 1. import java.text.decimalformat; 2. import java.text.numberformat; 3. import java.util.locale; 4. 5. public class LocaleExample { 6. 7. static public void localizedformat(string pattern, double value, Locale loc ) { 8. NumberFormat nf = NumberFormat.getNumberInstance(loc); 9. DecimalFormat df = (DecimalFormat)nf; 10. df.applypattern(pattern); 11. String output = df.format(value); 12. System.out.println(pattern + " " + output + " " + loc.tostring()); 13. } 14. 15. public static void main(string[] args) { 16. Locale locale = new Locale("ko", "KR"); 17. System.out.println(locale.getLanguage()); 18. System.out.println(locale.getCountry()); 19. System.out.println(locale.getDisplayCountry()); 20. 21. Locale locale2 = new Locale("en", "US"); 22. System.out.println(locale2.getLanguage()); 23. System.out.println(locale2.getCountry());

Chapter 기본 API 클래스 14 24. System.out.println(locale2.getDisplayCountry()); 25. 26. System.out.println(); 27. Locale[] locales = { 28. new Locale("en", "US"), 29. new Locale("de", "DE"), 30. new Locale("fr", "FR"), 31. new Locale("ko", "KR") 32. }; 33. 34. for (int i = 0; i < locales.length; i++) { 35. localizedformat("###,###.###", 123456.789, locales[i]); 36. } 37. }//end main 38. 39.} 14.5.2. Timezone Timezone 객체는시간대오프셋을나타냅니다. 일반적으로프로그램이실행되는시간대를기반으로 TimeZone을만드는 getdefault() 메서드를사용하여 TimeZone을얻습니다. 예를들면한국에서실행되는프로그램의경우 getdefault() 메서드는한국표준시를기반으로 TimeZone 객체를만듭니다. gettimezone() 메서드는지정한시간대의 TimeZone을얻습니다. 다음표는 TimeZone 클래스객체를반환하는메서드입니다. 메서드와설명 static TimeZone static TimeZone gettimezone(string ID) 타임존 ID 문자열로타임존객체를생성합니다. gettimezone(zoneid zoneid) 주어진 ZoneId 객체타임존객체를생성합니다. 다음코드는 TimeZone 클래스를이용하여표준시간대와의오프셋을출력합니다. 그 리고디폴트타임존을이용할경우와타임존을지정할경우에출력되는날짜값이어 떻게다른지를보여주는예입니다. TimezoneExample.java 1. import java.text.dateformat; 2. import java.text.simpledateformat; 3. import java.util.calendar; 4. import java.util.date; 5. import java.util.timezone; 6.

Java 자바야놀자 7. public class TimezoneExample { 8. 9. public static void main(string[] args) { 10. Calendar calendar = Calendar.getInstance(); 11. System.out.println( (calendar.get(calendar.zone_offset) + 12. calendar.get(calendar.dst_offset)) / (60 * 1000)); 13. 14. TimeZone tz = TimeZone.getDefault(); 15. System.out.println(tz); 16. System.out.println("Timezone offset: " + tz.getid()); 17. System.out.println("Timezone name: " + tz.getdisplayname()); 18. System.out.println("Timezone ID: " + (tz.getrawoffset()/1000/60) + " 분 "); 19. System.out.println("Summer Time 사용여부 : " + tz.usedaylighttime()); 20. 21. Date date = new Date(); 22. System.out.println(date); 23. 24. DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss (z Z)"); 25. System.out.format("%s%n%s%n%n", tz.getdisplayname(), df.format(date)); 26. 27. TimeZone tz2 = TimeZone.getTimeZone("Asia/Seoul"); 28. df.settimezone(tz2); 29. System.out.format("%s%n%s%n%n", tz2.getdisplayname(), df.format(date)); 30. 31. TimeZone tz3 = TimeZone.getTimeZone("America/Los_Angeles"); 32. df.settimezone(tz3); 33. System.out.format("%s%n%s%n%n", tz3.getdisplayname(), df.format(date)); 34. } 35. 36.}

Chapter 기본 API 클래스 14 14.6. 클래스 숫자를원하는형식의문자열로출력하고싶을때사용하는것이형식화 (Format) 클래스들입니다. 형식화클래스를이용하면숫자에콤마 (,) 를표기하거나원하는자리까지출력하는일, 날짜를원하는형식의날짜로출력하는것을쉽게처리할수있습니다. 형식화클래스들은 java.text 패키지에정의되어있습니다. 대표적인형식화클래스들 로는숫자형식화를위한 DecimalFormat 과날짜형식화를위한 SimpleDateFormat 그리고문자열형식화를위한 MessageFormat 등이있습니다. 14.6.1. DecimalFormat DecimalFormat 클래스는 NumberFormat 추상클래스를구현한클래스들중하나입니다. DecimalFormat 클래스는 Western, Arabic 및 Indic 숫자에대한지원을포함하여모든지역에서숫자를구문분석하고형식을지정할수있도록설계된다양한기능이있습니다. 또한정수 (123), 고정소수점수 (123.4), 과학표기법 (1.23E4), 백분율 (12%) 및통화금액 ($123) 을비롯한여러가지종류의숫자를지원합니다. 이들모두는지역화 (Locale) 될수있습니다. DecimalFormat 클래스는숫자를보기좋게표현해주는것만아닙니다. 지역화를적용하여사용자의실수를줄일수있게도와주기도합니다. 이것은매우중요합니다. 만일여러분이독일에 123.45유로를송금해야한다고가정해봅시다. 만일평소에우리가표기하던방법으로송금액을표기 (123.450) 한다고하면여러분의통장에서 12 만3천450유로가빠져나갈것입니다. 40) DecimalFormat은숫자데이터를원하는형식으로표현하기위해패턴을지정해야합 니다. 다음표는패턴들의예를설명합니다. 위치 지역화 의미 0 숫자 가능 숫자 # 숫자 가능 숫자, 0은표시하지않습니다.. 숫자 가능 소수구분기호또는화폐소수구분기호 - 숫자 가능 음수기호, 숫자 가능 그룹화구분기호 40) 독일은소수점을, 로표기하고정수자릿수구분자를. 을이용합니다.

Java 자바야놀자 E 가능 ; % \u2030 (\u00a4) ' 서브패턴경계접두어또는접미어접두어또는접미어 접두어또는접미어 접두어또는접미어 가능 과학표기법으로가수와지수를구분합니다. 접두어또는접미사에따옴표를쓸필요가없습니다. 양수및음수하위패턴구분 가능 100 을곱하고백분율로표시하세요. 가능 1000 을곱하고퍼밀리값으로표시하세요. 불가능 불가능 통화기호, 통화기호로대체되었습니다. 두배가되면국제통화기호로바뀝니다. 패턴에있으면소수구분기호대신화폐소수구분기호가사용됩니다. 접두어와접미어에특수문자를사용할때 ' 로묶어줍니다.( 예 : 123을 "'#'#" 포맷으로표현하면 "#123") '(a single quote) 자신을사용하려면 ' 를하나더표기합니다.( 예 : "# o''clock") 다음코드는 DecimalFormat 을이용하여주어진숫자를다양한형식으로표현하는예 제입니다. DecimalFormatExample.java 1: import java.text.decimalformat; 2: import java.text.numberformat; 3: import java.util.locale; 4: 5: public class DecimalFormatExample { 6: 7: static public void customformat(string pattern, double value ) { 8: DecimalFormat myformatter = new DecimalFormat(pattern); 9: String output = myformatter.format(value); 10: System.out.println(value + "\t" + pattern + "\t" + output); 11: } 12: 13: static public void main(string[] args) { 14: customformat("###,###.###", 123456.789); 15: customformat("###.##", 123456.789); 16: customformat("000000.000", 12345.67); 17: customformat("$###,###.###", 12345.67); 18: customformat("\u00a5###,###.###", 12345.67); 19: customformat("\u20a9###,###.###", 12345.67); 20: 21: DecimalFormat deformatter = (DecimalFormat)NumberFormat.getNumberInstance(new Locale("de", "DE")); 22: deformatter.applypattern("###,###.###"); 23: String output = deformatter.format(123.450); 24: System.out.println(123.450 \t###,###.### \t" + output); 25: } 26: }

Chapter 기본 API 클래스 14 14.6.2. SimpleDateFormat SimpleDateFormat 은로케일에따라날짜형식을지정하고구문분석하는데필요한 구체적인클래스입니다. SimpleDateFormat 을이용하면날짜를텍스트로형식화하는 것, 텍스트를날짜객체로구문분석하는것, 그리고정규화를할수있습니다. 다음은날짜와시간패턴문자들에대한설명입니다. Date 또는 Time Component 표현 예 G 지정자 텍스트 AD y 연도 연도 1996; 96 Y 연도 연도 2009; 09 M 월 월 July; Jul; 07 w 연도에서주 숫자 27 W 월에서주 숫자 2 D 연도에서날짜 숫자 189 d 월에서날짜 숫자 10 F 월에서요일 숫자 2 E 주에서요일이름 텍스트 Tuesday; Tue u 주에서요일의수 (1 = Monday,..., 7 = Sunday) 숫자 1 a 오전 / 오후표시 텍스트 PM H 시간 (0-23) 숫자 0 k 시간 (1-24) 숫자 24 K 오전 / 오후시간 (0-11) 숫자 0 h 오전 / 오후시간 (1-12) 숫자 12 m 분 숫자 30 s 초 숫자 55 S 밀리초 숫자 978 z 타임존 일반타임존 Pacific Standard Time; PST; GMT-08:00 Z 타임존 RFC 822 타임존 -0800 X 타임존 ISO 8601 타임존 -08; -0800; -08:00

Java 자바야놀자 다음표는날짜와시간패턴이 kr_kr로케일과 en_us 로케일에서각각어떻게변환되 는지보여주고있습니다. 주어진날짜와시간은 Asia/Seoul 타임존에서한국표준시 2017년 3월 13일오후 10시 16분 55초입니다. 시간패턴 결과 (ko_kr 로케일 ) "yyyy.mm.dd G 'at' HH:mm:ss z" 2017.03.13 at 22:16:55 KST "EEE, MMM d, ''yy" 월, 3월 13, '17 "h:mm a" 10:16 오후 "hh 'o''clock' a, zzzz" 10 o'clock 오후, 한국표준시 "K:mm a, z" 10:16 오후, KST "yyyyy.mmmmm.dd GGG hh:mm aaa" 02017.3월.13 서기 10:16 오후 "EEE, d MMM yyyy HH:mm:ss Z" 월, 13 3월 2017 22:16:55 +0900 "yymmddhhmmssz" 170313221655+0900 "yyyy-mm-dd't'hh:mm:ss.sssz" 2017-03-13T22:16:55.266+0900 "yyyy-mm-dd't'hh:mm:ss.sssxxx" 2017-03-13T22:16:55.266+09:00 "YYYY-'W'ww-u" 2017-W11-1 날짜와시간패턴 결과 (en_us 로케일 ) "yyyy.mm.dd G 'at' HH:mm:ss z" 2017.03.13 AD at 22:16:55 KST "EEE, MMM d, ''yy" Mon, Mar 13, '17 "h:mm a" 10:16 PM "hh 'o''clock' a, zzzz" 10 o'clock PM, Korea Standard Time "K:mm a, z" 10:16 PM, KST "yyyyy.mmmmm.dd GGG hh:mm aaa" 02017.March.13 AD 10:16 PM "EEE, d MMM yyyy HH:mm:ss Z" Mon, 13 Mar 2017 22:16:55 +0900 "yymmddhhmmssz" 170313221655+0900 "yyyy-mm-dd't'hh:mm:ss.sssz" 2017-03-13T22:16:55.266+0900 "yyyy-mm-dd't'hh:mm:ss.sssxxx" 2017-03-13T22:16:55.266+09:00 "YYYY-'W'ww-u" 2017-W11-1 다음코드는날짜와시간패턴예를보여주고있습니다. 실행시날짜와시간은 Asia/Seoul 타임존에서한국표준시 2017 년 3 월 13 일오후 10 시 16 분 55 초입니다. DateFormatExample.java 1: import java.text.dateformat; 2: import java.text.simpledateformat; 3: import java.util.calendar; 4: import java.util.date; 5: import java.util.locale; 6: import java.util.timezone; 7: 8: public class DateFormatExample { 9:

Chapter 기본 API 클래스 14 10: static void displaydateandtime(string format, Locale locale, Date date) { 11: DateFormat df = new SimpleDateFormat(format, locale); 12: System.out.format("%s : %s%n", format, df.format(date)); 13: } 14: public static void main(string[] args) { 15: Date date = Calendar.getInstance().getTime(); 16: Locale kolocale = new Locale("ko", "KR"); 17: TimeZone tz = TimeZone.getTimeZone("Asia/Seoul"); 18: System.out.println(tz.getDisplayName() + " : " + date); 19: displaydateandtime("yyyy.mm.dd G 'at' HH:mm:ss z", kolocale, date); 20: displaydateandtime("eee, MMM d, ''yy", kolocale, date); 21: displaydateandtime("h:mm a", kolocale, date); 22: displaydateandtime("hh 'o''clock' a, zzzz", kolocale, date); 23: displaydateandtime("k:mm a, z", kolocale, date); 24: displaydateandtime("yyyyy.mmmmm.dd GGG hh:mm aaa", kolocale, date); 25: displaydateandtime("eee, d MMM yyyy HH:mm:ss Z", kolocale, date); 26: displaydateandtime("yymmddhhmmssz", kolocale, date); 27: displaydateandtime("yyyy-mm-dd't'hh:mm:ss.sssz", kolocale, date); 28: displaydateandtime("yyyy-mm-dd't'hh:mm:ss.sssxxx", kolocale, date); 29: displaydateandtime("yyyy-'w'ww-u", kolocale, date); 30: 31: System.out.println(); 32: Locale uslocale = new Locale("en", "US"); 33: System.out.println(tz.getDisplayName() + " : " + date); 34: displaydateandtime("yyyy.mm.dd G 'at' HH:mm:ss z", uslocale, date); 35: displaydateandtime("eee, MMM d, ''yy", uslocale, date); 36: displaydateandtime("h:mm a", uslocale, date); 37: displaydateandtime("hh 'o''clock' a, zzzz", uslocale, date); 38: displaydateandtime("k:mm a, z", uslocale, date); 39: displaydateandtime("yyyyy.mmmmm.dd GGG hh:mm aaa", uslocale, date); 40: displaydateandtime("eee, d MMM yyyy HH:mm:ss Z", uslocale, date); 41: displaydateandtime("yymmddhhmmssz", uslocale, date); 42: displaydateandtime("yyyy-mm-dd't'hh:mm:ss.sssz", uslocale, date); 43: displaydateandtime("yyyy-mm-dd't'hh:mm:ss.sssxxx", uslocale, date); 44: displaydateandtime("yyyy-'w'ww-u", uslocale, date); 45: } 46: }

Java 자바야놀자 14.6.3. MessageFormat MessageFormat 클래스는언어에중립적인방법으로문자열들이연결된메시지를생 성하는수단을제공합니다. MessageFormat 은최종사용자에게표시되는메시지를생 성할때사용합니다. MessageFormat 은객체세트를가져와서형식을지정한다음서식이지정된문자열 을적절한위치의패턴에삽입합니다. MessageFormat는다른 Format 클래스와달리, getinstance() 스타일팩토리메서드 41) 가아닌생성자중하나를사용하여 MessageFormat 객체를생성합니다. MessageFormat 자체가로케일고유의동작을구현하지않기때문에팩토리메서드가필요하지않습니다. 모든로케일특정동작은사용자가제공한패턴과삽입된인수에사용되는하위형식에의해정의됩니다. MessageFormat 은다음형식의패턴을사용합니다. MessageFormatPattern FormatElement 형식또는값 String MessageFormatPattern FormatElement String { ArgumentIndex } { ArgumentIndex, FormatType } { ArgumentIndex, FormatType, FormatStyle } FormatType number, date, time, choice 하나 FormatStyle: short, medium, long, full, integer, currency, percent, SubformatPattern 다음코드는 MessageFormat 을이용하여문자열에형식을지정하여연결된메시지를 생성하는예입니다. MessageFormatExample.java 1: import java.text.messageformat; 2: import java.util.date; 3: 4: public class MessageFormatExample { 5: public static void main(string[] args) { 6: new MessageFormatExample(); 7: } 8: 41) getinstance() 메서드를갖는대표적인클래스는 Calendar 클래스입니다. getinstance() 메서드는객체를생성하여반환하는용도입니다. 이처럼객체를생성하기위해사용하는메서드들을팩토리메서드 (Factory Method) 라부릅니다.

Chapter 기본 API 클래스 14 9: public MessageFormatExample() { 10: Object[] args = {"foo", "bar", new Long(99)}; 11: MessageFormat mf = new MessageFormat("1:{0} 2:{1} 3:{2}"); 12: System.out.println(mf.format(args)); 13: 14: int meetingtime = 10; 15: String event = " 면접심사 "; 16: 17: String result = MessageFormat.format( 18: " 오늘 ({0, date}) {1,number,integer} 시에 {2} 가있습니다.", 19: new Date(), meetingtime, event); 20: System.out.println(result); 21: } 22: } 14.6.4. ChoiceFormat ChoiceFormat을사용하면숫자범위에형식을첨부할수있습니다. 일반적으로는여러개형식을처리하기위해 MessageFormat에서사용됩니다. 선택항목은 double 유형리스트의오름차순으로지정되며, 각항목은다음항목까지의반개방 (half open) 간격을지정합니다. ChoiceFormat 는다른 Format 클래스와달리, getinstance 스타일팩토리메서드가 아닌생성자를사용하여 ChoiceFormat 객체를만듭니다. ChoiceFormat 는지정된로 케일에대해복잡한설정이필요없기때문에팩토리메서드가필요하지않습니다. ChoiceFormat 를작성할때는제한 (limit) 배열과형식 (format) 배열을지정해야합니 다. 제한배열과형식배열의길이는동일해야합니다. 다음코드는 ChoiceFormat 을이용하여메시지를선택하는예입니다. ChoiceFormatExample1.java 1: import java.text.choiceformat; 2: import java.text.parseposition; 3: 4: public class ChoiceFormatExample1 { 5:

Java 자바야놀자 6: public static void main(string[] args) { 7: double[] limits = {1,2,3,4,5,6,7}; 8: String[] dayofweeknames = {"Sun","Mon","Tue","Wed","Thur","Fri","Sat"}; 9: ChoiceFormat choiceform = new ChoiceFormat(limits, dayofweeknames); 10: ParsePosition status = new ParsePosition(0); 11: for (double i = 0.0; i <= 8.0; ++i) { 12: status.setindex(0); 13: System.out.println(i + " -> " + choiceform.format(i) + " -> " 14: + choiceform.parse(choiceform.format(i),status)); 15: } 16: } 17: } 다음코드는 MessageFormat 과 ChoiceFormat 을같이사용한예 입니다. appleform 객체를이용하여사과의개수에따른선택항목 이지정되도록했습니다. 만일사과의개수가 2 개이상일경우에는 사과의개수가출력되도록 MessageFormat 을같이사용했습니다. MessageFormat 클래스의 setformatbyargumentindex() 메서드 는 format() 메서드인자로전달되는배열의값들중 ChoiceFormat 의 limit 값으로전달 되어야할항목의인덱스를지정합니다. ChoiceFormatExample2.java 1: import java.text.choiceformat; 2: import java.text.messageformat; 3: 4: public class ChoiceFormatExample2 { 5: public static void main(string[] args) { 6: 7: MessageFormat msgform = new MessageFormat("{0} 바구니에 사과가 {1}"); 8: 9: double[] applelimits = {0,1,2}; 10: String[] applepart = {" 없습니다.","1 개있습니다.","{1,number} 개있습니다."}; 11: ChoiceFormat appleform = new ChoiceFormat(appleLimits, applepart); 12: 13: msgform.setformatbyargumentindex(1, appleform); 14: 15: System.out.println(msgForm.format(new Object[]{" 그 ", new Long(2)})); 16: System.out.println(msgForm.format(new Object[]{" 그녀 ", new Long(0)})); 17: System.out.println(msgForm.format(new Object[]{" 나 ", new Long(1)})); 18: System.out.println(msgForm.format(new Object[]{" 너 ", new Long(5)})); 19: } 20: }

Chapter 기본 API 클래스 14 14.7. 관련클래스 14.7.1. Random 난수를발생시키기위해 Math.random() 메서드를사용할수있습니다. 그러나 Random 클래스를이용하면보다쉽고직관적으로난수를발생시킬수있습니다. Random 클래스의인스턴스는난수를발생시키기위해서사용됩니다. 생성자는 seed 를지정하지않고객체를생성하는기본생성자와 long 형 seed 값을인자로갖는생성 자를가지고있습니다. 다음표는 Random 클래스의생성자입니다. 설명 Random() 난수발생객체를생성합니다. Random(long seed) 시드값을사용한난수발생객체를생성합니다. 만일두인스턴스가동일한시드 (seed) 로만들어지고각각에대해동일한순서로난 수를발생시키는메서드가호출되면두객체는동일한순서로난수시퀀스가생성되 고반환됩니다. 다음표는 Random 클래스의주요메서드들입니다. 메서드와설명 boolean void double float int int long void nextboolean() boolean 타입임의의값을반환합니다.(true 또는 false) nextbytes(byte[] bytes) 임의의바이트를생성하여주어진 bytes 배열에저장합니다. nextdouble() 0.0 부터 1.0 미만임의의값을 double 형으로생성합니다. nextfloat() 0.0 부터 1.0 미만임의의값을 float 형으로생성합니다. nextint() int 형임의의값을생성합니다. nextint(int bound) 0 부터 bound 미만의값을 int 형으로반환합니다. nextlong() long 형임의의값을생성합니다. setseed(long seed) seed 값을설정합니다.

Java 자바야놀자 다음코드는난수를발생하는예입니다. RandomClassExample.java 1: import java.util.random; 2: 3: public class RandomClassExample { 4: public static void main(string[] args) { 5: int numtests = 10; 6: 7: Random random = new Random(); 8: for ( int i=0; i<numtests; i++ ) { 9: int randomint = random.nextint(100); 10: System.out.format(" 테스트 %2d, 발생난수 %d\n", i+1, randomint ); 11: } 12: } 13: } 14.7.2. Math Math 클래스에는지수, 로그, 제곱근및삼각함수와같은기본숫자연산을수행하기 위한메서드가포함되어있습니다. Math 클래스의멤버들은모두 static 으로선언되 어있기때문에객체를생성하지않고클래스이름만으로멤버를참조할수있습니다. 다음표는 Math 클래스의주요메서드들입니다. Math 클래스는 java.lang 패키지에 정의되어있습니다. static double static double static double static double static double static double static double 메서드와설명 abs(double a) 절대값을반환합니다. float, int, long 형파라미터를갖는메서드도중복정의되어있습니다. ceil(double a) 소수점이하를올림한값을반환합니다. cos(double a) cos 값을반환합니다. a 값은라디안 (radian) 42) 값으로입력해야합니다. floor(double a) 내림한값을반환합니다. log(double a) log 값은반환합니다. log10(double a) base 가 10 인로그값을반환합니다. max(double a, double b) 두수중에서큰값을반환합니다. float, int, long 형파라미터를갖는메서드도중복정의되어있습니다.

Chapter 기본 API 클래스 14 static double static double static double static long static int static double static double min(double a, double b) 수중에서작은값을반환합니다. float, int, long 형파라미터를갖는메서드도중복정의되어있습니다. pow(double a, double b) a 의 b 승수를반환합니다. random() 0.0 이상 1.0 미만의난수를반환합니다. round(double a) 반올림합니다. round(float a) 반올림합니다. sin(double a) sin 값을반환합니다. a 값은라디안 (radian) 값으로입력해야합니다. tan(double a) tan 값을반환합니다. a 값은라디안 (radian) 값으로입력해야합니다. 다음은 Math 클래스를테스트하는예입니다. MathClassExample.java 1: public class MathClassExample { 2: public static void main(string[] args) { 3: System.out.println(Math.random()); 4: System.out.println(Math.sin(30*(Math.PI/180))); 5: System.out.println(Math.cos(60*(Math.PI/180))); 6: System.out.println(Math.tan(45*(Math.PI/180))); 7: System.out.println(Math.pow(2, 3)); 8: System.out.printf("%d %d %d %d\n", (int)-3.6, (int)-3.4, (int)3.5, (int)3.6); 9: System.out.printf("%d %d %d %d\n", Math.round(-3.6), Math.round(-3.4), Math.round(3.5), Math.round(3.6)); 10: System.out.printf("%f %f %f %f\n", Math.ceil(-3.6), Math.ceil(-3.4), Math.ceil(3.5), Math.ceil(3.6)); 11: System.out.printf("%f %f %f %f\n", Math.floor(-3.6), Math.floor(-3.4), Math.floor(3.5), Math.floor(3.6)); 12: } 13: } 42) Radian = Degree * PI/180