이진탐색

 이진 탐색(binary search)는 정렬되어 있는 자료들의 집합에서 특정 자료를 찾고자 할 때 많이 사용되며 매우 빠른 탐색 알고리즘이다. 이진 탐색은 '퀵정렬'과 유사하게 '분할 후 정복(divide and conquer)'의 전략을 사용한다. 이 전략을 사용하는 알고리즘은 문제를 나누어 해결해 나가는 방법이기 때문에 실행시간은 log의 설징을 갖는다. 특히 문제의 크기를 정확히 양분하는 경우에는 최악의 경우라고 logN의 성능을 보장한다.

 이진 탐색의 탐색 시간은 'T = K * logN'으로 O(logN)이다. 선형 탐색의 시간보다 상당히 빠르지만 이진 탐색은 반드시 정렬이 되어있어야 한다. 그러므로 정렬되지 않는 리스트의 경우에는 정렬하는 비용 또한 상당히 들 것이다. 이와 같은 단점에도 불구하고 다음과 같은 상황에서 이진 탐색은 효율적인 성능을 제공한다.

 1) 새로운 자료가 추가되었어도 모든 자료가 재정렬이 일어나지 않는 경우 -> 해싱, 인덱스를 이용하는 경우

 2) 획기적으로 빠르고, 효율적인 자료의 재정렬이 가능한 자료 구조를 사용할 경우 -> B-트리 계열의 트리 구조 사용


다음은 이진 탐색의 JAVA 소스이다.

package Search;

public class BinarySearch {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

		binarySearch(2, arr);
	}

	public static void binarySearch(int iKey, int arr[]) {
		int mid;
		int left = 0;
		int right = arr.length - 1;

		while (right >= left) {
			mid = (right + left) / 2;

			if (iKey == arr[mid]) {
				System.out.println(iKey + " is in the array with index value: " + mid);
				break;
			}

			if (iKey < arr[mid]) {
				right = mid - 1;
			} else {
				left = mid + 1;
			}

		}
	}
}


+

기술면접에서 이진탐색을 왜 구현하지 못했을까... 자료구조 시간에 그렇게 공부하고 이해하고 구현하고 다 해본 것을ㅠㅠ

기본을 먼저 보고 갔어야 하는 건데, 괜히 다른 알고리즘을 너무 보고 갔더니 간단한 알고리즘조차 어렵게만 생각하고 복잡하게 풀려고 한 것 같다.. 그래서 다시 기본기를 훑어보고자 이렇게 블로그에 남겨놓는다.

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

[JAVA] 기수정렬(RadixSort)  (0) 2015.11.20
[JAVA] 피보나치 - 재귀사용  (0) 2015.11.13
[JAVA] 퀵정렬(QuickSort)  (0) 2015.11.06
[JAVA] 딕스트라 최단경로(Dijkstra Shortest Paths)  (0) 2015.10.31

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

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

삽입정렬

- 안정정렬

- 시간복잡도: 

- 설명: 왼쪽에 있는 항목들은 정렬된 것으로 가정하고, 증가하는 인덱스의 값을 삽입하는 방법.

- 특징: 정렬대상이 적거나, 이미 부분적으로 정렬되어 있는 상황일 경우 효율적. 선택정렬과 버블보다는 빠름



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

[JAVA] 병합정렬(MergeSort)  (0) 2015.10.30
[JAVA] 버블정렬(BubbleSort)  (0) 2015.10.23
[JAVA] 선택정렬(SelectionSort)  (0) 2015.10.09
[JAVA] 쉘정렬(ShellSort)  (0) 2015.10.02


# 설정 공유

File > Export 에서 Preferences를 export하고 다른 워크스페이스에서 import.


1. 설정파일 수정

eclipse > eclipse.ini 파일을 수정하며, 아래 설정값을 자신의 사양에 맞춰 변경하여 사용한다. 세미콜론(;)은 주석이다.

; workspace의 경로를 윈도우 타이틀바에 출력
-showlocation

; 클래스 유효성 검사 생략, 그러나 나중에 어딘서 오류나는지 확인하기 위해 사용 추천
;-Xverify:none

; jdk 버전으로 설정하면 속도 향상
-Dosgi.requiredJavaVersion=1.6

;---------------------------------------------
; JVM 메모리 관리
;---------------------------------------------
; JVM 시작히 힙 영역 크기 : 최소(ms), 최대(mx)
-Xms64m
-Xmx1024m

