'대학 생활 > JAVA' 카테고리의 다른 글

[JAVA] 피보나치 - 재귀사용  (0) 2015.11.13
[JAVA] 퀵정렬(QuickSort)  (0) 2015.11.06
[JAVA] 병합정렬(MergeSort)  (0) 2015.10.30
[JAVA] 버블정렬(BubbleSort)  (0) 2015.10.23

toArray() 사용법

보톤 반복문을 통해 하나하나 배열에 넣는 방법을 사용하는데, 속도도 느리고 효율성도 좋지 않다고 한다. 또한 arr = (String[])list.toArray(); 와 같은 코드를 사용한다면 List의 요소가 정확히 어떤 형태로 형변환을 해야 할지 명시하지 않아 java.lang.ClassCastException이 발생한다.


package Test;

import java.util.ArrayList;
import java.util.List;

public class Example {
	public static void main(String[] args) {
		List list = new ArrayList<>();
		list.add("test1");
		list.add("test2");
		list.add("test3");

		String[] arr = (String[]) list.toArray(new String[list.size()]);
		for (String str : list) {
			System.out.println(str);
		}
	}

}

IP주소는 하드코딩을 피해라.

책 '자바 코딩, 이럴 땐 이렇게'에서 이번에도 꼭 알아두어야 할 것 같은 부분을 보고 남기려고 한다. 서버 프로그램을 작성할 때 서버의 IP를 소스코드에 하드코딩하는 습관이 바람직하지 않다고 한다.

첫 번째 이유는 관리적인 측면과 유지보수의 측면에서 볼 수 있다. 말 그대로 서버의 IP가 바뀌었거나, 소스 수정을 할 때 하나하나 찾아가며 바꿔야 하기 때문이다. 

두 번째 이유는 보안적인 측면인데, 자바 소스는 디컴파일(decompile)이 가능하기 때문이다. 즉 JVM이 인식하는 코드 .class코드가 유출된다면 IP정보가 쉽게 유출된다는 점이다.


해결 방안

package Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Example {
	private static final String DEFAULT_PROPERTIES_PATH = "d://test.properties";

	private static String serverIP;

	public static void main(String[] args) throws Exception {
		setServerIP(Example.getKey("serverIp"));
	}

	public static String getKey(String key) throws Exception {
		String value = null;
		InputStream is = new FileInputStream(DEFAULT_PROPERTIES_PATH);
		Properties properties = null;
		try {
			properties = new Properties();
			properties.load(is);
			value = properties.getProperty(key);

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();

		} finally {
			try {
				is.close();
			} catch (IOException e) {

			}
		}
		return value;
	}

	public static String getServerIP() {
		return serverIP;
	}

	public static void setServerIP(String serverIP) {
		Example.serverIP = serverIP;
	}

}

varargs : Variable Argument List

매개변수가 가변적일 때 사용하는 가변인자. 즉, 여러개의 파라미터를 가변적으로 사용할 때 사용된다. 

방법은 아래와 같이 사용한다. API


    public void printFormat(String... strs) {
        System.out.println("size : " + strs.length);
        for (String str : strs) {
            System.out.printf(" %15s", str);
        }
    }


BigDecimal 객체 생성 방법, 비교

객체를 생성할 때 실수가 아닌 String 형태 혹은 valueOf()를 사용하고 비교할 때는 compareTo()를 사용한다.

import java.math.BigDecimal;
public class Example {
    public static void main(String[] args) {
        BigDecimal val1 = BigDecimal.valueOf(1.234);
        BigDecimal val2 = new BigDecimal("1.234");

        System.out.println(val1.compareTo(val2) == 0);
    }
}

불필요한 메모리 낭비 방지하기

빈번히 사용되는 수는 매번 인스턴스를 생성하여 사용하지 않고 미리 정의된 상수를 사용한다.

import java.math.BigInteger;

public class Exam {
    public static void main(String[] args) {
        BigInteger biZero = BigInteger.ZERO;
        BigInteger biOne = BigInteger.ONE;
        BigInteger biTen = BigInteger.TEN;

        BigInteger biTest1 = new BigInteger("10000000");
        BigInteger biTest2 = BigInteger.valueOf(1000000);

        System.out.println(biTest1.intValue());
    }
}

