기본API
● java.lang 패키지
- equals()
- hashCode()
- toString()
●String 클래스 ( equals(), hashCode() 오버라이딩 O)
- equals() : Object 클래스에 있는 equal()와 String 클래스에 있는 equal()는 다름.(String 클래스에서 오버라이딩)
Object 클래스의 equal() : obj1 == obj2
String 클래스의 equal() : String의 내용이 같은지 boolean값을 결과로 출력.
String s1 = "abc";
String s2 = "abc"; //String을 리터럴로 넣을 시 이미 만들어진 값의 주소를 리턴(s2=s1)
s1 == s2 : true
String s3 = new String("abc");
String s4 = new String("abc"); // 새로운 String 객체 생성
s2 == s3 : false
s3 == s4 : false // 주소 비교
s3.equals(s4) : true // 문자열 내용 비교
▷equals 메서드 오버라이딩하기(주소가 같은지 확인하는 기존 equals메서드를 값이 같은지 확인하는 메서드로 재정의)
class Equal {
int value;
Equal(int value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Equal) {
Equal e = (Equal) obj;
return value == e.value; // e1.value == e2.value (e1.equal(e2)일시)
} else {
return false;
}
}
}
- hashCode() : Object 클래스에 있는 hashCode()과 String 클래스에 있는 hashCode()은 다름. (String 클래스에서 오버라이딩)
- clone() : clone 메서드를 사용하려면 Cloneable을 구현하고 예외처리를 해야함.
1. 얕은 복사 : 객체에 저장된 값을 복제
2. 깊은 복사 : 원본이 참조하고 있는 객체까지 복제
public class ShallowCopy {
public static void main(String[] args) {
Circle c1 = new Circle(new Point(1, 1), 2.0);
Circle c2 = c1.shallowCopy();
Circle c3 = c1.deepCopy();
System.out.println("c1 = " + c1); // x=1, y=1
System.out.println("c2 = " + c2); // x=1, y=1
System.out.println("c3 = " + c3); // x=1, y=1
c1.p.x = 9;
c1.p.y = 9;
System.out.println("=========변경후=========");
System.out.println("c1 = " + c1); // x=9, y=9
System.out.println("c2 = " + c2); // x=9, y=9
System.out.println("c3 = " + c3); // x=1, y=1
}
}
class Circle implements Cloneable {
Point p;
double r;
public Circle(Point p, double r) {
this.p = p;
this.r = r;
}
Circle shallowCopy() {
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return (Circle) obj;
}
Circle deepCopy() {
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
Circle c = (Circle) obj;
c.p = new Point(this.p.x, this.p.y);
return c;
}
}
● StringBuffer, StringBuilder 클래스
(equals(), hashCode() 오버라이딩 X -> Object의 메서드 사용 / toString()은 오버라이딩 O)
- StringBuffer : 멀티 쓰레드환경
- StringBuilder : 싱글 쓰레드환경
● Wrapper 클래스(equals(), hashCode(), toString() 오버라이딩 O)
- 모든 Wrapper 클래스의 조상 : Number 클래스
- 박싱(Boxing) : 기본형 -> 래퍼
- 언박싱(Unboxing) : 래퍼 -> 기본형
- 오토박싱 : 같은 종류의 기본형과 래퍼클래스 사이의 오토캐스팅
ex) int ↔ Integer
- valueOf() : 매개변수의 값을 래퍼타입으로 바꿔준다. ex) Integer i1 = Integer.valueOf(“100”);
cf) parseInt() : 매개변수의 값을 기본형으로 바꿔준다. ex) int i2 = Integer.parseInt(“100”);
● Random 클래스
- double 타입 이외의 난수 형성가능. (Math.random()는 오로지 double 타입)
ex) nextBoolean(), nextByte(), nextInt(), nextLong(), nextFloat(), nextDouble()
- setSeed(long seed) : seed 값이 같은 객체들은 같은 난수가 출력
● StringTokenizer 클래스
- StringTokenizer() - 구분자로 문자 한글자만 허용 => 여러종류의 구분자 사용 가능, 빈 문자열은 토큰으로 인식 X, 구분자도 토큰인식, String에 저장
split() : - 구분자로 여러글자도 허용, 빈 문자열도 토큰으로 인식, 구분자는 토큰인식 X, String 배열에 저장
import java.util.StringTokenizer;
public class StringTokenizerEx4 {
public static void main(String[] args) {
String data = "100,,,200,300";
String[] result = data.split(",");
StringTokenizer st = new StringTokenizer(data, ",");
for (int i = 0; i < result.length; i++) {
System.out.print(result[i] + "|");
}
System.out.println("개수: " + result.length);
int i = 0;
for (; st.hasMoreTokens(); i++) {
System.out.print(st.nextToken()+ "|");
}
System.out.println("개수 : " + i);
}
}
>>100|||200|300|개수: 5 // split()
100|200|300|개수 : 3 // StringTokenizer