new -> start() -> runnable 상태->run()종료->dead


interrupt() 메소드를 이용하면 

(InterruptedException 예외를 발생시키고) Thread를 Runnable 상태로 돌릴 수 있다.(?)


run() 메소드를 정상적으로 벗어나거나 run() 메소드 안에서 예외가 발생하는 등의 이유로 스레드가 종료되었을 때 dead상태라고도 한다.

Posted by marvell
,

[Example]

public static void main(String[] args) {
	String str1 = "/home/hosting_users/userID/tomcat/webapps/ROOT/upload";
	String str2 = "c:\\home\\hostring";
	System.out.println(str1);
	System.out.println(str2);
}
/*
/home/hosting_users/marvell/tomcat/webapps/ROOT/upload
c:\home\hostring
*/

탈출문자 처리를 해주지 않을경우, 이클립스에서는 똑똑하게도 에러로 인식해준다.



[Summary]

결론은 제목과 같이,

역슬래쉬(\)는 탈출문자로 처리, 슬래쉬는 그냥 써도 된다.


'Java' 카테고리의 다른 글

쓰레드 발생과 종료 과정  (0) 2014.08.14
[Java] int String 변환  (0) 2014.02.21
[Java] String과 byte의 변환  (0) 2014.02.16
[Java] 패키지 컴파일  (0) 2014.02.11
[Java] list와 향상된 for문  (2) 2014.02.09
Posted by marvell
,

[Java] int String 변환

Java 2014. 2. 21. 05:35

String str = Integer.toString(int);

Posted by marvell
,

[Definition]

// String 생성자로 byte형 array를 받게 되면, default charset을 사용하여 bytes의 array를 decoding해서 새로운 String을 생성하게 합니다.

// 위에랑 비슷하다. 대신 charsetName이란 String형 옵션을 주면 default charset이 아닌 charsetName 이름의 charset을 가지고 decoding을 시도합니다.



// getBytes(String charsetName): this String을 지정된 charset을 이용해서 byte[]로 encode함

// getByte(): this String을 default charset을 이용해서 byte[]로 encode함



[Example]



/*

Text : This is an example

Text [Byte Format] : [B@7ac4b626

Text [Byte Format] : [B@7ac4b626

Text [Ascii Format] : 84 104 105 115 32 105 115 32 97 110 32 101 120 97 109 112 108 101 

Text Decryted : This is an example

*/


[Example]



/*

str1 = 안녕 the world! 123

str2 = ??? the world! 123

str3 = 안녕 the world! 123

*/



[Reference]

http://blog.naver.com/cjyjava?Redirect=Log&logNo=20198661689

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#String(byte[])

http://www.mkyong.com/java/how-do-convert-byte-array-to-string-in-java/

http://www.tutorialspoint.com/java/java_string_getbytes.htm

Posted by marvell
,

[Java] 패키지 컴파일

Java 2014. 2. 11. 18:06

1. 패키지 컴파일이란?

C#에서 namespace와 같은 것



2. 패키지 컴파일

일반컴파일: javac 클래스파일명.java

패키지컴파일: javac -d 클래스저장위치 클래스파일명(원본소스)

ex. javac -d . HelloWorld.java

(.이란 현재 디렉토리를 기준으로 패키지 구조를 구성하겠다.)


만약 servlet-api.jar가 없으면 javac -d (jar파일 경로) (jar파일 경로):클래스저장위치 클래스파일명(원본소스)

이런식으로 클래스가 저장될 위치에다도 path를 지정해주어야 한다.



3. 패키지 실행

일반실행: java클래스 파일명

패키지실행: java 패키지.클래스 파일명

ex. java test.hello.HelloWorld

패키지란 결국 폴더이다.



소스파일을 classes밑에다가 넣으면서 컴파일하고 싶을때,

(cafe24기준) WEB-INF에서 패키지 컴파일을 하면 된다.