Boolean 객체의 사용법

인스턴스화하지 않고 static 필드인 TURE, FALSE를 사용한다.

public class BooleanExample {
    public static void main(String[] args) {
        // Boolean bool = new Boolean(ture);
        // Boolean bool2  = Boolean.valueOf(false);

        Boolean bool = Boolean.TRUE;
        Boolean bool2 = Boolean.FALSE;
     }
}

식사하는 철학자(Dining Philosopher) 문제 구현하기

이미 java.util.concurrent.Semaphore 로 세마포어를 사용할 수 있지만 직접 만들어 보도록 한다. 이 코드가 세마포어를 구현한 것인지 확실하진 않다. 단지 내가 이해한 세마포어를 구현해보았다. 

+ 세마포어란 하나의 공유변수를 사용하는데 아래 코드는 각 객체안의 변수를 사용하므로 모니터가 맞는것 같다...

코드 : 식사하는 4명의 철학자

DiningTable.java


Chopstick.java


Philosopher.java



결과화면

  



homework_0604.zip



자바를 다루는 기술

저자
김병부 지음
출판사
길벗 | 2014-02-24 출간
카테고리
컴퓨터/IT
책소개
자바 언어의 기초 문법을 친절하고 자세하게 설명한다. 객체 지향...
가격비교

 

객체와 인스턴스의 차이점

 비슷한 개념이지만 정확히 구별하면 인스턴스가 객체보다 큰 의미이다. 객체는 어떤 클래스를 사용해서 만들어진 것을 의미한다. 그리고 그 객체가 메모리에 할당되어 실제 메모리를 차지하는 것을 인스턴스라고 한다.  


String str;
str = new String("Hello world");
System.out.println(str);

위와 같은 코드에서 객체와 인스턴스를 구별해보자.

먼저 str은 String 클래스를 사용하여 객체를 선언한 것이다. 즉 아직 str에 문자열이 할당되어 있지 않은 상태이다. 

그리고 다음 라인을 보자. new 키워드를 사용하여 JVM에 데이터가 생성된 것을 보여준다. 이렇게 객체를 실제로 메모리에 할당하는 과정을 인스턴스화(instantiate)라고 한다. 즉 객체 str에 "Hello world"라는 문자열을 할당해서 인스턴화하였다. 그리고 이렇게 인스턴스화된 것을 인스턴스라고 부른다.




자바코드(activity)에서 setText()로 값 변경시 태그넣기

TextView t1 = (TextView)findViewById(R.id.t1);
t1.setText(Html.fromHtml("1번째줄" + "<br />" + "2번째줄"));


자바코드(or Activity)에서 string.xml 값 가져오기

String st1 = getString(R.string.s1);
CharSequence st2 = getText(R.string.s2);



자바캔에서 구현이 잘되어있어서 본문글 자체를 그래도 가져온 글입니다. 본문글은 이곳입니다.

(문제가 생긴다면 삭제하도록 하겠습니다.)


안드로이드에서 2회 연속 백버튼을 눌러서 앱을 종료시키는 경우가 흔한데, 이 기능은 많이 사용되므로 다음과 같이 별도 클래스로 기능을 분리하면 향후 기능 재사용이 편리하다.

public class BackPressCloseHandler {

	private long backKeyPressedTime = 0;
	private Toast toast;

	private Activity activity;

	public BackPressCloseHandler(Activity context) {
		this.activity = context;
	}

	public void onBackPressed() {
		if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
			backKeyPressedTime = System.currentTimeMillis();
			showGuide();
			return;
		}
		if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
			activity.finish();
			toast.cancel();
		}
	}


	private void showGuide() {
		toast = Toast.makeText(activity, "\'뒤로\'버튼을 한번 더 누르시면 종료됩니다.",
				Toast.LENGTH_SHORT);
		toast.show();
	}

}

