[JAVA] Object 클래스

Ming·2022년 9월 29일
0

자바

목록 보기
9/14

Object 클래스

Object 클래스는 모든 클래스의 최고 조상으로 오직 11개의 메서드만 가지고 있다. 11개의 메서드 중 wait(), notify() 등은 쓰레드 관련 메서드이다.

Object 클래스의 메서드설명
protected Object clone()객체 자신의 복사본을 반환한다
public boolean equals(Object obj)객체 자신과 객체 obj가 같은 객체인지 알려준다같으면 true 반환)
protected void finalize()객체가 소면될 때 가비지 컬랙터에 의해 자동적으로 호출된다. 이때 수행되어야하는 코드가 있을 때 오버라이딩한다
public Class getClass()객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환한다
public int hashCode()객체 자신의 해시코드를 반환한다
public String toString()객체 자신의 정보를 문자열로 반환한다
public void notify()객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다.
public void notifyall()객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다
public void wait()
public void wait(long timeout)
pubilc void wait(long timeout, int nanos)
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간동안 기다리게 한다

equals(Object obj)

객체 자신(this)과 주어진 객체(obj)를 비교해서 같으면 true, 다르면 false를 반환한다. Object 클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)하기 때문에 주소가 같아야 true가 반환된다.

class Value {
	int value;
    
    Value(int value) {
    	this.value = value;
    }
}
class EqualsTest {
	public static void main(String[] args) {
    	Value v1 = new Value(10);
        Value v2 = new Value(10);
        
        System.out.println(v1.equals(v2));
    }
}

위의 예제를 실행시켜보면 서로 다른 두 객체는 항상 주소가 다르기때문에 false가 출력된다. 인스턴스 변수의 값들을 비교하고 싶다면 equals 메서드를 오바라이딩 해야한다.

equals(Ojbect obj)의 오버라이딩

class Value {
	private int value;
    
    Value(int value) {
    	this.value = value;
    }
    
    void int getValue(){
    	return value;
    }
    
    @Override
    public boolean equals(Object obj) {
    	if(obj instanceof Value) {
        	Value v = (Value)obj;
          	if(this.value==obj.getValue()){
            	retrun true;
            }
        }
        return false;
    }
}

위와 같이 해주면 인스턴스 변수의 값을 비교할 수 있다. 이때 형변환을 하는 이유는 obj는 Object 타입이므로 Value 타입 변환해야하기 때문이다.

💡 주의
형변환을 하기 전에 instanceof 연산자로 형변환이 가능한지 확인을 해주어야한다.

toString()

객체를 문자열(String)으로 변환하기 위한 메서드이다.

public String toString() {
	return getClass().getName()+"@"+Integer.toHexString(hashCode());
}

클래스이름과 주소를 반환하는 함수이다.

toString()의 오버라이딩

public String toString() {
	return "kind : " + kind + ", number: " + number;
}

원래는 클래스이름과 주소를 반환하는 함수를 오버라이딩을 통해 인스턴스 변수를 출력하도록 오버라이딩할 수 있다.

String strl = new String("abc"); 
String str2 = new String("abc"); 
System.out.println(strl.equals(str2)); // true 
System.out.println(strl.hashCode()); // 96354 
System.out.println(str2.hashCode()); // 96354

hashCode()

객체의 해시코드를 반환하는 메서드로 객체의 주소를 int로 변환해서 반환한다.
equals()의 결과가 true인 두 객체의 해시코드는 같아야하기 때문에 equals()를 오버라이딩하면, hashCode()도 오버라이딩해야한다.

String strl = new String("abc"); 
String str2 = new String("abc"); 
System.out.println(strl.equals(str2)); // true 
System.out.println(strl.hashCode()); // 96354 
System.out.println(str2.hashCode()); // 96354

String클래스

String클래스의 특징

  • 문자형 배열(char[])과 그에 관련된 메서드가 정의되어 있다.

문자형 배열, 관련메서드가 정의된 부분

