organize/자바

Java 17

001cloudid 2024. 5. 2. 20:01
728x90

Object 클래스

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

notify(), wait()는 쓰레드와 관련된 메서드

  • protected Object clone() 
    객체 자신의 복사본을 반환
  • public boolean equals(Object obj)
    객체 자신과 객체 obj가 같은 객체인지 확인. 같다면 true 객체 비교
  • protected void finalize() ↔ 생성자(객체 초기화)
    객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출. 이 때 수행되어야하는 코드가 있을 때 오버라이딩
    (거의 사용 ㄴ. 사용권장 ㄴ)
  • public Class getClass()
    객체 자신의 클래스 정보(설계 정보)를 담고 있는 Class 인스턴스를 반환
    객체 생성, 객체 정보를 얻을 수 있음
    ReffectionAPI
  • public int hashCode() 
    객체 자신의 해시코드를 반환
  • public String toString()
    객체 자신의 정보를 문자열로 반환
  • public void notify()
    객체 자신이 사용하려고 기다리는 쓰레드를 하나만 깨움
  • public void notifyAll()
    객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨움
  • public void wait(), public void wait(long timeout), public void wait(long timeout, int nanos)
    다른 쓰레드가 notify()나 notifyAll()을 호출할 때 까지 현재 쓰레드를 무한히 또는 지정된 시간동안 기다리게 함.

 

equals(Object obj)

객체 자신(this)과 주어진 객체(obj)를 비교 같으면 true, 다르면 false
Object클래스의 equals()는 객체의 주소를 비교(참조변수값 비교)

		public boolean equals(Object obj){
		 return (this==obj); //주소가 같아야 true
		}

 

package chapter09;

class Value{
	int num;
	
	public Value() {}
	
	public Value(int num) {
		this.num = num;
	}
}

public class Study02Ex1 {

	public static void main(String[] args) {

		Value v1 = new Value(10);
		Value v2 = new Value(10);
		
		//서로 다른 두 객체는 항상 주소가 다름
		System.out.println(v1.equals(v2));
		
	}
	
}

 

package chapter09;

class Value{
	int value;
	
	public Value() {}
	
	public Value(int value) {
		this.value = value;
	}

	//Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교
	public boolean equals(Object obj) {
    	//return this == obj; //주소 비교. 서로 다른 객체는 항상 거짓
        //참조변수의 형변환 전에는 반드시 instanceof로 확인
		if(obj instanceof Value)
			return false;
		Value v = (Value)obj; //obj를 value로 형 변환
		return this.value == v.value;
		
	}
	
}

public class Study02Ex1 {

	public static void main(String[] args) {

		Value v1 = new Value(10);
		Value v2 = new Value(10);
		
		//서로 다른 두 객체는 항상 주소가 다름
		System.out.println(v1.equals(v2));
		
	}
	
}

 

equals(Object obj)의 오버라이딩

인스턴스 변수(iv) 값을 비교하도록 equals()를 오버라이딩해야함

※cv : 객체마다 공통(공유), iv : 객체마다 다름(개별)

 

package chapter09;

class Person{
	long id;
	
	public boolean equals(Object obj) {
		if (obj instanceof Person)
			return id == ((Person)obj).id; //obj가 Object 타입이므로 id값을 참조하기 위해서는 Person 타입으로 형변환이 필요
		else
			return false; //타입이 Person이 아니면 값을 비교할 필요 없음
	}
	
	Person(long id){
		this.id = id;
	}
	
}


public class Study02Ex2 {

	public static void main(String[] args) {
		
		Person p1 = new Person(0001013000000L);
		Person p2 = new Person(0001013000000L);
		
		if(p1.equals(p2)) {
			System.out.println("p1과 p2는 같은 사람");
		} else {
			System.out.println("p1과 p2는 다른 사람");
		}
		
	}
	
}

 

==

package chapter09;

class Person{
	long id;
	
	public boolean equals(Object obj) {
		if (!(obj instanceof Person))
			return false; 
		
		return this.id == ((Person)obj).id;//obj가 Object 타입이므로 id값을 참조하기 위해서는 Person 타입으로 형변환이 필요
//		else
//			return false; //타입이 Person이 아니면 값을 비교할 필요 없음
	}
	