; Permanent(영구) 영역 : JVM 클래스와 메소드를 위한 공간, 'Out of Memory' 에러 발생시 크기 조절 = PermSize
; New/Young 영역 :  새로 생성된 개체들을 위한 공간 = NewSize
; Old 영역 : 만들어진지 오래된 객체들의 공간(New영역에서 이동)
-XX:PermSize=64M
-XX:MaxPermSize=512M
-XX:NewSize=128M
-XX:MaxNewSize=512M

; Heap Shrinkage를 수행하는 임계치를 지정한다. 예를 들어 이 값이 70이면 Heap의 Free 공간이 70% 이상이 되면 Heap 크기가 축소된다. MinHeapFreeRatio 옵션과 함께 Heap의 크기 조정을 담당한다. 기본값 70
;-XX:MaxHeapFreeRatio=70

;---------------------------------------------
; Garbage Collection 방식에 따라 가능한 옵션
;---------------------------------------------
; 병렬 GC 사용
; 메모리가 충분하고 코어수 많을때 유리하다.
-XX:+UseParallelGC

; CMS GC 사용
; 응답속도가 중요할때 사용한다.
; GC Pause에 의한 사용자 응답시간 저하 현상을 줄인다.
-XX:-UseConcMarkSweepGC
;-XX:+CMSIncrementalPacing

; G1 GC(Garbage-First Garbage Collector) 사용
; 성능은 좋지만 더욱 안정화가 되었을때 사용하는 것이 좋다.
; JDK 1.7.0_4 이후 사용하는것이 안정적
;-XX:+UnlockExperimentalVMOptions
;-XX:+UseG1GC
;-XX:MaxGCPauseMillis=10

;---------------------------------------------

; out of space in codecache 오류 발생시 증가. 이 값은 permGenSpace 공간에 할당되므로 비례하게 커야한다.
-XX:ReservedCodeCacheSize=128m

; 컴파일러의 소수점 최적화 기능을 작동시켜 빨라진다.
-XX:+AggressiveOpts

; 개별 Thread의 Stack Size를 지정
; 대부분 기본값 사용, 어플리케이션의 스레드 스택에 의한 메모리 요구향이 높아지면 'Out Of Memory' 에러 발생
-Xss4m

-XX:+UseFastAccessorMethods
-XX:CompileThreshold=20000


2. 소스 자동 폴딩 해제

Preferences > Java > Editor > Folding 에서 Enable folding 해제

혹은 Coffee Bytes Java Folding 플러그인으로 기능 확장


3. 코드 자동완성기능 해제

(자동으로 실행되는 것을 해제하고, ctrl+space를 사용해서 동작시킬 수 있다.)

Preferences > Java > Editor > Content Assist 에서 Auto Activation - Enable auto activation 해제


4. 오른쪽 하단에 메모리 사용상태 표시

Preferences > General 에서 Show heap status 체크


5. Spell checking 해제

Preferences > General > Editors > Text Editors > Spelling 에서 Enable spell checking 해제


6. 인코딩 변경

Preferences > General > Workspace 에서 Text file encoding 는 UTF-8, New text file line delimite 값은 사용환경에 따라 변경


7. 줄번호 사용(이클립스 루나버전 이후로는 기본값으로 설정)

Perferences > General > Editors > Text Editors 에서 Show line numbers 체크


8. 이클립스 실행속도 개선

실행할때 로딩되는 플러그인을 제외한다.

Preferences > General > Startup and Shutdown 에서 필요없는 것 제외


9. Validation 유효성체크 해제

자신이 사용할 부분만 켜서 사용한다.

Preferences > Validation


10. 불필요한 플러그인 삭제

1) Preferences > Install/Update 에서 Uninstall or update 선택

2) 불필요한 것 Uninstall


11. Autometic Update Off

Preferences > Install/Updates > Automatic Updates 에서 체크해제


참고 사이트

설정파일 링크, 링크, 링크, 링크

위키, GC튜닝, 폴딩강화, GC플러그인, 가비지컬렉터





StringTokenizer 클래스 사용방법

토큰을 따로 지정하지 않으면 공백을 구분으로 나누어진다. 따로 구분문자를 지정하려면 생성자에 넣어준다.

StringTokenizer st = new StringTokenizer("this is a test");
while(st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}
StringTokenizer st = new StringTokenizer("a|b|c|d", "|");
while(st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}

String클래스의 split() 사용하기

String[] result = "this is a test.".split("\\s");
for(int i = 0; i < result.length; i++) {
    System.out.println(result[i]);
}


