본문 바로가기
JAVA

[최상위클래스] Object클래스

by amoomar 2022. 1. 3.
반응형

 

Object클래스의 메소드 중 가장 많이 사용되는 to Stringequals에 대해 다루었다.

 

 


 

 

1. to String( );

 

Student stu1 = new Student();

system.out.println(stu1);

위와같은 코드가 출력이 되는 이유는 기본적으로 상속되는 최상위 클래스인 Object의 to String메서드를 자동사용하기 때문이다. 즉 system.out.println(stu1.toString);과 동일함을 인식해야한다.

 

그러하여 toString 메서드를 재정의( : overriding)하여 객체명 출력시 그 객체의 정보를 출력되도록 재정의 한다면, 기존에 사용하던 메서드(info(); 혹은 show();)를 사용하지 않아도 되기 때문에 메서드명과 메모리를 아낄 수 있다는 장점이 있다.

package class02;

class Student{
	String name;
	int score;	//입학점수
	
	Student (String name){	//전학생은 입학점수가 없으므로, 그를위한 생성자
		this(name, 0);
	}
	Student(String name, int score){
		this.name = name;
		this.score = score;
	}
	void info() {
		System.out.println(name + "학생은 " + score + "점 입니다.");
	}
	@Override //어노테이션, 어너테이션
	public String toString() {
		return "Student [name=" + name + ", score=" + score + "]";
	}
}
public class Test01 {

	public static void main(String[] args) {
		Student stu1 = new Student("김왕왕");
		Student stu2 = new Student("박엉엉", 100); //사용 않는 변수
		Student stu3 = new Student("이망망", 92); //사용 않는 변수
		
		//두개의 출력이 동일하므로, stu1뒤에 toString이 생략됨을 확인가능
		System.out.println(stu1);
		System.out.println(stu1.toString());
	}
}

syso(stu1)과 syso(stu1.toString)의 출력결과가 동일함을 확인할 수 있다.

* toString 재정의 단축키 : alt + shift + S + [제너레이션toString : 클릭] *

 

 

 


 

 

2. equals( );

 

주로 객체끼리의 값을 비교할때 많이 사용된다.(문자열끼리의 비교에는 굳이 사용할 필요가 없다.)

data[0] = sc.next();
data[1] = sc.next();

위의 예시처럼 입력을 받아 그 값을 객체에 저장하는 경우, 두 입력된 값이 같더라도 주소값이 다르기때문에 정확한 비교가 어렵다. 그 이유는 Object의 equals메서드가 사용되어 자동으로 주소값을 비교하기 때문이다. 이러한 경우로 정확한 값의 비교를 위해 equals를 재정의하여 사용한다. 단축키를 사용하게 되면 필요하지 않는 부분은 모두 삭제 가능하다. 이때 input과 return을 남기고 이외에는 삭제를 해주는 것이 바람직하다. 인자는 자동으로 Object obj로 설정이 되어있는데, 어떤 값이 들어올지 예측할 수 없으니 최상위클래스로 입력받는것이 좋다.

public boolean equals(Object obt : 뭐가 들어올지 몰라서 최상위 클래스를 입력 받자)
Point point = (Point)obt; -> 다운캐스팅인데 번역기를 속여서 이제 point.으로 사용 가능

if(지금 색상과 입력받은 색상이 같고, 비교할 x좌표와 입력받은 x좌료가 같으면){
	return true;
}
return false; //보통은 비교할 값이랑 입력받은 값이랑 다르다는 전제

이러한 풀이를 기반으로 예제 안에 풀이를 작성하자면 아래와 같다.

package class02;

import java.util.Scanner;

class Point{
	String color;
	int x;
	
	Point(){ //입력x시 기본값
		this("검정", 0);
	}
	
	Point(int x){ //좌표만 입력시 color기본값
		this("검정", x);
	}
	
	Point(String color){ //색상만 입력시 좌표 기본값
		this(color, 0);
	}
	
	Point(String color, int x){ //둘 다 입력시 입력받은 값으로,
		this.color = color;
		this.x = x;
	}

