
Person p1 = new Person("李佳恩");
System.out.println(p1.equals(new Person("李佳恩")));
System.out.println(p1.equals(new Person("姜琇雅")));
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 內容 다르다。");
}
}
String class도 當然히 Object class를 相續(繼承)、文字列의 內容을 比較하도록 Object class의 equals() 函數를 오버라이드(再定義)하고 있음
new로 客體生成을 했기 때문에 基本的으로 參照住所가 貯藏된다。그래서 == 演算時에 住所값을 比較하게 된다。
參照住所가 아닌 文字列의 內容比較를 爲해서는 一般的인 客體에서 比較하는 方法과 마찬가지의 方法으로 equals를 오버라이드해서 使用해야하지만 이미 String클래스에 equals가 오버라이드 되어있으므로 그냥 使用하면된다。
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));
- Java 1.5부터 나온 槪念
→ Generic이 나오기 前까지는 參照型變數 타입을 Object로 받을 수 밖에 없었다。- 機能
→ 資料型을 決定짓지 않고 틀을 만들어 두는 것을 意味함 (C++에서는 템플릿이라고 한다。)- 形態 : Object(參照型타입) 자리에 T가 들어감 → Generic
그래서 資料型의 情報를 Object 代身 T로 作成해 비워두고 인스턴스 生成時 參照타입을 決定함- 登場背景 : Generic以前의 코드에서 Object로 參照變數를 宣言했을 때 發生하는 問題들을 Generic을 使用함으로써 컴파일 段階에서 잡아줄 수 있도록 했음
誤謬의 發見 (例題코드에서 詳細한 說明)
1. 컴파일過程에서 發見 (簡單히 修正可能)
2. 實行過程에서 例外로 發見 (그나마 나은 狀況)
3. 失手가 實行過程에서조차 發見되지 않을 수도 있다。→ 큰 問題狀況
→ 文法이 컴파일過程에서 失手가 發見될 수 있도록 發展해가고 있다。
(하지만 工夫해야할 것이 많아짐)
最大限 컴파일過程에서 誤謬가 發見될 수 있도록 코드를 作成하는 것이 좋은 것!
1)
Apple ap = (Apple) aBox.get();
과 같이 프로그래머가 明視的型變換을 해서 責任을 지게 만들지 않고、컴파일러가 체크해서 코드의 安定性이 떨어지는 問題를 解決할 수 있도록 했다。
2)
aBox.set("Apple");
과 같은 狀況에서 컴파일러가 체크하지 못해서 實時間 에러로 이어지는 問題도 컴파일 에러로 잡을 수 있게 되었다。
3)
System.out.println(aBox.get());
과 같이 말도 안 되는 狀況에서 어떤 에러도 發生하지 않고 甚至於 그게 實行이 되는 第一 큰 問題狀況을 컴파일 에러로 막아 줄 수 있게 되었다!
public static void main(String[] args) {
DBox<String, Integer> box = new DBox<String, Integer>();
box.set("Apple", 25);
System.out.println(box);
}