참고사이트 Link

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

[JAVA] 쉘정렬(ShellSort)  (0) 2015.10.02
[JAVA] 달팽이 만들기  (0) 2015.06.23
[JAVA] 리스트와 배열 간 복사 방법  (0) 2015.04.08
[JAVA] String 인코딩  (0) 2015.04.01
import java.util.Arrays;
import java.util.List;

public class Test {
	public void copyByArray(int[] source) {
		int[] target = new int[source.length];
		// arraycopy(원본 배열, 복사 시작 위치, 대상 배열, 대상 배열의 시작 위치, 복사 길이);
		System.arraycopy(source, 0, target, 0, source.length);
	}

	public List copyByList(Integer[] args) {
		List list = (List) Arrays.asList(args);
		return list;
	}

}

equals() 와 hashCode() 는 함께 오버라이드 할 것.

자료형

해시 값 계산 방법

boolean

(value ? 1 : 0)

byte, char short, int

(int) value

float

Float.floatToIneBits(value)

double

Double.doubleToLongBits(value)

 String 및 기타 객체

"test".hashCode() 

package Test;

public class Test {
	int intVal;
	String strVal;

	public Test(int intVal, String strVal) {
		this.intVal = intVal;
		this.strVal = strVal;
	}

	public int getIntVal() {
		return intVal;
	}

	public void setIntVal(int intVal) {
		this.intVal = intVal;
	}

	public String getStrVal() {
		return strVal;
	}

	public void setStrVal(String strVal) {
		this.strVal = strVal;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + intVal;
		result = prime * result + ((strVal == null) ? 0 : strVal.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Test other = (Test) obj;
		if (intVal != other.intVal)
			return false;
		if (strVal == null) {
			if (other.strVal != null)
				return false;
		} else if (!strVal.equals(other.strVal))
			return false;
		return true;
	}

}

이클립스에서는 만드는 방법

단축키 Shift + Alt + S 

Generate hashCode() and equals()... 선택




int(정수)를 String(문자열)로 바꾸는 여러가지 방법

평소에 정수타입의 변수를 문자열로 바꿀 때 +"" 를 자주 사용하였다. 편리하기도하고 습관이 되었기 때문이다. 그러다가 갑자기 궁금해져서 바꾸는 방법에 대해서 페이스북 생활코딩 그룹에 도움을 청했다. 댓글을 통해서 2012년도에 작성된 String.valueOf(int) vs ""+int라는 글을 보았고, 몇가지 더 추가해서 실험해보았다. 실험에 사용된 코드는 아래와 같다.

코드

package Test1;

import java.io.IOException;

public class TestClass {
	public static void main(String... args) throws IOException {
		for (int i = 0; i < 10; i++) {
			long svo = perfStringValueOf();
			long qqp = perfQuoteQuotePlus();
			long its = perfIntegerToString();
			long sf = perfStringFormat();
			System.out.printf("String.valueOf() : %.3f\t", svo / 1e3);
			System.out.printf("Integer.toString() : %.3f\t", its / 1e3);
			System.out.printf("\"\"+ : %.3f\t", qqp / 1e3);
			System.out.printf("String.Format() : %.3f\n", sf / 1e3);
		}
	}

	private static long perfStringValueOf() {
		long start = System.nanoTime();
		final int runs = 100000;
		String s;
		for (int i = 0; i < runs; i++) {
			s = String.valueOf(i * i);
			if (s.length() < 1)
				throw new AssertionError();
		}
		long time = System.nanoTime() - start;
		return time / runs;
	}

	private static long perfQuoteQuotePlus() {
		long start = System.nanoTime();
		final int runs = 100000;
		String s;
		for (int i = 0; i < runs; i++) {
			s = "" + i * i;
			if (s.length() < 1)
				throw new AssertionError();
		}
		long time = System.nanoTime() - start;
		return time / runs;
	}

	private static long perfIntegerToString() {
		long start = System.nanoTime();
		final int runs = 100000;
		String s;
		for (int i = 0; i < runs; i++) {
			s = Integer.toString(i * i);
			if (s.length() < 1)
				throw new AssertionError();
		}
		long time = System.nanoTime() - start;
		return time / runs;
	}

