Language/Java

java.lang패키지와 유용한 클래스

JUNGKEUNG 2021. 10. 3. 22:34
반응형

Object클래스


  • 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다

참고 자료: 자바의 정석

 

 

 

equals(Object obj)


  • 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false
  • Object클래스의 equals()는 객체의 주소를 비교 (참조변수 값 비교)
class EqualsEx1 {
	public static void main(String[]args) {
		Value v1 = new Value(10);
		Value v2 = new Value(10);

		if ( v1.equals(v2)) {
			System.out.println("v1과 v2는 같습니다.");
		} esle {
			System.out.println("v1과 v2는 다릅니다.");
		}

		v2 = v1;

		if (v1.equals(v2)) {
				System.out.println("v1과 v2는 같습니다.");
		} else {
				System.out.println("v1과 v2는 다릅니다.");
		}
	} //main
} 

class Value {
	int value;

	Value(int value) {
			this.value =value;
	}
}
  • equlas메서드로 Value인스턴스가 가지고 잇는 value값을 비교 하도록 할 수는 없을까? Value클래스에서 equals메서드를 오버라이딩하여 주소가 아닌 객체에 저장된 내용을 비교하도록 변경
  • class Person {
    	long id;
    
    	public boolean equals(Object obj) {
    		if(obj!=null && obj instanceof Person) {
    			return id == ((Person)obj).id;
    		} else {
    			return false;
    		}
    	}
    
    	Person(long id){
    				this.id =id;
    		}
    }
    
    class EqualsEx2 {
    		public static void main(String[] args) {
    			Person p1 = new Person(8011081111222L);
    			Person p2 = new Person(9011091111222L);
    
    			if(p1==p2)
    				System.out.println("p1과 p2는 같은 사람입니다.");
    			else
    				System.out.println("p1과 p2는 다른 사람입니다.");
    
    			if(p1.equals(p2))
    				System.out.println("p1과 p2는 같은 사람입니다.");
    			else
    				System.out.println("p1과 p2는 다른 사람입니다.");
    	}
    }

 

 

 

hashCode()


  • 객체의 해시코드(hash code)를 반환하는 메서드
  • Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
  • equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 한다.
  • equals()의 결과 true인 두 객체의 해시코드는 같아야 하기 때문
public class HashCodeEx1 {
    public static void main(String[] args) {
        String str1 = new String("abc");
        String str2 = new String("abc");

        System.out.println (str1.equals ( str2 ));
        System.out.println (str1.hashCode ());
        System.out.println (str2.hashCode ());
//System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일
//객체마다 다른 해시코드 반환
        System.out.println (System.identityHashCode ( str1 ));
        System.out.println (System.identityHashCode ( str2 ));
    }
}
  • String클래스는 문자열의 내용이 같으면, 동일한 해시코드를 반환하도록 hashCode메서드가 오버라이딩되어 있기 때문에, 문자열의 내용이 같은 str1과 str2에 대해 hashCode()를 호출하면 항상 동일한 해시코드값을 얻는다.

 

 

 

toString(), toString()의 오버라이딩


  • toString() : 객체를 문자열(String)으로 변환하기 위한 메서드
class Card{
    String kind;
    int number;

    Card() {
        this("SPADE", 1);
    }

    Card(String kind, int number){
        this.kind = kind;
        this.number = number;
    }
   //Object클래스의 toString()을 오버라이딩
    public String toString() {
        return "kind:"+kind+", number:" + number;
    }
}
public class Ex9_4 {
    public static void main(String[] args) {
        System.out.println (new Card().toString ());
        System.out.println (new Card().toString ());
    }
}
  • Card클래스에서 Object클래스로부터 상속받은 toString()을 오버라이딩 하지 않았기 떄문에 Card인스턴스에 toString()을 호출하면, Object클래스의 toString()이 호출된다.

 

 

 

String 클래스


String 클래스 = 데이터(char[]) + 메서드(문자열 관련)

내용을 변경할 수 없는 불변(immutable) 클래스 이며 String 클래스는 앞에 final이 붙어 있으므로 다른 클래스의 조상이 될 수 없다.

문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용

 

 

 

문자열의 비교


문자열을 만드 때는 2가지 방법이 있다

  1. 문자열 리터럴을 지정하는 방법
  2. String클래스의 생성자를 사용해서 만드는 방법
String str1 = "abc";  //문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc";  //문자열 리터럴 "abc"의 주소가 str2에 저장됨
String str3 = new String("abc");  // 새로운 String인스턴스를 생성
STring str4 = new String("abc");  // 새로운 String인스턴스를 생성

String클래스의 생성자를 이용한 경우에는 new연산자에 의해서 메모리할당이 이루어지기 때문에 항상 새로운 String인스턴스가 생성된다. 그러나 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다

 

 

 

 

문자열 리터럴


  • 문자열 리터럴은 프로그램 실행시 자동으로 생성된다(constant pool에 저장)

 

 

 

빈 문자열 ("", empty string)


  • 내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열
String str = ""; // str을 빈문자열로 초기화
  • 크기가 0인 배열을 생성하는 것은 어느 타입이나 가능
char[] chArr = new char[0]; //길이가 0인 char배열
int[] iArr = {}; // 길이가 0인 int 배열
String s= ""; 과 같은 표현이 가능하다고해서 char c= ''; 와 같은 표현도 가능한 것은 아니다
char형 변수에는 반드시 하나의 문자를 지정해야한다.

'Language > Java' 카테고리의 다른 글

List, Set, Map  (0) 2021.10.10
StringBuffer클래스  (0) 2021.10.03
예외 처리  (0) 2021.09.27
인터페이스  (0) 2021.09.26
내부 클래스  (0) 2021.09.25