520 likes | 721 Views
JAVA ADVANCED java.lang package. IT 아카데미. java.lang package. class Object. 자바 모든 클래스의 최상위 클래스 extends java.lang.Object 주요 메서드 boolean equals(Object obj); String toString(); protected Object clone(); Class getClass(); void notify(); void notifyAll(); void wait();. class String.
E N D
JAVA ADVANCEDjava.lang package IT 아카데미
class Object • 자바 모든 클래스의 최상위 클래스 • extends java.lang.Object • 주요 메서드 • boolean equals(Object obj); • String toString(); • protected Object clone(); • Class getClass(); • void notify(); • void notifyAll(); • void wait();
class String • 문자열을 나타내고 처리하는 메서드를 구현한 클래스 • 한번 생성된 문자열은 절대 변하지 않음 • new를 사용한 객체 vs “” 를사용한 객체 • + 연산 : 문자열 결합 • 문자 + 문자 • 문자 + 숫자 • 숫자 + 문자 • 문자 + 객체 • 객체 + 문자
class StringBuffer • 변하는문자열을 다룰 때 사용 (cf. String) • 저장하고 있는 문자열의 내용을 변경 가능 • append method • insert method • replace method • setLength method
String/StringBuffer • String 클래스는 • 불변성(immutablity) 특성으로 인해 항상 읽기전용 상태를 유지합니다. • 어떠한 메소드 호출에도 원본 문자열이 변경되는 경우는 없습니다. • String 클래스에서“문자열의 대소문자 변환”등의 문자열 변경을 위한 메소드는 원래의 문자열의 내용이 변경되는 것이 아니라 원본은 원본대로 있고, 새로운 String 객체(복사본)을 생성하면서 그 내용을 원본과 다르게 바꾸는 것입니다.
String/StringBuffer • 반면, StringBuffer클래스에서는 String클래스와는 달리 불변성(immutability)이 없습니다. • 즉, StringBuffer클래스의 메소드를 사용하면 자신의 문자열 데이터를 변경시킬 수 있습니다. • 문자열 처리가 많은 자바 프로그램을 작성할 때 부하를 최소화 하기 위해서 String 클래스 보다 StringBuffer클래스의 사용을 권장하는 것도 이러한 이유에서 입니다. • 그러나, String 클래스를 사용함으로써 얻어지는 장점도 무시할 수 없으므로 어떤 것이 일방적으로 좋다고 말할 수는 없습니다. 일종의 이율배반(tradeoff)의 관계 입니다.
String 클래스 • 예를들어, 두 개의 문자열 str1, str2를 str3이라는 하나의 문자열로 연결하는 concat() 메소드의 경우 다음과 같은 형식으로 사용됩니다.
String 클래스 • 실행 결과 • str1과 str2에 아무런 변경도 가하지 않습니다. • 단, str1과 str2을 연결한 문자열을 가지는 새로운 객체가 생성되며 이를 str3이 가리키도록 합니다. • 자바 언어에서 일단 한번 String 객체가 생성되면 이 객체의 내용은 어떠한 경우에도 변하지 않습니다. • Note : • concat(), replace() 와 같이 문자열에 대한 변경을 가할 것 같아 보이는 String 클래스의 메소드라 할지라도 원본 문자열은 변하지 않습니다. 다만 변경된 값을 갖는 새로운 문자열 객체를 생성하고 이를 반환하는 것 뿐입니다.
String 클래스 • new 키워드 없이 String s = "abc"; 와 같이 표현하면 무조건 새로운 객체를 생성하는 것은 아니고, 이미 존재하는 String 객체 중에서 내용이 동일한 것이 있는지 찾아봅니다. • 동일한 내용의 String 객체가 이미 존재한다면 객체를 새로 생성하지 않고, 이미 존재하는 객체의 주소만 참조 변수에 할당받아서 그 String 객체를 공유합니다. • new 키워드를 사용하게 되면 같은 내용의 문자열을 포함하는 String 객체의 존재여부와 관계없이 새로운 객체를 생성합니다.
String 클래스 • 따라서, 다음과 같은 str3, str4, str5의 3개 문자열을 선언하였다고 하면, • .
String 클래스 • 또한, 자바 프로그래밍 언어에서는 ‘+’ 연산자에 대해서 문자열의 접합(concatenation)기능을 하도록 오버로딩(overloading)되어 있습니다. • C++이나 여타의 언어처럼 사용자에게 직접 연산자 오버로딩의 기회를 제공하지는 않고, 특이한 경우로 '+' 연산자에 대해서만 미리 오버로딩 해 놓았습니다.
String 클래스 • 위의 프로그램 코드가 실행되었을 때 메모리 상의 객체 및 참조변수들은 다음과 같은 상태를 가집니다.
String 클래스 • "str3과 str4가 내용이 같은데 참조변수 str3과 str4가 왜 같은 객체를 가리키지 않는가?“ 라고 의문을 제기할 수 있습니다. 자바 프로그래밍 언어에서는 ‘+’ 연산자를 오버로딩할 때 new 키워드를 사용하여 두 문자열을 결합한 형태의 새로운 문자열을 생성하도록 하였기 때문에 str4가 str3의 객체를 공유하는 것이 아닌 새로운 객체가 생성되는 것입니다.
String 클래스 • String 클래스는 문자열 객체 생성 및 초기화, 문자열 접합 기능외에 다음과 같은 여러 기능들을 제공합니다. • ■ 문자열 비교 • ■ 문자열에서 개별문자에 대한 접근 • ■ 부분문자열 뽑아내기 • ■ 문자열의 대소문자 변환
문자열 비교 • 자바 프로그래밍 언어에서 String 객체를 사용하여 문자열을 처리할 때 ‘==’ 연산자를 사용하여서는 문자열 비교를 제대로 할 수 없습니다. 앞에서도 언급한 바와 같이, ‘==’ 연산자는 해당 참조변수가 가지는 주소값을 테스트 하며, 문자열의 내용을 테스트하지는 않습니다. • 따라서, String 객체의 문자열 비교를 위해서는 equals() 혹은 compareTo() 메소드를 사용하여야 합니다.
문자열 비교 • equal() 메소드는 이 메소드를 호출하는 객체의 원본(source) 문자열과 인수로 넘어오는 비교 대상(target) 문자열의 내용이 같을 경우 true를, 그렇지 않은 경우 false를 반환합니다. • compareTo() 메소드는 대상 문자열이 원본 문자열보다 알파벳 순서로 앞서면 음수 값을 반환하며, 원본문자열이 대상 문자열보다 앞서면 양수 값을 반환합니다. 두 문자열이 동일하면 0의 값을 리턴합니다. • 문자열의 알파벳 순서 비교과정 • 우선 두 문자열의 첫 번째 알파벳을 비교하고 다른 경우 알파벳 순서상 차이를 리턴하고 첫 번째 비교한 문자가 같은 경우 그 다음 문자를 비교하는 식으로 진행합니다.
문자열 비교 • 위 메소드들의 사용 예는 다음과 같습니다.
문자열 비교 • 위 프로그램 코드의 실행결과는 다음과 같습니다.
문자열 비교 • equals() 메소드의 반환 값은 boolean형식이며 compareTo() 메소드의 반환 값은 int형이기 때문에 위와 같은 결과가 출력되었습니다. • str1과 str2는 같은 내용의 문자열을 가지므로 equals() 메소드를 사용한 테스트에서 true 값을 반환하며, str1과 str3의 각 객체가 가지는 문자열의 내용이 다르므로 false를 리턴합니다. • str1과 str2의 문자열을 compareTo() 메소드를 사용하여 비교해 보면 동일한 내용의 문자열을 가지므로 0값을 리턴합니다. 그러나, str1과 str3의 비교는 문자열의 첫 번째 문자가 서로 다르고 이들은 알파벳 순서상 10만큼 떨어져 있기 때문에 위와 같은 결과가 출력되었습니다.
문자열에서 개별문자에 대한 접근 • 프로그램에서 문자열을 다루다 보면 간혹 문자열내 각 개별문자에 대한 접근을 필요로 하는 경우가 있습니다. 이러한 경우에 사용할 수 있도록 String 클래스에서는 charAt() 메소드가 준비되어 있습니다. • charAt() 메소드는 문자열의 지정된 위치에 해당하는 문자를 반환합니다. 즉, String 객체 str1가 “abcde"라는 문자열을 가지고 있는 경우 str1.chatAt(3)은 'd‘ 값을 반환합니다.
부분문자열 뽑아내기 • substring 메소드 • 한 String 객체가 갖고 있는 전체 문자열 중 일부 문자열만 뽑아내어 새로운 문자열 객체를 생성하고자 할 경우 • 예를들어, String 객체 str1이 "abcde"라는 문자열을 갖는 경우 str1.substring(2, 4)는 “cd" 값을 반환합니다. • str1.substring(2)와 같이 호출하는 경우 문자열 ”cde"를 리턴합니다.
문자열의 대소문자 변환 • String 객체는 문자열 객체의 내용을 모두 대문자로 변경하거나 소문자로 변경할 수 있도록 하는 기능을 지원합니다. • 위 메소드의 사용 예를 들어보면, str1 문자열 객체가 "originally lowercase"을 가질 때, str1.toUpperCase() 메소드 호출을 하면 대문자로 변경된 형태의 문자열인 "ORIGINALLY LOWERCASE"를 돌려줍니다. • 반면, str1 문자열 객체가 “ORIGINALLY UPPERCASE"를 가질 때, str1.toLowerCase() 메소드 호출을 하면 소문자로 변경된 ”originally uppercase"를 반환합니다.
StringBuffer 클래스 • String 클래스가 불변성(immutability)을 갖는 문자열을 구현하는 반면에 StringBuffer 클래스는 불변성이 없습니다. • StringBuffer 객체가 갖고 있는 문자열 자체가 임의로 변경될 수 있습니다. • StringBuffer 클래스에는 존재하는 capacity라는 멤버변수의 값에 의해서 StringBuffer 객체의 버퍼 크기가 동적으로 변화할 수 있습니다.
StringBuffer 클래스 • 앞에서 String 객체의 생성 및 초기화는 new 키워드를 사용하는 방법과 사용하지 않는두가지 방법으로 할 수 있다고 하였습니다. • StringBuffer 객체의 생성 및 초기화는 반드시 new 키워드를 사용하여야 합니다. 만일, new 키워드를 사용하지 않고 다음과 같이 StringBuffer 객체를 생성하고 초기화하려 하면, 에러가 발생합니다.
StringBuffer 클래스 • 즉, "JAVA 2 SCJP" 라는 문자열 객체를 StringBuffer 클래스 타입으로 변환할 수 없다는 것입니다. • StringBuffer 클래스는 다음과 같은 기능을 제공합니다. ■ StringBuffer 객체의 문자열과 같은 문자열을 갖는 String 객체 생성하기 ■ StringBuffer 객체의 문자열 변경, 삭제 ■ StringBuffer 객체의 문자열에 임의 문자열 삽입 ■ StringBuffer 객체의 버퍼 크기 조정 ■ StringBuffer 객체가 가지는 문자열의 길이 알아내기
StringBuffer 객체의 문자열과 같은 문자열을 갖는 String 객체 생성하기 • StringBuffer 클래스를 사용하는 경우 다른 함수에서는 String 클래스 타입으로 문자열을 요구하는 경우가 종종 발생합니다. • StringBuffer 클래스는 현재의 문자열 내용을 String 클래스 타입으로 변환하여 반환하도록 하는 toString() 메소드를 제공합니다. • 이 메소드는 원래 Object 클래스에서 정의되어 있는 것이지만 StringBuffer 클래스 내에서 다시 오버라이드(override)되어 있습니다.
StringBuffer 객체의 문자열과 같은 문자열을 갖는 String 객체 생성하기 • 예를들어, StringBuffer 객체 strbuf1이 "JAVA 2 SCJP" 문자열을 포함하고 있는 경우 strbuf1.toString()을 호출하면 "JAVA 2 SCJP" 라는 동일한 문자열을 갖는 String 객체를 반환합니다. SCJP 5.0 대비 강좌
StringBuffer 객체의 문자열 변경, 삭제 • StringBuffer 객체 문자열의 특정 문자를 임의 문자로 대치하기 위해서는 setCharAt() 메소드를 사용합니다. 현재 객체의 문자열에서 특정 문자를 읽어내기 위해서는 charAt()메소드를 사용합니다. 함수 원형은 다음과 같습니다. • StringBuffer 객체 strbuf1이 "abcde"라는 문자열을 가지고 있을때 strbuf1.charAt(3)은 문자 ‘d’를 반환합니다. 또, strbuf1.setCharAt(3, 'z')은 StringBuffer 객체 strbuf1이 "abcze"의 문자열을 갖도록 변경합니다. SCJP 5.0 대비 강좌
StringBuffer 객체의 문자열 변경, 삭제 • StringBuffer 객체 문자열의 특정 위치에 있는 문자를 삭제하고자 하는 경우는 deleteCharAt() 혹은 delete() 메소드를 사용합니다. • 예를들어, StringBuffer 객체 strbuf1이 문자열 “abcdefg"를 가지고 있을 때, delete(1, 3)은 "첫번째 이후부터 3번째 문자열까지를 삭제한 "adefg"을 돌려줍니다. • 현재의 StringBuffer 객체 strbuf1은 문자열 "adefg"을 가지는 객체가 되며 불변성을 가지는 String 객체와는 달리 원본 자체가 변경됩니다. • 특정 위치의 한 문자만 삭제하고자 하는 경우에는 deleteCharAt() 메소드를 사용합니다. 현재의 StringBuffer 객체 strbuf1은 문자열 ”adefg"를 가지고 있으며, deleteCharAt(2)를 실행하면 두 번째 이후의 한 문자 'e'가 삭제된 “adfg"을 반환합니다.
StringBuffer 객체의 문자열에 임의 문자열 추가, 삽입 • StringBuffer 객체에 임의의 문자열을 추가하고자 하는 경우 append() 메소드를 사용합니다. • 대개 인수로 String 객체를 받지만, int, float, long, double, character array 등의 타입도 사용가능하도록 오버로딩(overloading)되어 있습니다.
StringBuffer 객체의 문자열에 임의 문자열 추가, 삽입 • append() 메소드를 사용한 예를 들어보면, StringBuffer객체 strbuf3이 "abcd"의 문자열을 가지고 있을 때, append("_1234")를 호출하면 strbuf3 객체의 문자열이 "abcd_1234"로 변경됩니다. • StringBuffer객체의 append() 메소드는 자바 프로그래밍 언어에서 ‘+’ 연산자 오버로딩에 내부적으로 사용되어 있습니다. • StringBuffer객체의 끝 부분에 문자열를 추가하는 것 외에 자바 프로그래밍 언어는 StringBuffer객체 문자열의 임의 위치에 다른 문자열을 삽입할 수 있는 기능을 insert() 메소드를 통하여 지원합니다. SCJP 5.0 대비 강좌
StringBuffer 객체의 문자열에 임의 문자열 추가, 삽입 • insert() 메소드 역시 append() 메소드처럼 String 객체 외에도 여러 가지 타입의 인수를 받을 수 있도록 오버로딩(overloading)되어 있습니다. • 인수 offset은 삽입 위치를 나타냅니다. StringBuffer 객체 strbuf1이 문자열 “abcde"를 가질 때, insert(1, "_1234_")를 실행하면 "a_1234_bcde"를 돌려줍니다.
StringBuffer 객체의 버퍼 크기 조정 • StringBuffer 객체의 버퍼 크기는 동적으로 변경될 수 있습니다. 버퍼 크기 조정과 관련하여 제공되는 메소드로는 capacity(), setLength()이 있습니다. • capacity() 메소드는 현재의 버퍼 capacity를 돌려주는 메소드입니다. 버퍼를 원하는 크기로 조정하고자 하는 경우 setLength() 메소드를 사용합니다. • StringBuffer 객체 strbuf1의 버퍼 크기를 30으로 조정하고자 한다면 strbuf1.setLength(30)과 같이 사용하면 됩니다. 물론 null 문자 등이 추가되어 크기가 약간씩 차이날 수 있습니다.
StringBuffer 객체가 가지는 문자열의 길이 알아내기 • StringBuffer 객체가 현재 포함하고 있는 문자열의 길이를 알고 싶은 경우 length() 메소드를 사용합니다. 함수 원형은 다음과 같습니다. • 예를들어, StringBuffer 객체 strbuf1이 "abcde"의 문자열을 포함하고 있는 경우 strbuf1.length() 는 5를 리턴합니다.
Wrapper classes • Boolean • Character • Byte • Short • Integer • Long • Float • Double
class Date • 생성자 • Date() • Date(long msec) : from 1970-01-01 00:00:00 • 메서드 • boolean after(Date when) • boolean before(Date when) • int compareTo(Date anotherDate) • long getTime() • void setTime(long time)
class Calendar • int get(int field) • void set(int year, int month, int date) • void set(int year, int month, int date, int hour, int minute) • void set(int year, int month, int date, int hour, int minute, int second) • long getTimeInMillis() • void setTimeInMillis(long millis)
class Calendar Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int mon = cal.get(Calendar.MONTH) + 1; int day = cal.get(Calendar.DAY_OF_MONTH); int hour = cal.get(Calendar.HOUR_OF_DAY); int min = cal.get(Calendar.MINUTE); int sec = cal.get(Calendar.SECOND); System.out.print(“현재시간 : ”); System.out.print(year + “-” + mon + “-” + day + “ ”); System.out.println(hour + “:” + min + “:” + sec);
class Vector • 배열 vs 벡터 • class Vector • void addElement(Object o) • int capacity() • int elementCount(); • boolean contains(Object o) • int indexOf(Object o)
JTree • JTree(TreeNode root) • class DefaultTreeNode implements TreeNode • DefaultTreeNode(Object o) • add(Object o)
JTable String[] col_names = {"ID", "이름", "직업", "참석 여부"}; String data[][] = { {"0181", "Bill Cat", "Political Candidate", "예"}, {"0915", "Opus Penguin", "Science", "아니오"} }; JFrame frame = new JFrame(); frame.addWindowListener(new WindowDestroyer()); JTable table = new JTable(data, col_names); frame.add(new JScrollPane(table)); frame.pack(); frame.setVisible(true);
Input / Output (IO) • IO programming • 데이터를 입력받아 처리하거나 (Input) • 결과를 어떤 출력장치로 출력하도록 (Output) • stream • 순서가 있는 일련의 데이터를 의미하는 추상적 개념 • source -> destination • IO stream • 순차적 데이터의 흐름 : 랜덤엑세스 불가능 • 단방향 : 입력 / 출력 스트림이 따로 존재 • 모든 스트림의 형태는 같음
JFileChooser • showDialog(Component parent, String title) • showOpenDialog(Component parent) • showSaveDialog(Component parent) • setFileSelectionMode(int mode) • JFileChooser.FILES_ONLY • JFileChooser.DIRECTORIES_ONLY • JFileChooser.FILES_AND_DIRECTORIES