public final class String implements java.io.Serializable. comparable{
	/** The value is used for character storage. */
	private char[] value;
	...
  • String인스턴스의 내용은 변경이 불가능하다.

String인스턴스 내용변경 불가능 예시

String a = "a";
String b = "b";
String a = a + b;

String a에 “a”를 저장 후, String a에 다시 a+b를 저장할 시 기존의 “a”값은

변경되지 않고 그대로 메모리에 남아있게 된다.

String형 변수에 “abc”와 new String(”abc”)의 차이

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");

System.out.println(str1==str2);//true
System.out.println(str3==str4);//false
System.out.println(str1.equals(str2));//true
System.out.println(str3.equals(str4));//true

str1와 str2는 “abc”가 저장된 하나의 메모리주소를 공유한다

str3와 str4는 각각의 객체를 생성하여 “abc”가 저장된 서로 다른

메모리주소를 가진다.

빈 문자열(””, empty string)

내용이 없는 문자열, 크키가 0인 char형 배열을 저장하는 문자열이다.

크기가 0인 배열을 생성하는 것은 어느 타입이나 가능하다

크기가 0인 배열 생성 예시

char[] cArr = new char[0]; // 크기가 0인 char배열
int[] iArr = (); // 크기가 0인 int배열

String str = “”;는 가능하나 char c = “”;는 불가능하다.

String은 참조형의 기본값인 null보다 빈 문자열로 초기화하고 char형은 기본값인 \u0000보다는 공백으로 초기화는 게 좋다.

String과 char형의 기본값 예시

String s = null;
char c = '\u0000';

String과 char형의 공백초기화 예시

String s = ""; // 빈 문자열로 초기화
char c = ' '; // 공백으로 초기화

String클래스의 생성자, 메서드

String클래스에는 많은 생성자와 메서드가 존재한다.

메서드설명예제결과
String(String s)주어진 문자열(s)를 갖는
String인스턴스를 생성
String s = new String(”Hello”);a = “Hello”
String(char[] value)주어진 문자열(value)를 갖는
인스턴스를 생성
char[] c = {’H’, ‘e’, ‘l’, ‘l’, ‘o’};
String s = new String(c);
s = “Hello”
String(StringBuffer buf)StringBuffer인스턴스가 갖고 있는 문자열과
같은 내용의 String인스턴스를 생성
StringBuffer sb = new StringBuffer(”Hello”);
String s = new String(sb);
s = “Hello”
char charAt(int index)지정된 위치(index)에 있는 문자를 알려준다.
index는 0부터 시작
String s = “Hello”;
String n = “0123456”;
char c = s.charAt(1);
char c2 = n.charAt(1);
c = ‘e’
c2 = ‘1’
String concat(String str)문자열(str)을 뒤에 덧붙인다.String s = “Hello”;
String s2 = s.concat(” World”);
s2 = “Hello World”
boolean cantains(CharSequence s)지정된 문자열(s)이 포함되었는지 검사String s = “abcdefg”;
boolean b = s.contains(”bc”);
b = true
boolean endsWith(String suffix)지정된 문자열(suffix)로 끝나는지 검사String file = “Hello.txt”;
boolean b = file.exdWith(”txt”);
b = true
boolean equals(Object obj)매개변수로 받은 문자열(obj)과
String인스턴스의 문자열을 비교한다.
obj가 String이거나 문자열이 다르면 false를 반환
String s = “Hello”;
boolean b = s.equals(”Hello”);
boolean b2 = s.equals(”hello”);
b = true
b2 = false
boolean equalsIgnoreCase(String str)문자열과 String인스턴스의 문자열을
대소문자 구분없이 비교
String s = “Hello”;
boolean b = s.equalsIgnoreCase(”HELLO”);
boolean b2 = s.equalsIgnoreCase(”heLLo”);
b = true
b2 = true
int indexOf(int ch)주어진 문자(ch)가 문자열에 존재하는지 확인하여
위치(index)를 알려주며 찾지 못하면 -1을 반환
index는 0부터 시작
String s = “Hello”;
int idx1 = s.indexOf(’o’);
int idx2 = s.indexOf(’k’);
idx1 = 4
idx2 = -1
int indexOf(String str)주어진 문자열이 존재하는지 확인하여
그 위치(index)를 알려주며 찾지 못하면 -1을 반환
index는 0부터 시작
String s = “ABCDEFG”;
int dex = s.indexOf(”CD”);
idx = 2
String intern()문자열을 constant pool에 등록한다.
등록 시 이미 constant pool에 같은 내용의
문자열이 있을 경우 그 문자열의 주소값을 반환
String s = new String(”abc”);
String s2 = new String(”abc”);
boolean b = (s==s2);
boolean b2 = s.equals(s2);
boolean b3 = (s.intern() == s2.intern());
b = false
b2 = true
b3 = true
int lastIndexOf(int ch)지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터
찾아서 위치(index)를 알려주며 찾지 못하면 -1을 반환
String = “java.lang.java”;
int idx1 = s.lastIndexOf(”java”);
int idx2 = s.indexOf(”java);
idx1 = 9
idx2 = 4
int length()문자열의 길이를 알려준다.String s = “Hello”;
int length s = s.length();
length = 5
String replace(char old, char nw)문자열 중의 문자(old)를 새로운 문자열(nw)로
모두 바꾼 문자열을 반환
String s = “Hellollo”;
String s1 = s.replace(”ll”,”LL”);
s1 = “HeLLoLLo”
String replaceAll(String regex, String replacement)문자열 중에서 지정된 문자열(regex)과 일치하는 것을
새로운 문자열(replacement)로 모두 변경
String ab = “AABBAABB”;
String r = ab.replaceAll(”BB”,“bb”);
r = “AAbbAAbb”
String replaceFirst(String regex, String replacement)문자열 중에서 지정된 문자열(regex)과 일치하는 것 중,
첫 번째 것만 새로운 문자열(replacement)로 변경
String ab = “AABBAABB”;
String r = ab.replaceFirst(”BB”,”bb);
r = “AAbbAABB”
String[] split(String regex)문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환String animals = “dog,cat,bear”;
String[] arr = animals.split(”,”);
arr[0] = “dog”
arr[1] = “cat”
arr[2] = “bear”
String[] split(String regex, int limit)문자열을 지정된 분리자(regex)로 나누어 문자열배열에 담아 반환
문자열 전체를 지정된 수(limit)로 자른다.
String animals = “dog, cat, bear”;
String[] arr = animals.split(”,”,2);
arr[0] = “dog”
arr[1] = “cat,bear”
boolean startsWith(String prefix)주어진 문자열(prefix)로 시작하는지 검사String s = “java.lang.Object”;
boolean b = s.startsWith(”java”);
boolean b2 = s.startsWith(”lang”);
b = true
b2 = false
String substring(int begin)
String substring(int begin, int end)
주어진 시작위치(begin)부터 끝 위치(end)범위에 포함된 문자열을 얻는다.
이 때, 시작위치의 문자는 범위에 포함되나, 끝 위치의 문자는 미포함한다.
String s = “java.lang.Object”;
String c = s.substring(10);
String p = s.substring(5,9);
c = “Object”
p = “lang”
String toLowerCase()String인스턴스에 저장되어 있는 모든 문자열을 소문자로 변환하여 반환String s = “Hello”;
String s1 = s.toLowerCase();
s1 = “hello”
String toString()String인스턴스에 저장되어 있는 문자열 반환String s = “Hello”;
String s1 = s.toString();
s1 = “Hello”
String toUpperCase()String인스턴스에 저장되어 있는 모든 문자열을 대문자로 변환하여 반환String s = “Hello”;
String s1 = s.toUpperCase();
s1 = “HELLO”
String trim()문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을
없앤 결과를 반환하며 이 때 문자열
중간에 있는 공백은 제거되지 않는다.
String s = “ Hello World “;
String s1 = s.trim();
s1 = “Hello World”
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(float f)
static String valueOf(double d)
static String valueOf(Object o)
지정된 값을 문자열로 변환하여 반환하며
참조변수의 경우, toString()을 호출한 결과를 반환
String b = String.valueOf(true);
String c = String.valueOf(’a’);
String i = String.valueOf(100);
String l = String.valueOf(100L);
String f = String.valueOf(10f);
String d = String.valueOf(10.0);
java.util.Date dd = new java.util.Date();
String date = String.valueOf(dd);
b = “true”
c = “a”
i = “100”
l = “100”
f = “10.0”
d = “10.0”
date = “Sun Jan 27 21:26:29 KST 2008”

문자열과 기본형간의 변환

  • 기본형 값을 문자열로 변환하는 방법은 두 가지가 있다.

기본형 값의 문자열 변환방법 예시

int i = 100;
String str1 = i + ""; // 100을  "100"으로, 변환 방법1
String str2 = String.valueOf(i); // 100을 "100"으로, 변환 방법2

문자열 값의 기본형 변환방법 예시

int i = Integer.parseInt("100"); // "100"을 100으로, 변환 방법1
int i2 = Integer.valueOf("100"); // "100"을 100으로, 변환 방법2
char c = "A".charAt(0); // 문자열 "A"를 문자 'A'로, 변환

기본형과 문자열 간 변환함수

0개의 댓글