본문 바로가기

JAVA/기본다지기

JAVA 11일차 필기

새로운 패키지 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