String은 우리가 많이 봐왔던 명령어 입니다. 오늘은 String에 대해서 자세히 알아보겠습니다.

 

String클래스는 하나의 문자열 표현하고, java는 큰 따옴표로 묶여서 표현되는 문자열을 모두 인스턴스화 합니다.

String - java.lang.String 에 저장되어 있어서 언제든 필요할 때 사용할 수 있도록 java가 지원합니다.

 

 

● String 사용 (기본적인 형태)

public class StringInstance {
	public static void main(String[] args) {
		String name = "홍길동"; 
		String hello = new String("안녕하세요, 여러분!!!");

String은 Scanner 와 다르게 import 하지 않아도 error 가 나지 않습니다.
그 이유는 String과 같은 아주 많이 사용되는 것들을 java.lang.String;에 넣어놨고, java.lang.은 import를 하지 않아도 되도록 java가 지원하기 때문입니다.  (java스스로 import 합니다. (system포함))

 

 

● String 사용 (new 생략)

package String;

public class StringMethod {
	public static void main(String[] args) {
		String str1 = "Smart"; // = String str1 = new String("Smart");

문자열이 많이 사용되기 때문에 new String를 생략하여도 포함되어지게 동작합니다.

 

단, new 을 넣은 값과 new를 생략한 값이 다른 결과 값이 나올 수 있습니다.

1) new 를 생략하지 않은 코드 

String name1 = new String("세종대왕");
String name2 = new String("세종대왕");
// 각각 메모리가 할당 되어 독립적으로 동작되어진다.

if(name1==name2) {
	    System.out.println("같은 메모리를 가지고 있다. 동일한 인스턴스 참조");
		}else {
		System.out.println("같은 메모리를 가지지 않는다. 다른 인스턴스 참조");	
		}



2) new 를 생략한 코드 

String name3 =  "이순신";
String name4 =  "이순신"; 	
		
		if(name3==name4) {
		System.out.println("같은 메모리를 가지고 있다. 동일한 인스턴스 참조");
		}else {
		System.out.println("같은 메모리를 가지지 않는다. 다른 인스턴스 참조");	
		}
        

1) new 를 생략하지 않은 코드의 결과 값 : 같은 메모리를 가지지 않는다. 다른 인스턴스 참조

2) new 를 생략한 코드의 결과 값 : 같은 메모리를 가지고 있다. 동일한 인스턴스 참조

 

1)과 2)의 결과 값이 다른 이유:

1) 과 같은 경우 name1 과 name2 라는 참조변수로 독립된 메모리를 할당 받지만,

2) 먼저 동일한 heap 영역에 문자열로 이동한 후 그 문자열의 주소값을  stack 영역의 각 이름으로 가지고 와서 주소값이 참조변수 이름에 저장됩니다.

1)의 경우 각각 연결되는 주소값이 다르고, 2)은 연결되는 주소값이 같습니다.

 

● String 의 특징

: 스트링 객체는 수정 불가능 합니다.

String S = new String("Hello") ; 
String T = S.concat("java"); 

System.out.println(S); = Hello
System.out.println(T); = Hellojava

※ concat 은 문자열을 뒤에 붙여주는 역할을 합니다.

 

 

● String 클래스가 제공하는 유용한 메소드

 

1) length 문자열의 길이 반환 public int length() 

public class StringInstance {
	public static void main(String[] args) {
		String name = "홍길동"; 
		String hello = new String("안녕하세요, 여러분!!!");

System.out.println(name.length());   결과값 : 3
System.out.println(hello.length());  결과값 : 13   
System.out.println("홍길동".length()); 결과값 : 3

System.out.println("홍길동".length());

문자열.method = java 문자열을 보면 "홍길동" 의 주소값을 불러오고 .length를 수행하여 해당 메모리로 가게됩니다.
메모리에 담지 않아도 한번만 수행하고 끝이면 문제 없습니다.  

 

 

 

2) 두 문자열의 결합  public String concat(String str) 

 concat(str) 활용이 많습니다. 멀티미디어( 파일의 이름과 확장자 명을 더해줄 때 사용합니다 . ex) drama.mp4)

