자바를 다루는 기술

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

 

객체와 인스턴스의 차이점

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


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

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

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

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




JDK 개발 도구 명령어

java

컴파일된 바이트 코드 파일(*.class)을 실행하는 명령어

  • 사용법 : java [클래스명]
  • 사용예 : java Helloworld

javac

자바 컴파일 명령어로 자바 코드로 작성된 파일을 실행 가능한 '.class'로 컴파일해준다.

  • 사용법 : javac [Java 파일명]
  • 사용예 : javac Helloworld.java


jar

자바에서 사용되는 묶음 파일인 Jar 파일을 다루기 위한 명령어. Jar 파일은 클래스 파일들을 편리하고 효율적으로 배포하기 위해 실행에 필요한 여러 파일들을 묶어 하나의 파일로 만든 것이다. 주로 외부 라이브러리들을 배포하거나 애플리케이션을 패치하는데 많이 사용된다. 

  • 묶는 법 : jar -xvf [대상 디렉토리 혹은 Class 파일들]
  • 푸는 법 : jar -cvf [jar 파일 경오]


javadoc

Java 문서를 만들어주는 명령어.

  • 사용법 : javadoc [Java 파일 명]

jps

현재 실행 중인 자바 프로세스들의 이름과 프로세스 ID를 보여주는 명령어

  • 사용법 : jps

jmap

JVM의 힙 메모리 상태를 확인할 수 있는 명령어. JVM의 힙 영역의 상태를 확인하는 것을 메모리 덤프나 메모리 절단면이라고 한다. 애플리케이션의 유지 보수 혹은 애플리케이션에서 에러가 발생했을 때 원인을 찾기 위해서 많이 사용하는 명령어.

  • 사용법 : jmap -heap:format=b,file=[저장할 dump 파일명][pid]

jhat

jmap을 사용하여 생성한 메모리 덤프 파일을 분석해주는 명령어. 이 명령어를 이용하면 스스로 웹서버를 띄워서 html 형식으로 분석된 내용을 보여준다. 보통 jps, jmap 그리고 jhat은 에러의 원인 분석이나 JVM 상태를 모니터링 하기 위해서 사용한다.

  • 사용법 : jhat [저장한 dump 파일명]


참고도서  : 자바를 다루는 기술 

Heap Sort Algorithm Source

package heapSort;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

public class Star {

	public static void main(String args[]) {

		ArrayList<String> data = new ArrayList<String>();
		String file_open_path = "D:/heapData.txt";

		fileRead(file_open_path, data);
		
		System.out.println(data);
		data = heapSort(data);
		System.out.println(data);

	}

	public static ArrayList<String> heapDown(ArrayList<String> data) {
		for (int n = (data.size() / 2) - 1; n >= 0; n--) {
			int leftChild = (n * 2) + 1;
			int rightChild = (n * 2) + 2;

			if (data.get(leftChild).compareTo(data.get(n)) < 0) {
				swapData(data, n, leftChild);
			}

			if (rightChild < data.size()) {
				if (data.get(rightChild).compareTo(data.get(n)) < 0) {
					swapData(data, n, rightChild);
				}
			}
		}
		return data;
	}

	public static ArrayList<String> heapSort(ArrayList<String> data) {
		ArrayList<String> sortedData = new ArrayList<String>();

		int len = data.size();
		data = heapDown(data);

		for (int i = 0; i < len; i++) {
			sortedData.add(0, data.remove(0));
			data = heapDown(data);
		}
		return sortedData;
	}

	private static void fileRead(String path, List<String> data) {
		BufferedReader reader = null;

		if (path != null) {
			try {
				reader = new BufferedReader(new FileReader(path));

				String line = null;
				while ((line = reader.readLine()) != null) {
					if (line.charAt(0) == 65279) {
						data.add(new String(new StringBuffer(line)
								.deleteCharAt(0)));
					} else {
						data.add(line);
					}
				}
				reader.close();
			} catch (Exception e) {
				System.err.println(e);
			} finally {
				try {
					if (reader != null) {
						reader.close();
					}
				} catch (Exception ex) {
				}
			}
		}
	}

