1. String 클래스 에서 문자열 비교시 equal을 쓰는 이유는?
: String은 기본적으로 문자열을 리턴하는 성질을 가진 객체(Object)이다. 그에 따라 해당 타입을 통해 선언한 변수를 비교하는데에 있어서 둘은 기존에 사용하던 대입연산자를 사용할 때 인스턴스의 내용을 비교하는 것이 아닌 객체를 비교하기 때문에 서로 주소가 달라 원치않은 값을 리턴할 수 있다. 따라서 원하는 결과를 도출하기 위해(인스턴스의 내용을 비교) equals의 기능을 이용하는 것이다.
2. shall copy, deep copy 의 차이는?
2-1. shall copy
얉은 복사(Shallow Copy)는 복사하여 객체를 별도로 생성하지만 그 안에 들어가는 내용은 원래와 같은 객체인 것을 의미한다. 그로인해 원본 객체의 값이 변조될 경우 이를 복사했던 객체까지 영향이 미친다.
public class RectangleShallow implements Cloneable {
private Point upperLeft; // 좌측 상단 좌표
private Point lowerRight; // 우측 하단 좌표
public RectangleShallow(int x1, int y1, int x2, int y2) {
upperLeft = new Point(x1, y1);
lowerRight = new Point(x2, y2);
}
// 좌표 정보를 수정함
public void changePos(int x1, int y1, int x2, int y2) {
upperLeft.changePos(x1, y1);
lowerRight.changePos(x2, y2);
}
// 얉은 복사의 형태로 해당 객체를 복사
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
// 직사각형 좌표 정보 출력
public void showPosition() {
System.out.print("좌측 상단: ");
upperLeft.showPosition();
System.out.print("우측 하단: ");
lowerRight.showPosition();
System.out.println();
}
}
2-2. deep copy
깊은 복사(Deep Copy)는 얉은 복사처럼 객체를 별도로 생성하되 그 안의 내용까지 재귀적으로 새롭게 생성하는 것을 의미한다. 따라서 원본 객체의 값이 변경되더라도 복사된 객체는 특수한 조건이 있지 않은 이상 영향이 가지 않는다.
public class RectangleDeep implements Cloneable {
private Point upperLeft; // 좌측 상단 좌표
private Point lowerRight; // 우측 하단 좌표
public RectangleDeep(int x1, int y1, int x2, int y2) {
upperLeft = new Point(x1, y1);
lowerRight = new Point(x2, y2);
}
// 좌표 정보를 수정함
public void changePos(int x1, int y1, int x2, int y2) {
upperLeft.changePos(x1, y1);
lowerRight.changePos(x2, y2);
}
@Override
public Object clone() throws CloneNotSupportedException {
// Object 클래스의 clone 메소드 호출 결과를 얻음
// 깊은 복사를 위해 copy라는 객체를 재귀하여 따로 생성
RectangleDeep copy = (RectangleDeep)super.clone();
// 깊은 복사의 형태로 복사본을 수정
copy.upperLeft = (Point)upperLeft.clone();
copy.lowerRight = (Point)lowerRight.clone();
// 완성된 복사본의 참조를 반환
return copy;
}
// 직사각형 좌표 정보 출력
public void showPosition() {
System.out.print("좌측 상단: ");
upperLeft.showPosition();
System.out.print("우측 하단: ");
lowerRight.showPosition();
System.out.println();
}
}
3. 금일 배운 Rectangle의 shall copy 와 deep copy 일때의 그림을 그리시오.
4. 다음 main()이 실행되면 아래 예시와 같이 출력되도록 MyPoint 클래스를 작성하라.
public static void main(String [] args) {
MyPoint p = new MyPoint(3, 50);
MyPoint q = new MyPoint(4, 50);
System.out.println(p);
if(p.equals(q)) System.out.println("같은 점");
else System.out.println("다른 점");
}
> Point(3,50)
> 다른점
4-1. MyPoint 클래스
public class MyPoint {
private int x, y;
public MyPoint(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Point(" + x + ", " + y + ")";
}
@Override
public boolean equals(Object obj) {
if ((this.x == ((MyPoint)obj).x)
&& (this.y == ((MyPoint)obj).y)) {
return true;
} else {
return false;
}
}
}
5. 중심을 나타내는 정수 x, y와 반지름 radius 필드를 가지는 Circle 클래스를 작성하고자 한다. 생성자는 3개의 인자(x, y, raidus)를 받아 해당 필드를 초기화하고, equals() 메소드는 두 개의 Circle 객체의 중심이 같으면 같은 것으로 판별하도록 한다.
public static void main(String[] args) {
Circle a = new Circle(2, 3, 5); // 중심 (2, 3)에 반지름 5인 원
Circle b = new Circle(2, 3, 30); // 중심 (2, 3)에 반지름 30인 원
System.out.println("원 a : " + a);
System.out.println("원 b : " + b);
if(a.equals(b))
System.out.println("같은 원");
else
System.out.println("서로 다른 원");
}
> 원 a : Circle(2,3)반지름5
> 원 b : Circle(2,3)반지름30
> 같은 원
5-1. Circle 클래스
public class Circle {
private int x, y, rad;
public Circle(int x, int y, int rad) {
this.x = x;
this.y = y;
this.rad = rad;
}
@Override
public String toString() {
return "Circle(" + x + ", " + y + ") 반지름 " + rad;
}
@Override
public boolean equals(Object obj) {
if ((this.x == ((Circle)obj).x)
&& (this.y == ((Circle)obj).y)) {
return true;
} else {
return false;
}
}
}
6. 문자열을 입력받아 한 글자씩 회전시켜 모두 출력하는 프로그램을 작성하라.(클래스로 작성할 필요없이 메인에서 직접 할것)
문자열을 입력하세요. 빈칸이나 있어도 되고 영어 한글 모두 됩니다. I Love you Love youI Love youI ove youI L ve youI Lo e youI Lov youI Love youI Love ouI Love y uI Love yo I Love you [Hint] Scanner.nextLine()을 이용하면 빈칸을 포함하여 한 번에 한 줄을 읽을 수 있다.
6-1. CircularQueue 클래스 (메인 클래스)
import java.util.InputMismatchException;
import java.util.Scanner;
public class CircularQueue {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("문자열을 입력하세요. 빈칸이 있어도 되고 영어와 한글 모두 됩니다.");
try { // 입력값 유효성 검사
String str = scanner.nextLine(); // 문자열 입력
for (int i = 0; i < str.length; i++) {
str = str.substring(1) + str.substring(0, 1);
System.out.println(str);
}
} catch (InputMismatchException e) {
System.out.println("잘못된 입력값 입니다! 다시 입력해주세요.");
}
scanner.close();
}
}
7. 래퍼 클래스란 무엇인가?
: 기본 자료형(Primitive Type)의 값을 인스턴스로 감싸는(Boxing) 목적의 클래스를 의미한다. 따라서 기본 자료형 7가지를 인스턴스로 감싸는 경우 다음과 같다.
(자료형 -> Boxing한 객체)
- boolean -> Boolean
- char -> character
- byte -> Byte
- short -> Short
- int -> Integer
- long -> Long
- float -> Float
8. auto unboxing 이란?
: 기존의 Boxing과 UnBoxing을 이용할 때 코드는 다음과 같았다.
Integer iObj = new Integer(10); // Boxing
int num = iObj.intValue(); // Unboxing
그러나 이러한 코드 구조로 인해 Wrapper 클래스의 이용이 복잡해져 이를 보완하기 위해 나온 기능이 Auto Boxing/Unboxing 구조이다.
Integer iObj = 10; // Auto Boxing
int num = iObj; // Auto Unboxing
Integer num = 10;
num++; // Auto Boxing과 Auto Unboxing을 동시에 진행
9. 다음 조건을 만족하는 클래스 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("최명태")));
9-1. Person 클래스
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this.name == ((Person)obj).name) {
return true;
} else {
return false;
}
}
}
10. 다음 조건을 만족하는 클래스 String의 객체 이용 프로그램을 작성하여 메소드 equals()와 연산자 ==의 차이를 비교 설명하시오.(필수)
- 메소드 equals()와 비교 연산자 ==의 차이를 다음 소스로 점검
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));
: 위 문제대로 코드를 작성한 결과는 다음과 같았다.
> false
> true
> true
> true
이러한 현상이 일어난 이유를 각각 분석해보자면
System.out.println(s1 == s2);
이 라인은 s1과 s2에 대한 객체 비교로 비교연산자(==)를 이용하였다. 그러므로 s1과 s2는 인스턴스의 내용이 같을지라도 각각 생성한 객체의 주소가 다르기 때문에 false를 리턴하였다.
System.out.println(s1.equals(s2));
이 라인은 s1과 s2에 대한 인스턴스의 내용을 비교하기 위해 equals를 이용하였다. 그러므로 s1과 s2는 각각 생성한 객체의 주소가 다르지만 인스턴스의 내용은 같으므로 true를 리턴하였다.
System.out.println(s2 == s3);
이 라인은 s2와 s3에 대한 객체 비교로 비교연산자(==)를 이용하였다. 그 전에 s3는 s2의 대한 내용을 대입 연산하였는데 이는 얉은 복사(Shallow Copy)에 해당된다. 따라서 두 변수 모두 같은 주소를 참조하므로 true를 리턴한다.
System.out.println(s2.equals(s3));
이 라인은 s2와 s3에 대한 인스턴스의 내용을 비교하기 위해 equals를 이용하였다. 언급했다시피 s3는 s2를 대입하여 얉은 복사를 하였기 때문에 인스턴스의 내용 또한 같아 true를 리턴한다.
11. 다음 조건을 만족하도록 오늘의 정보를 출력하는 프로그램을 작성하시오.
- 클래스 Calendar의 객체의 다음 메소드를 사용하며
- get(Calendar.DAY_OF_WEEK_IN_MONTH) : 달에서 요일의 횟수 반환
- get(Calendar.DAY_OF_WEEK) : 요일을 반환, 1이 일요일
- get(Calendar.WEEK_OF_MONTH) : 월의 주 횟수를 반환
- get(Calendar.DAY_OF_YEAR) : 해의 날짜를 반환
- get(Calendar.WEEK_OF_YEAR) : 해의 주 횟수를 반환
- 다음과 같이 출력되도록 한다.
> 오늘은 2012년 6월 17일 일요일입니다. > 이 달의 3번째 일요일입니다. > 이 달의 4번째 주입니다. > 이 해의 169일입니다. > 이 해의 25번째 주입니다.
11-1. 메인 클래스
import java.util.Calendar;
public class CalendarMain {
static Calendar calendar = Calendar.getInstance();
public static void main(String[] args) {
int year = calendar.get(Calendar.YEAR);
int mon = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int dowim = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH); // 달에서 요일의 횟수 반환
int wom = calendar.get(Calendar.WEEK_OF_MONTH); // 월의 주 횟수를 반환
int doy = calendar.get(Calendar.DAY_OF_YEAR); // 해의 날짜를 반환
int woy = calendar.get(Calendar.WEEK_OF_YEAR); // 해의 주 횟수를 반환
System.out.println("오늘은 " + year + "년 "+ (mon+1) + "월 " + day + "일 " + getDOW() +"요일입니다.");
System.out.println("이 달의 " + dowim + "번째 " + getDOW() +"요일입니다.");
System.out.println("이 달의 " + wom + "번째 주입니다.");
System.out.println("이 해의 " + doy + "일 입니다.");
System.out.println("이 해의 " + woy + "번째 주입니다.");
}
private static char getDOW() {
char result = 0;
int dow = calendar.get(Calendar.DAY_OF_WEEK); // 요일을 반환, 1이 일요일
switch (dow) {
case 1:
result = '일';
break;
case 2:
result = '월';
break;
case 3:
result = '화';
break;
case 4:
result = '수';
break;
case 5:
result = '목';
break;
case 6:
result = '금';
break;
case 7:
result = '토';
break;
}
return result;
}
}
'WebDev > 본과정' 카테고리의 다른 글
Generic 심화 및 컬렉션 프레임워크 개요 (0) | 2021.05.13 |
---|---|
Java의 기본 클래스 및 제네릭 개요 (0) | 2021.05.13 |
예외처리와 JVM 및 Object 클래스 (0) | 2021.05.13 |
인터페이스 심화 및 예외처리 (0) | 2021.05.12 |
객체 비교와 인터페이스 (0) | 2021.05.12 |
최근댓글