Object class
- 모든 자바 클래스들의 최고 조상 클래스
- 모든 클래스는 Object 클래스의 자식이다.
- Object 클래스의 메서드는 모든 클래스 내부에 상속받아져서 존재하고 있다.
- Object 클래스의 메서드는 주로 해당 클래스에 맞는 형태로 오버라이드 하여 사용하게끔 설계되어 있다.
toString()
- '해당 객체를 문자열로 표현한다면 어떤 모양이어야 하는 가'를 정의하는 메서드
- 자바의 모든 객체는 toString()을 통해 문자열로 표현할 수 있다.
- Object 클래스에 정의 되어있는 toString() 메서드의 원형은
해당 클래스의 이름과 메모리상 주소를 출력하게 되어있다.
- 기본 동작이 싫다면 자식 클래스에서 해당 메서드를 오버라이드하여 사용하면 된다.
equals(obj)
- '해당 객체로 만들어진 두 인스턴스가 같은지 판정하려면 어떻게 해야하는 가'를 정의하는 메서드
- 매개변수로 전달받은 인스턴스와 this를 비교하여 결과를 리턴한다.
- Object 클래스에 정의 되어있는 기본 동작은 해당 인스턴스의 주소값을 비교하게 되어있다.
Hash 알고리즘
hello! => A123D45FF6789123456 …
hello! => A123D45FF6789123456 ...
Hello! => FF1234213 ...
hello => DD1234AA ...
apple => FF1234561241 ...
- 같은 값을 넣으면 예측하기 힘든 일정한 값이 나와야 한다.
- 해쉬 알고리즘을 통해 얻어낸 해쉬 코드로는 원래 값을 알아낼 수 없어야 한다.
- 쉬운 단어들로 미리 해쉬코드들을 제작해놓고 대조해보는 공격 기법에는 취약할 수 있다. (레인보우 테이블)
hashCode()
- 해당 인스턴스의 지문 역할을 하는 메서드
- 해당 인스턴스의 고유 번호를 리턴해야 한다.
- hash: 같은 값을 넣으면 예측이 불가능한 같은 값이 나와야 하는 알고리즘
- Object 클래스의 기본 동작은 해당 인스턴스의 주소값을 리턴하는 것이다.
class Prize {
// 인스턴스 변수들은 초기화하지 않아도 0, false, null 등으로 초기화된다.
String name;
int price;
double rate;
public Prize(String name, int price, double rate) {
this.name = name;
this.price = price;
this.rate = rate;
}
// 부모 타입의 메서드를 마음대로 내가 수정하여 사용하는 것
@Override
public String toString() {
return price + "만원 상당의 가치를 지닌 " + name + "입니다. " +
"(당첨 확률: " + rate * 100 + "%)";
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Prize)) {
return false;
}
// 현재 인스턴스와 전달받은 인스턴스가 같은 객체인지 여부를 리턴해야 한다.
Prize p1 = this;
Prize p2 = (Prize) obj;
// 당첨 확률과 상품명이 같으면 같은 상품으로 인정하겠다.
return p1.rate == p2.rate && p1.name.equals(p2.name);
}
@Override
public int hashCode() {
return super.hashCode();
}
}
public class C10_Object {
public static void main(String[] args) {
Apple a = new Apple();
Coffee c = new Coffee(1, 1, "에스프레소");
Coffee c2 = new Americano();
Prize p = new Prize("경차", 500, 0.001);
Prize p2 = new Prize("냉장고", 200, 0.002);
Prize p3 = new Prize("커피포트", 10, 0.01);
Prize p4 = new Prize("커피포트", 10, 0.01);
Prize p5 = new Prize("커피포트", 10, 0.01);
Prize p7 = new Prize("커피포트", 10, 0.01);
p.price = 500;
p.name = "경차";
// 내가 만든적 없지만 Object는 모든 클래스의 부모이므로
// toString() 같은 Object 메서드들은 반드시 존재할 수 밖에 없다.
String str = p.toString();
// System.out.println()은 전달한 인스턴스의 toString()을
// 호출한 후 그 결과를 콘솔에 찍어주는 메서드이다.
System.out.println(str);
System.out.println(p2);
System.out.println(p3);
System.out.println(p3 == p7);
System.out.println(p3.equals(p7));
System.out.println("abc".equals("abc"));
System.out.println(p3.hashCode());
System.out.println(p4.hashCode());
}
}
'JAVA > 기본 이론' 카테고리의 다른 글
JAVA | 다중 클래스(Inner Class) (0) | 2023.04.01 |
---|---|
JAVA | 접근 제어자(Access Modifier) (0) | 2023.03.29 |
JAVA | 다형성(Polymorphism) (0) | 2023.03.29 |
JAVA | 상속(Extend) (0) | 2023.03.29 |
JAVA | 참조형 데이터 타입(References Data Type) (0) | 2023.03.29 |