public class StringMethod {
	public static void main(String[] args) {
		String str1 = "Smart"; // = String str1 = new String("Smart");
		String str2 = " and ";
		String str3 = "Simple";
	
		String result = str1.concat(str2); 
		System.out.println(result); 
		
       str1.concat(str2); =  str1+str2;  같은 결과 값을 가져옵니다. 
       

concat(str) : 내가 가진 문자열에 입력된 문자열을 연결시켜줍니다.

 

 

추가적 설명)

concat이 편하게 문자열을 결합시켜주지만 큰 단점이 존재합니다.

public class StringMethod {
	public static void main(String[] args) {
		String str1 = "Smart"; 
		String str2 = " and ";
		String str3 = "Simple";
       
        result = str1.concat(str2); // 두개의 문자열을 결합
		result = str1.concat(str2).concat(str3);// 3개의 문자열 결합
		System.out.println(result);

str1.concat(str2) -> str1만큼 같은 크기를 별도로 메모리에 할당하고, 입력으로 전달한 str2의 값의 크기만큼도 할당하고 모든 데이터를 복사해주고 concat이 주소값을 줘서 result 에 저장합니다. 
str1.concat(str2).concat(str3) -> str1.concat(str2)가 결합되어 있는 상태를 메모리에 할당하고 concat(str3)의 크기를

할당한다음 str1.concat(str2)과 concat(str3)을 복사해준 다음 주소값을 다시 줘서result에 저장됩니다.  

str1.concat(str2)의 result 값과 str1.concat(str2).concat(str3)의 result의 값은 다 다릅니다.

주소값을 잃어버린 str1.concat(str2)은 쓸데 없이 메모리를 차지하게 됩니다. (concat 많이 사용할수록 낭비되는 메모리가 많아집니다.) 메모리는 한정적이기 때문에 작은 수의 문자열을 결합할 때는 유용하지만 많은 문자열을 결합할 때는 좋지 않다는 큰 단점을 가지고 있습니다.

 

 

해결점 new StringBuilder(); 을 이용하여 해결합니다.

 

 

+ ) new StringBuilder();

 StringBuilder : string 의 기능중 concat의 문제를 해결하기 위해서 사용하는 자료형입니다.

public class BuilderString { 
public static void main(String[] args) {
new StringBuilder(); 
StringBuilder stringBuilder = new StringBuilder("AB"); 
		    
System.out.println(stringBuilder); = 출력값 : AB
 stringBuilder.append(25).append("Y").append(.14).append(true);
System.out.println(stringBuilder);  =  출력값 : AB25Y0.14true
			
stringBuilder.insert(3,false); 
System.out.println(stringBuilder);  = 출력값 : AB2false5Y0.14true
insert : 두번째 자리에 false를 입력하겠다는 것을 이며, 원하는 위치에 삽입합니다.
0부터 카운팅. 
		
	


StringBuilder은 append 명령어를 사용하여 별도의 메모리를 가지고 있어서 추가되는 형태로 저장되며 자신이 할당한 메모리 보다 내용이 많아지면 스스로 메모리를 추가해가는 알고리즘으로 되어 있어서 concat이 가지고 있는 단점으로 극복합니다.

concat 이라는 매서드가 있는 이유는 빠르게 올러올 수 있다라는 장점을 가지고 있기에 사용합니다. 그래서 큰 단점을 극복하기 위해서 java에서 제시해주는 것이 StringBuilder 입니다.


- 문자열의 갯수가 많을 때는 StringBuilder 사용하는 것이 메모리 효율성 해결할 수 있어서 좋습니다.

 

 

 

3) 두 문자열의 비교  public int compareTo(String anotherString) 

compareTo(anotherString) : 파일의 내용이 같은지 다른지를 확인시켜 줍니다.

 

package String;
public class StringMethod {
	public static void main(String[] args) {
		String str1 = "Smart"; // = String str1 = new String("Smart");
		String str2 = " and ";
		String str3 = "Simple";
        
        str1.compareTo(str3); 
		System.out.println(str1.compareTo(str3));  = 결과값 : 4

반환형(int) 이고, 결과의 수가 중요한 것이 아니라, 0인지 양수인지 음수인지 확인하는것이 중요합니다.

- 양수(앞의 문자열이 사전 뒤쪽에 있다), 음수 앞의 문자열이 사전 앞쪽에 있다), 0 (두가지가 같은 내용을 가지고 있다.)

 

 

 

 

 

 

 

 

 

 

'빅데이터 > JAVA' 카테고리의 다른 글

[JAVA] 콘솔 출력  (0) 2020.05.04
[JAVA] 배열 (array)  (0) 2020.05.02
[JAVA] Scanner  (0) 2020.04.30
[JAVA] System.out.println() , 자바의 메모리 모델  (0) 2020.04.30
[JAVA] 객체지향언어(오버로딩, this, 클래스매서드)  (0) 2020.04.29

+ Recent posts