String, StringBuffer, StringBuilder 공통점

모두 String을 저장하고 관리하는 클래스

 

String vs StringBuffer, StringBuilder 차이점

가장 큰 차이점으로 String은 불변 / StringBuffer, StringBuilder 가변이다

String str = "hello";   // String str = new String("hello");
str = str + " world";  // [ hello world ]

 

예제에서 "hello" 값을 가지고 있던 string 클래스의 참조변수 str이 가리키는 곳에

저장된 "hello"에 "world"문자열을 더해 "hello world"로 변경한 것으로 착각 할 수 있다

 

 

 

하지만 string은 불변이므로 "hello" 값을 가지고 있던 string 클래스의 참조변수 str이 "hello world"라는 값을

가지고 있는 새로운 메모리 영역을 가리키게 변경된다.

처음 선언된 "hello"로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 Garbage collection에 의해 제거된다

결국 새로운 string 인스턴스가 생성된 것이다

 

이 경우 변하지 않는 문자열을 자주 읽어들인 경우 String 사용하면 좋다

하지만 문자열 추가, 수정, 삭제 등 연산이 빈번하게 발생하는 경우에 String 클래스 사용하면

힙 메모리에 많은 Garbage가 생성되어 힙 메모리 부족이 발생한다

 

이를 해결하기 위해 StringBuffer, StringBuilder 클래스가 도입됐다

 

StringBuffer, StringBuilder

StringBuffer, StringBuilder는 가변성을 가지기 때문에 .append(), .delete()등의 API 사용하여

동일 객체 내에서 문자열 변경 가능하다

문자열 추가, 삭제, 수정이 빈번하게 발생할 경우라면 StringBuffer, StringBuilder를 사용해야 한다

StringBuffer  sb  =  new  StringBuffer("hello");
sb.append("world");

 

 

 

 

StringBuffer vs StringBuilder 차이점

동일한 API를 가졌지만 동기화의 유무 차이가 있다

StringBuffer는 동기화 키워드를 지원하고 StringBuilder는 동기화를 지원하지 않는다

 

StringBuffer는 동기화를 지원해 멀티 쓰레드환경에서 안전하다

StringBuilder는 동기화를 지원하지 않아 단일쓰레드에서 성능이 뛰어나다

 

 

결론

String : 문자열 연산 적고 멜티쓰레드 환경일 경우

StringBuffer : 문자열 연산 많고 멀티 쓰레드 환경일 경우

StringBuilder :  문자열 연산 많고 단일쓰레드이거나 동기화 고려하지 않아도 되는 경우

'java > 공부' 카테고리의 다른 글

[JAVA] static 변수와 static 메소드  (0) 2024.01.31
[JAVA] new String()과 String literal("") 차이  (0) 2024.01.22

Static이란 ?

  • Static이란 ' 정적인' 이라는 뜻을 가짐
  • Static 키워드를 통해 생성된 정적 멤버들은 Static 영역에 할당됨
  • Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버로 어디서든지 참조 가능
  • Gabage collector의 영역 밖에 존재하여 관여하지 않음
  • 프로그램 시작될때부터 종료될때까지 메모리 값에 유지된 채로 존재

 

 

 

[ static 변수 ]

static이 붙지 않은 메서드나, 변수의 경우 객체가 생성될 때마다 호출되어 서로 다른 값을 가질 수 있음

각 객체들에서 공통적으로 하나의 값이 유지되어야 할 경우 static 사용

 

예시로 좋아요 개수를 받을 경우

package study;

public class LikeCount {    

	int count;    
    
	public LikeCount() {      
		this.count++;      
		System.out.println("좋아요 개수 : " + count);  
	}    
    
	public static void main(String[] args) {    
		LikeCount lc1 = new LikeCount();     
		LikeCount lc2 = new LikeCount();   
	}
}

 

static 사용하지 않고  lc1, lc2 객체가 생성될 때 lc1의 count와 lc2의 count가 서로 다른 메모리를 할당받아

메모리를 각각 받았으므로 좋아요 개수는 계속 1이 나오는 결과가 나온다

 

좋아요 개수 : 1

좋아요 개수 : 1

 

package study;

public class LikeCount {    

	static int count;    
    
	public LikeCount() {      
		this.count++;      
		System.out.println("좋아요 개수 : " + count);  
	}    
    
	public static void main(String[] args) {    
		LikeCount lc1 = new LikeCount();     
		LikeCount lc2 = new LikeCount();   
	}
}

이 경우에는 static 변수를 사용하여 lc1, lc2 객체가 하나의 메모리를 공유하게 되어 좋아요 개수가 증가하게 된다

 

좋아요 개수 : 1

좋아요 개수 : 2

 

 

[ static 메소드 ]

  • 객체 생성 없이 사용 가능
  • 프로그램이 시작하면 메모리의 static 영역에 적재되고, 프로그램 종료될 때 해제된다
  •  Static 메서드 내에서 인스턴스 변수 사용 불가능, ststic 변수만 접근 가능

정적 메서드 사용 예시

class Name{
    static void print1() { //클래스 메소드
	System.out.println("이름 : 홍길동");
    }

    void print2() { //인스턴스 메소드
	System.out.println("이름 : 김상순");
    }
}

public class Static_ex {
	
    public static void main(String[] args) {
        Name.print1(); //인스턴스를 생성하지 않아도 호출이 가능
    	
        Name name = new Name(); //인스턴스 생성
        name.print2(); //인스턴스를 생성하여야만 호출이 가능
    }
}

 

 

 

참조 : https://dev-coco.tistory.com/23, https://coding-factory.tistory.com/524

 

'java > 공부' 카테고리의 다른 글

[JAVA] String, StringBuffer, StringBuilder 차이  (0) 2024.01.31
[JAVA] new String()과 String literal("") 차이  (0) 2024.01.22

 

자바에서 String 문자열 생성 방식

1. new String()

2. String literal("") 

 

두 개 차이 : 저장공간(메모리)의 차이

new 연산자를 사용하여 String을 생성할 경우

Heap 메모리 영역에 저장됨

 

리터럴(literal) 을 사용하여 String을 생성할 경우

Heap 안에 있는 String constant pool 영역에 생성

 

 

 

 

String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
  • literal로 생성한 s1, s2는 동일한 객체를 바라보고, new String()으로 생성한 s1은 다른 메모리 주소의 객체를 바라본다
  • String literal로 생성한 객체가 이미 존재한다면, 해당 객체는 이미 생성되어 있는 String constant pool 영역을 참조한다
  • new 연사자로 생성한 String 객체는 같은 값이 String pool에 존재하더라도, Heap영역에 별도로 객체를 생성한다.

 

System.out.println(s1.equals(s3)); //true 
System.out.println(s1 == s2);	//true
System.out.println(s1 == s3);	//false

 

  • equals값이 동일한지 비교하고, ==메모리상 동일한 객체인지 비교한다
  • s1과 s3는 값은 동일하지만 메모리상 저장된 곳이 다르기 때문에 false가 나온다
  • s1과 s2는 모두  literal을 사용한 동일한 문자열이기 때문에 동일한 주소값을 바라보므로 true가 나온다

 

 

참조 : https://yeoonjae.tistory.com/entry/Java-String-literal-%EA%B3%BC-new-String-%EC%9D%98-%EC%B0%A8%EC%9D%B4

'java > 공부' 카테고리의 다른 글

[JAVA] String, StringBuffer, StringBuilder 차이  (0) 2024.01.31
[JAVA] static 변수와 static 메소드  (0) 2024.01.31

+ Recent posts