[Java] java.lang패키지 유용한 클래스
ref- Java의 정석(남궁성) 도우출판
📌java.lang패키지
- 가장 기본이 되는 클래스들을 포함 import문 없이 사용가능.
📌object 클래스란?
- object 클래스는 모든 클래스의 최고 조상.
- 부모가 없는 클래스는 자동적으로 object 클래 스를 상속받는다.
- 모든 클래스는 object클래스에 정의돈 11개의 메서드를 상속받는다(to string () , equals(object obj), hashcod….)
- 11개의 메서드를 정의하지 않아도 사용할수있다.
- object 클래스에서 제공하는 메서드를 알아보자.
✅equals()
- 매개변수로 객체의 참조변수를 받아서 비교해, 그 결과를 boolean값으로 알려주는 메소드 => 즉 객체의 주소비교 메서드
package lang;
public class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if (v1.equals(v2)) {
System.out.println("v1과 v2는 같습니다.");
} else {
System.out.println("v1과 v2는 다릅니다");
}
}
}
class Value {
int value;
Value(int value) {
this.value = value;
}
//Object 의 equals()를 오버라이딩해서 주소가 아닌 value 값을 비교
public boolean equals(Object obj) {
//return this == obj ;//주소비교
//참조변수의 형변환 전에는 반드시 instanceOf 로 확인
if (!(obj instanceof Value)) return false;
Value v = (Value) obj; //obj를 value를 형변환}
return this.value == v.value;
}
}
/*출력
v1과 v2는 다릅니다
v1과 v2는 같습니다
*/
-
객체의 주소값이 아닌, 인스턴스에 Value값을 비교 하고싶을떄는 equals() 메서드를 오버라이딩 하여 주소가 아닌 객체에 저장된 내용을 비굑하도록 변경하면된다.
-
String(비롯한 Date, File, Wrapper [Integer, Double]) 클래스에서는 Object의 equals를 그대로 사용하는 것이 아닌, 오버라이딩으로 주소가 아닌 ‘값’을 비교하게 한다.
✅toString()
- 인스턴스에 대한 정보를 문자열String로 제공할 목적으로 정의한 메서드이다.
class Card {
String kind;
int number;
Card() {
this("SPADE", 1);
}
Card(String kind, int number) {
this.kind = kind;
this.number = number;
}
}
public class CardToString {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card();
// toString()메소드 오버라이드 x
System.out.println(c1);
System.out.println(c2);
System.out.println(c1.toString());
System.out.println(c2.toString());
}
}
/*출력
object.Card@50f8360d
object.Card@2cb4c3ab
*/
📌String 클래스
- String 클래스 = 데이터(char[]) + 메서드(문자열 관련)
- 내용을 변경할 수 없는 불변(immutable) 클래스 이며 String 클래스는 앞에 final이 붙어 있으므로 다른 클래스의 조상이 될 수 없다.
- 문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용
String a = "a";
String b = "b"
a = a + b;
✅String 클래스 메서드
✅문자열 비교
문자열을 만들 떄는 문자열 리터럴을 지정하는 방법과, new 키워드를 이용하여 만드는 방법이있다..
String str1 = "abc"; //문자열 리터럴 "abc"의 주소가 str1 에 저장됨
String str2 = "abc"; //문자열 리터럴 "abc"의 주소가 str2 에 저장됨
String str3 = new String("abc");
String str4 = new String("abc");
String 클래스이 생성자를 이용한 경우에는 new 연산자에 의해서 메모리 할당이 이루어지기 떄문에 항상 새로운 String 인스턴스가 생성된다.
그러나 문자열 리터럴은 이미 존재하는 것을 재사용하는것이다.
✅문자열 리터럴
- 문자열 리터럴은 프로그램 실행시 자동으로 생성된다(constant pool(상수)에 저장)
✅기본형 값을 String 으로 변환
- 기본형을 문자로 변경하는 방법
- 숫자에 빈 문자열”“을 더해주기
- valueOf() 사용.(속도가 더빠름)
=> 성능은 valueOf가 더 좋지만, 빈 문자열이 방법이 간단하기 쉽기떄문에 성능이 필요한 경우에만 valueOf를 사용 권장.
int i = 100;
String str1 = i + ""; // 숫자 100을 "100"으로 변환하는방법1
String str2 = String.valueOf(i); // 100을 "100"으로 변환하는 방법2
s —
📌StringBuffer 클래스
- String과 똑같지만 그러나 buffer는 내용을 변경할 수있다.
- StringBuffer 인스턴스를 생성할 떄는 생정자 StringBuffer(int length)를 사용해서 StringBuffer인스턴스에 저장된 문자열의 길이를 고려하여 충분히 여유있는 크기로 지정하는게 좋다.
- StringBuffer인스턴스를 생성할떄, 버퍼의 크기를 지정해주지 않으면 디폴트 16개의 문자를 지정할수 있는 크기의 버퍼를 생성한다.
✅사용이유
- 메모리의 낭비를 줄이기 막기위해서 이다.
세부사항
- 배열을 처음 생성한다면 길이를 변경할수없다. 공간이 부족하면 새로운 배열을 생성해야한다. 1.새로운 배열을 생성, -> 2. 내용 복사, -> 3.참조변경 이러한 일들이 반복된다면 성능이 떨어짐
이러한 이유들로 StringBuffer를 사용한다. 간단하게 예시코드를 살펴보자
//StringBuffer의 생성자
public StringBuffer(int length){
value = new Char[length];
shared =false;
}
public StringBuffer(){
this(16); // 버퍼의 크기를 지정하지 않으면 버퍼의 키그니느 16이된다.
}
public StringBuffer(String str){
this(Str.length() + 16); // 지정한 문자열의 길이보다 16이 더크게 버퍼를 생성한다.
append(Str);
}
class Ex9_11 {
public static void main(String[] args) {
//StringBuffuer 클래스란-> 문자열을 저장하는 클래스
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println("sb == sb2 ? " + (sb == sb2));
System.out.println("sb.equals(sb2) ? " + sb.equals(sb2));
// StringBuffer의 내용을 String으로 변환한다.
String s = sb.toString(); // String s = new String(sb);와 같다.
String s2 = sb2.toString();
System.out.println("s.equals(s2) ? " + s.equals(s2));
}
}
/*출력
sb == sb2 ? false
sb.equals(sb2) ? false
s.equals(s2) ? true
*/
- StringBuffer클래스는 equlas() 메서드를 오버라이딩 하고있지않다. StringBuffer를 String으로 변환하여 비교해야힌다. 때문에 toString()을 사용하여 비교하여야한다.
✅StringBuilder란?
- StringBuffer는 멀티쓰레드에 안전하도록 동기화 되어있다. . 멀티 쓰레드로 작성된 프로그램이 아닌경우 StringBuffer의 동기화는 불필효가게 성능만 떨어트리게 된다. 그래서 StringBuffer에서 쓰레드의 동기화만 뺸 StringBuilder가 새로 추가되었다.
📌래퍼(wrapper)클래스
- 기본형(primitive type)변수를 객체로 다룰 수 있게 한 클래스이다
(기본형 타입을 객체로 다뤄야할 필요가 있을떄 쓰인다.)
✅autoboxing vs unboxing
Integer intWrap = inter.valueOf(10); //jdk 1.5 버전 전에는 이렇게 Autoboxing을 해서 데이터를 포장했어야함
int number = intWrap.intValue(); //jdk 1.5 버전 전 unboxing 작업
Interger intWrap = 10; // Auto Boxing
int number = intWrap; //Unboxing
- 해당 예제를 보면 Interg Wrapper 클래스에 intWrap 참조변수에는 10 이라는 기본형 값을 담을수없다.
- 그래서 이러한 기본형 값을 래퍼 클래스이 객체로 변환해주어야 가능하다.
- jdk1.5 버전 전에는 저렇게 변환할떄 inter.valueof // intWrap.intValue 기입을 해줘야만했다
- jdk1.5 버전이후에 기본형 값을 래퍼 클래스의 객체로 자동 변환해주는것을 “autoboxing”이라고한다
- 그반대로 참조타입을 인트타입으로 값을 꺼낼떄는 “unboxing” 이라고 부름.
📌 java.util.StringTokenizer 클래스란?
-
긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰(token)이라는 여러 개의 문자열로 잘라내는데 사용댄다. 예) “100,200,300,400” 이란 문자열이 있을떄 “,”를 구분자로 잘라내면 “100”,”200”,”300”,”400” 이라는 4개의 문자열 토큰을 얻을수 있다.
-
StringTokenizer를 이용하는 방법 이외에도 아래와 같이 String split(String regex)이나 Scanner의 useDelimiter(String patter)을 사용할수 있지만 이 두 방법 은 ‘정규식 표현’ 을 사용해야 하므로 정규식 표현에 익숙지 않다면 stringTokenzie를 사용하는것이 간단하면서 명확한 결과를 얻을수있다.
-
StringTokenizer의 구분자로는 단 하나의 문자 밖에 사용하지 못하기 떄문에 , 보다 복잡한 형태의 구분자로 문자열을 나누어야 할떄는 어쩔수 없이 정규식으로 사용하는 메서드를 사용해야한다.
class StringTokenizerEx1 {
public static void main(String[] args){
String source = "100,200,300,400";
StringTokenizer st = new StringTokenizer(source, ",")
while(st.hasMoreToken()){
System.out.println(st.nextToken());
}
}// main
}
/*출력
100
200
300
400
*/
Leave a comment