본문 바로가기
java

String class

by 신방동불주먹 2022. 10. 7.

< 문자열 클래스(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