본문 바로가기

JAVA/기본다지기

JAVA 12일차 필기

ch10object 패키지에 새로운 클래스 L05EquaslEx.java생성

package com.javalesson.ch10object;


import java.util.ArrayList;


class EqualsDemo{

String str_val;

int int_val;

ArrayList list_val;

Object obj_val;

public EqualsDemo(String str_valint int_val, ArrayList list_val, Object obj_val){

this.str_val = str_val;

this.int_val = int_val;

this.list_val = list_val;

this.obj_val = obj_val;

}//생성자 end

@Override //Generate를 통해서 자동으로 생성된 코드

public int hashCode() {

final int prime = 31;//31을 곱하는 이유는?? 31이 아니어도 소수라면 가능

int result = 1;

result = prime * result + int_val;

result = prime * result + ((list_val == null) ? 0 : list_val.hashCode());

result = prime * result + ((obj_val == null) ? 0 : obj_val.hashCode());

result = prime * result + ((str_val == null) ? 0 : str_val.hashCode());

return result;

}

@Override //Generate를 통해서 자동으로 생성된 코드 

public boolean equals(Object obj) {

if (this == obj)//비교하는 두 주소값이 같은가?(100%동일한 자기자신인가?)

return true;

if (obj == null)//비교되는 값이 null인가? null값은 비교 자체가 불가능. why? 아래에서 설명

                        //if문을 쓸 때 null체크는 매우 중요하므로 꼭 체크해야 한다.

return false;

if (getClass() != obj.getClass())//class가 같은가?(데이터타입이 같은가?)

return false;

EqualsDemo other = (EqualsDemo) obj;//선언적형변환(casting)

//위 if문에서 class가 같은지 비교하지 않으면, class가 다를 시 형변환에서 치명적 오류발생

if (int_val != other.int_val)

return false;

if (list_val == null) {//비교하려는 list_val이 null인가? 

if (other.list_val != null)//비교되는 list_val이 null이 아닌가?(둘다 null이 아님확인)

return false;

} else if (!list_val.equals(other.list_val))

//비교하려는 list_val값이 null값이 아니라면 비교하려는 list_val값과 같지 않은가?

return false;

if (obj_val == null) {

if (other.obj_val != null)

return false;

else if (!obj_val.equals(other.obj_val))

return false;

if (str_val == null) {

if (other.str_val != null)

return false;

else if (!str_val.equals(other.str_val))

return  false;

return true;//모든 필터를 통과하면 복제인간처럼 같다고 판단

}

}//class end


public class L05EqualsEx {

public static void main(String[] args) {

//new ArrayList().add("list"); //저장에 성공했는지 안했는지 확인하는 boolean이 반환됨

ArrayList list = new ArrayList();

list.add("list");

EqualsDemo ed1 = new EqualsDemo("demo", 30, list, "object");

EqualsDemo ed2 = new EqualsDemo("demo", 30, list, "object");

System.out.println(ed1.equals(ed2));

}//main end

}//class end


null값을 비교할 수 없는 이유


null값은 '값이 정의되어 있지 않다'는 의미로, 참조하는 주소값에 아무런 데이터도 존재하지 않는다는 의미이다.

비교하고싶어도 비교할 대상이 존재하지 않으면 비교를 할 수 없는 것이다.


참고로, 연산에서의 null값은 '?'라고 생각하면 이해하기 쉽다. 예를 들어, 5라는 값에 null(?: 모르는 값)을 더하면 당연히 그 결과도 '?'일 수 밖에 없다. 



접근지정자


새로운 패키지 ch11access.other와 ch11access.same 생성

same 패키지에 새로운 클래스 L01SameClass.java 생성

package com.javalesson.ch11access.same;


public class L01SameClass {

//서로 다른 접근지정자를 가진 메소드 4개를 만들고, 자신 내부(class안)에서 접근시도

public L01SameClass(){

this.publicTest();

this.defaultTest();

this.protectedTest();

this.privateTest();

}

public void publicTest(){

System.out.println("publicTest() 접근");

}

void defaultTest(){

System.out.println("defaultTest() 접근");

}

protected void protectedTest(){

System.out.println("protectedTest() 접근");

}

private void privateTest(){

System.out.println("privateTest() 접근");

}

public static void main(String[] args) {

new L01SameClass();

}//main end 

}//class end

same 패키지에 새로운 클래스 L02OtherClass.java 생성

package com.javalesson.ch11access.same;


public class L02OtherClass extends L01SameClass{

public L02OtherClass(){

//상속관계 접근지정자 확인

super.publicTest();

super.defaultTest();

super.protectedTest();

//super.pivateTest();//접근x

}//생성자 end

public static void main(String[] args){

//객체로 접근지정자 확인

L01SameClass sc = new L01SameClass();

sc.publicTest();

sc.defaultTest();

sc.protectedTest();

//sc.privateTest();//접근x

//private접근 지정자는 class내부에서만 사용할 수 있다.

}//main end

}//class end

위의 두 클래스는 같은 패키지에 있는 같은 프로젝트임.


other 패키지에 새로운 클래스 L03OtherPackage.java 생성

package com.javalesson.ch11access.other;


import com.javalesson.ch11access.same.L01SameClass;


public class L03OtherPackage extends L01SameClass{

public L03OtherPackage(){

//상속 관계에서 다른 패키지의 클래스 접근지정자 확인

super.publicTest();

//super.defaultTest();//접근x

super.protectedTest();//protected는 상속 관계일 때 접근가능

//super.privateTest();//당연히 접근x

}//생성자 end

public static void main(String[] args){

//객체로 다른 클래스 접근지정자 확인

L01SameClass sc = new L01SameClass();

sc.publicTest();

//sc.defaultTest();

//sc.protectedTest();

//sc.privateTest();

//public을 제외한 모든 접근 지정자는 외부(다른 패키지)에서 접근불능!!

}//main end

}//class end

이 클래스는 다른 패키지에 있는 다른 프로젝트임.


 

(==)class

동일한 클래스

(!=)class

다른 클래스 

(!=)pack, extends

다른 패키지, 상속 

(!=)package

다른 패키지 

public

O

O

O

O

protected

O

O

O

X

default 

O

O

X

X

private 

O

X

X

X




'JAVA > 기본다지기' 카테고리의 다른 글

JAVA 13일차 필기  (0) 2016.08.22
[JAVA] 0~100 숫자맞추기 게임  (0) 2016.08.18
JAVA 11일차 필기  (0) 2016.08.16
JAVA 10일차 필기  (1) 2016.08.12
JAVA 9일차 필기  (0) 2016.08.11