본문 바로가기

말하는 감자 탈출하기

Java day7

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