	private static void swapData(ArrayList<String> data, int a, int b) {
		String temp;
		temp = data.get(a);
		data.set(a, data.get(b));
		data.set(b, temp);
	}
}


ArrayList 합집합(union)

	public <T> List<T> union(List<T> list1, List<T> list2) {
		Set<T> set = new HashSet<T>();

		set.addAll(list1);
		set.addAll(list2);

		return new ArrayList<T>(set);
	}

ArrayList 교집합(intersection)

	public <T> List<T> intersection(List<T> list1, List<T> list2) {
		List<T> list = new ArrayList<T>();

		for (T t : list1) {
			if (list2.contains(t)) {
				list.add(t);
			}
		}

		return list;
	}

사용예시

public class ListUtil {

	public static void main(String... args) throws Exception {

		List<String> list1 = new ArrayList<String>(Arrays.asList("A", "B", "C"));
		List<String> list2 = new ArrayList<String>(Arrays.asList("B", "C", "D",
				"E", "F"));

		System.out.println("교집합" + new ListUtil().intersection(list1, list2));
		System.out.println("합집합" + new ListUtil().union(list1, list2));
	}

	public <T> List<T> union(List<T> list1, List<T> list2) {
		Set<T> set = new HashSet<T>();

		set.addAll(list1);
		set.addAll(list2);

		return new ArrayList<T>(set);
	}

	public <T> List<T> intersection(List<T> list1, List<T> list2) {
		List<T> list = new ArrayList<T>();

		for (T t : list1) {
			if (list2.contains(t)) {
				list.add(t);
			}
		}

		return list;
	}
}



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

[JAVA] JDK 개발 도구 명령어  (0) 2014.07.16
[JAVA] HeapSort Algorithm  (0) 2014.07.09
[JAVA] java.io.RandomAccessFile() (작성중)  (0) 2014.05.27
[JAVA] 전기 요금 계산  (0) 2014.05.14

Application Specification

 Date

 2014.06.20

 Name

 wisay (wise saying)

 Version

 1.3.1

 minSdkVersion

 14

 Google Play

 링크


이전 업데이트


 


1. 변경 사항

스크롤바의 디자인 변경, 아이콘 변경, 환경설정창 메뉴 추가(문의하기, 평가하기), 타이틀바 디자인 변경, 타이틀바 코드 수정


2. 보완해야할 점

검색기능, 즐겨찾기기능, 위젯 디자인 설정, 탭뷰 프래그먼트로 변경,

 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.8.0_05

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


안드로이드 메일보내기

Intent it = new Intent(Intent.ACTION_SEND); String[] mailaddr = {"opid911@gmail.com"}; it.setType("plaine/text"); it.putExtra(Intent.EXTRA_EMAIL, mailaddr); // 받는사람 it.putExtra(Intent.EXTRA_SUBJECT, "[wisay]"); // 제목 it.putExtra(Intent.EXTRA_TEXT, "\n\n" + "v" + appVersion); // 첨부내용 startActivity(it);

받는주소에는 문자열배열이 아니면 안되는것 같다.


ListView에 Scrollbar 감추기

listview.xml

<ListView android:id="@+id/listview" ... android:scrollbars="none" >

ListView에 이동하는 스크롤바 적용하기(fast scroll)

listview.xml

<ListView android:id="@+id/listview" ... android:fastScrollEnabled="true" >


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TabHost
        android:id="@+id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1" >
            </FrameLayout>

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </TabHost>
</LinearLayout>

tabhost의 id가 @android:id/tabhost가 아닌 @+id/tabhost 이다.

위 tab은 FrameLayout 속성에 layout_weight="1" 때문에 하단에 위치하게 된다.


MainActivity.java

