Java(자바) 17日次

블로그 移轉·2022년 11월 15일

Java

목록 보기
16/20

Java 面接 族譜 整理 (17日次)

1. 다음 條件을 滿足하는 클래스 Person을 具現하여 테스트하는 프로그램을 作成하시오。

  • 클래스 Person은 이름을 貯藏하는 필드를 構成
  • 클래스 Person은 上位클래스 Object의 메소드 equals()를 오버라이드하여 이름이 같으면 true를 返還하는 메소드를 具現
  • 다음과 같은 소스로 클래스 Person을 點檢
Person p1 = new Person("李佳恩");
System.out.println(p1.equals(new Person("李佳恩")));
System.out.println(p1.equals(new Person("姜琇雅")));

2. 下段의 內容을 參考하여、메소드 equals()와 演算子 「==」 의 差異를 比較說明하시오。

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가 오버라이드 되어있으므로 그냥 使用하면된다。

3. 下段의 內容의 結果는 false가 出力이 된다。true가 되도록 INum을 作成하시오。

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));

4. 제네릭(Generic・總稱型)이란?

  • Java 1.5부터 나온 槪念
    → Generic이 나오기 前까지는 參照型變數 타입을 Object로 받을 수 밖에 없었다。
  • 機能
    資料型을 決定짓지 않고 틀을 만들어 두는 것을 意味함 (C++에서는 템플릿이라고 한다。)
  • 形態 : Object(參照型타입) 자리에 T가 들어감 → Generic
    그래서 資料型의 情報를 Object 代身 T로 作成해 비워두고 인스턴스 生成時 參照타입을 決定
  • 登場背景 : Generic以前의 코드에서 Object로 參照變數를 宣言했을 때 發生하는 問題들을 Generic을 使用함으로써 컴파일 段階에서 잡아줄 수 있도록 했음

5. Generic 以前의 코드의 問題 狀況들을 例를 들어 說明하시오。

Generic 以前의 코드의 問題狀況들

誤謬의 發見 (例題코드에서 詳細한 說明)
1. 컴파일過程에서 發見 (簡單히 修正可能)
2. 實行過程에서 例外로 發見 (그나마 나은 狀況)
3. 失手가 實行過程에서조차 發見되지 않을 수도 있다。→ 큰 問題狀況

→ 文法이 컴파일過程에서 失手가 發見될 수 있도록 發展해가고 있다。
(하지만 工夫해야할 것이 많아짐)
最大限 컴파일過程에서 誤謬가 發見될 수 있도록 코드를 作成하는 것이 좋은 것!

例示코드를 基準으로 說明하면

1)

Apple ap = (Apple) aBox.get();

과 같이 프로그래머가 明視的型變換을 해서 責任을 지게 만들지 않고、컴파일러가 체크해서 코드의 安定性이 떨어지는 問題를 解決할 수 있도록 했다。

2)

aBox.set("Apple");

과 같은 狀況에서 컴파일러가 체크하지 못해서 實時間 에러로 이어지는 問題도 컴파일 에러로 잡을 수 있게 되었다。

3)

System.out.println(aBox.get());

과 같이 말도 안 되는 狀況에서 어떤 에러도 發生하지 않고 甚至於 그게 實行이 되는 第一 큰 問題狀況을 컴파일 에러로 막아 줄 수 있게 되었다!

6. 下段의 內容이 作動하도록 DBox를 完成하시오。

  • main函數
    public static void main(String[] args) {
    	DBox<String, Integer> box = new DBox<String, Integer>();
    	box.set("Apple", 25);
    	System.out.println(box);
    }
profile
移轉했읍니다。

0개의 댓글