/** * Servlet implementation class for Servlet: Servlet3 * */ public class Servlet3 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { static final long serialVersionUID = 1L;
public class model1 { public List getBrands(String color) { List brands = new ArrayList(); if (color.equals("amber")) { brands.add("Jack Amber"); brands.add("Red Moose"); } else { brands.add("Jail pale Ale"); brands.add("Gout Stout");
String은 내용을 변경할 수 없기 때문에 String에서 + 연산자를 사용하면 내부적으로StringBuffer를 생성해서 append() 메소드를 이용해서 문자열을 결합한다는 것은 대부분의 자바 프로그래머가 알고 있을 것입니다.
따라서 String을 많이 사용하는 서블릿이나 기타 프로그램에서는 되도록이면 StringBuffer나 char[]를 사용하시는 것이 효과적이라는 것도 다 알고 있는 사실입니다. 그런데 프로그램하다보면 귀찮아서라도 String을 많이 사용하는 것이 현실입니다.
그래서 잠시 10여분을 할애하여 String과 StringBuffer의 성능 차이를 테스트 해보았습니다. 테스트는 제가 새로 얻은(?) 펜티엄에 윈도우 2000이 설치된 컴퓨터 에서 했습니다. 테스트할 프로그램은 다음과 같습니다. 각 프로그램은 모두 "a" 문자열을 30,000번 씩 결합하도록 했습니다.
예제 : StringTime.java
1public class StringTime {
2
3public static void main(String args[]) {
4Runtime rt = Runtime.getRuntime();
5System.out.print(rt.freeMemory());
6System.out.println("/" + rt.totalMemory());
7long start = System.currentTimeMillis();
8String a = "a";
9for(int i=0; i < 30000; i++) {
10a += "a";
11}
12long stop = System.currentTimeMillis();
13System.out.println(stop - start);
14System.out.print(rt.freeMemory());
15System.out.println("/" + rt.totalMemory());
16}
17
18}
예제 : StringBuffer.java
1public class StringBufferTime {
2
3public static void main(String args[]) {
4Runtime rt = Runtime.getRuntime();
5System.out.print(rt.freeMemory());
6System.out.println("/" + rt.totalMemory());
7long start = System.currentTimeMillis();
8StringBuffer a = new StringBuffer("a");
9for(int i=0; i < 30000; i++) {
10a.append("a");
11}
12long stop = System.currentTimeMillis();
13System.out.println(stop - start);
14System.out.print(rt.freeMemory());
15System.out.println("/" + rt.totalMemory());
16}
17
18}
테스트 결과
String
1830448/2031616
41800-> 총 소요시간(단위: ms)
967576/2031616
StringBuffer
1830336/2031616
30-> 총 소요시간(단위: ms)
1673200/2031616
시간 차이도 많이 났지만, 메모리 사용량도 상당한 차이가 있었습니다. 이와 함께 더 큰 문제는 이 작업이 많아질 수로 가비지 콜렉션에 의해 String을 사용하는 경우에 시간에 휠씬 큰 차이로 많이 소요된다는 것입니다.
String클래스와 StringBuffer클래스의 차이점
* String은 문자열의 내용이 조금이라도 바뀌거나 스트링 컨케트네이션되면 새로운
객체를 만든다.
레퍼런스를 잃어버린 객체는 가비지 컬렉션의 대상이 되며 새로운 객체에 새 주소를
주므로 해쉬코드도 변한다. Immutable한 특징도 가지고 있다.
* StringBuffer는 원래 있던 객체의 내용만 바뀌는 Mutable한 특징이 있다.
Mutable : 변덕스러운.
Immutable : 불변의.
StringBuffer 안의 모든 문자열을 지우고 싶을때
StringBuffer sb = new StringBuffer(); sb.append("안녕하세요.abc"); sb.delete(0, sb.length());
public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick){ MidiEvent event = null; try{ ShortMessage a = new ShortMessage(); a.setMessage(comd, chan, one, two); event = new MidiEvent(a, tick); } catch(Exception e) {e.printStackTrace();}
자바(Java)를 이야기할 때 크게 두 가지로 나누어 이야기 할 수 있습니다. 먼저, 기계어, 어셈블리어(Assembly), 포트란(FORTRAN), 코볼(COBOL), 파스칼(PASCAL), 또는 C 등과 같이 프로그래밍을 하기 위해 사용하는 자바 언어가 있고, 다른 하나는 자바 언어를 이용하여 프로그래밍 하기 위해 사용할 수 있는 자바 API(Application Programming Interface)와 자바 프로그램을 실행시켜 주기 위한 자바 가상머신(Java Virtual Machine) 등을 가리키는 자바 플랫폼(Platform)이 있습니다. 다시 말해서, 자바 언어는 Visual C++와 비유될 수 있고, 자바 플랫폼은 윈도우 95/98/NT 및 윈도우 95/98/NT API와 비유될 수 있습니다.
그림 1. 자바(Java)
자바 언어(Java Language)를 이용하여 작성한 자바 프로그램(Java Program)은 자바 컴파일러(Java Compiler)를 이용하여 자바 바이트코드(Java Byte code)로 컴파일 되고, 이 자바 바이트코드는 자바 가상머신에 의해 해석되어 실행되는데, 이때 자바 가상머신은 자바 바이트코드에 대한 해석기 즉 인터프리터(interpreter)로 동작하게 됩니다. 이렇게 자바 프로그램은 컴파일 방식 및 인터프리터 방식이 모두 적용된다는 것입니다.
자바 컴파일러(Java Compiler):자바 언어로 작성된 자바 프로그램을 중간 언어(intermediate language) 형태인 자바 바이트코드로 컴파일 합니다<.
자바 바이트코드(Java Byte code):컴퓨터는 각 CPU에 따라 서로 다른 기계어를 갖습니다. 이러한 이유 때문에 도스 또는 윈도우 95/98/NT 등이 설치되어 있는 컴퓨터에서 실행되는 프로그램이 유닉스가 설치되어 있는 컴퓨터에서는 실행되지 않는 것입니다. 그러나, 자바 바이트코드는 이러한 플랫폼에 상관없이 자바 가상머신에 의해 실행될 수 있도록 정의된 중간코드입니다. 따라서, 자바 바이트코드로 컴파일 되기만 하면, 자바 인터프리터인 자바 가상머신이 설치되어 있는 곳이면 어디에서든 실행시켜 줄 수 있습니다. 이는 자바 개발자 또는 사용자로 하여금 자바 프로그램을 개발하거나 사용할 때 그 플랫폼이 윈도우 95/98/NT, 유닉스, 또는 매킨토시인지 전혀 신경 쓰지 않아도 되도록 합니다.
자바 인터프리터(Java Interpreter) 또는 자바 가상머신(Java Virtual Machine):
자바 바이트코드 명령어를 해석하고, 이를 자바 인터프리터가 설치되어 있는 플랫폼(윈도우 95/98/NT, 유닉스, 매킨토시 등)에 맞게 실행시켜 줍니다. 자바 인터프리터는 자바 바이트코드를 실행시켜 주기 위한 기능을 명세하고 있는 자바 가상머신을 구현해 놓은 것으로서 자바 가상머신과 같은 의미로 사용되며, 주로 자바 가상머신으로 많이 사용됩니다.
자바 바이트코드는 자바 가상머신에서 실행되는 기계어라고 생각하면 됩니다. 그리고, 모든 자바 인터프리터는 자바 가상머신을 구현해 놓은 것으로, 자바 가상머신과 자바 인터프리터를 같은 것으로 생각할 수 있습니다. . 이러한 자바 가상머신은 JDK(Java Development Kit)에 포함되어 있을 수도 있고, 자바 호환 웹 브라우저 내에 내장되어 있을 수도 있습니다. 또는, 자바 칩과 같이 하드웨어에 직접 구현될 수도 있습니다. 자바 바이트코드는 “write once, run anywhere”라는 말을 가능하게 해 줍니다. 다시 말해서, 자바 언어를 이용하여 작성한 자바 프로그램을 각 플랫폼(윈도우 95/98/NT, 리눅스, 유닉스, 매킨토시 등)에 맞게 제공되는 자바 컴파일러를 통해서 바이트코드로 컴파일 할 수 있습니다. 그리고, 이 바이트코드는 자바 가상머신이 있는 어떤 곳에서도 실행될 수 있습니다.
그림 2. 플랫폼 독립적인 자바
플랫폼이란 프로그램이 실행되는 하드웨어 또는 운영체제와 같은 소프트웨어적인 환경을 말합니다. 대부분의 플랫폼은 하드웨어와 운영체제를 함께 일컬어 말합니다. 그러나 자바 플랫폼은 하드웨어와 무관하게 동작하는 오직 소프트웨어적인 플랫폼이란 점에서 다른 플랫폼과 다릅니다. 이를 위해 자바 플랫폼은 다음과 같은 두 가지의 구성요소를 갖습니다.
자바 가상머신(Java Virtual Machine; Java VM): 자바 가상머신은 자바 플랫폼의기반을 이루며, 다양한 하드웨어기반 플랫폼에 포팅(poring) 됩니다. 다시 말해서, 자바 가상머신은 윈도우 95/98/NT, 유닉스, 또는 매킨토시 등과 같은 기존의 운영체제 또는 인터넷 익스플로러와 넷스케이프 등과 같은 웹 브라우저 등, 여러 가지 플랫폼에 설치되어 사용될 수 있으며, 사용자는 자바 바이트코드로 컴파일된 자바 프로그램을 실행시키기 위해서 이 자바 가상머신을 이용하면 됩니다.
자바 API(Java Application Programming Interface):자바 API는 윈도우 API와 같이 운영체제에서 제공해 주는 라이브러리와 같은 것입니다. 다시 말해서, 자바 프로그램을 개발하기 위해 사용할 수 있는 라이브러리 또는 클래스들이라 할 수 있습니다. 이러한 자바 API는 서로 관련된 클래스들을 묶어서 패키지 단위로 제공되고 있습니다