public class MainActivity extends ActivityGroup {
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		createTab();
	}

	private void createTab() {
		TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
		tabHost.setup(getLocalActivityManager());

		tabHost.addTab(tabHost.newTabSpec("TAB1").setIndicator("TAB1")
				.setContent(new Intent(this, Tab1Activity.class)));
		tabHost.addTab(tabHost.newTabSpec("TAB2").setIndicator("TAB2")
				.setContent(new Intent(this, Tab2Activity.class)));

		}

	}
}


참고 사이트



어플리케이션 버전 가져오기

// 어플 버전 가져오기
PackageInfo pi = null;
try {
	pi = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
	Log.e(TAG, e.getMessage());
}
String appVersion = pi.versionName;
Int appCode = pi.versionCode; 


자바코드(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" ->

전기 요금 계산기

package report;

import java.util.Scanner;

public class Elec {

	// electric charge table
	// 2013.11.21
	final static float v1 = 60.7f;
	final static float v2 = 125.9f;
	final static float v3 = 187.9f;
	final static float v4 = 280.6f;
	final static float v5 = 417.7f;
	final static float v6 = 709.5f;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int kwh;
		int tmpCharge;
		int vat; // value added tax
		float eCharge = 0; // energy charge
		int bCharge = 0; // basic charge
		int eBaseFund = 0; // Electric Power Industry Base Fund
		int mcr = 0; // monthly customer requisition

		System.out.print("input kwh : ");
		kwh = sc.nextInt();

		int temp;

		// basic charge
		if (0 < kwh && kwh <= 100) {
			bCharge = 410;
		} else if (100 < kwh && kwh <= 200) {
			bCharge = 910;
		} else if (200 < kwh && kwh <= 300) {
			bCharge = 1600;
		} else if (300 < kwh && kwh <= 400) {
			bCharge = 3850;
		} else if (400 < kwh && kwh <= 500) {
			bCharge = 7300;
		} else {
			bCharge = 12940;
		}

		// energy charge
		temp = kwh;
		if (temp >= 100) {
			eCharge += (float) (100 * v1);
			temp = temp - 100;
			if (temp >= 100) {
				eCharge += (float) (100 * v2);
				temp = temp - 100;
				if (temp >= 100) {
					eCharge += (float) (100 * v3);
					temp = temp - 100;
					if (temp >= 100) {
						eCharge += (float) (100 * v4);
						temp = temp - 100;
						if (temp >= 100) {
							eCharge += (float) (100 * v5);
							temp = temp - 100;
							if (temp >= 0) {
								eCharge += (float) (temp * v6);
							} else {
								eCharge += (float) (temp * v6);
							}
						} else {
							eCharge += (float) (temp * v5);
						}
					} else {
						eCharge += (float) (temp * v4);
					}
				} else {
					eCharge += (float) (temp * v3);
				}
			} else {
				eCharge += (float) (temp * v2);
			}
		} else {
			eCharge += (float) (temp * v1);
		}

		tmpCharge = (int) (bCharge + eCharge);
		vat = (int) Math.round(tmpCharge * 0.1);
		eBaseFund = (int) ((tmpCharge * 0.037) / 10 * 10);
		mcr = (int) (eCharge + bCharge + vat + eBaseFund) / 10 * 10;

//		System.out.println("basic " + bCharge);
//		System.out.println("tax " + eCharge);
//		System.out.println("total " + tmpCharge);
//		System.out.println("vat " + vat);
//		System.out.println("eBaseFund " + eBaseFund);

		System.out.println("output : " + mcr);
	}
}

 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.7.0_51

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


TabHost

여러 탭을 두고 각 탭을 클릭할 때마다 해당 화면이 나오도록 설정하는 뷰 컨테이너.

예제 결과

XML code

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1" >

                <LinearLayout
                    android:id="@+id/tab1"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="#00ff00"
                    android:orientation="vertical" >

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="1" />
                </LinearLayout>

                <LinearLayout
                    android:id="@+id/tab2"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="#0000ff"
                    android:orientation="vertical" >

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="2" />
                </LinearLayout>

                <LinearLayout
                    android:id="@+id/tab3"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="#ff0000"
                    android:orientation="vertical" >

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="3" />
                </LinearLayout>
            </FrameLayout>

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
            </TabWidget>
        </LinearLayout>
    </TabHost>

