티스토리 뷰

학습정리-10-29.txt
0.00MB

1. Object클래스의 11개 함수를 나열해 보시오. (그중 우리가 외워야 할 함수들은 찍어 보세요 ㅎㅎ)

  • protected Object clone() : 해당 객체를 복사한다.
  • boolean equlas(Object obj) : 해당 객체와 전달받은 객체가 같은지 확인한다.
  • protected void finalize() : 해당 객체를 더 이상 참조하지 않아 가비지 컬렉터가 해당 객체를 메모리에서 없애기 위해 사용한다.
  • Class<T>getclass() : 해당 객체의 클래스 타입을 반환한다.
  • int hashCode() : 해당 객체의 해시 코드값을 반환한다.
  • void notify() : 해당 객체의 대기(wait)하고 있는 하나의 스레드를 다시 실행할 때 호출한다.
  • void notifyAll() : 해당 객체의 대기(wait)하고 있는 모든 스레드를 다시 실행할 때 호출한다.
  • String toString() : 해당 객체의 정보를 문자열로 반환한다.
  • void wait() : 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출한다.
  • void wait(long timeout) : 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지날 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.
  • void wait(long timeout, int nanos) : 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지나거나 다른 스레드가 현재 스레드를 인터럽트(interrupt) 할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.

11개의 함수 중 오버라이딩을 통해 가장 자주 사용되는 함수는 clone, equlas, toString이다.

▶ clone
clone 메소드를 호출하려면  Cloneable 인터페이스를 먼저 구현해야한다.Cloneable 인터페이스는 구현해야 할 추상 메소드가 없는 마커 인터페이스이다!
또 다른 객체 생성 방법 중 하나이다.

또한 clone을 사용하면 생성자가 호출되지 않는다.
생성자를 호출해서 메모리에 올리는 것이 아니라 복사할 객체에 저장되어 있는 010101덩어리를 그대로 복사해서다른 메모리 주소에 올린다.

 

 

 

 


2. equals 함수에 대하여 설명하시오.

객체가 들어가면 주소값을 비교한다. 객체 내용물 자체를 비교하기 위해서는 오버라이딩이 필요하다.
다만 String(문자열)의 경우 이미 오버라이딩이 돼 있기 때문에 equals를 사용하면 글자 그자체를 비교한다.

class Person{	
	public Person(String name) {
		
	}
}

public class EqualsTest {

	public static void main(String[] args) {

		Person park = new Person("park");
		Person yoon = new Person("yoon");
		String str = "Spring";
				
		boolean bool = park.equals(str);
		// 주소값을 비교하기 때문에 오류가 아니라 false 출력.
		System.out.println(bool);
		
		String str1 = new String("LLL");
		String str2 = new String("LLL");
		
		boolean bool2 = str1.equals(str2);
		System.out.println(bool2);
		// 주소값 비교라 false가 츨력될거 같지만.....true....
		// 폴리몰티즘을 이용한 오버라이딩이 적용되어 String에 equals를 사용할 경우
		// 직접적으로 글자를 비교한다.

	}
}
class INum{
	private int num;
	
	public INum(int num) {
		this.num = num;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(this.num == ((INum)obj).num)
			return true;
		else
			return false;
	}
	// 오버라이딩 적용해서 객체 내용물 비교하는 함수 생성
	// Object는 부모 클래스임으로 자식 클래스에 있는 내용을 불러오기 위해서는 
	// (INum)으로 강제 형변환 해줘야한다. (자식으로 강제 형변환)
// 자식 = (자식)부모 !!
	
}


public class EqualsExample {

	public static void main(String[] args) {
		INum num1 = new INum(10);
		INum num2 = new INum(12);
		INum num3 = new INum(10);		
		
		if(num1.equals(num2))
			System.out.println("num1, num2 내용 동일하다.");
		else
			System.out.println("num1, num2 내용 다르다.");
		
		// num1, num2 내용 다르다. 
		
		if(num1.equals(num3))
			System.out.println("num1, num3 내용 동일하다.");
		else
			System.out.println("num1, num3 내용 다르다.");
		
		// num1, num3 내용 동일하다.
		
	}
}

 

 

 

 


3. String 클래스 에서 문자열 비교시 equals를 쓰는 이유는?

String(문자열)의 경우 이미 오버라이딩이 돼 있기 때문에 equals를 사용하면 글자 그자체를 비교한다.

 

 

 



4. shallow copy, deep copy 의 차이는?