BackPressCloseHandler의 구현은 간단하다.

  • backKeyPressedTime은 백버튼이 눌린 마지막 시간을 기록한다.
  • onBackPressed() 메서드는 현재 시간이 마지막 백버튼 누른 시간으로부터 
    • 2초 이상 지났으면, 마지막 백버튼 눌린 시간을 현재 시간으로 갱신하고 showGuide()를 실행한다.
    • 2초 이상 지나지 않았으면, Activity를 종료한다.
    • 참고로, 2초는 Toast.LENGTH_SHORT의 기본 값이다.
  • showGuide() 메서드는 Toast를 이용해서 메시지를 출력한다.

2회 연속 백버튼 누를 때 종료시키고 싶은 Activity가 있다면, 다음과 같이 사용한다.

  • BackPressCloseHandler 타입의  backPressCloseHandler 필드를 추가한다.
  • onCreate() 메서드에서 BackPressCloseHandler 객체를 생성해서 필드에 할당한다.
  • onBackPressed() 메서드에서 backPressCloseHandler.onBackPressed()를 호출한다.
아래 코드는 실제 적용한 코드의 일부를 발췌한 것이다.


public class HomeActivity extends Activity ... {

	private BackPressCloseHandler backPressCloseHandler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.home_layout);
		...
		backPressCloseHandler = new BackPressCloseHandler(this);
	}

	@Override
	public void onBackPressed() {
		backPressCloseHandler.onBackPressed();
	}
}


문제점

다이얼로그에서 버튼을 클릭하면 닫히는 것을 막으려고 한다. 
참고사이트

해결방안

기존 리스너는 버튼만 만들어주고 AlertDialog 객체를 통해 오버라이딩해서 사용한다. 
그리고 아래 조건문을 통해 dimiss()를 제어한다.

코드

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		tvName = (TextView) findViewById(R.id.tvName);
		btnClick = (Button) findViewById(R.id.btnClick);

		btnClick.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				dialogView = (View) View.inflate(asdasd.this, R.layout.dialog,
						null);

				AlertDialog.Builder builder = new AlertDialog.Builder(
						asdasd.this);
				builder.setMessage("Test input data");
				builder.setView(dialogView);
				builder.setPositiveButton("ok",
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
							}
						});
				builder.setNegativeButton("clear",
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
							}
						});
				final AlertDialog dialog = builder.create();
				dialog.show();

				dlg_edt_name = (EditText) dialogView
						.findViewById(R.id.dlg_edt_name);

				dialog.getButton(AlertDialog.BUTTON_POSITIVE)
						.setOnClickListener(new View.OnClickListener() {
							@Override
							public void onClick(View v) {
								Boolean wantToCloseDialog = true;

								tvName.setText(dlg_edt_name.getText());

								if (wantToCloseDialog)
									dialog.dismiss();
							}
						});
				dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
						.setOnClickListener(new View.OnClickListener() {
							@Override
							public void onClick(View v) {
								Boolean wantToCloseDialog = false;

								dlg_edt_name.setText("");

								if (wantToCloseDialog)
									dialog.dismiss();

							}
						});
			}
		});
	}


dialogExam.zip


java.io.RandomAcessFile

RandomAcessFile는 Object 클래스의 한단계 하위 클래스로 파일의 읽기, 쓰기가 가능하다.

파일시스템에 바이트로 저장된 큰 배열에 접근하는 방법으로 순차적으로 접근하는 방법이 아니라 파일 포인터를 이용해 임의의 위치(사용자가 선택한 인덱스)를 바로 읽을 수 있는 클래스이다.


Constructor:생성자

1. RandomAccessFile(File file, String mode)

2. RandomAccessFile(String name, String mode)

* mode

"r" -> 읽기전용

"rw" -> 읽고 쓰기 가능

"rws" ->

 JAVA 연산자 우선순위

  1. (), [], .
  2. !, ~, ++, --, +, -, instanceof
  3. new, (type name)
  4. *, /, %
  5. +, -
  6. <<, >>< >>>
  7. <, <=, >, >=
  8. ==, !=
  9. &, ^, |
  10. &&, ||
  11. ?:
  12. =, +=, -=, *=, /=, %/, >>=, >>>=, <<=, &=, ^=, |=


앞 포스팅과 다른점은 try-catch 위치 변경.
package Test03;


