● 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