DHTML 속도 향상을 위한 몇 가지 팁

Mark Davis
Microsoft Corporation

요약: 이 기사는 성능에 주로 영향을 주는 일부 DHTML 기능에 대해 설명하고 사용자의 DHTML 페이지 기능을 향상시킬 수 있는 몇 가지 팁을 제시합니다(9페이지/인쇄 페이지 기준).

목차

소개
DHTML 변경 내용 일괄 처리
InnerText 사용
DOM을 사용한 개별 요소 추가
SELECT 요소에서 사용자 옵션 확장
DOM을 사용한 테이블 업데이트
한번 쓰기, 여러 번 사용
지나치게 동적인 속성은 피할 것
데이터 바인딩의 유용성
문서에 Expando 속성을 사용하지 말 것
클래스와 스타일 규칙을 전환하지 말 것
상위 요소를 찾기 전에 텍스트 범위를 축소
기타 자료

소개

Microsoft® Internet Explorer 4.0에 동적 HTML(DHTML)을 도입함으로써 웹 페이지 제작자 및 개발자에게 새로운 프로그래밍 모델 사용을 가능하게 했습니다. 이후 웹 페이지 제작자는 이 강력한 기능을 사용하여 웹 사용자에 대한 다양한 대화식 환경을 활성화함으로써 동적인 컨텐트, 스타일, 위치 지정 등을 제공하게 되었습니다. DHTML의 유연성은 종종 두 가지 이상의 방법을 제공하여 사용자가 원하는 작업을 수행하도록 합니다. 사용자의 요청을 처리하는 Internet Explorer의 HTML 구문 분석 및 렌더링 구성 요소를 이해하면 최상의 작업 방법을 결정할 때 많은 도움이 됩니다. 이 기사는 성능에 주로 영향을 주는 일부 DHTML 기능에 대해 설명하고 사용자의 DHTML 페이지 기능을 향상시킬 수 있는 몇 가지 팁을 제시합니다.

맨 위로

DHTML 변경 내용 일괄 처리

DHTML 웹 페이지 성능을 증가시키는 가장 중요한 방법은 HTML 컨텐트의 변경 내용을 적용하는 방법을 개선하는 것입니다. 웹 페이지를 업데이트하는 여러 가지 방법이 있다는 것을 알아 두어야 합니다. 클라이언트 스크립팅에서부터 웹 페이지 제작자는 여러 블록의 HTML 텍스트를 적용하거나 DHTML 개체 모델(영문 사이트) 또는 W3C 문서 개체 모델(DOM)(영문 사이트)을 사용하여 개별적인 HTML 요소에 액세스 할 수 있습니다. HTML 컨텐트에 변경 내용이 발생할 때마다 Internet Explorer의 HTML 구문 분석 및 렌더링 구성 요소는 해당 페이지의 내부 표시를 재구성하고 문서의 레이아웃 및 흐름을 다시 계산해서 변경된 내용을 표시해야 합니다. 실제 성능은 변경 내용과 웹 페이지 컨텐트에 따라 달라지지만 이러한 작업은 비용이 많이 들게 됩니다. 개별 요소를 액세스하는 대신 HTML 텍스트 블록을 적용하는 경우에는 HTML 파서가 호출되어야 하므로 추가 성능 비용을 초래하게 됩니다. HTML 텍스트를 허용하는 메서드와 속성에는 insertAdjacentHTML(영문 사이트) 및 pasteHTML(영문 사이트) 메서드와 innerHTML(영문 사이트) 및 outerHTML(영문 사이트) 속성이 포함됩니다.

팁 1: 하나의 스크립트 함수에서 HTML 컨텐트를 변경하십시오. 마우스 움직임에 대한 응답처럼 여러 이벤트 처리기를 사용하는 경우 한 위치에서 변경하십시오.

HTML 구문 분석 및 구성 요소 렌더링에 대한 중요한 또 다른 사실은 스크립트 이벤트 처리기 함수가 있는 경우나 setTimeout(영문 사이트)과 같은 메서드가 호출되는 경우와 같이 일단 어떤 스크립트가 제어권을 반환하면 레이아웃을 다시 계산하여 웹 페이지를 표시한다는 것입니다. 이제 Internet Explorer가 변경 내용을 처리하는 방법에 대해 알게 되었으므로 웹 페이지 성능 향상을 시작할 수 있습니다.

팁 2: 여러 업데이트를 수행하는 대신 HTML 문자열 하나를 작성하여 문서를 변경해 보십시오. HTML 컨텐트가 필요하지 않다면 innerText(영문 사이트) 속성 사용을 고려해 보십시오.

다음 예에서 느린 메서드는 innerHTML 속성을 설정할 때마다 HTML 파서를 호출합니다. 성능을 향상시키기 위해 문자열을 작성한 후에 innerHTML 속성이 할당되도록 할 수 있습니다.

실행 비교

느린 메서드:

  divUpdate.innerHTML = "";
 for ( var i=0; i<100; i++ )
 {
  divUpdate.innerHTML += "<SPAN>This is a slower method! </SPAN>";
 }