</LinearLayout>

java code

package com.android_report;

import android.app.TabActivity;
import android.os.Bundle;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;

public class MainActivity extends TabActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		TabHost tabHost = getTabHost();

		TabSpec tabSpecTab1 = tabHost.newTabSpec("TAB1").setIndicator("강아지");
		tabSpecTab1.setContent(R.id.tab1);
		tabHost.addTab(tabSpecTab1);

		TabSpec tabSpecTab2 = tabHost.newTabSpec("TAB2").setIndicator("고양이");
		tabSpecTab2.setContent(R.id.tab2);
		tabHost.addTab(tabSpecTab2);

		TabSpec tabSpecTab3 = tabHost.newTabSpec("TAB3").setIndicator("토끼");
		tabSpecTab3.setContent(R.id.tab3);
		tabHost.addTab(tabSpecTab3);

		TabSpec tabSpecTab4 = tabHost.newTabSpec("TAB4").setIndicator("말");
		tabSpecTab4.setContent(R.id.tab1);
		tabHost.addTab(tabSpecTab4);
		
		tabHost.setCurrentTab(0);

	}
}


 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.7.0_51

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


코드 실행시간 확인하기

조금 더 정확한 측정 방법

public class TimerTest {
	public static void main(String[] args) {

		ExecTime timer = new ExecTime();
		timer.start();

		// code
		for (int i = 0; i < 100000000; i++) {

		}
		timer.stop();

		timer.printExecTime();
		System.out.println(timer.getRunTimeNano() / 1000000 + " ms");
		System.out.println(timer.getRunTimeNano() / 1000000 / 1000 + " sec");
	}

}

class ExecTime {
	private long start;
	private long stop;

	void start() {
		start = System.nanoTime();
	}

	void stop() {
		stop = System.nanoTime();
	}

	long getRunTimeNano() {
		return stop - start;
	}

	void printExecTime() {
		System.out.println(stop - start + " ns");
	}
}

방법1

class TimeTest1 {
	public static void main(String[] args) {

		long startTime = System.currentTimeMillis();

		// code

		long stopTime = System.currentTimeMillis();
		long runTime = stopTime - startTime;

		System.out.println(runTime);
	}
}

방법 2

public class Stopwatch {
	long start;
	long end;
	
	void start() {
		start = System.currentTimeMillis();
	}
	
	void stop() {
		end = System.currentTimeMillis();
	}
	
	String getRunTime(){
		return end - start + "";
	}
}
class TimeTest2 {
	public static void main(String[] args) {

		Stopwatch timer = new Stopwatch().start();

		// code

		timer.stop();

		System.out.println(timer.getRunTime());
	}
}

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

[JAVA] java.io.RandomAccessFile() (작성중)  (0) 2014.05.27
[JAVA] 전기 요금 계산  (0) 2014.05.14
[JAVA] 연산자 우선순위  (0) 2014.05.02
[JAVA] 파일 읽기, 쓰기  (0) 2014.04.16

 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.7.0_51

 WebServer

 Apache Tomcat 7.0


문제점

톰캣의 루트 경로를 바꾸는 방법에 대해서 알아보자.


해결방안

1. 먼저 변경할 루트폴더를 만든 후 기본 루트폴더에 있던 파일들(설정)을 모두 복사해 넣는다.

  • 기본 루트 폴더 : C:\Tomcat 7.0\webapps
  • 변경할 루트 폴더 : D:\website


2. 톰캣의 server.xml 파일에서 바꾼 폴더명을 넣어준다.

  • 파일 위치 : C:\Tomcat 7.0\conf
after

before

3. 톰캣을 구동하고 http://localhost:8090을 통해 확인하도록 한다.

(기본 포트는 8080이지만 오라클과 중복되므로 8090으로 변경한 상태이다)


