11. 기본 클래스 이해하기
Object 클래스의 특징과 tostring()을 코딩에 활용하기
equals() 메서드의 특징과 hashCode()의 관계 활용하기
String 클래스의 특징과 연결 시 단점에 대해 이해하고 대안책 활용하기
java.lang
java.lang 패키지는 기본적으로 임포트를 하고 있어서 모두 사용할 수 있다
모든 클래스는 object클래스의 상속을 받는다. extends object가 생략되어있음
String 타입을 선언할 때 사용한 String도 어떤 임포트도 없이 사용할 수 있는 것은 java.lang 패키지가 자동으로 임포트되기 때문
Object클래스의 equals, hashCode, toString 등의 메서드를 주로 재정의해서 사용한다
* final 키워드가 있는 메서드들은 재정의할 수 없다
package object;
public class Student {
String name;
int studentId;
public Student(String name, int studentId) {
this.name=name;
this.studentId=studentId;
}
}
package object;
public class StudentTest {
public static void main(String[] args) {
Student studentKim = new Student("Kim",1001);
System.out.println(studentKim);
// object.Student@7852e922
String str=new String("test");
// java.lang의 String은 객체가 문자열로 출력되도록 정의된 toString이 있음
System.out.println(str);
// test
}
}
-> 주소가 아닌 값을 출력하기위해서 toString메서드를 오버라이드한다
@Override
public String toString() {
return name+","+studentId;
}
-> Kim,1001 로 출력물이 변환된다
equals
Student s1= new Student();
Student s2=s1;
System.out.println(s1==s2); // true
System.out.println(s1.equals(s2)); // true
두개의 레퍼런스가 같을 때(heap memory의 주소) TRUE를 반환함
*별개의 인스턴스도 같다고 정의할 수 있는 경우가 있음 -> 논리적으로 같은 경우
두 학생의 학번이 같은 경우 같은 학생으로 생각해야함 = 논리적인 같음을 재정의해야함
package object;
public class StudentTest {
public static void main(String[] args) {
Student studentKim = new Student("Kim",1001);
System.out.println(studentKim);
String str=new String("test");
System.out.println(str);
String str2=new String("test");
System.out.println(str==str2); // false
System.out.println(str.equals(str2)); // true -> String에 equals 메서드는 이미 오버라이드되어있어서 참값을 반환함
}
}
equals 메서드 재정의
package object;
public class Student {
String name;
int studentId;
public Student(String name, int studentId) {
this.name=name;
this.studentId=studentId;
}
@Override
public String toString() {
return name+","+studentId;
}
// 객체가 문자열로 변환되야할 때 사용됨
@Override
public boolean equals(Object obj) {
if(obj instanceof Student) {
Student std=(Student)obj;
// 인자로 들어온 obj는 Object클래스의 인스턴스?이므로 다운캐스팅해야 Student의 매개변수인 studentId를 사용할 수 있음
if(this.studentId==std.studentId) {
return true;
}
else return false;
}
else return false;
}
}
package object;
public class StudentTest {
public static void main(String[] args) {
Student studentKim = new Student("Kim",1001);
Student studentKim2 = new Student("Kim",1001);
System.out.println(studentKim==studentKim2); // false 주솟값이 같지 않으므로
System.out.println(studentKim.equals(studentKim2)); // true ->equals메서드를 학번이 같은 경우 true값을 반환하도록 재정의하였으므로
}
}
hashCode()
두 객체가 동일할 때 같은 hashCode를 가짐
두 객체가 '논리적으로 동일하다'를 만족하기 위해서는 같은 hashCode를 가져야함
앞선 예제의 student해시코드를 출력해보면 값이 다른데, 이것도 재정의해줘야 논리적으로 동일함을 완성할 수 있음
System.out.println(studentKim.hashCode()); // 2018699554
System.out.println(studentKim2.hashCode()); // 1311053135
equals에서 사용했던 동일하기 위한 조건(studentId)을 그대로 사용해서 재정의한다
@Override
public int hashCode() {
return studentId;
}
주솟값(해시코드값)이 정말 같아지는 게 아니라 같은 값을 넣어주는 것
-> 실제 주소를 찾으려면
System.identityHashCode(변수명); 메소드를 사용한다
String Class
immutable type의 자료형으로 한번 생성하면 불변함
-> 문자열을 계속 연결하면 메모리에 garbage가 생김
-> StringBuilder, StringBuffer(멀티 스레드에서 동기화 제공 )클래스를 사용하는 것을 권장함
가변적인 배열 char[] 배열을 가지고 있음
'말하는 감자 탈출하기' 카테고리의 다른 글
| Java day9 (0) | 2023.05.14 |
|---|---|
| Java day8 (1) | 2023.05.13 |
| java를 해야하는데 ㅎㅅㅎ (0) | 2023.05.07 |
| 감자의 에러 (0) | 2023.05.04 |
| JNDI에 대해 알아보자 (0) | 2023.04.29 |