shallow copy(얕은 복사)는 해당 객체만 복사하여 새 객체를 생성한다. 복사된 객체 안의 인스턴스 변수는 원본 객체의 인스턴스 변수와 같은 메모리 주소를 참조한다.그래서 원본 객체나 복사 객체 둘 중 한 객체에서라도 인스턴스 변수 값이 변하면 두 객체 모두 변수 값이 같이 변경된다. 

 

Deep Copy(깊은 복사)는 해당 객체만 복사하는 것이 아니라 인스턴스 변수까지 복사해서 새 주소에 담는다. 그래서 얕은 복사와 다르게 인스턴스 변수 값이 한쪽을 따라 같이 변경되지 않고, 각 객체별로 따로 변경해 줄 수 있다.

 

 

 

 


5. 금일 배운 Rectangle의 shall copy 와 deep copy 일 때의 메모리 그림을 그려보시오.

 

 

 

 

 


6. 아래를 프로그래밍 하시오.
- 클래스 Person
* 필드 : 이름, 나이, 주소 선언
- 클래스 Student
* 필드 : 학교명, 학과, 학번, 8개 평균평점을 저장할 배열로 선언
* 생성자 : 학교명, 학과, 학번 지정
* 메소드 average() : 8개 학기 평균평점의 평균을 반환
- 클래스 Person과 Student 
- 프로그램 테스트 프로그램의 결과 : 8개 학기의 평균평점은 표준입력으로 받도록한다.
----------------------------------------
이름 : 김다정
나이 : 20

주소 : 서울시 관악구
학교 : 동양서울대학교
학과 : 전산정보학과
학번 : 20132222

----------------------------------------
8학기 학점을 순서대로 입력하세요

1학기 학점  → 3.37
2학기 학점  → 3.89
3학기 학점  → 4.35
4학기 학점  → 3.76
5학기 학점  → 3.89
6학기 학점  → 4.26
7학기 학점  → 4.89
8학기 학점  → 3.89
----------------------------------------
8학기 총 평균 평점은 4.0375점입니다.

import java.util.Scanner;

class Person {
	private String name, adress;
	private int age;

	public Person(String name, int age, String adress) {
		this.name = name;
		this.age = age;
		this.adress = adress;
	}

}

class Student extends Person {
	private String school, major;
	private int undergrad;
	private double[] avg = new double[8];

	public Student(String name, int age, String adress, String school, String major, int undergrad) {
		super(name, age, adress);
		this.school = school;
		this.major = major;
		this.undergrad = undergrad;
	}

	public double average(double[] avg) {
		for(int i = 0; i < avg.length; i++) {
			this.avg[i] = avg[i];
		}
		
		double sum = 0;
		for(int i = 0; i < avg.length; i++) {
			sum += avg[i];
		}
		
		return (sum / avg.length);
	}

}

class AverageTest {
	public static void main(String[] args) {
		Student stu = new Student("김다정", 20, "서울시 관악구", "동양서울대학교", "전산정보학과", 20132222);
		
		Scanner sc = new Scanner(System.in);
		
		double[] avg = new double[8];
		
		System.out.println("8학기 학점을 순서대로 입력하세요.");
		
		System.out.print("1학기 학점  → ");
		avg[0] = sc.nextDouble();
		
		System.out.print("2학기 학점  → ");
		avg[1] = sc.nextDouble();
		
		System.out.print("3학기 학점  → ");
		avg[2] = sc.nextDouble();
		
		System.out.print("4학기 학점  → ");
		avg[3] = sc.nextDouble();
		
		System.out.print("5학기 학점  → ");
		avg[4] = sc.nextDouble();
		
		System.out.print("6학기 학점  → ");
		avg[5] = sc.nextDouble();
		
		System.out.print("7학기 학점  → ");
		avg[6] = sc.nextDouble();
		
		System.out.print("8학기 학점  → ");
		avg[7] = sc.nextDouble();
		
		double avgtotal = stu.average(avg);
		
		System.out.println("8학기 총 평균 평점은 " + avgtotal + "점입니다.");

	}

}

왜 이따구로 만들었지................. 정신차려...ㅠㅠ

 

 

getter, setter 도 만들어 주는게 좋다! 실무에서는 getter, setter를 통해 값을 통제

학점 8개 담는 거 함수로......ㅠ

스캐너로 입력 받으니 예외가 발생할 수 있으니 try catch로 예외처리 해주기!