빠른 메서드:

  var str="";
 for ( var i=0; i<100; i++ )
 {
  str += "<SPAN>This is faster because it uses a string! </SPAN>";
 }
 divUpdate.innerHTML = str;

자세한 내용은 동적 컨텐트(영문 사이트)를 참조하십시오.

맨 위로

InnerText 사용

DHTML 개체 모델에서 HTML 요소의 텍스트 컨텐트는 innerText(영문 사이트) 속성을 통해 액세스되는 반면 W3C DOM은 별도의 하위 텍스트 노드를 제공합니다. DHTML innerText 속성을 직접 사용하면 DOM의 createTextNode(영문 사이트) 메서드를 호출하는 것 보다 더 빨리 요소 컨텐트를 업데이트할 수 있습니다.

팁 3: innerText 속성을 사용하여 텍스트 컨텐트를 업데이트하십시오.

다음 예는 innerText 속성을 사용하여 성능을 향상시키는 방법을 보여 줍니다.

실행 비교

느린 메서드:

  var node;
 for (var i=0; i<100; i++)
 {
  node = document.createElement( "SPAN" );
  node.appendChild(  document.createTextNode( " Using createTextNode() " ) );
  divUpdate.appendChild( node );
 }

빠른 메서드:

  var node;
 for (var i=0; i<100; i++)
 {
  node = document.createElement( "SPAN" );
  node.innerText = " Using innerText property ";
  divUpdate.appendChild( node );
 }

맨 위로

DOM을 사용한 개별 요소 추가

앞서 언급했던 것처럼 HTML 텍스트를 적용하여 액세스하는 방법은 HTML 파서를 호출하므로 이에 따른 성능 손실이 발생합니다. 이러한 이유 때문에 insertAdjacentHTML 메서드에 대한 단일 호출을 수행하는 대신 createElement(영문 사이트)와 insertAdjacentElement(영문 사이트) 메서드를 사용하여 요소를 추가하는 것이 더 빠릅니다.

팁 4: createElementinsertAdjacentElement 메서드를 호출하는 것이 insertAdjacentHTML 메서드를 호출하는 것보다 빠를 때가 있습니다.

DHTML 업데이트를 일괄 처리하고 insertAdjacentHTML 메서드에 대한 단일 호출을 수행하면 성능을 향상시킬 수는 있지만 DOM에서 직접 요소를 만드는 것이 더 효율적인 경우가 있을 수 있습니다. 그러므로 두 가지 방법을 모두 시도하여 어떤 것이 빠른지 결정하는 것이 좋습니다.

실행 비교

느린 메서드:

  for (var i=0; i<100; i++)
 {
  divUpdate.insertAdjacentHTML( "beforeEnd", "<SPAN> Uses insertAdjacentHTML() </SPAN>" );
 }

빠른 메서드:

  var node;
 for (var i=0; i<100; i++)
 {
  node = document.createElement( "SPAN" );
  node.innerText = " Uses insertAdjacentElement() ";
  divUpdate.insertAdjacentElement( "beforeEnd", node );
 }

맨 위로

SELECT 요소에서 사용자 옵션 확장

HTML 텍스트 메서드 사용에 관한 이전의 규칙에 대한 예외는 SELECT(영문 사이트) 요소에 많은 OPTION(영문 사이트) 요소를 추가할 때입니다. 여러 옵션에 액세스하려면 createElement 메서드를 호출하는 것보다 innerHTML 속성을 사용하는 것이 더 효율적입나다.

팁 5: SELECT 요소에 많은 옵션을 추가하려면 innerHTML을 사용하십시오.

문자열 연결을 사용하여 SELECT 요소 HTML 텍스트를 작성한 뒤 이 팁을 사용하여 innerHTML 속성을 설정합니다. 옵션이 많은 경우에는 문자열 연결도 성능에 영향을 미칠 수 있습니다. 이런 경우에는 배열을 만들고 Microsoft JScript® join(영문 사이트) 메서드를 호출하여 OPTION 요소 HTML 텍스트의 최종 연결을 수행합니다.

실행 비교

느린 메서드:

  var opt;
 divUpdate.innerHTML = "<SELECT ID='selUpdate'></SELECT>";
 for (var i=0; i<1000; i++)
 {
  opt = document.createElement( "OPTION" );
  selUpdate.options.add( opt );
  opt.innerText = "Item " + i;
 }

빠른 메서드:

  var str="<SELECT ID='selUpdate'>";
 for (var i=0; i<1000; i++)
 {
  str += "<OPTION>Item " + i + "</OPTION>";
 }
 str += "</SELECT>";
 divUpdate.innerHTML = str;

더 빠른 메서드:

 var arr = new Array(1000);
 for (var i=0; i<1000; i++)
 {
  arr[i] = "<OPTION>Item " + i + "</OPTION>";
 }
 divUpdate.innerHTML = "<SELECT ID='selUpdate'>" + arr.join() + "</SELECT>";
 

맨 위로