추가 자료



 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


직렬화하지 않은 파일 읽기, 쓰기 

- API : FileReader, BufferedReader, FileWriter, BufferedWriter

읽기, 쓰기작업을 처리하는 FileReader, FileWriter에 효율을 향상시켜주는 BufferedReader, BufferedWriter 클래스를 연쇄시켜 사용한다. 버퍼는 자신이 가득 찰 때까지 기다리다가 꽉찬 후에 작업이 진행한다.


[JAVA] java.io.File 클래스


쓰는 방법(출력)

BufferedWriter w = new BufferedWriter(new FileWriter(new File("FileTest.txt")));

버퍼가 가득차기전에 데이터를 보내고자 한다면 writer.flush() 호출한다.


읽는 방법(입력)

읽기작업은 while()문에서 한번에 한 행씩 읽어오며, readLine()에서 null을 리턴하면 반복문을 종료한다.

가장 흔하게 쓰이는 방법

import java.io.*;

public class FileTest {
	public static void main(String[] args) {
		String fDir = "TestDir/";
		String fName1 = "FileTest.txt";
		File f;

		try {
			// File 객체 생성(존재하는 파일)
			f = new File(fDir + fName1);

			// 파일 쓰기(주석부분은 간략화)
			FileWriter fileWriter = new FileWriter(f);
			BufferedWriter writer = new BufferedWriter(fileWriter);
			//BufferedWriter writer = new BufferedWriter(new FileWriter(f));

			writer.write("witerTest1");
			writer.append("\n"); // 개행문자 삽입
			writer.append("witerTest2");
			writer.newLine(); // 개행 메서드
			writer.write("witerTest3");
			writer.close(); // 파일 닫기

			// 파일 읽기
			FileReader fileReader = new FileReader(f);
			BufferedReader reader = new BufferedReader(fileReader);

			String line = null;
			while ((line = reader.readLine()) != null) {
				System.out.println(line);
			}
			reader.close(); // 파일 닫기
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}

	}
}



직렬화된 객체의 파일 입출력

- API : ObjectOutputStream, ObjectInputStream, FileOutputStream, FileInputStream

사진. 구글 검색(Head First Java)


직렬화할 객체

Serializable 인터페이스를 꼭 구현해야한다.

class TestSerialization implements Serializable {
	private int x;
	private String str;

	TestSerialization(int a) { this.x = a; }
	TestSerialization(String s) { this.str = s;	}

	int getA() { return x; }
	String getS() {	return str;	}
}

파일 저장하기(출력)

public class FileTest {
	public static void main(String[] args) {
		String fDir = "TestDir/";
		String fName = "FileTest.ser";

		FileOutputStream fileStream;
		ObjectOutputStream objStream = null;

		// 저장할 객체
		TestSerialization test1 = new TestSerialization("ObjectTest1");
		TestSerialization test2 = new TestSerialization(100);
		TestSerialization test3 = new TestSerialization("ObjectTest3");

		try {
			// 파일에 연결하기위해 생성, 파일명의 파일이 없으면 새로 만들어줌.
			fileStream = new FileOutputStream(fDir + fName);
			objStream = new ObjectOutputStream(fileStream);

			// 출력되는 객체는 반드시 Serialization 인터페이스 구현
			objStream.writeObject(test1);
			objStream.writeObject(test2);
			objStream.writeObject(test3);
			
			System.out.println("end");

		} catch (Exception ex) {
			System.err.println("Exception : " + ex.getMessage());
		} finally {
			try {
				objStream.close();
			} catch (IOException e) {
				System.out.println(e.getMessage());
			}
		}
	}
}

파일 불러오기(입력) : 역직렬화(객체 복구)