import java.util.Scanner;

class Person{
	private String name, address;
	private int age;
	
	public Person(String name, int age, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
	}
	
	public void print() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
		System.out.println("주소 : " +address);
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
}


class Student extends Person{
	private String uni;
	private String major;
	private int stuNum;
	
	private double[] grade = new double[8];

	public Student(String name, int age, String address, String uni, String major, int stuNum) {
		super(name, age, address);
		this.uni = uni;
		this.major = major;
		this.stuNum = stuNum;
	}
	
	@Override
	public void print() {
		super.print();
		System.out.println("학교 : " + uni);
		System.out.println("학과 : " + major);
		System.out.println("주번 : " + stuNum);
	}
	
	public double average() {
		double sum = 0;
		double avg = 0;
		
		for (double d : grade) {
			sum += d;
		}
		
		avg = sum / grade.length;
		
		return avg;
	}
	

	public String getUni() {
		return uni;
	}

	public void setUni(String uni) {
		this.uni = uni;
	}

	public String getMajor() {
		return major;
	}

	public void setMajor(String major) {
		this.major = major;
	}

	public int getStuNum() {
		return stuNum;
	}

	public void setStuNum(int stuNum) {
		this.stuNum = stuNum;
	}

	public double[] getGrade() {
		return grade;
	}

	public void setGrade(double[] grade) {
		this.grade = grade;
	}
	
	public void setGrade() {
		try {
			Scanner sc = new Scanner(System.in);
			System.out.println("8학기 학점을 순서대로 입력하세요.");
			
			for(int i = 0; i < grade.length; i++) {
				System.out.println((i + 1) + "학기 학점  → ");
				grade[i] = sc.nextInt();
			}
			
			// sc.close(); 이건 절대 넣지 말 것!
			
		} catch (Exception e) {
			System.out.println("잘못된 입력입니다. 다시 입력해 주세요.");
			setGrade(); // 다시 입력하도록 자기 자신 함수 호출.
		}
										
	}
				
}

public class StuTest {
	public static void main(String[] args) {
		Student stu = new Student("김다정", 20, "서울시 관악구", "동양서울대학교", "전산정보학과", 20132222);
		stu.print();
		
		stu.setGrade();
		
		System.out.println("8학기 총 평균 평점은 " + stu.average() + "점입니다.");
				
	}
}

 

 

 

 



7.철수 학생은 다음 3개의 필드와 메소드를 가진 4개의 클래스 Add, Sub, Mul, Div를 작성하려고 한다.
- int 타입의 a, b 필드: 2개의 피연산자
- void setValue(int a, int b): 피연산자 값을 객체 내에 저장한다.
- int calculate(): 클래스의 목적에 맞는 연산을 실행하고 결과를 리턴한다.

곰곰 생각해보니, Add, Sub, Mul, Div 클래스에 공통된 필드와 메소드가 존재하므로 새로운 추상 클래스 Calc를 작성하고,
 Calc를 상속받아 만들면 되겠다고 생각했다. 
그리고 main() 메소드에서 다음 실행 사례와 같이 2개의 정수와 연산자를 입력받은 후, 
Add, Sub, Mul, Div 중에서 이 연산을 처리할 수 있는 객체를 생성하고 setValue() 와 calculate()를 호출하여 
그 결과 값을 화면에 출력하면 된다고 생각하였다. 

철수처럼 프로그램을 작성하라.(예외처리 구문도 넣어 주세요^^)

두 정수와 연산자를 입력하시오 >> 5 7 +

import java.util.Scanner;


abstract class Calc{
	final int A = 0;
	final int B = 0;
	
	abstract void setValue(int A, int B);
	
	abstract int calculate();
}

class Add extends Calc{
	private int a, b;
	
	@Override
	public void setValue(int a, int b) {
		this.a = a;
		this.b = b;
	}

	@Override
	public int calculate() {
		return (a + b);
	}
	
}

class Sub extends Calc{
	private int a, b;
	
	@Override
	public void setValue(int a, int b) {
		this.a = a;
		this.b = b;	
	}

	@Override
	public int calculate() {
		return (a - b);
	}
	
}

class Mul extends Calc{
	private int a, b;
	
	@Override
	public void setValue(int a, int b) {
		this.a = a;
		this.b = b;		
	}

	@Override
	public int calculate() {
		return (a * b);
	}
	
}

class Div extends Calc{
	private int a, b;
	
