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_val, int 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 |