	Person(long id){
		this.id = id;
	}
	
}


public class Study02Ex2 {

	public static void main(String[] args) {
		
		Person p1 = new Person(0001013000000L);
		Person p2 = new Person(0001013000000L);
		
		if(p1.equals(p2)) {
			System.out.println("p1과 p2는 같은 사람");
		} else {
			System.out.println("p1과 p2는 다른 사람");
		}
		
	}
	
}

 

String 클래스

데이터(char[]) + 메서드(문자열 관련)

내용을 변경할 수 없는 불변(immutable) 클래스

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

덧셈 연산자를 이용한 문자열 결합은 성능이 떨어짐, 문자열의 결합이나 변경이 많다면, 내용 변경이 가능한 StringBuffer를 사용

 

문자열 비교

String str = "abc";와 String str = new String("abc");의 비교

		String str1 = "abc"; //문자열 리터럴 "abc"의 주소가 str1에 저장
		String str2 = "abc"; //문자열 리터럴 "abc"의 주소가 str2에 저장
        //내용 공유
        
		//new를 이용하면 내용이 같아도 항상 새로운 문자열이 만들어짐
		String str3 = new String("abc"); //새로운 String 인스턴스를 생성
		String str4 = new String("abc"); //새로운 String 인스턴스를 생성
		
		System.out.println(str1 == str2);
		System.out.println(str3 == str4);

 

문자열 리터럴

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

		String s1 = "AAA";
		String s2 = "AAA";
		String s3 = "AAA";
		String s4 = "BBB";

같은 내용의 문자열 리터럴은 하나만 만들어짐

 

빈 문자열("", empty string)

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

char[] chArr = new char[0]; //길이가 0dls char 배열
int[] i iArr = {}; //길이가 0인 int 배열

 

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

		char[] chArr = new char[0]; //길이가 0인 char 배열
		int[] iArr = {}; //길이가 0인 int 배열

 

문자(char)와 문자열(String) 초기화

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

 

String 생성자

  • String(String s)
    주어진 문자열(s)을 갖는 String 인스턴스를 생성
    잘 사용하지 않음
		String string = new String("Hello");
  • String(char[] value)
    주어진 문자열(value)을 갖는 String 인스턴스를 생성
		char[] c = {'H','e','l','l','o'};
		String string2 = new String(c);
  • String(StringBuffer buf)
    StringBuffer 인스턴스가 갖고 있는 문자열과 같은 내용의 String 인스턴스를 생성
		StringBuffer sb = new StringBuffer("Hello");
		String string3 = new String(sb);
  • char charAt(int index)
    지정된 위치(index)에 있는 문자열을 알려줌. index는 0부터 시작. 문자 1개 반환
		String string4 = "Hello";
		String n = "0123456";
		char c1 = sb.charAt(1);
		char c2 = n.charAt(1);
  • int compareTo(String str)
    문자열(str)과 사전순서로 비교. 같으면 0, 사전순으로 이전이면 음수, 이후면 양수로 반환
    정렬할 때 사용
		int i1 = "aaa".compareTo("aaa"); //0
		int i2 = "aaa".compareTo("bbb"); //음수
		int i3 = "bbb".compareTo("aaa"); //양수
  • String concat(String str)
    문자열(Str)을 뒤에 덧붙임
String string5 = "Hello";
String string6 = string5.concat(" World");
  • boolean contains(CharSequence s) 
    지정된 문자열(s)이 포함되어 있는지 검사
String string7 = "asdfjklzxcvnriw";
boolean b = string7.contains("sd"); //연속된 문자열 ad는 string7에는 포함되었지만 떨어져있어서 결과가 false로 반환
  • boolean endsWith(String suffix) 
    지정된 문자열(suffix)로 끝나는지를 검사
String file = "Hello.txt";
boolean b1 = file.endsWith("txt");
  • boolean equals(Object obj)
    매개변수로 받은 문자열(obj)과 String 인스턴스의 문자열을 비교.
    obj가 String이 아니거나 문자열이 다르면 false로 반환
String string8 = "Hello";
boolean b2 = string8.equals("Hello"); //true
boolean b3 = string8.equals("hello"); //false
  • boolean equalsIgnoreCase(String str)
    문자열과 String 인스턴스의 문자열을 대소문자 구분없이 비교