DOM을 사용한 테이블 업데이트

DHTML 테이블 개체 모델에 속해 있는 insertRow(영문 사이트) 및 insertCell(영문 사이트) 메서드를 사용하는 것 보다 DOM 메서드를 사용하여 테이블 행 및 셀을 삽입하는 것이 더 효율적입니다. 특히 크기가 큰 테이블을 만들 때 효율적입니다.

팁 6: 크기가 큰 테이블을 작성하려면 DOM 메서드를 사용하십시오.

실행 비교

느린 메서드:

  var row;
 var cell;
 for (var i=0; i<100; i++)
 {
  row = tblUpdate.insertRow();
  for (var j=0; j<10; j++)
  {
    cell = row.insertCell();
    cell.innerText = "Row " + i + ", Cell " + j;
  }
 }

빠른 메서드:

  var row;
 var cell;
 var tbody = tblUpdate.childNodes[0];
 tblUpdate.appendChild( tbody );
 for (var i=0; i<100; i++)
 {
  row = document.createElement( "TR" );
  tbody.appendChild( row );
  for (var j=0; j<10; j++)
  {
    cell = document.createElement( "TD" );
    row.appendChild( cell );
    cell.innerText = "Row " + i + ", Cell " + j;
  }
 }

맨 위로

한번 쓰기, 여러 번 사용

웹 사이트에서 공통적인 작업을 수행하는 데 스크립트를 사용한다면 둘 이상의 웹 페이지에서 재사용할 수 있도록 이러한 함수를 별도의 파일에 두는 것이 좋습니다. 스크립트 파일을 사용하면 코드 유지 관리를 향상시킬 뿐 아니라 스크립트 파일이 브라우저 캐시에 남아있게 되므로 웹 사이트를 방문하는 동안 사용자 컴퓨터에 한 번만 다운로드하면 됩니다. 개별 파일에도 일반 스타일 규칙을 적용하면 동일한 효과를 얻을 수 있습니다.

Tip 7: 공통 코드를 동작 또는 개별 파일에 두어 스크립트를 재활용하십시오.

스크립트 재활용 기능 향상을 위해 DHTML 첨부 또는 요소 동작(영문 사이트)에 공통 스크립트 작업을 배치하십시오. 동작은 스크립트를 재활용하고 HTML에서 액세스 가능한 구성 요소를 작성하여 사용자 고유의 개체, 메서드, 속성 및 이벤트를 사용한 DHTML 개체 모델 확장을 가능하게 합니다. 동작이 viewlink(영문 사이트) 기능을 사용하지 않는 경우 Internet Explorer 5.5 에서 사용 가능한 lightweight(영문 사이트) 동작 기능을 사용하면 코드 간략화를 더욱 효과적으로 수행할 수 있습니다. 또한 스크립트 코드가 단일 SCRIPT(영문 사이트) 블록 내에 있는 경우 성능을 더욱 향상시킬 수 있습니다.

지나치게 동적인 속성은 피할 것

동적 속성(영문 사이트)을 통하여 웹 페이지 제작자는 속성 값으로 식을 사용할 수 있습니다. 이 식은 실행 시간에 계산되어 속성에 그 결과 값을 적용합니다. 이 기능은 강력합니다. 페이지 스크립트 양을 감소시킬 수 있지만 식이 주기적으로 다시 계산되고 종종 다른 속성 값에 따라 변하기 때문에 성능에 좋지 않은 영향을 줄 수도 있습니다. 위치 지정 속성인 경우에는 특히 그러합니다.

팁 8: 동적 속성 사용을 자제하십시오.

맨 위로

데이터 바인딩의 유용성

데이터 바인딩(영문 사이트)은 웹 페이지의 HTML 요소에 데이터베이스 쿼리 결과 값 또는 XML 데이터 섬(영문 사이트) 컨텐트를 바인딩할 수 있는 강력한 기능입니다. 또한 데이터를 가져오기 위해 서버로 돌아가지 않고도 데이터 정렬 및 필터링 기능 및 다른 데이터 뷰를 제공할 수 있습니다. 회사의 데이터를 선 그래프, 막대 그래프 또는 파이 차트로 나타내고 지점, 제품 또는 판매 기간별로 데이터를 정렬하는 단추가 있는 웹 페이지를 상상해 보십시오. 한 번만 서버를 방문하면 이 모든 기능을 제공할 수 있습니다.

팁 9: 다양한 클라이언트쪽 데이터 뷰를 제공하려면 데이터 바인딩을 사용하십시오.

데이터 바인딩에 대한 자세한 정보는 다음 기사를 참조하십시오.

맨 위로

문서에 Expando 속성을 사용하지 말 것