class MainClass {
	public static void main(String[] args) {
		// 객체 생성, 메서드 호출, for한번 허용
		MultiplicationTable play = new MultiplicationTable();
		for (int chk = 0; chk != 1;) {
			try {
				chk = play.inputValue(chk);
				play.outputResult();
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		}
	}
}
package Test03;

import java.util.Scanner;

class MultiplicationTable {
	int input_first, input_last;

	int inputValue(int chk) throws Exception {
		// 입력
		Scanner in = new Scanner(System.in);
		System.out.print("구구단의 시작단을 입력하세요 ");
		this.input_first = in.nextInt();
		System.out.print("구구단의 마지막단을 입력하세요  ");
		this.input_last = in.nextInt();

		// 예외 발생시키기
		if (input_first > input_last) {
			throw new Exception("시작단은 마지막단보다 작아야합니다.");
		}
		if ((input_first < 2) || (input_last > 9)) {
			throw new Exception("구구단은 2~9단을 입력하세요.");
		}
		// 예외가 일어나지 않아야 밑으로 이동
		chk = 1;
		return chk;

	}

	void outputResult() {
		for (int dan = input_first; dan <= input_last; dan += 3) {
			for (int line = 1; line < 10; line++) {
				System.out.printf(dan > input_last ? " " : "%d x %d = %2d  ",
						dan, line, (dan * line));
				System.out.printf(dan + 1 > input_last ? " "
						: "%d x %d = %2d  ", dan + 1, line, ((dan + 1) * line));
				System.out.printf(dan + 2 > input_last ? "\n"
						: "%d x %d = %2d\n", dan + 2, line, ((dan + 2) * line));
			}
			System.out.println("");
		}
	}
}

 

이클립스를 사용하는데 글씨가 너무 작아서 I 인지 L 인지 구별도 안가고, 피로감이 몰려와 하기싫어지면 안되겠죠.... 많은 분들이 이클립스를 사용하시는데 이번 크기는 글씨 크기를 키우는 방법에 대해서 알려드리겠습니다.

 

Window - Preferences 를 클릭해줍니다.

 

General - Appeareance - Colors and Fonts 로 들어가지면

Java Editer Text Font 를 더블클릭 또는 오른쪽 상단에 Edit를 클릭해줍니다.

( 저의 경우는 JAVA만 바꾸도록 하였습니다. 원하는 언어의 폰트를 변경하거나 Basic(이클립스 기본)에서 Font를 변경하시면 글씨 크기, 글씨체, 글꼴 스타일을 바꾸실수 있습니다. )

 

위 사진과 같이 크기를 알맞은 크기로 변경후 확인하시면 글씨크기를 바꾸실수 있습니다.

이클립스 글자크기를 설정하는 포스팅을 이만 마치겠습니다.


이클립스를 이용해 자바로 작성한 프로그램을 실행시킬 수 있도록 실행파일(exe)로 변환하는 방법에 대해 포스팅하겠습니다. 준비물로는 작성된 소스파일, 이클립스, JSmooth 이렇게 세 가지가 필요합니다.

JSmooth링크와 아래 그림을 통해 다운 받으시면 됩니다.

 

1. JSmooth 설치하기

 

 

 

 

JSmooth 설치가 끝나셨다면 이클립스를 통해 jar파일을 생성하도록 하겠습니다.

 

 

2. *.jar 파일 생성하기

 

프로젝트에 오른쪽 버튼 클릭 후 Export 를 클릭합니다. 

 

Java - Rnuable JAR file 선택 후 Next로 이동합니다.

 

먼저 Export destination에 .jar파일을 저장 할 위치를 지정해주고,

Launch configuration에는 만들고자 하는 클래스와 프로젝트를 선택하고 만들어주시면 됩니다.

 

 

3. JSmooth를 이용하여 exe파일 만들기

 

위 사진은 JSmooth 첫 실행화면입니다.

 

Skeletion Selection에 콘솔창 프로그램이라면 Consol Wrapper을, 윈도우창(AWT, Swing)이라면 Windowed Wrapper을 선택 후, 윈도우창을 선택했을 경우 아래 체크하시기 바랍니다.

 

위에는 .exe 파일의 경로를 선택하시고 아래는 아이콘으로 선택합니다.

 

먼저 아래에 .jar 파일을 선택하시고, 다음 Main class에 메인클래스를 선택합니다.

 

JVM 버전을 작성합니다.

 

모두 마친 후에 Project - compile 을 선택합니다.

 

JSmoonth파일을 생성할 위치를 선택하시고나면 exe파일이 만들어집니다.

 

위 사진과 같이 바탕화면에 두개의 파일이 만들어졌습니다.

이상으로 이클립스를 이용하여 자바 실행파일 만드는 방법에 대한 포스팅을 마치겠습니다.

 

carTest.java

