[220929] Object 클래스, String 클래스

황준하·2022년 9월 29일
0

◆ Object 클래스

▶ Object 클래스 이해

  • Object 클래스는 java.lang 패키지에 들어있다.
  • 모든 클래스의 조상
  • => default생성자가 생성되듯이 컴파일 할때 자동으로 extends Object가 들어간다.

▶ 자주 쓰이는 Object 클래스 메소드

  • public boolean equals(Object obj) : obj가 이 객체와 같은지를 검사한다.
  • public String toString() : 객체의 문자열 표현을 반환한다.
  • protected Object clone() : 객체 자신의 복사본을 생성하여 반환한다.
  • public int hashCode() : 객체에 대한 해쉬 코드를 반환한다.
  • protected void finalize() : 가비지 콜렉터에 의하여 호출된다.
  • public final Class getClass() : 객체의 클래스 정보를 반환한다.

- Equals()

▶주소값 비교

package java_0929;

class Circle{
	private int radius;
	
	public Circle(int radius) {
		this.radius = radius;
	}
}

public class CircleTest {
	
	public static void main(String[] args) {
		Circle obj1 = new Circle(10);
		Circle obj2 = new Circle(10);
		if(obj1 == obj2) System.out.println("2개의 원은 같습니다.");
		else System.out.println("2개의 원은 같지 않습니다.");
	}
}

위 코드는 객체의 주솟값끼리 비교하게 되기 때문에 같지 않습니다.를 출력하게 된다.

System.out.println(obj1);
System.out.println(obj2);

java_0929.Circle@5d22bbb7
java_0929.Circle@41a4555e

▶직접 만든 equals

package java_0929;

class Circle {
	private int radius;

	public Circle(int radius) {
		this.radius = radius;
	}
	
	public int getRadius() {
		return radius;
	}
	
	public boolean equals(Circle c1) {
		if(this.radius == c1.getRadius())
			return true;
		else
			return false;
	}
}

public class CircleTest {

	public static void main(String[] args) {
		Circle obj1 = new Circle(10);
		Circle obj2 = new Circle(10);
		
		if (obj1.equals(obj2))
			System.out.println("2개의 원은 같습니다.");
		else
			System.out.println("2개의 원은 같지 않습니다.");
	}
}

▶Object클래스 사용 - Circle

package java_0929;

class Circle {
	...
	@Override
	public boolean equals(Object obj) {

		if (obj instanceof Circle) {
			Circle circle = (Circle) obj;
			if (this.radius == circle.getRadius())
				return true;
		}
		return false;

	}
}
...

이번에는 Object클래스 메소드를 Override해보았다.

  • 장점
    Object 클래스는 모든 개발자들이 알고 있는 것이기 때문에 많은 개발자들이 이 방식을 사용한다.
  • 정리
    함수 오버라이딩 + Object클래스가 최고 조상 + 다형성(Parameter 받을때) + instanceof + 다운 캐스팅

▶Object클래스 사용2 - INum

package java_0929;

class INum {
	private int num;

	public INum(int num) {
		this.num = num;
	}

	@Override
	public boolean equals(Object obj) {

		if (obj instanceof INum) {
			INum inum2 = (INum) obj;
			if (this.num == inum2.getNum())
				return true;
		}

		return false;

	}

	private int getNum() {
		return num;
	}
}

public class CircleTest {

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

		if (num1.equals(num3))
			System.out.println("num1, num3 내용 동일하다.");
		else
			System.out.println("num1, num3 내용 다르다.");
	}
}

- toString() 메소드

public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
  • toString()
    = 기본적으로 toString()을 정의하지 않아도 호출할 수 있다.
    = 자동적으로 Object 클래스를 상속받기 때문이다.

▶예시

public class CircleTest {

	public static void main(String[] args) {
		Object obj = new Object();
		System.out.println(obj.toString());
		System.out.println(obj);
	}
}

java.lang.Object@762efe5d
java.lang.Object@762efe5d

  • System.out.println(obj); 할때 obj는 어떤 타입으로 매개변수가 넘어갈까?
    => Object타입
  • 보통 toString()을 override해서 다른 용도로 많이 쓴다.
public class CircleTest {