expando(영문 사이트) 속성은 모든 개체에 추가할 수 있는 임의 속성입니다. 이 속성은 현재 웹 페이지에 정보를 저장하는 경우 유용하며 DHTML 개체 모델을 확장하는 또 다른 방법을 제공합니다. 예를 들어 HTML 요소에 clicked 속성을 할당하여 어느 요소가 클릭되었는지를 알려주는 데 사용할 수 있습니다. 이벤트를 발생시켜 이벤트 처리기 함수에 추가적인 컨텍스트 정보를 제공하는 경우에도 expando 속성을 사용할 수 있습니다. expando 속성을 어떻게 사용하건 document(영문 사이트) 개체에는 이 속성을 설정하지 마십시오. 속성을 설정하면 속성을 액세스할 때 문서가 추가적인 재계산을 수행해야 합니다.

팁10: window(영문 사이트) 개체에 expando 속성을 설정하십시오.

실행 비교

느린 메서드:

for (var i=0; i<1000; i++)
 {
  var tmp;
  window.document.myProperty = "Item "+i;
  tmp = window.document.myProperty;
 }

빠른 메서드:

for (var i=0; i<1000; i++)
 {
  var tmp;
  window.myProperty = "Item "+i;
  tmp = window.myProperty;
 }

맨 위로

클래스와 스타일 규칙을 전환하지 말 것

클래스와 스타일 규칙을 전환하면 재계산과 전체 문서 레이아웃이 필요하기 때문에 부담이 큰 작업이 될 수 있습니다. 웹 사이트의 컨텐트를 다른 방법으로 보기 위해 스타일시트를 사용하는 경우, 요소의 className(영문 사이트) 속성이나 styleSheet(영문 사이트) 개체를 수정하는 대신 변경할 요소의 style(영문 사이트) 개체를 직접 수정하는 것이 좋습니다.

팁 11: 컨텐트 표시를 변경할 때 style 개체를 직접 수정하십시오.

상위 요소를 찾기 전에 텍스트 범위를 축소

TextRange(영문 사이트) 개체는 사용자가 선택하거나 BODY(영문 사이트)와 같은 HTML 요소에서 가져온 텍스트의 영역입니다. 텍스트 범위의 상위는 parentElement(영문 사이트) 메서드를 호출해 확인합니다. 복잡한 문서 범위는 parentElement 메서드를 호출하기 전에 collapse(영문 사이트) 메서드를 호출하는 것이 효율적입니다.

팁 12: parentElement 메서드를 액세스하기 전에 텍스트 범위를 축소하십시오.

자세한 내용은 TextRange 개체 사용(영문 사이트)을 참조하십시오.

맨 위로

기타 자료

성능에 대한 다른 정보를 보려면 다음 기사를 참조하십시오.

Mark Davis는 Internet Explorer SDK 설명서 팀의 소프트웨어 디자인 엔지니어입니다. 그는 Internet Explorer 연구에 빠져 있거나 시간이 나면 미국 서북부 지역을 하이킹하는 것이 취미입니다.

 

Tistory 태그:

Java's Runtime.exec() and External Applications
by Mitchell S. Baltuch ( mitch@unidata.ucar.edu)

Java was developed with an eye toward platform independence, freeing the software developer from the unpleasant and tedious task of cross-platform porting and testing of software. All too often, however, developers are not able to write completely new applications, but have to interface to existing legacy software and operating systems. This poses a problem as Java cannot make use of many utilities and system-dependent features that these programs have relied upon in the past.

There are two solutions to this problem, both of which sacrifice platform independence. The first is to make use of native methods in your Java code. You lose the portability, but achieve the result. Native methods can also be more difficult to implement, which can make them less desirable to use.

The second option is to satisfy the programming needs by executing external utilities and applications from within a Java program. In Java, this means employing the Runtime class exec() method. Like the fork(3) C function, Runtime.exec() allows you to execute a program; unlike fork(), it does not allow you to directly control the environment. Runtime.exec() provides a simple interface to platform-dependent utilities and applications, although at the expense of platform independence. In an environment where Java applications must coexist with other non-Java applications this will often be a valid trade-off.

In its simplest form, exec() is quite easy to use:

	Process p = Runtime.getRuntime().exec("/bin/ls");

The problem with this form is that it gets you nowhere. When Java forks a new process it redirects STDIN, STDOUT and STDERR. Therefore the results of "/bin/ls" do not go to the screen. Instead you must use the getInputStream(), getOutputStream() and getErrorStream() methods of the Process object to communicate with the program that you executed. Listing 1 shows an example using the Unix ls(1) command.

				  Listing 1
import	java.io.*;

class execInput {
    public static void main(String Argv[]) {
	try {
	    String ls_str;

	    Process ls_proc = Runtime.getRuntime().exec("/bin/ls -aFl");

	    // get its output (your input) stream

	    DataInputStream ls_in = new DataInputStream(
                                          ls_proc.getInputStream());

	    try {
		while ((ls_str = ls_in.readLine()) != null) {
		    System.out.println(ls_str);
		}
	    } catch (IOException e) {
		System.exit(0);
	    }
	} catch (IOException e1) {
	    System.err.println(e1);
	    System.exit(1);
	}

	System.exit(0);
    }
}

Some points to be aware of with this code. In the JDK1.0.2 implementation, you must supply a complete path to whatever it is that you are executing. There is no facility in that version of the JDK to get the shell environment that you are running in, hence no PATH variable is known. This is fixed in JDK1.1, however it is always good practice to fully qualify the path.

