JAVA의 정석 | Chapter 9 java.lang패키지와 유용한 클래스

Yunny.Log ·2022년 6월 23일
0

JAVA

목록 보기
18/29
post-thumbnail

1. java lang 패키지

  • java lanf은 자바프로그래밍에 가장 기본 클래스들 포함
  • 따라서 import 가 필요 없음

1.1 Object 클래스

  • 모든 클래스의 최고 조상, Object 클래스의 멤버들은 모든 클래스에서 사용 가능

equal : 인스턴스의 주소값으로 비교

메서드내용
equals(Object obj)객체 참조변수 받아서 결과 boolean 반환
class EqualsEx1 {
	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는 다릅니다.");		
		}

		v2 = v1;

		if (v1.equals(v2)) {
			System.out.println("v1과 v2는 같습니다.");
		} else {
			System.out.println("v1과 v2는 다릅니다.");		
		}
	} // main
} 

class Value {
	int value;

	Value(int value) {
		this.value = value;
	}
}
  • 이 equals 를 적절히 오버라이딩해 내가 원하는 대로 바꾸기 가능
  • String(비롯한 Date, File, Wrapper [Integer, Double]) 클래스에서는 Object의 equals를 그대로 사용하는 것이 아닌, 오버라이딩으로 주소가 아닌 '값'을 비교하게 한다.

hashCode

메서드내용
hashCode객체 자신의 해쉬코드 반환
  • 해싱기법에 사용되는 해시 함수를 구현한 것
  • 해싱은 데이터 관리 기법 중 하나, 다량 데이터 저장, 검색에 유용
  • 해시함수는 찾고자 하는 값 입력 시, 그 값이 저장된 위치를 알려주는 해쉬코드 반환
  • 인스턴스 변수 값으로 객체의 같고 다름 판단해야한다면 equals 뿐만 아니라 hashCode 메소드도 적절 오버라이딩 필요
  • String 클래스는 문자열 내용이 같으면 동일 해시코드 반환하도록 hashCode 메서드 오버라이딩돼있기 때문에 문자열 내용 같으면 동일한 해시코드 값 얻는다.
  • 출처 : https://github.com/castello/javajungsuk3/blob/master/ppt/%5BJava%EC%9D%98%EC%A0%95%EC%84%9D%5Dch9_lang%ED%8C%A8%ED%82%A4%EC%A7%80.ppt

toString()

메서드내용
toString인스턴스에 대한 정보를 문자열로 제공
  • 객체 클래스를 만들고 거기에 public String toString() 메소드를 정의하면 나중에 객체를 System.out.println(객체의 인스턴스.toString) 진행을 하면 내가 정의한 대로 나오게 된다.

clone()

메서드내용
clone객체 자신의 복사본 반환
  • clone 사용 조건 : 복제할 클래스가 Cloneable 인터페이스 구현
  • clone() 을 오버라이딩하며 이를 protected에서 public 으로 변경 필요
  • 또한 반드시 clone() 시에는 try catch 로 CloneNotSuppoerted 에러 예외처리를 진행해주어야 한다.

얕은 복사, 깊은 복사

1) 얕은 복사

  • clone()은 단순히 객체에 저장된 값 그대로 복제, 객체가 참조하고 있는 객체까지 복사는 x
  • clone()으로 객체배열 복제하는 경우에는 원본과 복제본이 같은 객체 공유 => 완전한 복제라고 보긴 difficult
  • 원본 변경 시, 복사본도 영향을 받게 됨

2) 깊은 복사

  • 원본이 참조하고 있는 객체까지 복사하는 것
  • 원본과 복사본이 서로 다른 객체 참조, 원본 변경이 복사 영향 x

import java.util.*;

class Circle implements Cloneable {
	Point p;  // 원점
	double r; // 반지름

	Circle(Point p, double r) {
		this.p = p;
		this.r = r;
	}

	public Circle shallowCopy() { // 얕은 복사
		Object obj = null;

		try {
			obj = super.clone();
		} catch (CloneNotSupportedException e) {}

		return (Circle)obj;
	}

	public Circle deepCopy() { // 깊은 복사
		Object obj = null;

		try {
			obj = super.clone();
		} catch (CloneNotSupportedException e) {}

		Circle c = (Circle)obj; 
		c.p = new Point(this.p.x, this.p.y); 

		return c;
	}

	public String toString() {
		return "[p=" + p + ", r="+ r +"]";
	}
}

