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

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/12954

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 문제 풀이

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        
        for(int i=0; i<n; i++){
            answer[i] = (long) x * (i+1) ;
        }
        
        return answer;
    }
}

 

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/181938

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2.문제 풀이

class Solution {
    public int solution(int a, int b) {
        int answer = 0;
        
        int ab = Integer.parseInt(""+a+b);
        int abb = 2*a*b;
        
        answer = ab >= abb ? ab : abb;

    }
}

3.다른 풀이

Max() 함수를 사용하면 두 인자 값 중 큰 값을 리턴해주므로 훨씬 간단하게 코딩 가능

class Solution {
    public int solution(int a, int b) {

        return Math.max(Integer.parseInt(""+a+b), 2*a*b);

    }
}

+ Recent posts