Shell built-in commands will not work here. A prime example of this is the DOS "dir" command. This is a built-in and will not execute. You would need to use "command \c dir" as the command string.

If you pass the executable command as a single String, the exec() method will break the string into multiple strings, breaking the original string on white space. This will cause some trouble when trying to do things like I/O redirection.

Consider the following line of code:

	Process p = Runtime.getRuntime().exec("/bin/sh -c /bin/ls > ls.out");

This is intended to execute a Bourne shell and have the shell execute the ls command, redirecting the output of ls to the file ls.out. The reason for using /bin/sh is to get around the problem of having stdout redirected by the Java internals. Unfortunately, if you try this nothing will happen. When this command string is passed to the exec() method it will be broken into an array of Strings with the elements being "/bin/sh", "-c", "/bin/ls", ">", and "ls.out". This will fail, as sh expects only a single argument to the "-c" switch. To make this work try:

	String[] cmd = {"/bin/sh", "-c", "/bin/ls > out.dat"};
	Process p = Runtime.getRuntime().exec(cmd);

Since the command line is already a series of Strings, the strings will simply be loaded into the command array by the exec() method and passed to the new process as is. Thus the shell will see a "-c" and the command "/bin/ls > ls.out" and execute correctly.

Using Runtime.exec() can make integration with system utilities, tools and legacy software achievable, although, as already noted, at the expense platform independence. If you must work with existing software and tools, it is often the easiest, and most straight-forward approach to the problem. But beware of the gotchas. They can often lead to unexpected results.

 

번 호
1

ERROR
Exception in thread "main" java.lang.NoClassDefFoundError: 파일명

발생되는 경우
클래스 파일을 찾을 수 없는 경우

조 언
실행하려는 클래스 파일 이름이 제대로 되어 있는지 확인한다.
또한, CLASSPATH 설정이 제대로 되어 있는지 확인하며 (도스모드에서 set명령어)
만약, 되어있지 않다면 설정한다. (CLASSPATH = jdk1.3/jre/lib/rt.jar; 2-1강좌 참조)

번 호
2

ERROR
cannot resolve symbol
symbol : class in(에러가 난 부분)
location : class StackTest(찾으려는 위치)

발생되는 경우
이해할 수 없는 클래스나 메소드, 변수명이 올경우

조 언
보통 이 에러는 철자가 틀렸을 경우에 많이 발생한다. 클래스, 메소드, 변수의 철자를 세심히 확인해 본다.
특히, 철자를 확인할때 대소문자 구분을 확실히 체크한다.(자바는 대소문자를 구별한다.) 그리고 클래스에서 발생할 경우 import를 해주었는지 확인해 봅니다.

번 호
3

ERROR
non-static variable 변수이름(or method 메소드이름) cannot br referenced from a static context

발생되는 경우
static 메소드 안에서 static 으로 선언되지 않은 메소드나 변수를 참조(사용)했을 경우.
특히, 메소드의 경우는 인스턴스를 사용하지 않고 static메소드 내에서 바로 선언한 경우.

조 언
static 선언자의 사용여부를 살펴보고 static 메소드 안에 static으로 선언되어지지 않은 메소드나 변수가 있느지 확인해본다.
만약 그런것이 있으면 메소드를 새로 만들어 그쪽에서 선언한다. 단, 인스턴스를 생성해서 불러줘야 한다는 것을 잊지 말아야한다.

번 호
4

ERROR
valiable 변수명 might not have been initialized

발생되는 경우
지역변수인 변수명의 변수가 초기화가 되어있지 않았을 경우

조 언
지역변수(메소드 내에서 선언한 변수)를 초기화 하지 않은채 선언했을 경우 발생한다.
멤버 필드가 아닌 경우는 반드시 변수 선언시 초기화를 해주어야 한다.
(멤버 필드는 자바 프로그램 자체에서 자동으로 default값으로 초기화 해준다.)

번 호
5

ERROR
class 클래스명 is public, should be declared in a file named 클래스명.java

발생되는 경우
클래스명이 public으로 선언되었는데 파일명과 다를 경우

조 언
public으로 선언된 클래스가 있다면 반드시 그 클래스명과 파일명이 같아야 한다.
클래스명과 파일명의 대소문자 및 철자가 같은지 비교해 본다.
또한, public으로 선언된 클래스가 하나 이상 있는지 찾아본다.(반드시 하나만 있어야한다.)

번 호
6

ERROR
push(java.lang.object)[메소드(인자로 받을 수 있는 형)] in java.util.Stack(메소드의 클래스) cannot be applied to (int)[잘못 들어간 형]

발생되는 경우
메소드에서 인자를 받을 때 받을 수 있는 형이 아닌 자료형 또는 클래스형을 사용할 경우

조 언
사용하는 메소드의 API를 참고하여 어떤 형을 인자로 받을 수 있는지 찾아본다.
API를 보지 못할 경우는 각 자료형으로 인자를 직접 바꾸어 본다.

