일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Java업캐스팅
- Java추상클래스
- Java 추상 메서드
- 자바 제어문
- 오라클
- nodejs
- 자바 내부 클래스
- 자바 추상메서드
- Java 내부 클래스
- Express
- DBMS
- oracle
- java super( )
- 자바 Wrapper클래스
- 자바 Random클래스
- 자바 try-catch
- database
- Java thorw
- Java객체배열
- 자바 문자열 클래스
- Java try-catch
- Java다운캐스팅
- Java문자열 클래스
- 자바 예제
- 자바 String클래스
- 코딩
- 자바 스트링클래스
- dbeaver
- db
- 데이터베이스
- Today
- Total
코딩이란 무엇일까
Java/자바 [14일차] (2)-Object 클래스 본문
글을 읽기 전 필자는 아직 코딩을 배우는 단계이므로 글의 내용이 부정확할 수 있습니다.
여러 가지 글과 책, 수업을 바탕으로 정리한 내용이니 알맞지 않은 내용이 있다면 댓글 남겨주시면 수정하겠습니다.
Object클래스란?
object클래스는 자바의 최상위 클래스를 뜻합니다.
클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않더라도
암시적으로 java.lang.Object 클래스를 상속하고 있습니다.
그림으로 표현하면 대강 이러한 구조를 갖고 있습니다.
위에 표현한 3개의 클래스 말고도
더 많은 클래스가 Object클래스를 상속하고 있죠
Object 클래스의 메서드
Object클래스는 다양한 메서드가 있습니다.
그중 대표적인 메서드인
equals( ), hashCode( ), toString( ) 메서드에 대해 다루어 보겠습니다.
객체 비교 (equals( ) )
equals( ) 메서드는 Object클래스의 메서드 중 하나입니다.
equals( ) 메서드는 비교 연산자인 ==과 동일한 결과를 리턴합니다.
두 객체가 동일한 객체라면 true 그렇지 않다면 false를 리턴합니다.
Animal a1= new Animal();
Animal a2= new Animal();
System.out.println(a1.equals(a2));
//동일한 객체가 아니기에 결과 :false
equals( )메서드는 주로 두 객체를 동등 비교할 때 사용합니다.
두 객체를 비교해서 논리적으로 동등하면 true를 리턴, 그렇지 않으면 false를 리턴합니다.
❗논리적으로 동등하다는 것은 같은 같은 객체가 건 다른 객체이건 상관없이 객체가 저장하고 있는 데이터가 동일 함을 뜻합니다.
따라서 equals( )메서드를 재정의 하지 않고 쓴다면 단순히 == 비교 연산자를 사용하는 것인데
저희가 문자열을 비교할 때 equals( ) 메서드를 사용하는데
분명 객체는 다른데 값이 같으면 true를 리턴합니다.
이 또한 String클래스 내부에서
equals( )메서드를 오버라이드 했기에 가능한 이야기입니다.
Object클래스의 equals메서드
public boolean equals(Object obj) {
return (this == obj);
}
위의 equals메서드는 Object클래스에서 정의된 메서드입니다.
String 클래스에서 재정의된 equals메서드
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
String클래스에서 재정의된 equals( ) 메서드를 보시면
위의 Object클래스의 equals메서드와 많이 다른 것을 볼 수 있습니다.
이렇든 저희는 equals( ) 메서드를 재정의하여 객체의 논리적으로 동등한 지를 알 수 있습니다.
equals메서드 재정의 해보기
Member클래스 부분
class Member{
private final int id;
private final String name;
private final int age;
private final boolean isAdult;
public Member(int id,String name,int age,boolean isAdult) {
this.id=id;
this.name=name;
this.age=age;
this.isAdult=isAdult;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
public boolean isAdult() {
return isAdult;
}
equals( )메서드 재정의 부분
@Override
public boolean equals(Object obj) {
if(this==null) return false;
if(this == obj) return true;
Member m=(Member)obj; //매개변수 Object는 모든 타입이 가능한 인자가 될수 있다.
return this.name.equals(m.name) && this.age==m.age && this.id==m.id&&this.isAdult==m.isAdult;
}
equals( )메서드를 재정의 해보았습니다.
return 부분 위에는 매개변수로 받아온 타입을
Member 타입으로 강제 형 변환해주어야
필드를 사용할 수 있기에 강제 형 변환을 해주었습니다.
return부분이 가장 중요한데
return에 모든 필드 값이 동일한지 검사한 뒤
동일하다면 true를 리턴하게 메서드를 재정의 해주었습니다.
Main메서드
public static void main(String[] args) {
Member sana = new Member(12,"사나",24,true);
Member sana2= new Member(12,"사나",24,true);
//재정의된 equals( )메서드 확인
System.out.println(sana.equals(sana2));
System.out.println(sana2.equals(sana));
//결과 값 : true, true
}
객체 해시 코드 (hashCode( ))
객체 해시 코드란 객체를 식별하는 하나의 정수 값을 말합니다.
hashCode( ) 객체의 메모리 번지를 이용해서 해시 코드를 만들어 리턴합니다.
따라서 객체마다 다른 값을 가지고 있습니다.
hashCode( ) 메서드 또한 논리적으로 동등한지 비교를 할 때 메서드를 재정의 할 필요가 있습니다.
hashCode( )메서드 재정의 해보기
위의 클래스를 이어서 하겠습니다.
@Override
public int hashCode() { //객체의 주소공간은 달라도 필드 값(data)이 같으면 동일한 해시코드 생성
return Objects.hash(name)+Objects.hash(age)+Objects.hash(id)+Objects.hash(isAdult);
}
Objects.hash( )는 필드의 데이터를 해시 코드를 만들어 정수형 타입으로 리턴해줍니다.
Main 메서드
Member sana = new Member(12,"사나",24,true);
Member sana2= new Member(12,"사나",24,true);
//재정의된 hashCode( ) 메섣 확인
//10진수와 16진수로 확인
System.out.println(sana.hashCode()+","+Integer.toHexString(sana.hashCode()));
System.out.println(sana2.hashCode()+","+Integer.toHexString(sana.hashCode()));
출력 결과
위의 결과를 보면 sana와 sana2는 서로 다른 객체임에도 불구하고 같은 해시 코드가 나온 것을 볼 수 있습니다.
toString( ) 메서드
Object의 클래스인 toString( ) 메서드는 객체의 문자 정보를 리턴합니다.
여기서 문자 정보는 객체를 문자열로 표현한 값입니다.
재정의를 안 한 메서드의 리턴 값은 ‘클래스 이름’ @16진수 해시 코드로 구성된 문자정보를 리턴합니다.
toString메서드로 객체 정보 출력해보기
public static void main(String[] args) {
Member sana = new Member(12,"사나",24,true);
Member sana2= new Member(12,"사나",24,true);
System.out.println(sana.toString());
System.out.println(sana2.toString());
}
출력 결과
출력 결과를 보시면 패지키명. 클래스 이름@16진수의 해시 코드로 이루어진 것을 확인할 수 있습니다.
하지만 자바 애플리케이션에서는 별로 값 어치가 없는 정보이므로
toString메서드를 재정의하여 좀 더 필요한 정보를 리턴할 수 있습니다.
toString( ) 메서드 재정의
@Override
public String toString() {
return "Member [id=" + id + ", name=" + name + ", age=" + age + ", isAdult=" + isAdult + "]";
}
toString메서드를 재정의하여 객체의 필드 값을 출력할 수 있게 재정의 해주었습니다.
Main 메서드
public static void main(String[] args) {
Member sana = new Member(12,"사나",24,true);
Member sana2= new Member(12,"사나",24,true);
System.out.println(sana.toString());
System.out.println(sana2.toString());
}
출력 결과
'국비지원수업' 카테고리의 다른 글
Java/자바[15일차](2)-ArrayList 예제 (0) | 2022.11.09 |
---|---|
Java/자바 [15일차] (1)-컬렉션 프레임워크 , List (0) | 2022.11.09 |
Java/자바 [14일차] (1)-추상 클래스,추상 메서드 (0) | 2022.11.08 |
Java/자바 [13일차] (1)-메서드 오버라이딩(Overriding) (0) | 2022.11.07 |
Java/자바 [프로그래머스 문제] (Lv.0 7의 개수), (Lv1.부족한 금액 계산하기) , (Lv1.없는 숫자 더하기) (0) | 2022.11.06 |