	@Override
	public String toString() {
		return color+"("+x+")";
	}
	 @Override
	   public boolean equals(Object obj) {
	      
	      Point point=(Point)obj;
	      // 다운 캐스팅 -> 컴파일시에는 문제가없으나, 실행시(런타임시)에 문제가 발생!
	      //  => 현재의 경우, 실제로 인자로 입력된 객체가 Point로 알맞기때문에 문제발생xxx
	      if(this.color.equals(point.color)&&this.x==point.x) {
	         return true;
	      }
	      return false;
	   }
}

public class Test02 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Point [] data = new Point[5];
		for(int i=0; i<data.length; i++) {
			System.out.println("색입력 : ");
			String color =sc.next();
			System.out.println("x좌표 입력 : ");
			int x = sc.nextInt();
			data[i] = new Point(color, x);
		}

		for(Point v:data) {
			System.out.println(v + " ");
		}
		
		if(data[0].equals(data[1])) {
			System.out.println("같다");
		}else {
			System.out.println("다르다");
		}
	}
}

* equals 재정의 단축키 : alt + shift + S + [제너레이션equals : 클릭] *

 

 

 


 

3. 예제_도서 대여 관리 프로그램 

 

package class02;

import java.util.Scanner;

class Book{
   String title;
   String writer;
   boolean check;
   Book(String title,String writer){
      this.title=title;
      this.writer=writer;
      this.check=true;
   }
   void f1() {
      if(!check) {
         System.out.println("대여중이라 대여불가능!");
         return;
      }
      check=false;
      System.out.println(title+" 대여완료!");
   }
   void f2() {
      if(!check) {
         check=true;
         System.out.println(title+" 반납완료되었습니다!");
         return;
      }
      System.out.println("이미 반납된 도서입니다.");
   }
   @Override
   public String toString() {
      if(check) {
         return "["+title+" | 대여가능]";
      }
      return "["+title+" | 대여중]";
   }
}
public class Test03 {
   public static void main(String[] args) {

      Scanner sc=new Scanner(System.in);
      Book[] data=new Book[3];
      data[0]=new Book("해리포터","JK롤링");
      data[1]=new Book("어린왕자","생텍쥐페리");
      data[2]=new Book("홍길동전","허균");

      while(true) {
         System.out.println("===============");
         System.out.println("1.대여 2.반납 3.확인 4.종료");
         System.out.print("입력: ");
         int act=sc.nextInt();
         System.out.println("===============");
         if(act==1) {
            System.out.print("대여할책? ");
            // 사용자가 직접 입력하는 부분들에 대해서 유효성 검사가 필요!!!
            String title=sc.next();
            boolean flag=false;
            // flag가 T : 책 존재
            // F : 존재xxx
            for(int i=0;i<data.length;i++) {
               if(title.equals(data[i].title)) {
                  flag=true; 
                  data[i].f1(); //있으면 바로 대여하도록
                  break;
               }
            }
            if(!flag) {
               System.out.println("해당 도서는 존재하지않습니다!");
            }
         }
         else if(act==2) {
            System.out.print("반납할책? ");
            String title=sc.next();
            boolean flag=false;
            // flag가 T : 책 존재
            // F : 존재xxx
            for(int i=0;i<data.length;i++) {
               if(title.equals(data[i].title)) {
                  flag=true;
                  data[i].f2();
                  break;
               }
            }
            if(!flag) { //책이 없으면
               System.out.println("해당 도서는 존재하지않습니다!");
            }
         }
         else if(act==3) {
            System.out.println("===도서 목록===");
            for(Book book:data) {
               System.out.println(book);
            }
         }
         else if(act==4) {
            break;
         }
         else { // 유효성 검사
            System.out.println("잘못입력하셨습니다!");
         }
         
      }
   }
}

정상출력 확인

반응형

'JAVA' 카테고리의 다른 글

[컬렉션프레임워크] 배열리스트  (0) 2022.01.11
자판기 만들기_재고와 PK  (0) 2022.01.10
[다형성] 추상클래스 & 인터페이스  (0) 2022.01.01
[다형성] 클래스배열 & Casting  (0) 2022.01.01
[상속] 상속과 Overriding  (0) 2022.01.01