	private static long perfStringFormat() {
		long start = System.nanoTime();
		final int runs = 100000;
		String s;
		for (int i = 0; i < runs; i++) {
			s = String.format("%d", i * i);
			if (s.length() < 1)
				throw new AssertionError();
		}
		long time = System.nanoTime() - start;
		return time / runs;
	}
}

결과


첫 실행 속도로 보았을 땐 Integer.toString() < String.valueOf() < ""+ < String.Format()  이다. 하지만 여러번 반복하고 평균적으로 보았을 땐 ""+ < Integer.toString() < String.valueOf() < String.Format() 이었다.

속도와 간단함으로 보았을 땐 ""+ 이었지만 추후에 좀더 성능을 고려해서 다시 실험해보아야겠다.

메서드 배열 만들기

public class Node {
    ...
    public void goNorth() { ... }
    public void goSouth() { ... }
    public void goEast() { ... }
    public void goWest() { ... }

    interface MoveAction {
        void move();
    }

    private MoveAction[] moveActions = new MoveAction[] {
        new MoveAction() { public void move() { goNorth(); } },
        new MoveAction() { public void move() { goSouth(); } },
        new MoveAction() { public void move() { goEast(); } },
        new MoveAction() { public void move() { goWest(); } },
    };

    public void move(int index) {
        moveActions[i].move();
    }
    public void allMove() {
        for (MoveAction m : moveActions)
            m.move();
    }
}

참고


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);
		}
	}

}

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());
    }
}

summary

먼저 아파치 톰캣이 이클립스에 연동되어있다고 가정한다.
서블릿으로 웹요청을 받아들여 디비랑 통신하기 위한 코드에 대한 템플릿이다. 

DB와의 통신은 서블릿 코드에서 DBConnect.java를 통해 디비에 접속하고 Dao를 통해 질의문을 작성한다.


template_server.zip

git

프로젝트 생성

이클립스 > File > New > Dynamic Web Project

서블릿 파일 생성

File > New > Servlet > 아래 코드

package templete_server.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class GetData
 */
@WebServlet(name = "GetData", urlPatterns = { "/GetData" })
public class GetData extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public GetData() {
		super();
		// TODO Auto-generated constructor stub
	}

	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();

		/////////////////////////////////////////////////////////////////
		// HTML SOURCE CODE
		out.println("<html>");
		out.println("<head>");
		out.println("<title>Servlet GetData</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>Servlet GetData at " + request.getContextPath()
				+ "</h1>");
		out.println("<p>");
		out.println("get data : " + request.getParameter("id"));
		out.println("</body>");
		out.println("</html>");

		out.println("");
		// HTML SOURCE CODE
		/////////////////////////////////////////////////////////////////

		String id = request.getParameter("id");
		System.out.println(id);
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

}

DB Connect ( Mysql)

jdbc나 mysql 드라이버는 'WebContent > WEN-INF > lib' 안에 넣어주어야 한다.

첫 번째 코드는 DB를 연결하기 위함이고, 두 번째 코드는 질의문을 서버에 작성할 수 있다.


DBConnector.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnector {
	private String driver = "com.mysql.jdbc.Driver";
	private String url = "jdbc:mysql://localhost:3306/dbschema?useUnicode=true&characterEncoding=UTF-8";
	private String user = "userid";	//DB user ID
	private String pwd = "password";	//DB user Password
	private Connection conn = null;
	
	public Connection getConnection(){
		try{
			Class.forName(driver);
		}catch(ClassNotFoundException e){
			System.out.println("BusInfoSystem : 드라이버 로딩 실패(getConnection)");
			System.out.println(e.getMessage());
		}
		try{
			conn = DriverManager.getConnection(url,user,pwd);
		}catch(SQLException e){
			System.out.println("BusInfoSystem : DB 연결 실패(getConnection)");
			System.out.println(e.getMessage());
		}
		return conn;
	}
}