public class FileTest {
	public static void main(String[] args) {
		String fDir = "TestDir/";
		String fName = "FileTest.ser";

		FileInputStream fileStream;
		ObjectInputStream objStream = null;
		
		try {
			// 역직렬화할 파일을 불러온다.
			fileStream = new FileInputStream(fDir + fName);
			objStream = new ObjectInputStream(fileStream);

			// 처음에 저장된 순서대로 가져온다.
			Object one = objStream.readObject();
			Object two = objStream.readObject();
			Object three = objStream.readObject();
			
			// 역직렬화할 객체
			TestSerialization test1 = (TestSerialization) one;
			TestSerialization test2 = (TestSerialization) two;
			TestSerialization test3 = (TestSerialization) three;
			
		} catch (Exception ex) {
			System.err.println("Exception : " + ex.getMessage());
		} finally {
			try {
				objStream.close();
			} catch (IOException e) {
				System.out.println(e.getMessage());
			}
		}
	}
}



 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


java.io.File 클래스 API

File 클래스는 파일의 내용을 수정하거나 입력하는 클래스가 아니라, 파일이나 디렉토리 자체를 담는 클래스이다.

즉, File 객체는 파일경로명이나 파일명과 비슷한 것으로 생각할 수 있다. 파일에 입력이나 수정을 하려면 File 객체를 FileWriter 또는 FileInputStream 등의 객체에 전달해서 그 객체에서 사용해야 한다.


import java.io.File;

public class FileTest {
	public static void main(String[] args) {
		// File 객체 생성(이미 존재하는 파일)
		File f = new File("FileTest.txt");
		
		// 현재 프로젝트 폴더내에 생성
		File dir = new File("FileTestDir");
		if(dir.mkdir()) {
			// 폴더가 존재하지 않다면
			System.out.println("true");
		} else {
			// 폴더가 존재한다면
			System.out.println("False");
		}
		
		// 파일 또는 디렉토리의 절대 경로명
		System.out.println(f.getAbsolutePath());
		System.out.println(dir.getAbsolutePath());
		
		// 파일 또는 디렉토리 삭제
		boolean deletedCheck = dir.delete();
		System.out.println(deletedCheck != false ? "삭제 성공" : "삭제 실패");
	}
}


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

[JAVA] 연산자 우선순위  (0) 2014.05.02
[JAVA] 파일 읽기, 쓰기  (0) 2014.04.16
[JAVA]정적필드, 정적메소드  (0) 2014.03.18
[JAVA] String <-> int, double, float 변환  (0) 2014.02.28

 실행환경

 Desktop

 조립식 컴퓨터

 CPU

 Intel Core i3 CPU 550 @ 3.20GHz x 4

 Memory

 4 GB

 OS

 ubuntu 13.10 32bit


Ubuntu JAVA JDK 설치

OpenJDK 제거
$ sudo apt-get purge opnjdk*

repository 추가 및 업데이트
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update

자바 설치
$ sudo apt-get install oracle-java8-installer


자바 제거

$ sudo apt-get remove orable-java8-installer


'System > Linux, unix' 카테고리의 다른 글

[UNIX]메시지 보내기 - talk, write, wall  (0) 2014.10.22
[ubuntu] ssh server 설치  (0) 2014.07.02
[ubuntu] 한글 설정하기  (0) 2014.04.04
[ubuntu] 기본 패키지 설치, 업데이트  (0) 2014.04.04

radioGroup 리스너 예제 - 2014.04.01