	public static void main(String[] args) {
		Student s = new Student("홍길동", "남자");
		System.out.println(s);
	}
}
  • 위 같은 메인을 실행했을때, 아래와 같은 결과가 나오도록 class Student에서 toString 오버라이딩하기

    이름은 홍길동이고 성별은 남자입니다.

▶예시

package java_0929;

class Student {
	private String name, gender;

	public Student(String name, String gender) {
		this.name = name;
		this.gender = gender;
	}

	@Override
	public String toString() {

		return "이름은 " + name + "이고 성별은 " + gender + "입니다.";
	}
}

◆ String 클래스

▶ String 클래스 이해

private final byte[] value;

이와 같은 배열에 아스키 코드 값 형태로 저장된다.

▶ 많이 쓰는 String 메소드

▶ String 객체

- 객체 생성 2가지

2가지 방식으로 String을 객체를 생성할 수 있다.
▶사용예시

public static void main(String[] args) {
		String str = new String("아아아");
		String str1 = "아아아";
        char ch = '1';	//char형은 작은 따옴표
}

- 문자열 비교하기

public class Test {

	public static void main(String[] args) {
		String s1 = "Java";
		String s2 = "Java";
		String s3 = new String("Java");
		String s4 = new String("Java");
		if(s1 == s2)
			System.out.println("true");
		else
			System.out.println("false");
		if(s3 == s4)
			System.out.println("true");
		else
			System.out.println("false");
		if(s3.equals(s4))
			System.out.println("true");
		else
			System.out.println("false");
	}
}

true
false
true

  • String은 참조객체인데 true가 나오는 이유가 어떤걸까요?
    => String s1 = "Java"는 배열의 첫번째 인덱스를 저장하기 때문에 주소값이 아닌 J와 J를 비교하게 된다.

- 문자 추출

  • 문자열 해당 인덱스의 값을 반환한다.
package java_0929;

public class Test {

	public static void main(String[] args) {

		String subject = "자바 프로그래밍";
		char charValue = subject.charAt(3);
		System.out.println(charValue);
	}
}

- 문자열 안에서 단어찾기

  • 해당 단어의 인덱스를 반환한다.
  • 해당 단어가 없으면 -1을 반환한다.
public class Test {

	public static void main(String[] args) {

		String str = "the cat is on the table";
		int index = str.indexOf("table");
		if(index ==-1)
			System.out.println("table은 없습니다.");
		else
			System.out.println("table의 위치: " + index);
	}
}

- 문자열 길이

  • 문자열 길이를 반환한다.
package java_0929;

public class Test {

	public static void main(String[] args) {

		String str = "the cat is on the table";

		System.out.println(str.length());
	}
}

▶실습

public class Test {


	public static void main(String[] args) {

		String[] strArr = { "akbce", "봄", "가을" };

		System.out.println(stringCount(strArr));
	}

스트링 배열안에 있는 글자수의 합을 반환하는 stringCount 구현

	private static int stringCount(String[] strArr) {

		int total = 0;
		for (String str : strArr) {
			total += str.length();
		}
		return total;
	}

- 공백 잘라내기

  • trim()

- 문자열을 단어로 분리

  • split
package java_0929;

public class Test {

	public static void main(String[] args) {

		String[] tokens = "I am a boy".split(" ");
		
		for (String str : tokens) {
			System.out.println(str);
		}
	}
}

- valueof

  • 기본 타입값을 문자열로 반환

▶실습문제

Scanner를 이용하여 한 라인을 읽고, 공백으로 분리된 어절이 몇 개 들어 있는지 "그만"을 입력할 때까지 반복하는 프로그램을 작성하라.

package java_0929;

import java.util.Scanner;

public class Test {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		String str;
		
		while(true) {
			str = sc.nextLine();
			if(str.equals("그만")) {
				System.out.println("종료합니다.");
				break;
			}
			else {
				String[] token = str.split(" ");
				System.out.println("어절 개수는 "+token.length);
			}
		}
	}
}

◆과제

▶ buyer

package java_0929;

public class Test {

	public static void main(String args[]) {

		Buyer b = new Buyer();
		b.buy(new Tv());
		b.buy(new Computer());
		b.buy(new Tv());
		b.buy(new Audio());
		b.buy(new Computer());
		b.buy(new Computer());
		b.buy(new Computer());

		b.summary();

	}

}

class Buyer {
	int money = 1000;
	Product[] cart = new Product[3]; // 구입한 제품을 저장하기 위한 배열

