Person p1 = new Person("홍길동");
System.out.println(p1.equals(new Person("홍길동")));
System.out.println(p1.equals(new Person("최명태")));
소스코드
class Person {
String name;
@Override
public boolean equals(Object obj) {
if(this.name == ((Person)obj).name)
return true;
else
return false;
}
}
public static void main(String[] args) {
String s1 = new String("java");
String s2 = new String("java");
String s3 = s2;
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s2 == s3);
System.out.println(s2.equals(s3));
if(s1 == s2)
System.out.println("s1, s2 참조 대상 같다.");
else
System.out.println("s1, s2 참조 대상 다르다. ");
if(s2 == s3)
System.out.println("s2, s3 참조 대상 같다.");
else
System.out.println("s2, s3 참조 대상 다르다. ");
if(s1.equals(s2))
System.out.println("s1, s2 내용 동일하다.");
else
System.out.println("s1, s2 내용 다르다.");
if(s2.equals(s3))
System.out.println("s2, s3 내용 동일하다.");
else
System.out.println("s2, s3 내용 다르다.");
실행결과
false
true
true
true
s1, s2 참조 대상 다르다.
s2, s3 참조 대상 같다.
s1, s2 내용 동일하다.
s2, s3 내용 동일하다.
설명
== 연산자는 주소값을 비교하는것이며, s1과 s2의 주소값은 다르기에 false가 된다.
s3은 s2의 주소값을 대입한것이기 때문에, s2와 s3이 가르키는 주소값이 같기 때문에
참조 대상이 같기에 true로 반환된다.
eqauls(obj)함수는 두 문자열의 내용을 비교하는것이기 때문에
s1=s2=s3 전부 동일하다.
INum[] ar1 = new INum[3];
INum[] ar2 = new INum[3];
ar1[0] = new INum(1); ar2[0] = new INum(1);
ar1[1] = new INum(2); ar2[1] = new INum(2);
ar1[2] = new INum(3); ar2[2] = new INum(3);
System.out.println(Arrays.equals(ar1, ar2));
소스코드 (1번과 동일)
class INum {
private int a;
private Object num;
INum(int a) {
this.a = a;
}
@Override
public boolean equals(Object obj) {
if(this.num == ((INum)obj).num)
return true;
else
return false;
}
}
제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다. 한마디로 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것이다.
class Apple {
public String toString() { return "I am an apple."; }
}
class Orange {
public String toString() { return "I am an orange."; }
}
// 다음 상자는 사과도 오렌지도 담을 수 있다.
class Box { // 무엇이든 저장하고 꺼낼 수 있는 상자
private Object ob;
public void set(Object o) { ob = o; }
public Object get() {return ob; }
}
public static void main(String[] args) {
Box aBox = new Box();
Box oBox = new Box();
// 아래 두 문장에서는 사과와 오렌지가 아닌 '문자열'을 담았다.
aBox.set("Apple");
oBox.set("Orange");
// 상자에 과일이 담기지 않았는데 과일을 꺼내려 한다.
Apple ap = (Apple)aBox.get();
Orange og = (Orange)oBox.get();
System.out.println(ap);
System.out.println(og);
출력 결과
Apple
Orange
이와 같이, Box안에 객체가 삽입된것이 아니라, 문자열을 삽입했으나
컴파일 상 에러가 발생하지 않으며, 의도했던 바와 전혀 다른 실행결과가 나오게 된다.
public static void main(String[] args) {
DBox<String, Integer> box = new DBox<String, Integer>();
box.set("Apple", 25);
System.out.println(box);
}
소스코드
class DBox<L, R> {
private L left; // 왼쪽 수납 공간
private R right; // 오른쪽 수납 공간
public void set(L o, R r) {
left = o;
right = r;
}
@Override
public String toString() {
return left + " & " + right;
// System.out.println(box); 를 호출하면
// 왼쪽값 & 오른쪽값 = 사과 & 25 라는 값을 출력되게 하기 위한
// toString 메소드 오버라이딩
}
}