번 호
7

ERROR
java.lang.NoSuchMethodError: main
Exception in thread "main"

발생되는 경우
클래스 파일 안에서 main() 메소드를 찾을 수 없는 경우

조 언
자바 애플릿이 아닌 이상 자바 애플리케이션은 반드시 main() 메소드를 사용해야 합니다.
main() 메소드를 빼먹지 않았는지 확인해 보십시요. 또한 public static void main(String[] args) 형식으로 씌어졌는지도 확인해 보십시요.
(main 클래스는 반드시 위와 같은 형식으로 만들어져야 합니다.)

번 호
8

ERROR
unreported exception java.io.IOException(Exception명); must be caught or declared to be thrown

발생되는 경우
예외가 발생하는데 예외처리를 해주지 않았을 경우

조 언
예외를 발생하는 메소드 같은 경우는 반드시 예외처리를 해주어야 합니다.
예외를 발생하거나 예외처리를 해야하는 메소드는 API를 확인해 보시면 알 수 있습니다.
그렇지 않다면 컴파일 후 지금처럼 에러가 난 예외를 예외처리해 주시면 됩니다.
또한, 예외를 처리할 때는 메소드 차원에서 throws 예외명을 이용해서 처리할 수 있고
try{} catch{} 구문을 이용해서 직접 처리해 주셔도 됩니다.(예외 강좌를 참고하세요.)
특히, 예외도 클래스이므로 반드시 예외가 들어간 패키지를 import 해주어야 합니다.

번 호
9

ERROR
Note : Calculator.java(파일명) uses or overrides a deprecated API.
Note : Recompile with -deprecation for details.

발생되는 경우
JDK 버전이 높아졌거나 보안등의 기타이유로 사용이 deprecated된 메소드를 사용한 경우

조 언
이건 예외라기 보다는 경고 입니다.(실행하면 됩니다.^^)
JDK가 버전이 높아지거나 보안등의 이유에 따라 예전에 만들어졌지만 필요가 없어지거나 대체된 메소드가 생겨났습니다.
그런 메소드를 deprecated 되었다고 하는데 이것은 API상에 나왔있습니다.
또한, 컴파일할때 -deprecation 옵션주면 어떤 메소드가 deprecate됐는지 알수있읍니다.
사용이 중지 됐다고 보기 보다는 사용을 가능하면 하지 않게끔 해주는 거죠.
대치되었거나 버전 업된 메소드를 사용하시면 됩니다.

번 호
10

ERROR
MouseEvent(클래스명) should be declared abstract; it does not define mouseDragged(java.awt.event.MouseEvent)[메소드명(메소드가 포함된 클래스)] in MouseEvent(클래스명)

발생되는 경우
implements한 Interface의 모든 메소드를 구현하지 않아서 발생됨

조 언
Interface는 모든 메소드가 선언만 되고 구현되지 않은 추상(abstract) 메소드입니다.
만약 Interface를 implements하려면 implements한 클래스가 Interface에서 선언한 모든 메소드를 구현해 주어야 합니다.
하나라도 빠질 경우 implements한 클래스도 추상 클래스로 보고 에러가 발생합니다.
에러에 구현해 주어야할 메소드명이 나오므로 그곳에 쓰여있는 메소드를 구현해 주면 됩니다.
만약, 그 메소드를 구현해 주었는데 에러가 나면 철자 및 대소문자를 다시 확인해 보십시요.

번 호
11

ERROR
incompatible types
found : /null(입력한 자료형)
required : int(요구하는 자료형)

발생되는 경우
입력을 했을때 맞지 않는 자료형이나 클래스형을 입력할 경우

조 언
incompatible 은 '성미가 맞지 않는','모순된' 이라는 뜻을 가진 단어 입니다.
단어뜻 처럼 입력 경우 required 에 나타난 자료형 및 클래스형을 요구하는데
found 에서 나타난 자료형 및 클래스형을 써주어서 입력을 하지 못하게 되어서 발생하는 에러입니다.
found 에 나타난 자료형을 required 에 나타난 자료형으로 변경해 주시면 됩니다.

번 호
12

ERROR
package java.servlet(패키지명) does not exist

발생되는 경우
import한 패키지가 존재하지 않을 경우

조 언
import한 패키지가 존재하지 않을 경우에 발생하는 에러입니다.
철자와 대소문자를 먼저 확인하고 CLASSPATH 설정을 확인해 보시기 바랍니다.
또한 그 곳에 패키지가 jar파일로 있는지도 확인해 보셔야 합니다.
(API에 나와있는 패키지는 rt.jar에 다 있습니다.
단 javax가 붙거나 다름으로 시작되는 확장 패키지는 설치해 주어야합니다.(javax.swing 제외))

번 호
13

ERROR
java.lang.NullPointerException
Exception in thread "main"(메소드) java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:341)... [에러가 일어난 부분]

발생되는 경우
참조하거나 사용한 클래스 또는 자료형이 초기화 되지 않은 경우