MainActivity.java
package com.example.project4_1_pet;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	TextView tv1, tv2;
	CheckBox start_chkBox;
	RadioGroup rGroup;
	RadioButton rb1, rb2, rb3;
	ImageView imgView;
	Button btn, btnQuit, btnReturn;
	Switch switchBtn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		setTitle("yeongjun");

		switchBtn = (Switch) findViewById(R.id.switchBtn);
		tv1 = (TextView) findViewById(R.id.tv1);
		tv2 = (TextView) findViewById(R.id.tv2);
		rGroup = (RadioGroup) findViewById(R.id.RGroup);
		rb1 = (RadioButton) findViewById(R.id.rb1);
		rb2 = (RadioButton) findViewById(R.id.rb2);
		rb3 = (RadioButton) findViewById(R.id.rb3);
		imgView = (ImageView) findViewById(R.id.imgView);
		btnQuit = (Button) findViewById(R.id.btnQuit);
		btnReturn = (Button) findViewById(R.id.btnReturn);

		switchBtn
				.setOnCheckedChangeListener(new Switch.OnCheckedChangeListener() {
					public void onCheckedChanged(CompoundButton cb,
							boolean isChecking) {
						if (isChecking) {
							Toast.makeText(getApplicationContext(),
									"isChecked", Toast.LENGTH_SHORT).show();
							tv2.setVisibility(1);
							rGroup.setVisibility(1);
							imgView.setVisibility(1);
						} else {
							Toast.makeText(getApplicationContext(),
									"isNotChecked", Toast.LENGTH_SHORT).show();

							tv2.setVisibility(4);
							rGroup.setVisibility(4);
							imgView.setVisibility(4);
						}

					}
				});

		rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				// TODO Auto-generated method stub
				switch (checkedId) {
				case R.id.rb1:
					imgView.setImageResource(R.drawable.dog);
					break;
				case R.id.rb2:
					imgView.setImageResource(R.drawable.cat);
					break;
				case R.id.rb3:
					imgView.setImageResource(R.drawable.rabbit);
					break;
				default:
					Toast.makeText(getApplicationContext(),
							"radio btn select plz", Toast.LENGTH_SHORT).show();
				}
			}
		});

		btnQuit.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				finish();
			}
		});

		btnReturn.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				tv2.setVisibility(4);
				rGroup.setVisibility(4);
				imgView.setVisibility(4);

				switchBtn.setChecked(false);
			}
		});
	}
}


main.xml


Listener 사용 - 2014.03.18 강의내용

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	Button _btnNum;
	Button _btnName;

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

		_btnNum = (Button) findViewById(R.id.btn_num);
		_btnName = (Button) findViewById(R.id.btn_name);

		OnClickListener mClickListener = new OnClickListener() {
			@Override
			public void onClick(View v) {
				switch (v.getId()) {
				case R.id.btn_num:
					Toast.makeText(MainActivity.this, "2010211878",
							Toast.LENGTH_LONG).show();
					break;
				case R.id.btn_name:
					Toast.makeText(MainActivity.this, "Kim Yeong-Jun",
							Toast.LENGTH_LONG).show();
					break;
				}

			}
		};
		_btnNum.setOnClickListener(mClickListener);
		_btnName.setOnClickListener(mClickListener);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

정적필드, 정적메소드

변수, 메소드 앞에 static키워드 붙인다.

인스턴스화 하지않고도 클래스의 이름으로 사용할 수 있는 필드, 메소드.

public class Student {
	String name;
	int age;
	static int count;
	
	Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
}


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

[JAVA] 파일 읽기, 쓰기  (0) 2014.04.16
[JAVA] java.io.File 클래스  (0) 2014.04.10
[JAVA] String <-> int, double, float 변환  (0) 2014.02.28
[JAVA] heap, stack 메모리  (0) 2014.01.24

Toast 사용 - 2014.03.11 강의내용

public class HelloAndroidActivity extends Activity {
	Button _clickBtn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main); // 초기에 띄워줄 화면

		// 초기화
		_clickBtn = (Button) findViewById(R.id.btn_click);

		// 이벤트 리스너
		_clickBtn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// 매개변수 1 : context 내가 사용할 응용프로그램 자체
				// 매개변수 2 : 출력할 문자
				// 매개변수 3 : 화면에 보여줄 시간

				Toast.makeText(HelloAndroidActivity.this, "test", Toast.LENGTH_LONG).show();
				// Toast.makeText(getApplicationContext(), "test",Toast.LENGTH_LONG).show();

				// 아래 변수를 생성해주어야만 사용 가능
				// final Context thisContext = this.getApplicationContext();
				// Toast.makeText(thisContext, "test",Toast.LENGTH_LONG).show();
			}
		});

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.hello_android, menu);
		return true;
	}

}

+ Recent posts