일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- boxing
- 내장객체
- maven
- start.spring.io
- https://start.spring.io
- 컬렉션
- 스프링
- Scanner
- Jenkins
- 제너릭
- 자동형변환
- 메소드
- 루프
- 싱글턴
- 무한
- 인텔리제이
- suvlet
- dependency
- 클래스
- bootstrap
- 빌드
- Java
- 언박싱
- Short
- 제네릭
- unboxing
- 콜렉션
- wrapper
- 박싱
- 싱글톤
- Today
- Total
Developer Gonie
[3주차] 58. Object 클래스에 존재하는 equal(), toString() 메소드 오버라이딩*** 본문
[3주차] 58. Object 클래스에 존재하는 equal(), toString() 메소드 오버라이딩***
이대곤 2022. 6. 2. 09:48* Object 클래스란?
클래스 작성시 혹은 자바에 존재하는 모든 클래스는 명시해주지 않아도 자동적으로 extends Object 가 붙으며
모든 클래스가 Object 클래스를 상속받게 된다. 즉, Object 클래스는 모든 클래스의 최상위 부모인 것이다.
Object 는 멤버함수를 가지고 있는데 보통 이를 오버라이딩 해서 사용하게 된다.
아래는 자주 오버라이딩 되어 사용되는 Object의 equals(), toString() 메소드이다.
또한, 따로 import 해주지 않아도 이 클래스의 메소드를 사용할 수 있는데,
이건 Object 클래스가 java.lang 패키지에 존재하기 때문임
* Object 클래스의 equal() 메소드
Object 클래스의 equal() 메소드는 두 객체의 주소를 비교하여 그 주소가 같다면 true, 다르면 false를 반환한다.
== 연산자도 Object 클래스의 equal() 메소드와 같게 객체가 인자로 주어지면 주소를 비교하여 그 결과를 반환함.
사용자 입장에서 보통 객체가 같은지 다른지를 볼 때 주소를 비교하기보다는 객체 내부의 값을 비교해서 판단하고 싶기
때문에 오버라이딩되어 사용된다. 이 메소드를 오버라이딩 해서 사용할 때는 주의할 점이 있다.
매개변수로 Object 타입의 객체를 받고 있기 때문에 다형성에 의해 모든 클래스의 객체가 들어올 수 있는데, 이것 때문에
실행부에서 instanceof 로 원하는 타입이 맞는 경우에만 작동하도록 해줘야 한다.
class Object{
public boolean equals(Object obj){
...
}
}
* Object 클래스의 toString() 메소드
Object 클래스의 toString() 메소드는 주소를 반환하는데, 별 의미없는 정보라서 보통 오버라이딩 하여 사용된다.
class Object{
public String toString(){
...
}
}
1. Object 클래스의 equal() 메소드 오버라이딩 예시
class Fruit2 { // 모든 클래스는 Object 클래스를 자동으로 상속받음 "extends Object"
String name;
int price;
Fruit2(String name, int price) {
this.name = name;
this.price = price;
}
// Object 클래스로부터 상속받은 equal() 메소드 오버라이딩
public boolean equals(Object obj) {
if(obj instanceof Fruit2) {
Fruit2 fr2 = (Fruit2)obj;
//여기서의 equals는 String의 equals() 메소드로 객체 내부의 값을 비교한 결과가 반환되어 Object 클래스의 equals() 와 다름
return this.name.equals(fr2.name);
}else {
return false;
}
}
}
public class Ex08_01_Equals {
public static void main(String[] args) {
// case1.
// "apple" 은 new String("apple")과 같은데 new를 사용하지 않고 아래와 같이 연달아 같은걸 만들라고 하면
// 새로운 객체를 만드는게 아니라 이미 존재하는 것의 주소를 그냥 가리키게 됨
String s = "apple";
String s2 = "apple"; // 같은 "apple" 문자열이므로 효율상 새로운 공같에 다시 안만들고 미리 존재하는 "apple" 의 주소를 가리키게됨.
System.out.println(s == s2); // 주소비교 : 결과값 true
// case2.
// new 를 사용하여 같은 문자열로 객체를 생성하면 서로 다른 주소공간에 2개의 객체가 만들어짐
s = new String("apple");
s2 = new String("apple");
System.out.println(s == s2); // 주소비교 : 결과값 false
System.out.println();
// case1과 같은 방식으로 작동하는 경우
Fruit2 f1 = new Fruit2("apple", 1000); // 객체 내부에서 new String("apple")를 통해 객체가 생성되어 같은 예제가 되는 것임
Fruit2 f2 = new Fruit2("apple", 2000);
System.out.println(f1.name == f2.name); // 주소비교 : 결과값 true
System.out.println(f1.price == f2.price); // 주소비교 : 결과값 false
System.out.println();
// case2와 같은 방식으로 작동하는 경우
Fruit2 f3 = new Fruit2(new String("apple"), 1000);
Fruit2 f4 = new Fruit2(new String("apple"), 2000);
System.out.println(f3.name == f4.name); // 주소비교 : 결과값 false
System.out.println(f3.price == f4.price); // 주소비교 : 결과값 false
System.out.println();
System.out.println(f1.equals(f2)); // 내부의 값비교 : 결과값 true
}
}
실행결과
true
false
true
false
false
false
true
2. Object 클래스의 toString() 메소드 오버라이딩 예시
class Fruit { // 모든 클래스는 Object 클래스를 자동으로 상속받음 "extends Object"
private String name;
int price;
Fruit(String name, int price) {
this.name = name;
this.price = price;
}
String getName() {
return this.name;
}
int getPrice() {
return this.price;
}
// Object 클래스로부터 상속받은 toString() 메소드 오버라이딩
public String toString() {
return name + "," + price;
}
}
public class Ex08_01_ToString {
public static void main(String[] args) {
Fruit f1 = new Fruit("apple", 1000);
Fruit f2 = new Fruit("orange", 2000);
System.out.println(f2.getName() + ":" + f2.getPrice());
System.out.println();
System.out.println(f1.toString());
System.out.println();
System.out.println(f1); // 객체 출력을 시도하면 자동으로 객체의 toString() 메소드가 호출됨
}
}
실행결과
orange:2000
apple,1000
apple,1000
'K-DigitalTraining 강의 > 1. Java' 카테고리의 다른 글
[3주차] 60. String 클래스의 멤버함수(메서드) 한방에 정리*** (0) | 2022.06.02 |
---|---|
[3주차] 59. String 클래스의 equals(), toString() 메소드는 Object 클래스의 메소드를 오버라이딩 하여 구현된 것*** (0) | 2022.06.02 |
[3주차] 57. 익명클래스, 존재하는 클래스의 메서드를 1회성으로 오버라이딩 혹은 새로운 메소드를 추가해서 사용. 혹은 인터페이스 혹은 추상클래스의 미완성된 추상메소드를 완성 (0) | 2022.06.02 |
[3주차] 56. 이너클래스(=중첩클래스), 클래스 내부에 선언한 클래스 (0) | 2022.06.02 |
[2주차] 55. 난수, 1~100 사이의 정수 난수를 반환받는 방법 (0) | 2022.06.02 |