반응형
< 문자열 클래스(String) >
1. String
- 문자열을 다루는 String 클래스는 데이터가 변하면 기존의 객체를 버리고 새로운 객체를 메모리에 생성한다.
=> 기존 객체는 GC에 의해 메모리 회수가 되지만 회수 전까지는 메모리를 차지하고 있어 효율이 좋지 않음
2. StringBuffer / StringBuilder
- String 클래스의 단점을 보완한 클래스로 데이터가 변경되면 기존 객체를 재활용 한다.
=> 기존 객체의 메모리를 그대로 사용
package stringProject; //1007 string class 차이
public class StringTest {
public static void main(String[] args) {
//charAt()
//subString()
//indexOf()
//equals()
//valueOf()
// 1.String str1 = "abc"; //String은 같은 문자열을 받으면 다른 주소값이 아닌 동일한 주소값을 저장한다.
String str2 = "abc";
//원래 사용 방식
String str3 = new String("abc"); //다른 값을 받아야 할때엔 이렇게 생성하나, 잘 쓰지 않는다.
String str4 = new String("abc");
//문자열 비교
// str3 == str4 ==> 문자값이 아닌 주소값을 비교하는 것.
if(str3 == str4) {
System.out.println("같다");
}else {
System.out.println("다르다");
} //다르다 출력
// 실제 문자열 비교
if(str3.equals(str4)) { //"abc".equals("abc") 문자 직접비교도 가능하다.
System.out.println("같다");
}else {
System.out.println("다르다");
} //같다 출력
/*
System.out.println(str1.hashCode());
String str1 = "abc";
String str2 = "def";
str1 = str1 + str2; //"abcdef" --> 주소값이 수정된 내용의 str1을 가리키는것이 아니라 새로운 메모리에 할당되어 주소값이 변한다.
*/
/* String fileName = "Hello.java";//문자마다 인덱스 번호가 존재함.
//길이와 상관없이 추출하고 싶을 때
//특정 문자를 포함하는 위치를 반환(인덱스) : .indexOf()
int index = fileName.indexOf('.');
System.out.println(fileName.substring(0,index));
System.out.println(fileName.substring(index + 1));*/
//문자열 자르기 : charAt()
/* char a = fileName.charAt(2);
System.out.println(a);
//전체 문자 한 글자씩 출력
for(int i=0;i<fileName.length();i++) {
System.out.println(fileName.charAt(i));
}
*/
//원하는 부분에서 문자열 자르기 : substring
/* String str = fileName.substring(0,5); //시작인덱스, 끝인덱스
System.out.println(str); //Hello
String str2 = fileName.substring(6,10);
System.out.println(str2);
String str3 = fileName.substring(3); //끝까지 출력하고 싶으면 시작 인덱스만 쓰면된다.
System.out.println(str3); */
//숫자를 문자로 변환시켜준다. : valueOf
int x = 10;
String str = String.valueOf(x);
//String buffer클래스 - string클래스와 거의 비슷하다
//새로운 메모리 할당이 아닌 기존메모리에 저장해서 메모리 퍼포먼스가 훨씬 좋다
StringBuffer sb = new StringBuffer("abc");
System.out.println(sb);
sb.append("def");
System.out.println(sb);
}
}
package exceptionProject;
public class Person {
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override //object가 상속한것
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override //여기서 오버라이딩 해서 홍길동과 홍길동 이름을 비교할 수 있도록 함
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person another = (Person)obj;
return this.name.equals(another.name) && this.age == another.age;
}
return false;
}
@Override//제네릭 컬렉션 사용시에는 hashcode도 동일시켜주어야 한다.
public int hashCode() {
return (this.name + age).hashCode(); //"홍길동10".hashCode화 (앞문자열이 동일하면 무조건 같은 hashcode를 갖게된다.
}
}
package exceptionProject;
public class ObjectTest {
public static void main(String[] args) {
Person p1 = new Person("홍길동", 10);
Person p2 = new Person("홍길동", 10);
//제네릭 컬렉션 사용시에는 hashcode도 동일시켜주어야 한다.
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println(p1.toString());
System.out.println(p2.toString());
//object의 equals 사용한 것 - api 가면 주소값 비교하는 것으로 정의되어있음
if(p1.equals(p2)) { //오버라이딩 후 "홍길동" == "홍길동" && 10 == 10
System.out.println("같음");
}else {
System.out.println("다름");
} //equals 오버라이딩 전 -- 다름
// 후 - 같음
}
}
반응형
'java' 카테고리의 다른 글
래퍼 클래스(Wrapper class) (0) | 2022.10.11 |
---|---|
Calendar 클래스 (0) | 2022.10.11 |
UML(Unified Modeling Language) (0) | 2022.10.06 |
다형성(인터페이스) (0) | 2022.10.06 |
(abstract)추상메서드 (0) | 2022.10.06 |