스트링 빌더와 제네릭

서문🌙·2023년 3월 8일
0
post-thumbnail

StringBuilder

참고 사이트

String을 사용하여 String과 String을 더하여 연결하는 방식은
메모리 할당과 해제를 발생시키기 때문에, 성능적으로 좋다고 볼 수 없다.

이유

  • String 객체는 일단 생성되면 변경할 수 없다.
  • ( + ) 연산자를 사용하여 문자열을 연결할 때마다 새로운 문자열 객체가 생성됨을 의미한다. (연결을 하면 새 문자열이 생성되고 이전 문자열은 가비지 컬렉터로 들어간다.)
String str1 = "Hello";

str1 = str1 + " java";

System.out.println(str1);

다음과 같은 문장을 실행하면 두 개의 String 객체가 생성됨을 의미한다.
개체의 생성은 다른 작업들 보다 시간이 더 많이 소요되기 때문에 위와 같이 문자열을 연결하는 방식은 비효율적이다.

이와 같은 상황을 극복하기 위한 것이 String Builder 이다.

StringBuilder str1 = new StringBuilder("Hello");

str1.append(" java");

System.out.println(str1);
//여기선 의미 없지만, str1.toString(); 도 사용 가능

str1.append(" and ").append(program1.getLanguage);
//program1.language가 python이라고 가정할떄
//이와 같은 상황에서 유용하게 사용할 수 있다.

StringBuffer 또한 동기화 된다는 점을 제외하고 StringBuilder와 동일한 메서드를 가지기 때문에, 일반 문자열을 대체하려면 StringBuilder를 사용하는 것을 권장하고, 스레드 안전성이 필요한 경우라면 StringBuffer사용을 고려하는 것을 권장한다




제네릭(Generic)

프로그래머가 매개변수화된 코드를 작성할 수 있도록 하는 Java 프로그래밍 언어의 기능

  • 장점 1 : 캐스팅을 사용할 필요가 없어진다.
  • 장점 2 : Stronger type checks at compile time (컴파일 타임에 더 강력한 검사 가능)
//제네릭 없이 컬렉션 사용하기
List listpet = new ArrayList();
listpet.add("고양이");

String pet_name1 = (String) listpet.get(0);		//고양이가 들어감

Date nowDate = new Date();
listpet.add(nowDate);					//Date 형의 nowDate를 넣음

String pet_name2 = (String) listpet.get(1);		//캐스팅이 가능할까?
  • listpet에서는 String 개체를 저장하도록 되어있습니다.
    여기서 get()메서드를 사용하면 Object 유형의 객체를 반환하기 때문에
    String으로 캐스트하는 과정이 필요합니다.
  • 그런데, 아래의 Date의 경우에는 Object -> String으로의 캐스팅 과는 다르게 Date -> String 의 캐스팅이기 떄문에 ClassCastException 오류가 발생하게 됩니다.

//제네릭을 사용하여 다시 구현
List<String> listpet = new ArrayList<String>();
listpat.add("고양이");

Date nowDate = new Date();
listpet.add(nowDate);
  • 제네릭을 사용하더라도 당연히 오류는 발생합니다. 단, 위에서는 컴파일러가 감지할 수 없는 오류라면, 아래의 오류는 컴파일러가 미리 오류를 감지할 수 있습니다.
  • 또한, 제네릭을 사용하면 일반 컬렉션에서 요소를 가져올 때 개체를 캐스팅할 필요가 없습니다.

profile
예외(exception)는 있다

0개의 댓글