JAVA 중요클래스 자바에서는프로그래밍개발에필요한여러패키지를지원한다. 패키지는 c 언어의라이브러리(include) 와비슷한개념이면서패키지에대한설명은 4 장에서설명하였으니참고할것. 사용자는자바에서지원하는여러패키지를상속받아어플리케이션이나애플릿코딩시자성하며또한자신이직접만든클래스를모아패키지를정의하여쓰기도한다. 자바에서는여러패키지중가장중요하고널리사용되는 java.lang, java.util, java.io, java.net, java.awt, java.applet, javax.swing 등이있다. 여기서 java.lang은가장기본적인자바패키지로서 import 문을직접작성하지않아도알아서자동으로컴파일되는패키지이다. 자바에서제공하는주요패키지. java.lang : 자바프로그램의기본기능을제공한다. 모든자바프로그램에포함되는패키지이다. java.util : 유틸리티클래스를포함하는패키지이다. java.io : 입출력을담당하는패키지이다. 스트림형태로되어있으며 io 를처리하게된다. java.net : 네트워크기능과관련된패키지이다. java.awt : GUI 환경의프로그램을위한패키지이다. java.awt.event : awt 컴포넌트에서발생되는이벤트를설정하는패키지이다. java.applet : 웹상의애플릿프로그램을작성하기위해필요한패키지이다. javax.swing : awt(gui) 패키지보다좀더추가된기능을가진패키지이다. java.lang 패키지와 java.util 패키지의주요클래스. 객체및데이터형 : Object 클래스 ( 모든클래스의최상위클래스이다.) Wrapper 클래스 ( 기본데이터형에대한객체형이존재하는클래스이다.) 문자열 :String( 문자열클래스) StringBuffer ( 동적문자열클래스) StringTokenizer ( 문자열분석클래스) 기능형: Calendar ( 날짜시간처리클래스 / ) Random ( 난수발생으로인한랜덤값을받는클래스) 컬렉션 :Vector( 리스트처리클래스) Hashtable ( 해쉬테이블관련클래스) 1. java.lang.object 자바클래스에있어서가장상위클래스이다. 그러므로모든클래스는 Object 클래스로부터자동상속 된다 (Object 클래스의정의된변수와메소드모드다른클래스에상속됨). 이중에중요한메소드만설명 하고넘어가자. boolean equals(object obj) : 현재객체와인자 obj 의값이같은객체인지를검사한다. int hashcode() : 객체의해시코드값을계산한다. Class getclass() : 객체의클래스를반환한다. String tostring() : 수식에서객체가문자열로변경되어야할경우이메소드가자동호출된다. final void wait(), nofity() : 스레드의상태를제어한다. 스레드의대한내용은나중에설명하겠다. boolean equals(object obj) 클래스의주소를비교해서각객체의주소의내용이같은지를비교하는메소드이다.
01 class aaa { 02 String a="love"; 03 String b="lo"; 04 public static void main(string[] args) 05 { 06 aaa abc = new aaa(); 07 abc.b += "ve"; 08 09 if(abc.a == abc.b) 10 System.out.println("a와 b 는같음"); 11 else 12 System.out.println("a와 b 는같지않음"); 13 if(abc.a.equals(abc.b)) 14 System.out.println("a와 b 는같음"); 15 else 16 System.out.println("a와 b 는같지않음"); 17 } 18 } 같은 String형변수 a,b에각값을똑같이 love 를대입하였다. 근데 09행과 13 행의실행값은다르게나온다. 지금위코드의결과값은. a와 a와 b는같지않음 b는같음 왜이렇게나올까? 같은값이들어있는데도말이다. 일단 String 은클래스객체이다. 주소를가지고있는데 09행에서 abc.a == abc.d 에서 == 서로주소를비교하는것이다. 해서같은값이라고해도값을비교하는것이아닌주소를비교하게되어당연 else 문으로빠지게된다. 하지만 13행처럼 equals() 메소드를쓰게되면해당객체의주소가아닌실제값을비교한다. 실제로는 String에서 equals() 메소드를오버라이딩해서정의되어있는것이다. String tostring() 주로클래스주소의정보를타나내는데사용된다. 디버깅시편리한기능을제공한다. 하지만 Object 클래스자체는간단한클래스이름과클래스정보만은문자열로넘겨주기때문에이메서드도제대로사용하기위해서는오버라이딩이반드시필요하다. 01 class bbb{ 02 int a,b; 03 bbb(int a, int b){ 04 this.a = a; 05 this.b = b; 06 } 07 public String tostring(){ 08 Strings=" 이클래스의변수는a 의값:"+a+" 과b 의값:"+b+ 09 " 가있습니다."; 10 return s;
11 } 12 public static void main(string[] args) 13 { 14 bbb abc = new bbb(10,20); 15 System.out.println(abc); 16 } 17 } 07행에서 tostring() 메소드를오러바이딩하였다. Object 클래스는모든클래스의상위클래스로서이 메소드또한 equals() 메소드처럼따로클래스를선언하지않고메소드만오버라이딩해준다. 15 행을보면그냥객체만적어주었는데사실객체뒤에.toString() 이포함되어있다. 해서자동으로이메소드로호출이되는것이다. 08행에있는명령문이실행되는데이렇게객체주소에 대한정보를내가직접코딩해서보여줄수가있다. 그래서디버깅시유용하게쓰인다는것이다. 2. Wrapper 클래스자바에서기본데이터형과레퍼런스데이터형은구분되어진다. 작업을하다보면기본데이터형이클래스인스턴스로바꿔서작업해야하는경우가생긴다. 대표적인것이인자가객체형인자바의메서드를사용해야하는경우인데이런경우자바는 Wrapper 클래스를사용한다. Wrapper 클래스를사용하면기본형데이터형의내용이클래스화되어서여러장점이생긴다. 기본데이터형 boolean byte char short int long float double Wrapper 클래스 Boolean Byte Character Short Integer Long Float Double Wrapper 클래스생성 boolean a = true; Boolean aa = new Boolean(a); int b = 50; Integer bb = new Integer(b); 대표적인매소드 String tostring() byte bytevalue() short shortvalue() int intvalue() long longvalue() float floatvalue() double doublevalue() 가장많이사용되는메소드이다. Wrapper 클래스의내용인기본형데이터를문자여로바꾸는기능을한다. 숫자데이터를포함한 Wrapper 클래스들은해당메서드를호출하여실제데이터자바기본형데이터를얻을수있다 ( ).
01 import java.util.*; 02 public class aaa{ 03 public static void main(string[] args){ 04 boolean a=true; 05 Boolean a1 = new Boolean(a); 06 07 int b = 10; 08 Integer b1 = new Integer(b); 09 10 float c = 11.5f; 11 Float c1 = new Float(c); 12 13 System.out.println(a1.toString()); 14 System.out.println(b1.intValue()); 15 System.out.println(c1.floatValue()); 16 } 17 } 01 : util 패키지를사용하기위해서 import 를섰다. 앞으로도필요한클래스라이브러리를사용하기위 해서는해당패키지를import 해주어야한다. 4행과 5행이바로 wrapper 클래스이용방법이다. boolean 데이터 a를 05행에서 a1클래스객체로 wrapper 클래스화시킨다. 07 행,08행과 10 행,11행역시동일하며해당객체의내용을출력하기위해 13~15 행처럼사용한다. 3. System 클래스 System 클래스는실행시간환경과관련된여러속성과메소드를지원하는클래스이다. System 클래스 PrintStream 를참조하는객체변수( out ) 출력메소드 System.out.println() InputStream 을참조하는객체변수( in ) 입력메소드 System.in.read() System 클래스는 exit() 메소드, currenttimemills() 메소드, arraycopy() 메소드등을지원한다. exit() 메소드는현재실행중인프로그램을종료시키는데사용된다. void exit(int code); 여기서 code에 0 값으로지정하면정상종료라는의미를갖는다. currenttimemills() 메소드는그리니치표준시로 1970년 1월 1일 0시부터현재시각까지흐른시간을 millisecond 단위반환한다. long currenttimemillis(); arraycopy() 메소드는배열을복사하는메소드이다. void arraycopy(object a, int aindex, Object b, int bindex, int size); 배열 a의 aindex부터배열 b의 bindex로복사하며복사되는배열의크기는 size 만큼이다. 01 class java5-1{ 02 public static void main(string args[]){ 03 int array1[] = {10,20,30,40,50}; 04 int array2[] = new int[5];
05 System.arraycopy(array1,0,array2,0,4); 06 for(int i=0; i<5 ; i++){ 07 System.out.println(array1[i]); 08 System.out.println(array2[i]); 09 } 10 } 11 } 03 행: 배열array1[] 선언및초기화 04 행 : 배열 array2[] 객체생성 05 행 : arraycopy() 메소드이용하여배열 array1[] 의 0번째주소부터크기 4만큼복사하여배열 array2[] 0 부터복사된내용을붙여넣는다. 07 행,08행을출력해보면각배열마다복사되어값이같음을알수있고또한크기 4만큼만복사했기 때문에배열 arrray1의 5 번째주소값은복사되지않는것도확인할수있다. 4. DecimalFormat 클래스 java.text.decimalformat 에속하는클래스로숫자의형식을지정하는매우유용한클래스이다. DecimalFormat 클래스의생성자는숫자패턴을나타내는 String 을인자로갖는다. DecimalFormat("000") : 최초자리수 3자리를확보하고 2자리이하의숫자를출력하게되면앞이자리수가 0 으로채워진다. DecimalFormat("#,###") : 세자리마다컴마를찍어서표시한다. DecimalFormat(".00") : 소수점 3 자리에서반올림하여두자리까지만표시한다. DecimalFormat("$#,###") : 숫자앞에 $ 를붙여서표시한다. format() 메소드를이용해서인자를받아들여출력한다. 01 import java.text.decimalformat; 02 class java5_2{ 03 public static void main(string args[]){ 04 05 DecimalFormat aaa = new DecimalFormat("000"); 06 System.out.println(aaa.format(9)); 07 08 DecimalFormat bbb = new DecimalFormat("#,###"); 09 System.out.println(bbb.format(1000000)); 10 11 DecimalFormat ccc = new DecimalFormat(".00"); 12 System.out.println(ccc.format(0.346)); 13 14 DecimalFormat ddd = new DecimalFormat("*#,###"); 15 System.out.println(ddd.format(1000000)); 16 } 17 } 05,08,11,14 행 : DecimalFormat 클래스객체생성시원하는형식으로초기화 06,09,12,15 행 : 해당객체생성시원하는형식으로출력, 출력시인자값은항상 format() 메소드를이용해서받아야한다.
5. String 클래스프로그램에서문자열관련처리는상당히까다롭고중요하게여겨진다. String 클래스는그런문자열을나타내는데사용하는기본클래스중의하나이며기본자료형과변환이가능하다. 문자열조작을위한여러메소드가있으며편리하게문자열을편집하는것이가능하다. String 객체는다른객체와달리너무자주사용되어서따로들어서사용할수있다. String a = "Hello"; new 연산자를사용하지않고도객체를만 String 클래스의구조 String 클래스는프로그램에서쉽게사용되는데비해, 그구조가다소복잡하다. String 클래스의가장큰특징은 문자열상수는가상머신전체에서공유한다는점 과 클래스주소의값이바뀌지않는다 이다. 이두가지특성때문에일반적인레퍼런스와다르게동작한다. 첫번째로문자열상수를지정하는방법은위에서표기한 new 연산자를쓰지않는방법과 new 연산자를생성해서사용하는방법이다. 둘의차이는먼저 new 연산자를사용하지않았을때자바가상머신은내부문자열저장소에서동일한내용의 String형주소가존재하는지살펴보고동일한내용이존재한다면그내용을가진 String 형주소를공유해서쓰게된다. 만약같은내용이존재하지않는다면새로운 String 형주소를문자열저장소에저장하게된다. 따라서문자열상수로지정된 String 클래스주소는한번생성되면변화되지않고, 자바가상머신에저장하게되는것이다. 하지만 new 연산자를이용하여객체를생성하게된다면같은문자열의내용이있다고하여도매번새 로운클래스를생성하게된다. 이런경우만약 String 형마다비교해야할일이생긴다면 equals() 메 소드를이용해야할것이다. 두번째로 String 클래스를다루게되면클래스가동적인문자열을다루는것이아닌문자열상수를다 루게된다. 해서위해서설명한대로한번생성된 String 객체의내용을변화되지않는다. 따라서 String 형객체의내용을수정하게되면그객체의내용이바뀌는것이아니라새로운 String 형객체가생성 된다. 예를들어서 String aa = new String("HELLO"); aa.tolowercase(); //tolowercase() 메소드의역할은문자열의대문자를소문자로바꾸게해준다. aa의내용 HELLO 가 hello 로바뀔것같지만사실변화가일어나지않는다. 문자열상수로써 String형으로만들어진객체의내용을수정될수없다. 그래서바뀐내용을확이하기위해서는. String aa = new String("HELLO"); String bb = aa.tolowercase(); 이렇게 String 형객체생성후접근하는방법밖에없다. 많이쓰이는메소드 int length() : String 클래스이문자열길이를반환한다. boolean equals(object a) : 두 String 클래스객체의내용이같은지비교한다.
boolean equalsignorecase(string a) : 대소문자구분없이문자열이같은지비교하다. String substring(int a) : a 로주어진값부터문자열의마지막까지의문자열을반환해준다. String concat(string a) : 이메소드를호출한 String 클래스객체의내용과인자로주어진문자열을 합친새로운 String 클래스객체를반환함. String replace(char a, char b) : a로표시된문자들을 b 문자로바꾼다. String tolowercase() : String 클래스객체의모든문자를소문자로바꾼다. String touppercase() : String 클래스객체의모든문자를대문자로바꾼다. char charat(int a) : a 로지정된곳의문자값을반환함. 01 class java5_3{ 02 public static void main(string[] args) 03 { 04 String a = "Hello"; 05 String b = "Welcome"; 06 07 String c = a.concat(b); 08 System.out.println("concat 의결과 : " + c); 09 10 String d = a.tolowercase(); 11 System.out.println("a 변수의대문자를소문자로바꾸면 12 } 13 } : " + d); 04행과 05행각각 String 클래스객체생성. 07행의 concat은문자열의결합으로따로 String c 객체에값을넣어주었다. 10행의 tolowercase는대문자를소문자로바꾸는역할을하며이또한 String d 객체에값을주었다. 6. StringBuffer 클래스 String 클래스와달리동적문자열을처리하는기능을제공한다. String a = "Hel + "lo"; 하면 Hel 따로 lo 따로각각문자열상수로 String 객체가생성되면서 "Hello" 라는문자열상수또생기는것이다. 이런식으로문자열결합이발생할때마다수많은문자열객체가만들어지게되는것인데그럼자연스레메모리낭비를발생시키게되고속도도저하된다. 이런 String클래스의문제점을해결하기위해만들어진클래스가 StringBuffer 클래스이다. 즉 StringBuffer 클래스는문자의배열형태로기억하고있으며, 계속해서객체를만들지않고, 현재가지고있는문자열을수정하는것이가능하다. StringBuffer 클래스의메소드 StringBuffer(String a) : 문자열 a 을가지고있는생성자이다. StringBuffer append(string a) : 현재 StringBuffer에문자열 a 를덧붙인다. 인수로올수있는것은문자열뿐만이아니라다른자료형도된다. StringBuffer delete(int a, int b) : 버퍼의내용일부(a위치부터 - b 위치까지) 를삭제한다. StringBuffer deletecharat(int a) : a 위치의문자를제거한다. StringBuffer insert(int a, String b) : 문자열 b를현재버퍼의 a 위치에끼워넣는다. int length() : 버퍼에있는문자열의길이를반환함.
StringBuffer replace(int a, int b, String c) : 현재버퍼의 a위치부터 b-1 위치까지의문자열을 c문자 열로바꾼다. StringBuffer reverse() : 문자열내용을뒤집어서순서가반대가되게한다. String tostring() : 현재버퍼에있는문자열을반환한다. 7. StringTokenizer 클래스프로그램작성할때많이해야하는작업중의하나가문자열을나누는작업이다. 이때나누는단위가되는문자열을토큰이라고한다. 예를들어서 2002-12-10 날짜를문자열로나눈다면 2002,12,10 이렇게각각나뉘게되고이런문자열을구분하는토큰은 - 가되는것이다. StringTokenizer 클래스의메소드 int counttokens() : 토큰의수를반환함. boolean hasmoretokens() : 가져올토큰이아직남아있으면 true, 그렇지않다면 false 를반환한다. String nexttoken() : 다음번토큰을반환한다. 토큰은처음것부터 nexttoken() 메소드를호출할때 마다하나씩반환된다. 01 import java.util.*; 02 class java5_4{ 03 public static void main(string[] args) 04 { 05 StringTokenizer aaa = new StringTokenizer("Hello-I-am-Boy","-"); 06 System.out.println(" 나누어야할문자열의수는총 : " + 07 aaa.counttokens() +" 개"); 08 while(aaa.hasmoretokens()) 09 System.out.print(aaa.nextToken()+" "); 10 } 11 } StringBuffer 사용을위해 import java.uti.*; 패키지를이용한다. 05 행에 Hello-I-am-Boy" 라는인자값을받고토큰을구분지어야할 - 까지지정하여 StringTokenizer 객체를생성하였다. 07행에서생성된객체의나누어야할문자열의수를알기위해 counttokens() 메소드이용. 08행 while 문( 반복문) 의조건에서 hasmoretokens() 메소드를이용하여남아있는버퍼가없을때까지 09행의 nexttoken() 메소드를실행. 8. 컬렉션프로그램개발에있어서가장기본적으로갖추어져야하는부분이바로자료를다루는함수들이다. 자료를연결리스트형태로다룰것인지간단하게배열형태로다룰것인지등은프로그램의성능및개발시간과도많은관련이있다. 즉컬렉션이란객체형태의요소들을다양한방식으로저장하고나중에꺼내볼수있게해주는클래스들을말한다. 인터페이스컬렉션인터페이스는크게 Collection과 Map으로구분되고하위인터페이스는상위인터페이스에기능 이나특징이부가된것이다.
객체를저장하기위한부분으로만정의되어있다. int size() : 요소가몇개들었는지를반환함. Collection boolean add() : 요소를추가함. 제대로추가되면 true 반환 boolean remove() : 요소를삭제함. 제대로삭제되면 false 반환 void clear() : 요소전체를없앰. Set 저장되는요소들의중복을허용하지않는다. 요소를일렬로유지해서위치에의해접근한다. int indexof(object a) : 인자로주어진객체의첫번째위치를반환한다. list에서는 List 요소가중복될수있기때문에, 인자로주어진요소가여러곳에중복될수있다. int lastindexof(object a) : 인자로주어진객체의마지막위치를반환함. Object remove(int a) : a 의위치에서객체를지운다. SortedSet 저장되는요소들이자동으로정렬이이루어진다. SortedMap 키와객체를쌍으로데이터유지한다. 객체접근하기위해서는해당키를넘겨주어야객체를얻을수있다. 알고리즘각각의클래스들이나메소드들은사용하고자하는자료형태에따라서적당히사용하면되도록최대한효율적으로구성되어있으며, 하나의자료구조에서다른자료구조로변경하는것도쉽게할수있도록되어있다. 이런알고리즘은java.util.Collections 에서제공한다. int binarysearch(list list, Object key) : 주어진리스트에서해당객체의위치를찾기위해바이너리검색을이용한다. void shuffle(list ist) : 리스트의내용를마구섞는다. void sort(list list) : 리스트에들어있는객체를순서대로배열한다. Vector 클래스배열은여러데이터를쉽게하나의묶음으로처리할수있는장점이있다. 이에반해, 배열은몇가지약점이있는데, 첫째는배열의크기가일단생성된뒤에는변경될수없다는점이고, 둘째는같은종류의데이터만배열에포함될수있다는점이다. 그리고, 배열은요소에접근하는방식이인덱스를통한접근만이허용된다는점이다. 이러한약점을해결하기위해컬렉션클래스를사용하는것이다. 그러나 Vector 클래스는객체레퍼런스를저장하기때문에자바기본형데이터는저장할수없는약점을가지고있다. 생성자 Vector() 아무내용도가지고있지않는벡터를생성함. 기본공간과자동증가크기는기본값을사용한다. Vector(Collection a) 다른컬렉션 a 의내용을가져와서벡터의내용을채우는생성자. Vector(int initialcapacity) 초기공간의크기를 initialcapacity 만큼을가지도록하는생성자이다. 초기공간의크기를 initalcapacity 만큼가지며, 나중에자료를넣다 Vector(int initialcapacity, 가공간이부족하게되었을때한번에증가할크기를 int capacityincrement) capacityincrement 만큼으로지정한다. 메소드 void add(int index, Object element) index 위치에객체 element 를추가한다. boolean add(object o) 벡터자료의끝에객체 o 을추가한다. void clear() 벡터내의자료를모두삭제함. Object clone() 현재벡터와똑같은내용을가지고있는벡터를만들어서리턴한다.
boolean contains(object elem) 벡터내에 elem 객체를가지고있다면 true 를반환한다. Object elementat(int index) 벡터가가지고있는 index 위치의객체를반환한다. Object remove(int index) index 위치의객체를삭제한다. booleanremove(objecto) 객체o 와같은항목중첫번째만나는것을삭제한다. intsize() 벡터내에가지고있는항목의수를반환함. fromindex 위치부터 toindex -1 위치까지의내용을포하 List sublist(int fromindex, int toindex) 하는 List 형태의객체를만들어서반환한다. Enumeration elements() 현재내용을 Enumeration 형태로반환한다. 01 import java.util.*; 02 class java5_5{ 03 public static void main(string[] args) { 04 Vector v; 05 v = new Vector(); 06 07 for(int i=0;i<args.length; i++) 08 v.add(args[i]); 09 String s; 10 List list = v; 11 for(int j=0; j<v.size(); j++){ 12 s = (String)list.get(j); 13 System.out.println(j + " 번째 14 } 15 } 16 } " + s); 어김없이패키지 java.util을 import 시킨다. 04~05행 Vector 클래스생성. 07 : 프로그램실행시인자값을 String args 배열값으로 08 행백터에추가시킨다. 08 : 객채이기에백터에추가가가능하다. 10 : List 인터페이스에백터레퍼런스인 v 를할당함. 11 : 반복문백터의크기만큼 12 행,13행실행 12 : list.get() 메소드를이용하여백터요소를얻어냄. 일반백터로접근이아닌 list로백터요소에접근하였다. 하지만나중에는원하는클래스로캐스팅이필요하다. 해쉬테이블(Hashtable) 클래스값을저장하고꺼내올때 Vector 처럼인덱스를사용하지않고키값을사용하는방식이다. 즉저장할때각자료를키와값의쌍으로저장한후키값을이용해값을꺼내올수있도록하는클래스이다. 키(Key) 와값(Value) 으로는객체형태이면어떤것이든사용할수있다. 생성자에의해서생성된다. Hashtable aa = new Hashtable(); 메소드 Object put(object key, Object value) Object get(object key) value로주어진클래스객체를 key로주어진클래 스객체의키를이용하여해쉬테이블에저장한다. key 로주어진클래스객체의키를이용하여, 객체를검색한다.
Object remove(object key) key 로주어진클래스객체의키를이용하여, 이블에서해당객체를삭제한다. 해쉬테 01 import java.util.*; 02 03 class java5_6{ 04 public static void main(string[] args){ 05 Hashtable a = new Hashtable(); 06 07 a.put("handphone", new String("Motorola")); 08 a.put("house", new String("lovehouse")); 09 a.put("music", new String("Go")); 10 11 String n = (String)a.get("handphone"); 12 if(n!= null){ 13 System.out.println("handphone : " + n); 14 } 15 } 16 } 08 : hashtable 클래스객체생성 07~09 : 키와해당키로검색할수있는값을각각 hashtable 에저장하였다. 11 : 키값에해당하는값을찾기위해get() 메소드사용. 13 : 제대로검색되었는지확인하기위해출력한다.