조 언
보통 이것은 awt나 배열 부분에서 자주 발생하는데 초기화를 해주지 않아서 많이 발생합니다.
자바의 변수들은 기본적으로(자동으로 초기화 되는 멤버필드등을 제외하고) 초기화를 요구합니다.
에러에 체크된 부분을 검토해 보시고 초기화를 해주십시요.

번 호
14

ERROR
';'(빠진 부분) expected

발생되는 경우
문법상으로 써야할 것을 쓰지 않은 경우 발생합니다.

조 언
주로 ';'을 안써주시거나 아님 '()'(괄호)를 열기만 하고 닫지 않은 실수를 할 경우 발생합니다.
대부분 이 에러가 발생한 경우는 에러에 나온것을 소스에 추가해 주시면 됩니다.

번 호
15

ERROR
unexpected type
required : value(요구하는 타입)
found : class(소스상 써준 타입)

발생되는 경우
써주어야 할 타입이 아닌 잘못된 타입을 써주었을 경우

조 언
unexpected type 에러를 해석하면 '기대하지 않은 타입'이란 뜻을 가지고 있습니다.
즉, 원하는 타입(required)이 아닌데 잘못된 타입(found)을 써준 경우 발생합니다.
에러 체크된 부분의 타입을 required 에서 나타난 타입으로 변경해 주시면 됩니다.

번 호
16

ERROR
java.lang.ArrayIndexOutOfBoundsException
at Test.main(Test.java:10)[클래스.메소드(파일명:에러난 위치)]
Exception in thread "main"(예외가 던져진 메소드)

발생되는 경우
배열의 범위를 넘어선 값을 넣었을 경우

조 언
위의 에러는 특이하게 컴파일은 이상없이 되지만 실행을 하면 발생하는 에러입니다.
배열의 범위를 넘어설 경우에 발생하므로 에러난 위치의 배열의 참조 범위를 확인해보시고
선언해둔 배열의 범위에 맞게 조정해 주시면 됩니다.

번 호
17

ERROR
illegal start of expression

발생되는 경우
선언자(modifier)를 잘못 집어 넣은 경우

조 언
에러의 단어뜻을 확인해 보면 '표현의 시작이 부적격 합니다.'하고 해석할 수 있습니다.
보통 선언자가 맞지 않거나 쓰일데가 아닌데 선언자를 줄 경우에 많이 발생합니다.
특히 메소드안에서 static 선언자를 쓴 경우에는 직격으로 볼수 있죠.
에러가 난 부분의 선언자를 제거하거나 맞는 것인지 다시 확인해 보십시요.

번 호
18

ERROR
java.io.InputStream(클래스) is abstract; cannot be instantiated

발생되는 경우
abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우

조 언
abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우에 발생하는 에러입니다.
왜냐하면, 추상 클래스는 직접 new 명령어를 이용하여 인스턴스화 할수 없기 때문입니다.(객체를 못만든다구요.)
이 경우에는 인스턴스를 다른 방법으로 생성하시면 됩니다.
예를 들어 인스턴스를 반환하는 메소드를 이용한다거나 상속을 통해서 상속받은 클래스의 인스턴스를 만들어
직접 인스턴스를 만드는 효과를 낼수도 있구요. 원하시는 방법으로 바꾸어 보시길...

번 호
19

ERROR
local variable name(변수명) is accessed from within inner class; needs to be declared final

발생되는 경우
Local Class의 변수를 final로 선언하지 않은 경우

조 언
Local Class의 변수는 참조변수의 참조값 변동을 방지하기 위하여 final 선언자를 붙여주어야 합니다.
변수에 final 선언자를 붙이면 변수는 값을 변동할 수 없는 상수 처럼 쓰이며
만약 이 값을 참조할 경우 자바는 이 값을 넘기는게 아니라 이 값의 복사본을 참조 값으로 넘기게 됩니다.
그러므로 Local Class에서 참조값 변동없이 변수를 참조할 수 있게 되는 것입니다.
Local Class를 정의해준 곳을 살펴보고 final 선언자를 확실하게 확인하시기 바랍니다.

번 호
20

ERROR
inner classes cannot have static declarations

발생되는 경우
내부 클래스 안에서 static 선언자를 쓴 경우

조 언
내부 클래스 안에서는 static 선언자를 쓸수 없습니다.
내부 클래스 안에서 사용된 static 선언자를 제거해 주십시요.

번 호
21

ERROR
referenceto List is ambiguous,both class java.util.List(클래스) in java.util(패키지)
and class java.awt.List(클래스) in java.awt(패키지) match

발생되는 경우
클래스 사용시 다른 패키지내에 동일이름의 클래스들이 있어서 참조가 모호할 경우

조 언
예시를 보면 아시겠지만 import 한 패키지중에 같은 이름을 사용하는 클래스를 클래스 이름만으로
생성함으로서 참조가 모호해질 경우 발생하는 에러입니다.
이와 같은 경우는 import를 하나 제거 하거나 아님 java.util.List 이런식으로
직접 그 클래스의 패키지를 같이 써줌으로서 모호성을 제거할수 있습니다.

