728x90

 

수업내용 정리 (Java)

 

1. 객체 비교

더보기
IntNumber num1 = new IntNumber(10);
IntNumber num2 = new IntNumber(10);

 

// == 연산자
if(num1 == num2) {
	System.out.println("참조값 비교");
}else {
	System.out.println("참조값이 다르다.");
}
  • 객체의 주소값(참조값)을 비교하는 역할

 

// .equals 메소드
if(num1.equals(num2)) {
	System.out.println("오버라이딩 전 참조값 비교, 오버라이딩 후 내용 비교");
}else {
	System.out.println("오버라이딩 전 참조값/후 내용이 다르다");
}
  • 객체를 비교할 때에는 오버라이딩하지 않는 이상 참조값을 비교하는 것이다.
  • 원래 equals 메소드의 경우, Object 클래스의 메소드라서 == 연산자와 동일하게 주소값을 비교하도록 하는 메소드지만 String 타입에서는 내용 비교가 가능한 이유가 String 클래스에서 Object 메소드를 오버라이딩했기 때문이다.
@Override
public boolean equals(Object obj) {
	IntNumber cmp = (IntNumber)obj;
	if(this.num == cmp.num) {
		return true;
	}
	return false;
}
  • 오버라이딩을 통해 내용 비교로 바꿀 수 있다.

 

 

// 예제
package part1;

class Book{
	private String title;	//책제목
	private String author;	//작가
	private int price;
	public Book(String title, String author, int price) {
		this.title = title;
		this.author = author;
		this.price = price;
	}
	
	@Override
	public String toString() {
		return " > title: "+title+"\t("+author+")";
	}

	@Override
	public boolean equals(Object obj) {
		Book book = (Book)obj;
		if(this.title.equals(book.title)
				&& this.author.equals(book.author)
				&& this.price == book.price) {
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
		return price%5;	//나머지 0~4(해시값)
	}
	
}

public class Ex01 {
	public static void main(String[] args) {
		Book b1 = new Book("삼국지","홍길동",1000);
		Book b2 = new Book("삼국지","홍길동",1200);
		Book b3 = new Book("삼국지","이순신",1000);
		
		System.out.println(b1 == b2);	// 참조값 비교
		System.out.println("참조값 주소\t"+System.identityHashCode(b1));
		System.out.println("해시 값\t"+b1.hashCode());
		
		if(b1.equals(b2)) {
			System.out.println("b1과 b2는 동일 도서");
		}else
			System.out.println("b1과 b2는 비동일 도서");
		if(b1.equals(b3)) {
			System.out.println("b1과 b3는 동일 도서");
		}else {
			System.out.println("b1과 b3는 비동일 도서");
		}
	}
}
  • hashCode(): 객체의 주소값을 변환하여 생성한 객체의 고유한 정수값 / 이 또한 오버라이딩해서 사용할 수 있다.
  • .equals를 오버라이딩해서 객체의 title, author, price가 셋 다 맞아야 같은 책이라는 조건을 넣었다.

 

 

2. int / Integer

더보기
  • int
  • 변수 타입
  • 자료형
  • 산술 연산 가능
  • null 값 지정 불가

 

  • Integer
  • 객체 타입
  • 래퍼클래스
  • Unboxing하지 않을 시 산술 연산 불가능 (지금은 자동으로 Boxing / Unboxing이 된다)
  • null 값 지정 가능

 

 

public class Ex01 {
	public static void main(String[] args) {
		Integer iInst = new Integer(10);
		Double dInst = new Double(3.14);
		
		iInst = new Integer(iInst.intValue()+10);
		System.out.println(iInst);
		System.out.println(dInst);
	}
}
  • Integer iInst = new Integer(10); 이 코드를 작성하면 취소선과 함께 노란색 밑줄이 쳐지는데 이클립스가 개선되면서 이렇게 풀어쓰지 않아도 된다는 뜻이므로 프로그램은 정상적으로 돌아간다. (Integer iInst = 10;과 동일한 코드) 밑의 Double도 동일
  • iInst = new Integer(iInst.intValue()+10); 이 코드를 작성해도 취소선과 함께 노란색 밑줄이 쳐진다. (iInst+=10;과 동일한 코드)

 

public class Ex02 {
	public static void main(String[] args) {
		Integer num1 = new Integer(10);
		Integer num2 = 10;
		
		if(num1 == num2) {
			System.out.println("참조값 비교");
		}else {
			System.out.println("참조값 다름");
		}
		if(num1.equals(num2)) {
			System.out.println("내용 비교");
		}else {
			System.out.println("내용 다름");
		}
	}
}
  • 콘솔창: 참조값 다름, 내용 비교 출력

 

 

3. 소수점 절대값 내기 (BigDecimal)

더보기
import java.math.BigDecimal;
import java.util.Scanner;

public class Ex04 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("5.5 입력> ");
		BigDecimal num1=new BigDecimal(sc.next());
		System.out.print("10.7 입력> ");
		BigDecimal num2=new BigDecimal(sc.next());
		
		System.out.println("절대값: "+num1.subtract(num2).abs());
	}
}
  • (아직 BigDecimal에 대해 잘 모르겠다.)
  • BigDecimal은 자바 언어에서 숫자를 정밀하게 저장하고 표현할 수 있는 유일한 방법이다. (참고)
  • .abs는 인자값에 대한 절대값을 반환해준다.

 

 

4. Random

더보기
Random rd = new Random();
  • Random 함수를 사용하기 위해서는 import해야한다.

 

// 선생님이 예제로 보여주신 방법
for(int i=0; i<5; i++) {
	System.out.print((int)(Math.random()*10)+" ");
}
// 기존에 내가 찾아뒀던 방법
for(int i=0; i<5; i++) {
	System.out.print(rd.nextInt(10)+" ");
}
  • (나는 내가 기존에 찾아뒀던 방법이 편하다고 생각한다.)

 

// 문제) 중복되지 않는 6개의 정수(1~14)를 배열에 저장 후 출력하시오
int[] a = new int[6];
		
for(int i=0; i<a.length; i++) {
	a[i] = rd.nextInt(13)+1;
	for(int j=0; j<i; j++) {
		if(a[i] == a[j]) {
			i--;
			break;
		}
	}
}
Arrays.sort(a);
for(int i=0; i<a.length; i++) {
	System.out.println(a[i]);
}
  • 랜덤한 숫자를 중복되지 않게 6개 뽑아내고, 배열에 저장해 출력하기
  • 첫번째 숫자(배열의 0번째 인덱스)를 뽑을 때는 그냥 뽑지만 두번째 숫자(배열의 1번째 인덱스)부터는 for문을 다시 돌려 i번째 인덱스와 j번째 인덱스가 같으면 i-1을 해주며 두번째 for문인 j for문을 종료하고 다시 큰 for문을 돌린다.
  • 배열에 숫자를 모두 저장하고 나면 Arrays.sort 함수를 이용하여 배열 내 숫자들을 순서대로 정리해줬다.
  • for문을 돌려 배열에 저장된 숫자들을 순서대로 출력했다.

 


 

질문한 내용이나 어려웠던 점 메모

1. BigDecimal

 


728x90