javac -d ./classes -classpath /home/hosting_users/CAFE24_ID/tomcat/lib/servlet-api.jar:/home/hosting_users/CAFE24_ID/tomcat/webapps/ROOT/WEB-INF/classes /home/hosting_users/CAFE24_ID/src/com/entity/*.java


'Java' 카테고리의 다른 글

[Java] int String 변환  (0) 2014.02.21
[Java] String과 byte의 변환  (0) 2014.02.16
[Java] list와 향상된 for문  (2) 2014.02.09
[Java] 2차원 배열의 길이  (0) 2014.02.08
[Java] String과 StringBuffer의 차이점  (0) 2014.01.24
Posted by marvell
,

[Example]

ArrayList list = new ArrayList();
int count = 0;
list.add("Happy");
list.add("Hacking");
for(String str : list){
    System.out.println(count + "번째 메시지는: " + str);
    count++;
}
//


** 2014년 3월 2일 추가글

array와 향상된 for문은 궁합이 잘 맞는다.

arraylist도 array의 일종으로 볼 수 있으므로 향상된 for문을 이용해서 값을 뽑아낼 수 있다.

'Java' 카테고리의 다른 글

[Java] String과 byte의 변환  (0) 2014.02.16
[Java] 패키지 컴파일  (0) 2014.02.11
[Java] 2차원 배열의 길이  (0) 2014.02.08
[Java] String과 StringBuffer의 차이점  (0) 2014.01.24
[Java] 메모리 관점에서 본 String  (0) 2014.01.24
Posted by marvell
,

[Example]

arr[5][2]

arr.length -> (행) 길이는 5

arr[x].length -> (열) 길이는 2

'Java' 카테고리의 다른 글

[Java] 패키지 컴파일  (0) 2014.02.11
[Java] list와 향상된 for문  (2) 2014.02.09
[Java] String과 StringBuffer의 차이점  (0) 2014.01.24
[Java] 메모리 관점에서 본 String  (0) 2014.01.24
[Java] 상수(Constant)  (0) 2014.01.24
Posted by marvell
,

String과 StringBuffer의 차이점



public class StringEx3 {
	public static void main(String[] args){
		String stringSql = "select"
				+ " name"
				+ " from board"
				+ " where num=?";
		System.out.println(stringSql);
		
		StringBuffer bufferSql  = new StringBuffer();
		bufferSql.append("select");
		bufferSql.append(" name");
		bufferSql.append(" from board");
		bufferSql.append(" where num=?");
		String sql = bufferSql.toString();
		System.out.println(sql);
	}	
}
/* output
select name from board where num=?
select name from board where num=?
*/

String을 쓰다가 (+)연산자를 이용하면 내부적으로 계속 new 연산자를 이용해서 새로운 힙 메모리를 만들게 된다. 

/* 이 부분에 대해서 윤성우씨의 난 정말 java공부한 적이 없다고요 책을 참고하였다.*/

/*  StringBuffer를 이용해 내부 구현한 부분 (http://skynaver.tistory.com/128에서 참조)

stringSql = "select";

stringSql += " name";

stringSql = new StringBuffer(stringSql).append(" name").toString(); */

메모리 낭비일뿐만 아니라 GC가 이를 소멸시키는 과정에서 속도에도 영향을 준다. 
또한 String을 쓰면 DB에서 수많은 sql query가 발생하는데 이때마다 엄청난 양의 메모리가 소모된다. 

하지만 StringBuffer를 쓰게 된다면 새로운 메모리를 만드는 대신에 기존의 메모리에 작업을 하게 된다. 
append는 첨부하다 덧붙이다라는 뜻을 가지고 있는데, 이를 음미하면 좀더 이 객체를 쉽게 이해할 수 있을것이다. 

처리시간의 면에서 본다면 StringBuilder, StringBuffer, String 순이다. 
StringBuffer는 내부 함수들이 Synchronized로 되어있어 여러 개의 쓰레드Multi-threads에서 안전성을 보장한다.(사용해도 문제가 없다.) 하지만 이로 인해 성능저하가 발생한다. 

StringBuilder는 쓰레드에 안전한지 여부가 상관없는 혹은 단일 쓰레드일때 사용되는데, 속도면에서는 제일 빠르다.




'Java' 카테고리의 다른 글

[Java] list와 향상된 for문  (2) 2014.02.09
[Java] 2차원 배열의 길이  (0) 2014.02.08
[Java] 메모리 관점에서 본 String  (0) 2014.01.24
[Java] 상수(Constant)  (0) 2014.01.24
[Java] String constant pool  (0) 2014.01.24
Posted by marvell
,

메모리 관점에서 본 String


package p20140124;

class StringEx1 {
	public static void distinction(boolean value){
		if(value){
			System.out.println("true");
		}else{
			System.out.println("false");
		}
	}	
	public static void main(String[] args) {
		String str1 = "marvell";
		String str2 = new String("marvell");

		if (str1 == str2) {
			distinction(true);
		} else {
			distinction(false);
		}
		
		if (str1.equals(str2)) {
			distinction(true);
		} else {
			distinction(false);
		}
		
		if(str1.hashCode()==str2.hashCode()){
			distinction(true);
		}else{
			distinction(false);
		}
		
		if(System.identityHashCode(str1)==System.identityHashCode(str2)){
			distinction(true);
		}else{
			distinction(false);
		}
	}
}
/* output
false
true
true
false */

/*  http://cafe.naver.com/javachobostudy/57390 차가운잎사귀(Idshyun2)님의 글에서 가져온 내용임을 밝힙니다. */

str1 - 리터럴 영역의 메모리 주소를 직접접근

str2 - 힙영역의 메모리 주소를 통해 간접접근

힙영역은 단지 리터럴 영역의 메모리주소 값을 보관하기 위한 메모리 영역에 지나지 않습니다.





- 큰 따옴표를 이용해 문자를 대입하면, 바로 Constant pool, 즉 상수 메모리 영역에 저장이 된다. 이 메모리는 누군가가 한명이라도 참조하고 있는한 사라지지 않는다.