tempateDao.java
package templete_server.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class templateDao {

	private DBConnector dbc;

	public templateDao() {
		dbc = new DBConnector();
	}

	public int getData(int arg1) {
		int result = 0;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = new String("select * from dbtable where ID = ?;");

		conn = dbc.getConnection();
		try {
			ps = conn.prepareStatement(sql);
			ps.setInt(1, arg1);
			rs = ps.executeQuery();
			rs.first();
			while (true) {
				result = rs.getInt("id");
				if (rs.isLast())
					break;
				rs.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeDB(rs, ps, conn);
		}

		return result;
	}

	/**
	 * DataBase 자원 반환
	 * 
	 * @param rs
	 * @param ps
	 * @param conn
	 */
	private void closeDB(ResultSet rs, Statement ps, Connection conn) {
		if (rs != null) {
			try {
				rs.close();
			} catch (Exception e) {
			}
		}
		if (ps != null) {
			try {
				ps.close();
			} catch (Exception e) {
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (Exception e) {
			}
		}
	}
}


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64

Handler 사용하기

안드로이드에서는 메인스레드가 아닌 다른 스레드(백그라운드)에서 UI를 건들였을 때 에러가 발생한다. 이는 서로 변경하는 것을 허용하게 되면 동기화 문제가 발생하기 때문이다. 그렇기 때문에 핸들러(Handler)를 사용해서 스레드간에 통신을 할 수 있다.


방법 1

방법 2


방법 3


데몬 스레드(Daemon Thread)

데몬(Daemon): 
리눅스 서버에서 주로 많이 사용되며, 백그라운드 상태에서 대기하고 있다가 처리할 요청이 
발생하거나 조건 상황이 맞으면 작업을 실행하는 프로그램.
(자바를 다루는 기술 vol.1 김병무 지음. 길벗)

즉, 자바에서 데몬 쓰레드로 이와 비슷한 동작을 할 수 있다. 데몬 쓰레드란 다른 쓰레드 일반 쓰레드를 보조하는 역할로 사용한다. 예를 들면 어플리케이션이 실행하는 동안 백그라운드에서 서비스를 제공하는 가비지컬렉터, 워드프로세서에서 정기적으로 파일을 저장하는 자동 저장기능 등을 말할 수 있다. (티스토리에서 글 작성시에 자동저장하는 기능도 데몬 쓰레드?)

사용 방법은 쓰레드를 실행하기 전에 Thread 클래스에서 제공하는 setDaemon(true) 메소드를 호출하면 된다.

특징으로는 일반 쓰레드(main 등)가 모두 종료되면 강제적으로 종료 된다.


1. mysql-connector Librarie추가

현재 프로젝트 오른쪽 클릭 - Properties - Java Build Path - Add External JARs...

Download Connector/J Link

(mysql 설치시 Java Connector 도 같이 설치된다.)





2. MySQL DB, Java 코드로 연동하기

public class TestClass {
	public static void main(String[] args) {
		Connection con = null;
		Statement st = null;
		ResultSet rs = null;

		try {

			con = DriverManager.getConnection("jdbc:mysql://localhost", "root",
					"1234");

			st = con.createStatement();
			rs = st.executeQuery("SHOW DATABASES");

			if (st.execute("SHOW DATABASES")) {
				rs = st.getResultSet();
			}

			while (rs.next()) {
				String str = rs.getNString(1);
				System.out.println(str);
			}
		} catch (SQLException sqex) {
			System.out.println("SQLException: " + sqex.getMessage());
			System.out.println("SQLState: " + sqex.getSQLState());
		} finally {
			if (rs != null) { try { rs.close(); } catch (Exception e) {}}
			if (st != null) { try { st.close(); } catch (Exception e) {}}
			if (conn != null) { try {conn.close();} catch (Exception e) {}}
		}
	}
}

문제점

SQLException: No suitable driver found for jdbc:mysql://localhost
▶ 해결방법 : 위 1번 드라이버 추가했는지 확인할 것.


SQLException: Access denied for user 'root'@'localhost' (using password: YES)
▶ 해결방법 : 링크


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

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

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

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

DiningTable.java


Chopstick.java


Philosopher.java



결과화면

  



homework_0604.zip


 실행환경

 Desktop

 조립식

 CPU

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

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


문제점

List의 중복된 값을 제거하고 정렬한다. 


해결방안

ArrayList<String> tempList = new ArrayList<String>();
ArrayList<String> dataList;

dataList = new ArrayList<String>(new HashSet<String>(tempList));
Collections.sort(dataList);

2019.10.11. 옛날 코드를 보니 다이아몬드 연산자도 안쓰고, 다형성도 활용하지 않고, 사이드이펙트있는 정렬 메서드 쓰고 있어서... 새로 수정 with 자바8람다

List<String> duplicateStringList = Arrays.asList("2", "2", "1", "3");
List<String> result = duplicateStringList.stream()
.distinct()
.sorted()
.collect(Collectors.toList());



한글 깨지는 *.txt 파일 읽기

String path="fileName.txt";
BufferedReader reader = new BufferedReader(new InputStreamReader(
						new FileInputStream(path), "euc-kr"));

UTF-8 파일 쓰기

String path="fileName.txt";
BufferedWriterreader = new BufferedWriter(new OutputStreamWriter(
						new FileOutputStream(path), "utf-8"));



+ Recent posts