class Point {
	int x;
	int y;

	Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public String toString() {
		return "("+x +", "+y+")";
	}
}

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);
		System.out.println("c2="+c2);
		System.out.println("c3="+c3);
		c1.p.x = 9;
		c1.p.y = 9;
		System.out.println("= c1의 변경 후 =");
		System.out.println("c1="+c1);
		System.out.println("c2="+c2);
		System.out.println("c3="+c3);
	}
}
		Circle c1 = new Circle(new Point(1, 1), 2.0);
		Circle c2 = c1.shallowCopy();
		Circle c3 = c1.deepCopy();
  • c1 인스턴스 생성 후 얕은 복사, 깊은 복사로 c2, c3 생성
		c1.p.x = 9;
		c1.p.y = 9;
  • c1 이 참조하느 객체의 값을 변경
  • 딥 카피로 복사한 c3는 영향 x, c2는 영향 ㅇ (같은 객체 참조해서)

getClass()

메서드내용
getClass()자신이 속한 클래스의 Class객체를 반환하는 메서드
  • 클래스파일(*.class)이 메모리에 로드될때 생성된다.

  • Class객체는 클래스의 모든 정보를 담고 있으며, 클래스당 단 1개만 존재!

1.2 String 클래스

immutable

  • String 의 내용은 바꿀 수 없는 immutable
  • 만약 바꾸면 , 이런 식으로 아예 참조하는 객체(주소가 아예 다라짐)가 달라지면서 메모리 공간 많이 차지함, 한번 지정된 문자열 객체는 바뀌지 않는 것

  • 오히려 String 내용 많이 변경 예정이라면 StringBuffer 클래스를 써라

문자열 비교

  • 문자열 만들 때는
    (1) 문자열 리터럴 지정 방법
  • 이미 존재하는 것 재사용
    (2) String 클래스 생성자 사용해 만드는 방법
  • new에 의해 메모리 할당 이루어지며 항상 새로운 String 인스턴스 생성

1.3 String Buffer

  • 내용 변경 가능
  • 인스턴스를 생성할 때 버퍼(배열)의 크기를 충분히 지정해주는 것이 good
  • String 은 값 똑같으면 equals = true 반환, equals를 오버라이딩 해줬기 때문
  • 그러나 스트링 버퍼는 이걸 오버라이딩 안해서 값 똑같아도 equals=FALSE 출력함

1.5 래퍼 (Wrapper) 클래스

  • 자바에서 유일한 primitive 변수 8가지 (소문자로 시작하는 아이들)
  • 이또한 객체로 다뤄져야 하는 경우 有
  • 8개의 기본형을 대표하는 8개의 래퍼클래스가 존재하는데, 이 클래스들 이용 시 기본형 값 객체로 다루기 가능
  • 내부적으로 기본형(primitive type) 변수를 가진다
  • 값을 비교하도록 equals()가 오버라이딩

래퍼클래스 parse, value of
1) 타입.parse타입(String s)

  • 문자를 숫자로 변경
  • 반환값이 기본형 (primitive)

3) 타입.valueOf()

  • 문자를 숫자로 변경
  • 반환값이 래퍼클래스 타입

boxing vs unboxing

  • boxing : primitive -> wrapper
  • unboxing : wrrapper -> primitive

▪ 모든 wrapper 클래스 생성자는 각각에 해당하는 primitive data type을 이용하여 객체 생성

Integer iOb = new Integer(100); 
// boxing (primitive data type → 객체)
int i = iOb.intValue(); 
// unboxing (객체 → primitive data type)
System.out.println(i + " : " + iOb); 
// toString() 메소드 overriding 되어 있음

▪ autoboxing / auto-unboxing 기능은 코딩을 보다 간단히 할 수 있도록 한다.

  • 보이지는 않지만 컴파일 과정에서 valueOf을 통해 primitive 를 Wrapper 형으로 변환해주는 것
Integer iOb = 100; // autoboxing
int i = iOb; // auto-unboxing
System.out.println(i + " : " + iOb);

2.2 Random 클래스

Math.random()과 Random 클래스

• 기본적으로 같음.
• Random 클래스는 seed 값을 설정할 수 있음.
• 같은 seed 값은 같은 random 값을 생성

import java.util.*;

class RandomEx1 {
	public static void main(String args[]) {
		Random rand  = new Random(1);
		Random rand2 = new Random(1);

		System.out.println("= rand =");
		for(int i=0; i < 5; i++)
			System.out.println(i + ":" + rand.nextInt());

		System.out.println();
		System.out.println("= rand2 =");
		for(int i=0; i < 5; i++)
			System.out.println(i + ":" + rand2.nextInt());
	}
}

  • seed 가 똑같으면 같은 난수가 생성된다는게 math 의 random 과 가장 다른 포인트!

0개의 댓글