	@Override
	public void setValue(int a, int b) {
		this.a = a;
		this.b = b;		
	}

	@Override
	public int calculate() {
		return (a / b);
	}
	
}


class ArithmeticTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("두 정수와 연산자를 입력하시오 >> ");
		
		try {
			int num1 = sc.nextInt();
			int num2 = sc.nextInt();
			String op = sc.next();
			
			switch(op) {
			case "+":
				Add add = new Add();		
				add.setValue(num1, num2);
				System.out.println("계산 결과 : " + add.calculate());
				break;
			
			case "-":
				Sub sub = new Sub();		
				sub.setValue(num1, num2);
				System.out.println("계산 결과 : " + sub.calculate());
				break;
				
			case "*":
				Mul mul = new Mul();		
				mul.setValue(num1, num2);
				System.out.println("계산 결과 : " + mul.calculate());
				break;	
				
			case "/":
				Div div = new Div();		
				div.setValue(num1, num2);
				System.out.println("계산 결과 : " + div.calculate());
				break;	
			
			default :
				System.out.println("잘못된 입력입니다.");
			} 
			
		}
		catch (Exception e) {			
			System.out.println("잘못된 입력입니다.");
			e.printStackTrace();
		}
								
	}

}

abstract 함수(추상 함수)에 변수는 상수만 들어갈 수 있다! final.....

 

공통으로 들어가는 함수는 무조건 부모 클래스로 빼서 폴리몰티즘을 활용해야 한다.(인터페이스나 추상 클래스)

import java.util.Scanner;

abstract class Calc{
	protected int a; // 상속할꺼니까 protected!
	protected int b;
	
	void setValue(int a, int b) {
		this.a = a;
		this.b = b;
	}
	
	abstract int calculate();
	
}

class Add extends Calc{
	
	@Override
	int calculate() {
		return super.a + super.b;
	}
		
}

class Sub extends Calc{
	
	@Override
	int calculate() {
		return super.a - super.b;
	}
		
}

class Mul extends Calc{
	
	@Override
	int calculate() {
		return super.a * super.b;
	}
		
}

class Div extends Calc{
	
	@Override
	int calculate() {
		return super.a / super.b;
	}
		
}

public class CalTest {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("두 정수와 연산자를 입력하시오 >> ");
		
		int a = sc.nextInt();
		int b = sc.nextInt();
		
		String op = sc.next();
		
		Calc cal = null;
		
		switch (op) {
		case "+":
			cal = new Add();
			break;
		case "-":
			cal = new Sub();
			break;
		case "*":
			cal = new Mul();
			break;
		case "/":
			cal = new Div();
			break;	

		default:
			System.out.println("잘못된 연산자 입니다.");
		}
		
		cal.setValue(a, b);
		System.out.println(cal.calculate());
				
	}
}

 

 

 



8. 문자열을 입력 받아 한 글자씩 회전시켜 모두 출력하는 프로그램을 작성하라.
(클래스로 작성할 필요없이 메인에서 직접 할것)
[Hint] Scanner.nextLine()을 이용하면 빈칸을 포함하여 한 번에 한 줄을 읽을 수 있다.
문자열을 입력하세요. 빈칸이나 있어도 되고 영어 한글 모두 됩니다.
힌트 : substring 함수를 활용
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
```

import java.util.Scanner;

class TextRotation {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("문자열을 입력하세요.");
		String str = sc.nextLine();
		
		for(int i = 0; i < str.length(); i++) {
			
			if(i == 0) {
				System.out.println(str.substring(i));
				continue;
			}
			else{
				System.out.println(str.substring(i) + str.substring(0, i));
				continue;
			}  // else if((i > 0) && (i < str.length()))로 해도 같은 결과 출력
          									
		}
		
		System.out.println(str);
				
	}

}

 

substring(0,0)은 출력값이 없다.

public class StringRotation {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("문자열을 입력하세요. 빈칸이나 있어도 되고 영어 한글 모두 됩니다.");
		String input = sc.nextLine();
		
		for(int i = 0; i <= input.length(); i++) {
			System.out.print(input.substring(i));
			System.out.println(input.substring(0, i));
		}
				
	}
}

 


이클립스 창시자 : 에릭 감마 → 디자인 패턴이라는 저서(소프트웨어 개발 서적) 때문에 유명....대학원, 대학생 필수 교재........,

소프트웨어 개발 4대 거성 : 제임스 고슬링, 에릭 감마, ....

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함