	int i = 0; // Product배열 cart에 사용될 index

	void buy(Product p) {

		/*
		 * 
		 * (1) 아래의 로직에 맞게 코드를 작성하시오 . 
		 * 1.1 가진 돈과 물건의 가격을 비교해서 가진 돈이 적으면 메서드를 종료한다. 
		 * 1.2 가진 돈이 충분하면, 제품의 가격을 가진 돈에서 빼고 
		 * 1.3 장바구니에 구입한 물건을 담는다.(add 메서드 호출 )
		 * 
		 */
	}

	void add(Product p) {

		/*
		 * 
		 * 1.1 i의 값이 장바구니의 크기보다 같거나 크면 
		 * 	1.1.1 기존의 장바구니보다 2배 큰 새로운 배열을 생성한다. 
		 * 	1.1.2 기존의 장바구니의 내용을 새로운 배열에 복사한다. 
		 * 	1.1.3 새로운 장바구니와 기존의 장바구니를 바꾼다. 
		 * 1.2 물건을 장바구니(cart)에 저장한다. 그리고 i의 값을 1 증가시킨다.
		 * 
		 */

	} // add(Product p)

	void summary() {

		/*
		 * 
		 * 1.1 장바구니에 담긴 물건들의 목록을 만들어 출력한다 . 
		 * 1.2 장바구니에 담긴 물건들의 가격을 모두 더해서 출력한다. 
		 * 1.3 물건을 사고 남은 금액 를 출력한다(money).
		 * 
		 */

	} // summary()

}

class Product {

	int price; // 제품의 가격

	Product(int price) {

		this.price = price;

	}

}

class Tv extends Product {

	Tv() {

		super(100);

	}

	public String toString() {

		return "Tv";

	}

}

class Computer extends Product {

	Computer() {

		super(200);

	}

	public String toString() {

		return "Computer";

	}

}

class Audio extends Product {

	Audio() {

		super(50);

	}

	public String toString() {

		return "Audio";

	}

}

//[실행결과]
//
//잔액이 부족하여 Computer을/를 살 수 없습니다.
//구입한 물건 : Tv, Computer, Tv, Audio, Computer, Computer,
//
//사용한 금액 : 850
//남은 금액 : 150
//```
//
//### 풀이
//
//```

▶ 풀이

package java_0929;

public class Test {

	public static void main(String args[]) {

		Buyer b = new Buyer();
		b.buy(new Tv());
		b.buy(new Computer());
		b.buy(new Tv());
		b.buy(new Audio());
		b.buy(new Computer());
		b.buy(new Computer());
		b.buy(new Computer());

		b.summary();

	}

}

class Buyer {
	private int money = 1000;
	Product[] cart; // 구입한 제품을 저장하기 위한 배열

	private int cartSize = 3;
	private int i = 0; // Product배열 cart에 사용될 index

	Buyer() {
		cart = new Product[3];
	}

	void buy(Product p) {

		if (p.getPrice() <= money) {

			add(p);
			i++;
			money -= p.getPrice();
		} else
			System.out.println("잔액이 부족하여 " + p + "을/를 살 수 없습니다.");
	}

	void add(Product p) {

		if (cartSize <= i) {
			Product[] tmpCart = new Product[cartSize * 2];
			cartSize *= 2;

			for (int j = 0; j < i; j++) {
				tmpCart[j] = cart[j];
			}
			cart = tmpCart;

		}
		cart[i] = p;

	} // add(Product p)

	void summary() {
		int total = 0;
		for (int j = 0; j < i; j++) {
			System.out.print(cart[j] + ", ");
			total += cart[j].getPrice();
		}
		System.out.println();
		System.out.println("사용한 금액: " + total + "남은 금액: " + money);

	} // summary()

}

class Product {

	private int price; // 제품의 가격

	Product(int price) {

		this.price = price;

	}

	public int getPrice() {
		return price;
	}

}

class Tv extends Product {

	Tv() {

		super(100);

	}

	public String toString() {

		return "Tv";

	}

}

class Computer extends Product {

	Computer() {

		super(200);

	}

	public String toString() {

		return "Computer";

	}

}

class Audio extends Product {

	Audio() {

		super(50);

	}

	public String toString() {

		return "Audio";

	}

}

0개의 댓글