번 호
22

ERROR
m()(메소드명) in B(클래스명) cannot override m()(메소드명) in A(클래스명);
attempting to use incompatiable return type

발생되는 경우
클래스를 상속받고서 메소드를 오버라이드 하고자할때 잘못한 경우

조 언
클래스를 상속받고서 메소드를 오버라이드 할 경우에는 지켜야 하는 규칙이 있습니다.
1. 메소드의 이름이 같아야 합니다.
2. 메소드의 파라미터 개수, 데이터형이 같아야 합니다.
3. 메소드의 리턴형이 같아야 합니다.
4. 상위 메소드와 동일하거나 더 구체적인 Exception을 발생시켜야 합니다.
5. 상위 메소드와 동일하거나 접근범위가 더 넣은 접근 제한자를 사용해야 합니다.
님의 메소드 오버라이드시 위 규칙을 잘 지켰는가를 다시 한번 확인해 보세요.

번 호
23

ERROR
getPathBetweenRows(int,int)(메소드) has protected access in javax.swing.jTree(클래스)

발생되는 경우
protected로 선언된 메소드를 상속 없이 직접 불러쓸 경우

조 언
protected로 선언되어 있는 메소드는 상속하거나 같은 package에 있을 때만 쓸 수 있습니다.
상속해서 다시 public 메소드로 값을 받던지 아니면
public 메소드 중에서 비슷한 기능을 하는 메소드가 있는지 찾아서 바꾸어주어야 합니다.

번 호
24

ERROR
invalid method declaration; return type required

발생되는 경우
리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우

조 언
리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우에 발생하는 에러이므로
에러가 발생한 메소드를 확인해보고 리턴 타입을 맞게 적어주어야 합니다.

번 호
25

ERROR
Error occurred during initialization of VM
java.lang.ExceptionInInitializerError

발생되는 경우
static으로 선언된 변수중 초기화가 안되어 있는 것이 있는 경우

조 언
static으로 선언된 변수중에 초기화가 안된게 있는 경우에 발생하는 에러이므로
에러가 발생한 변수를 확인해보고 알맞은 초기화를 시켜주거나 변수의 위치를
자동 초기화가 가능한 메소드 밖의 클래스 변수로서 사용하게 합니다.

번 호
26

ERROR
Error opening registry key 'Software\JavaSoft\Java Runtime Environment'
Error: could not find java.dll
Error: could not find Java 2 Runtime Environment

발생되는 경우
중복설치 등으로 인해 레지스트리 키값이 잘못되어 있는 경우

조 언
중복설치 등으로 인해 레지스트리 키값이 잘못되어 있는 경우에 발생하는 에러이므로
레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft에
보시면 3개의 키가 있을 겁니다. 그중에서 첫번째 키인 Java 런타임 환경 을 마우스
오른쪽 버튼으로 클릭하여 Java Runtime Environment로 이름을 바꿔주시면 됩니다.

번 호
27

ERROR
Error Registry Key 'Sofrware\JavaSofrware\Java Runtime Environment\CurrentVerison'
has value '1.1',but '1.3' is requried.
Error: could not find java.dll
Error: could not find java 2 Runtime Enviroment.

발생되는 경우
중복설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우

조 언
중복설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우에 발생하는 에러이므로
레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft -> Java Runtime Environment의 Current version의 값을 1.3으로 되어있는지 확인해 주시면 됩니다.

번 호
28

ERROR
java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver(드라이버명)

발생되는 경우
JDBC로 데이터 베이스에 연결하는 중 드라이버를 찾지 못할 경우

조 언
JDBC를 연결하는 중에 드라이버를 찾지 못할 경우에 발생하는 에러이므로
각 데이터 베이스에 맞는 드라이버가 제대로 다운로드 되었는지 확인해 보시고
드라이버의 위치가 클래스 패스에 잡혀 있는지 확인해주시면 됩니다.

번 호
29

ERROR
Method printIn(java.lang.String)(메소드명) not found in class java.io.PrintStream(클래스명)

발생되는 경우
자신이 사용한 클래스의 메소드가 맞지 않는(=없는)경우

조 언
자신이 사용한 클래스의 메소드가 맞지 않는(=없는) 경우에 발생하는 에러이므로
API를 통해서 사용하고자 하는 클래스와 메소드를 다시 한번 확인해 봅니다.
보통 이경우 메소드의 철자나 대소문자를 잘못 쓴 경우가 많으니 그점을 유심히 살표봅니다.
마지막으로 철자와 대소문자도 맞는다면 메소드의 인자의 객체형을 맞게 주었는지 확인해보면 됩니다.

자바를 하다보면 에러와 만나게 되는데요... 자바는 친절해서 몇번라인에 에러가 났으니 고쳐달라고 콘솔창에 표시를 합니다... 그래도 모르는 에러들이 있는데요.. 조금이라도 참고해 보아요

 

Tistory 태그: ,

+ Recent posts