자바 프로그래밍 17일차 수업

김형우·2022년 11월 15일
0

Java

목록 보기
16/22

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("최명태")));

소스코드

	
class Person {

	String name;
    
    @Override
    public boolean equals(Object obj) {
		if(this.name == ((Person)obj).name)
	         return true;
	      else
	         return false;
	}
}

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 내용 다르다.");

실행결과

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 전부 동일하다.

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

소스코드 (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;
		
	}

}

4. 제네릭(Generic)이란?

제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다. 한마디로 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것이다.

5.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안에 객체가 삽입된것이 아니라, 문자열을 삽입했으나
컴파일 상 에러가 발생하지 않으며, 의도했던 바와 전혀 다른 실행결과가 나오게 된다.

6. 아래가 돌아 가도록 DBox를 완성 하시오.

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 메소드 오버라이딩
   }
}

profile
개발자 지망생

0개의 댓글