새로운 패키지 ch10object 생성, 새로운 클래스 L01Object.java 생성
package com.javalesson.ch10object;
//import java.lang.Object; 생략되어있음.
class ObjectDemo{
public void a(Object o){
System.out.println(o);//.toString()이 생략되어있음.
System.out.println(o.toString());
}//a end
}//class end
class ToStringDemo1{
public String toString() {
return "ToStringDemo1 호출";
}//toString end
}//class end
class ToStringDemo2{
public String toString(){
return "ToStringDemo2 호출"+super.toString();
}
}//class end
public class L01Object{//모든 클래스가 Object 클래스를 상속 받고 있다.(extends Object가 생략됨)
public static void main(String[] args) {
//ToStringDemo1, ToStringDemo2의 toString을 ObjectDemo로 호출하세요.
ObjectDemo ob = new ObjectDemo();
ToStringDemo1 d1 = new ToStringDemo1();
Object d2 = new ToStringDemo2(); //모든 객체의 데이터타입으로 지정 가능하다.
ob.a(d1);
ob.a(d2); //이렇게 출력하거나
new ObjectDemo().a(new ToStringDemo1()); //이렇게 출력한다.
new ObjectDemo().a(new ToStringDemo2());
}//main end
}//class end
/*
* java.lang.Object class
*
* 모든 클래스가 상속받는 클래스다.
* 모든 클래스의 조상이다.
* 모든 객체의 데이터타입으로 지정 가능하다.(이때는 Object 클래스의 자원만 사용가능)
*
* 이 예제에서 생각해 볼 점.
* 상속, 재정의, 객체, 데이터타입.
*/
출력된 결과값
ToStringDemo1 호출
ToStringDemo1 호출
ToStringDemo2 호출com.javalesson.ch10object.ToStringDemo2@6d06d69c
ToStringDemo2 호출com.javalesson.ch10object.ToStringDemo2@6d06d69c ←super.toString()의 기본값@객체의 주소
public String toString() { //toString() 객체의 형태
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
hashcode는 객체를 구별하기위한 sign
ch10object에 새로운 클래스 L02ToString.java 생성
package com.javalesson.ch10object;
//동물 '쥐' 클래스를 만든다.
//'쥐' 클래스가 하는 가장 큰 일은 "찍찍"하고 우는 것
//Mouse 객체를 생성할 때마다 "쥐가 찍찍"이 호출 되도록하자.
class Mouse{
String squick;
public Mouse(String squick){
this.squick = squick;
}
@Override
public String toString(){
return "쥐가 "+squick;
}
}//class end
public class L02ToString {
public static void main(String[] args) {
//String a = new Mouse("찍찍");//예외 상황) 이때만 .toString()이 자동호출 되지 않는다.
System.out.println(new Mouse("찍찍"));//toString 자동호출
System.out.println(new Mouse("짹짹").toString());//위와 동일
}//main end
}//class end
/*
* Object.toString()
* 인스턴스 객체를 직접 호출하면 암묵적으로 toString()을 호출함
* why? 프로그래머들이 문자열을 반환하는 함수를 자주 작성하기 때문에
*/
ch10object에 새로운 클래스 L03HashCode.java 생성
package com.javalesson.ch10object;
class HashCodeDemo{
String name;
public HashCodeDemo(String name){
this.name = name;
}
public int hashCode() {
return super.hashCode();
}
//재정의를 권장하지 않는다. 16진수로 반환
}
public class L03HashCode {
public static void main(String[] args) {
HashCodeDemo a = new HashCodeDemo("A");
HashCodeDemo b = new HashCodeDemo("A");
HashCodeDemo c = new HashCodeDemo("A");
System.out.println(a == b);//==참조하는 위치가 같은지 비교(값이 같은지 비교X)
System.out.println(b == c);
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(c.hashCode());
}//main end
}//class end
/* hashCode() 객체가 가지는 고유한 sign -> 물리적 주소
*
* com.javalesson.ch10Object.L03HashCode 클래스를 유일하게 만들어주는 경로
* 패키지명 = 고유한 이름, 패키지 내부에서 같은 이름의 클래스를 가질 수 없다.
* new L03HashCode(), new L03HashCode() 두 객체가 다름을 증명하는 sign → hashCode()
* L03HashCode
* 인스턴스 객체.hashCode()는 객체의 고유 sign을 가진다.
* 하지만 String객체는 ASCII code의 Decimal값을 가진다. → 모든 객체가 고유한 hashCode 값을 가지는 것은 아니다.
* 기본데이터 타입의 랩퍼 클래스를 제외하고 모든 클래스의 객체는 고유한 hashCode 값을 가진다.
*/
결과값
false
false
366712642
1829164700
2018699554
hashCode()는 재정의를 권장하지 않는다.
'패키지명.클래스명'이 중요한 이유.
ch10object 패키지에 새로운 클래스 L04Equals.java 생성
package com.javalesson.ch10object;
//equals()는 복제인간 수준으로 같은 객체는 같다고 본다.
//==으로는 비교할 수 없기 때문에 equals가 등장함
class Animal{
String name;
//필드는 전역변수이자 클래스가 가지는 성질, 성격의 모든 것
//그렇다면 equals로 비교해야 하는 것은?
public Animal(String name){
this.name = name;
}
public boolean equals(Object obj) {
boolean flag = true;
Animal a = (Animal)obj;//기본데이터타입에서 casting과 같은 상태
//Object 클래스가 모든 클래스의 조상이기 때문에 가능
if(this.getClass() != a.getClass()){
flag = false;
}
if(!this.name.equals(a.name)){
flag = false;
}
return flag;
}
}
public class L04Equals {
public static void main(String[] args) {
String a = "hi";
String b = new String("hi");
System.out.println(a);
System.out.println(b);
System.out.println(a==b);
System.out.println(a.equals(b));
//Object 클래스가 가지고있는 equals를 String이 재정의한 것임.
Animal cat = new Animal("페르시안");
Animal cat2 = new Animal("페르시안");
System.out.println(cat.equals(cat2));//결과값이 true가 뜨도록 해보기
//equals()를 재정의하기
}//main end
}//class end
'JAVA > 기본다지기' 카테고리의 다른 글
[JAVA] 0~100 숫자맞추기 게임 (0) | 2016.08.18 |
---|---|
JAVA 12일차 필기 (0) | 2016.08.17 |
JAVA 10일차 필기 (1) | 2016.08.12 |
JAVA 9일차 필기 (0) | 2016.08.11 |
JAVA 8일차 필기 (0) | 2016.08.10 |