- 반면 힙을 통해서 만든 String 객체는 일단 힙 메모리 주소를 가리키기 때문에 == 연산자를 통해 str1과 str2를 단순 비교 하면 다른 객체라고 뜬다.

/* http://cafe.naver.com/javachobostudy/57390 남궁성님 리플에서 가져온 내용임을 밝힙니다. */

- HashCode()는 모든 클래스의 조상인 Object에 정의되어 있는 메서드인데, 이는 주소값을 이용하여 해쉬코드(int 정수형)을 만든다. 때문에 이론상으로 HashCode()를 이용하여 객체를 구분할 수가 있다.

  그런데 String 클래스는 Object 클래스로부터 상속받은 HashCode()를 오버라이딩해서 그 내용을 바꿔버린다. 즉, 주소값을 가지고 해쉬코드를 만드는게 아니라 문자열의 내용으로 해서 코드를 만든다. 따라서 해쉬코드가 동일했던 것이다.

  한편 identityHashCode는 객체의 주소값을 가지고 HashCode를 생성하는 메서드이고, 이는 String과 같이 HashCode()를 오버라이딩한 경우에도 다른 객체는 다른 HashCode를 얻게 된다.


'Java' 카테고리의 다른 글

[Java] list와 향상된 for문  (2) 2014.02.09
[Java] 2차원 배열의 길이  (0) 2014.02.08
[Java] String과 StringBuffer의 차이점  (0) 2014.01.24
[Java] 상수(Constant)  (0) 2014.01.24
[Java] String constant pool  (0) 2014.01.24
Posted by marvell
,

[Java] 상수(Constant)

Java 2014. 1. 24. 05:41

본문 내용은 http://cafe.naver.com/lucasgameschool/785을 참고 하였습니다.



상수(Constant)


상수는 프로그램이 실행되는 동안 (선언과 동시에 값을 설정했다면) 값이 변하지 않는 것.

(선언과 동시에 값을 설정 안했다면) 값을 한 번만 설정이 가능한 것.

명령어로는 c++에서는 const로 Java에서는 final이 있다.

상수는 literal 상수와 symbolic 상수로 나뉘어 진다.


1) Literal 상수                                                                                      

int result = 1 + 2;

숫자를 저장하려면 메모리에 저장공간을 확보해야 하는데, 1과 2라는 숫자는 메모리에 할당을 하지도 않았는데, CPU가 이것들을 연산하고 result라는 메모리 변수에 대입을 하고 있다.

a. 1과 2의 숫자가 메모리 공간에 상수로 지정

b. 두 상수의 덧셈연산이 진쟁된다.

c. 그 결과가 result에 저장. 

즉, int 변수처럼 메모리에 할당이 되지만 변수명이 없이 메모리에 올려진 것을 literal 상수라고 한다.

int 정수 외에도 문자나 실수에도 같은 논리가 적용된다. 

char ch = 'A';
double d = 9.11; // Java - float은 F



2) Symbolic 상수                                                                                  

// symbolic 상수 : 이름이 있는 상수
final int MAX = 10;
final float PI = 3.14F;



결론 : 1, 2는 literal 상수, (final이 붙는) PI는 symbolic 상수다.



c를 공부하신 분들은 포인터와 메모리 구조를 알고 있는데, 이는 Java를 이해하는데 도움이 됩니다. 밑의 그림은 HeadFirst C에서 참고했습니다. 이책은 문자열 부분만큼은 설명이 정말 잘되어있습니다. 코드영역과 데이터 영역은 프로그램이 메모리에 로드될 때 올라오게 되는데, 이때 여기서 "JQK"가 상수메모리 영역에 올라가게 됩니다. 프로그램이 cards 변수가 가리키는 문자열의 내용을 바꾸려 하지만 읽기전용 상수 메모리에 내용이 있기 때문에 바꿀 수가 없습니다.

데이터영역(data segment)에 대한 추가 설명을 하자면 저 영역은 프로그램이 메모리에 로드될 때 할당, 프로그램이 종료될 때 소멸됩니다.



2014년 1월 24일 상수 관련 추가 글

- 클래스에 로딩되면 클래스에 정의된 상수들이 Constant pool에 올라갑니다.

이론상으로는 개체 소멸시 따라서 소멸되야 하지만 Java에서 소멸 타이밍을 알기는 힘들다.

따라서 객체 소멸 후에도 클래스 정보가 메모리에서 사라지지는 않는다.

- 접근과 공유의 문제는 2차적인 문제이다.


'Java' 카테고리의 다른 글

[Java] list와 향상된 for문  (2) 2014.02.09
[Java] 2차원 배열의 길이  (0) 2014.02.08
[Java] String과 StringBuffer의 차이점  (0) 2014.01.24
[Java] 메모리 관점에서 본 String  (0) 2014.01.24
[Java] String constant pool  (0) 2014.01.24
Posted by marvell
,