 생성자를 사용한 코드를 만들면서 주석을 통해 정리해봤습니다.

 

 

1. if

구조 

 

if(조건식)

{

//조건식에 만족할 때 수행되는 문장.

}

else if(조건식2)

{

//조건식1이 만족하지 않을 때, 조건식2로 내려와 만족하면 수행되는 문장.

}

else

{

//생략이 가능하며, 위의 어느 조건도 만족하지 않을 때 수행되는 문장.

}

 

 

* equals 메소드

 

String str1 = new String("Hello");

String str2 = new String("Hello");

 

if(str1 == str2)                            // 주소값을 비교. false

if(str1.equals(str2))                    // 변수 안에 내용을 비교하는 메소드. true

if(str1.equalsIgnoreCase(str2))    // 변수안에 대소문자 가리지않고 내용만 확인. true

 

 

2. switch

구조

 

switch(조건식){

case 값1 :

// 조건식의 값이 값1과 같을 경우 실행.

break;    // 모두 실행하고 switch문을 빠져나오기 위함.

case 값2 :

// 조건식의 값이 값2과 같을 경우 실행.

break;

default :

// 위의 조건식에 일치하지 않을 때 실행.

 

※ case문의 값으로 변수를 사용할 수 없다.(리터럴, 상수만 가능)

 

* Math 클래스의 random() : 0.0과 1.0 사이의 범위에 속하는 하나의 double값을 반환하는 메소드.

 

 임의의 문자를 얻을 수 있도록 하는 예제.

0.0 <= Math.random() <1.0

 

0.0 * 26 <= Math.random() * 26 < 1.0 * 26

0.0 <= Math.random() * 26 < 26.0

출력하고자 하는 문자의 갯수 26을 각 변에 곱한다.

 

0.0 * 26 + 65 <= Math.random() * 26 + 65 <1.0 * 26 + 65

65.0 <= Math.random() * 26 + 65 < 91.0

아스키코드 65(A)부터 시작하므로 65를 각 변에 더한다.

 

(char)65.0 <= (char)Math.random() * 26 + 65 < (char)91.0

'A' <= (char)Math.random() * 26 + 65 < '['

문자로 형변환을 한다.

 

 

3. for

구조 

 

for(초기화 ; 조건식 ; 증감식){

// 조건식에 만족할 때 수행되는 문장.

// 순서 : 초기화 → 조건식 → for문 수행 → 증감식 조건식

// for문 안에 초기화에서 변수가 선언되면 for문 안에서만 사용가능하다.

//



4. do-while

구조 

 

do{

// 조건식에 만족할 때 수행되는 문장.

// 최소한 한번은 수행되는 반복문.

}while(조건식)



5. break, continue, Loop

break     : 사용되는 위치에서 가까운 반복문을 빠져나오는데 사용된다.

continue : 반복문의 끝으로 이동하여 다음 반복이 진행된다.

Loop      : 반복문 앞에 이름을 정해주고, break이나 continue에 같이 써줘 반복문을 벗어나거나 반복을 

   건너뛸  수 있게 한다.




변수란

하나의 값을 저장할 수 있는 공간.

 

변수의 선언

변수타입 변수이름;

char name;    // 문자형 변수 name을 선언한다.

변수의 이름(메서드, 클래스의 이름도 포함)을 선언할때, 대소문자 구분해야한다.

숫자로 시작하거나, 예약어를 사용하면 안 된다.

특수문자는 '_'와 '$'만 사용가능하다.

int num = 6 ;    // 선언후 변수의 값을 6으로 초기화 한다. 

 

변수의 타입과 크기

기본형(Primitive type) : boolean, char, byte, short, int, long, float, double

참조형(Reference type) : 기본형을 제외한 나머지 타입

 

 

1 byte

2 byte

4 byte

8 byte

논리형

boolean

문자형

char

(유니코드)

정수형

byte

short

int

(기본 자료형)

long

실수형

float

double

(기본 자료형)

 

데이터 타입

변수의 범위 

 기본값

크기 

boolean

true, false

 false

1 byte

byte

\u0000~\uffff (0~65,535)

 0

1 byte

char

-128~127

 '\u000'

2 byte

short

-32,768~32,767

 0

2 byte

int

-2,147,483,648~2,147,483,647

 0

4 byte

long

-9223372036854775808~9223372036854775807

 0L

8 byte

float

1.4E-45~3.4028235E38

 0.0f

4 byte

double

4.9E-324~1.7976931348623157E308

 0.0 또는 0.0d

8 byte

 

 

 

2015.01.29 추가

이번에  JAVA를 다시 설치하면서 환경변수가 자동으로 설정된다는 것을 알았다.

Path를 보니 c:\ProgramData\Oracle\Java\javapath 가 지정되어 있었고, 그 디렉토리 안에는 Java가 바로가기파일로 들어있었다. 앞으로는 따로 환경변수를 지정하지 않아도 될 듯하다.





환경변수

설명

Path

OS에서 명령어를 실행할 때 명령어를 찾아야 하는 폴더의 순위를 설정하는 환경 변수

CLASSPATH

JVM이 시작될 때 JVM의 클래스 로더는 이 환경 변수를 호출한다. 그래서 환경 변수에 설정되어 있는 디렉토리가 호출되면 그 디렉토리에 있는 클래스들을 먼저 JVM에 로드한다. 그러므로 CLASSPATH 환경 변수에는 필스 클래스들이 위치한 디렉토리를 등록하도록 한다.

JAVA_HOME

JDK가 설치된 홈 디렉토리를 설정하기 위한 환경 변수다. 반드시 필요한 환경 변수는 아니지만 Path와 CALLPATH 환경 변수에 값을 설정할 때 JAVA_HOME 환경 변수를 포함하여 설정한다.


환경 변수 설정하기

JDK 설치를 하고 환경 변수를 설정하는 방법이다. 환경 변수란 실행 파일이 모여있는 디렉토리 경로를 지정함으로써 어느 위치에서든지 사용할 수 있도록 하는 것이다. 먼저 윈도우에서 환경 변수를 설정하기 창을 실행시킨다. 방법은 아래와 같다.
아래의 아무것이나 한 가지 선택해서 환경 변수 설정 창을 실행 시킨다.
1. '제어판 → 모든 제어판 항목 → 시스템' 선택 후 '고급 시스템 설정' 클릭하고 고급 탭에서 '환경 변수' 클릭.
2. 내컴퓨터 오른쪽 클릭 후 속성 선택하고 고급 탭에서 '환경 변수' 클릭.

JAVA_HOME 추가하기


'새로 만들기' 선택 후 변수 이름은 'JAVA_HOME'이고 변수 값은 자신의 컴퓨터에 설치된 JAVA의 경로를 입력한다.

Path에 ;%JAVA_HOME%\bin 추가하기


시스템 변수 Path에 마지막에 ;%JAVA_HOME%\bin을 추가한다. Path를 삭제하거나 잘못 저장한다면 복잡해질 수 있으니 조심해야 한다.

CLASSPATH 추가하기


'새로 만들기' 선택 후 변수 이름은 'CLASSPATH'이고 변수 값은 자신의 컴퓨터에 설치된 %JAVA_HOME%\lib를 입력한다.


TEST 하기

java -verion, javac -version 은 Path에 추가 되었는지 확인하기 위함이고, echo %CLASSPATH% 는 CLASSPATH가 추가 되었는지 확인하기 위함이다.


컴파일하고 실행시에 "기본 클래스 을(를) 찾거나 로드 할 수 없습니다. 라는 에러메세지가 뜬다면 다음과 같이 실행시킨다.

java -classpath ".;lib" Helloworld

혹은 CLASSPATH의 변수 값을 다음과 같이 수정한다.

%JAVA_HOME%\lib\;.


+ Recent posts