String string8 = "Hello";
boolean b4 = string8.equalsIgnoreCase("HELLO"); //true
boolean b5 = string8.equalsIgnoreCase("hello"); //true
  • int indexOf(int ch) 
    주어진 문자(ch)가 문자열에 존재하는지 확인하여 위치(index)를 알려줌. 못찾으면 -1을 반환(index 시작 번호는 0). 
    대소문자 구분
String string8 = "Hello";
int idx1 = string8.indexOf("o"); //4
int idx2 = string8.indexOf("a"); //-1
int idx3 = string8.indexOf("h"); //-1

 

  • int indexOf(int ch, int pos)
    주어진 문자(ch)가 문자열에 존재하는지 지정된 위치(pos)부터 확인하여 위치(index)를 알려줌. 못찾으면 -1을 반환(index 시작 번호는 0)
string8 = "Hello";
int idx4 = string8.indexOf('e', 0);
int idx5 = string8.indexOf('e', 2);
  • int indexOf(String str) 
    주어진 문자열이 존재하는지 확인하여 그 위치(index)를 알려줌. 없으면 -1을 반환(index 시작 번호는 0)
 String string9 = "ABCDFEG";
 int idx6 = string9.indexOf("DF"); //3
  • int lastIndexOf(int ch) 
    지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아서 위치(index)를 알려줌. 못찾으면 -1을 반환
 String string10 = "java.lang.Object";
 int idx7 = string10.lastIndexOf("."); //9
 int idx8 = string10.indexOf("."); //4

 

  • int lastIndexOf(String str)
    지정된 문자열을 인스턴스의 문자열 끝에서부터 찾아 위치(index)를 알려줌. 못 찾으면 -1을 반환
 string10 = "java.lang.Object";
 int idx9 = string10.lastIndexOf("java"); //10
 int idx10 = string10.indexOf("java"); //0
  • int length() 문자열의 길이
 String string11 = "Hello";
 int length = string11.length(); //5
  • String[] split(String regex)
    문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환
 String animal = "dog,cat,pig";
 String[] arr = animal.split(",");
 for(String a : arr) {
 System.out.println(a);
 }
  • String[] split(String regex, int limit) 
    문자열을 지정된 분리자(regex)로 나누어 문자열배열에 담아 반환. 단, 문자열 전체를 지정된 수(limit)로 자름
 String [] arr1 = animal.split(",", 2);
 for(String x : arr1) {
 System.out.println(x);
 }
  • boolean startsWith(String prefix) 
    주어진 문자열(prefix)로 시작하는지 검사
 String string12 = "java.lang.Object";
 boolean b6 = string12.startsWith("java"); //ture
 boolean b7 = string12.startsWith("Object"); //false
  • String substring(int begin), String substring(int begin, int end) 
    주어진 시작위치(begin)부터 끝 위치(end) 범위에 포함된 문자열을 얻음. 
    이때 시작위치의 문자는 범위에 포함되지만 끝 위치의 문자는 포함되지 않음(begin <= x < end)
 String string13 = "java.lang.Object";
 String s1 = string13.substring(10); //Object
 String s2 = string13.substring(5, 9); //lang
  • String toLowerCase()
    String 인스턴스에 저장되어 있는 모든 문자열을 소문자로 변환하여 반환
 String a = "Hello";
 String a1 = a.toLowerCase(); //hello
  • String toUpperCase() 
    String 인스턴스에 저장되어 있는 모든 문자열을 대문자로 변환하여 반환
 a = "Hello";
 String a2 = a.toUpperCase(); //HELLO
  • String trim()
    문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환. 단, 문자열 중간에 있는 공백은 제거되지 않음
 String a3 = "                    Hello       World                        ";
 String a4 = a3.trim(); //Hello       World
  • static String valueOf(Object obj)
    지정된 값을 문자열로 변환하여 반환. 참조 변수의 경우 toString()을 호출한 결과를 반환
728x90

'organize > 자바' 카테고리의 다른 글

Java 19  (0) 2024.05.04
Java 18  (0) 2024.05.03
Java 16  (0) 2024.05.01
Java 15  (0) 2024.04.30
Java 14  (0) 2024.04.28