'Computer Science/JAVA'에 해당되는 글 6건

  1. 2015.12.03 Thread-2 (Wait & notify) 1
  2. 2015.12.03 Thread-1 (Basic)
  3. 2015.12.02 Hashmap 과 Treemap 의 차이
  4. 2015.11.18 E-Clipse Java Font 수정
  5. 2015.11.18 StringBuilder
  6. 2015.11.18 Inner Class(내부 클래스)

Thread에서 wait 와 notify 은 어떠한 상황에서 쓰는지 예제를 통해 알아 보도록 합시다.


Wait() : 다른 Thread 에게 제어권을 넘겨주고 대기상태로 진입

notify() : wait() 되었던 것이 다시 실행상태가 됨


※ 각각은 Thread가 아닌 object에 정의되어 있어 각 쓰레드에서 호출 가능

※ 동기화 블록 내에서만 사용가능 (synchronized)



아래 조금 극단적인 예제를 들어보았다. 

<Example-1> 

public class Example1 { public static void main(String[] args){ sumThread th = new sumThread(); th.start();
System.out.println("Total is: " + th .total);
} } class sumThread extends Thread{ int total; @Override public void run(){ for(int i=0; i<100000 ; i++){ total += i; } //System.out.println("Final Total " + total); // 0~100000까지 합계값을 확인 } }


<결과>

Total is: 946000

Final Total 704982704


<문제점>

th.start();
System.out.println("Total is: " + th .total);

 main 함수 안에서 print 하는 total 값이 맞지 않는다. 왜냐하면 아직도 sum 연산을 수행하고 있기 때문!


만약 wait와 notify 를 이용해서 해결하고싶다면. 아래와 같이 코드를 작성한다




public class Example3 { public static void main(String[] args){ SumThread th = new SumThread(); th.start(); synchronized(th){ try{ System.out.println("Wait......"); th.wait(); // notify에 의해서 wait가 해제됨 }catch(InterruptedException e){ e.printStackTrace(); } System.out.println("Total is: " + th.total); } } } class SumThread extends Thread{ int total; @Override public void run(){ synchronized(this){ for(int i=0; i<100000 ; i++){ total += i; } notify(); // 연산을 모두 마친후 notify } } }


<결과>

Wait......

Total is: 704982704


위 예제는 구글링해서 가져온걸 수정한겁니다.

저렇게 사용하지 않고 main에서 출력하려면

th.start() 다음에 th.join() 을 하면 그냥 해결 되는 문제입니다. 

'Computer Science > JAVA' 카테고리의 다른 글

Thread-1 (Basic)  (0) 2015.12.03
Hashmap 과 Treemap 의 차이  (0) 2015.12.02
E-Clipse Java Font 수정  (0) 2015.11.18
StringBuilder  (0) 2015.11.18
Inner Class(내부 클래스)  (0) 2015.11.18
Posted by HHHimchan
,


Thread 속성들


void setPriority(int proirity) 최소1~최대10 보통5 . 

int getPriority

우선순위는 상속됨


join() => Thread 객체가 끝날때 까지 대기

    ex) Thread객체1.join(), Thread객체1이 끝날때까지 대기() 


Sleep() : Thread를 지정시간동안 일시정지 상태로 만듦


suspend():일시정지상태 = > resume() : 다시 실행대기상태

stop() : 종료 

==> suspend(), resume(), stop()은 dead-lock 을 유발할 수 있어서 deprecated



yield() => 다른 Thread에 양보 (실행=>실행대기), while 구문 안에 있을경우 자원낭비를 줄일 수 있다.

interrupt() => sleep, join, wait에 의해 정지된 쓰레드를 실행 대기 상태로 만듦.


 

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

		Thread thread1 = new numberCountThread();
		Thread thread2 = new numberCountThread2();
		Thread thread3 = new numberCountThread3();

		thread1.start(); // Thread1 시작
		thread2.start(); // Thread2 시작
		try {
			thread2.join(); // Thread2가 끝날때까지 대기
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		thread3.start(); //Thread3 시작
		System.out.println("Program 종료"); // Thread3 의 동작하고 있지만 print 함.
	}

	static class numberCountThread extends Thread {

		@Override
		public void run() {
			for (int i = 0; i < 10; i++) {
				System.out.println(getName() + "    " + i);

				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(getName() + " End");
		}				
	}

	static class numberCountThread2 extends Thread {

		@Override
		public void  run() {
			for (int i = 10; i < 20; i++) {
				System.out.println(getName() + "		" + i);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(getName() + " End");
		}
		
	}

	static class numberCountThread3 extends Thread {

		@Override
		public void run() {
			for (int i = 20; i < 30; i++) {
				System.out.println(getName() + "			" + i);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(getName() + " End");
		}
	}
}


<결과>

Thread-0    0

Thread-1 10

Thread-1 11

Thread-0    1

Thread-0    2

Thread-1 12

Thread-0    3

Thread-1 13

Thread-1 14

Thread-0    4

Thread-1 15

Thread-0    5

Thread-1 16

Thread-0    6

Thread-0    7

Thread-1 17

Thread-0    8

Thread-1 18

Thread-1 19

Thread-0    9

Thread-0 End

Thread-1 End

Program 종료

Thread-2 20

Thread-2 21

Thread-2 22

Thread-2 23

Thread-2 24

Thread-2 25

Thread-2 26

Thread-2 27

Thread-2 28

Thread-2 29

Thread-2 End


'Computer Science > JAVA' 카테고리의 다른 글

Thread-2 (Wait & notify)  (1) 2015.12.03
Hashmap 과 Treemap 의 차이  (0) 2015.12.02
E-Clipse Java Font 수정  (0) 2015.11.18
StringBuilder  (0) 2015.11.18
Inner Class(내부 클래스)  (0) 2015.11.18
Posted by HHHimchan
,

http://stackoverflow.com/questions/2444359/what-is-the-difference-between-a-hashmap-and-a-treemap

'Computer Science > JAVA' 카테고리의 다른 글

Thread-2 (Wait & notify)  (1) 2015.12.03
Thread-1 (Basic)  (0) 2015.12.03
E-Clipse Java Font 수정  (0) 2015.11.18
StringBuilder  (0) 2015.11.18
Inner Class(내부 클래스)  (0) 2015.11.18
Posted by HHHimchan
,

간단한 글이지만 Eclipse의 Consolas 폰트를 다른 폰트로 바꿔 보도록 하겠습니다.

개인적으로 개발자들이 많이 사용하는 나눔고딕글꼴, D2Coding 을 많이 쓰기때문에 바꾸려 합니다.


네이버 개발자 센터에서 배포중이니 아래 경로에서 설치하시면 됩니다.

나눔고딕글꼴 : http://dev.naver.com/projects/nanumfont

D2Coding : http://dev.naver.com/projects/d2coding



[1] EClipse를 실행합니다.

상단의 메뉴를 확인합니다 >> Window 클릭



[2] Window >> Preference

[3] 일일히 메뉴찾지 마시고, font라고 입력합니다.

그러면 우측에 Java를 클릭합니다



[4] Java Editor Text Font을 클릭하고 Edit 를 클릭


[5] 원하는 폰트로 변경 후 Apply , OK



[6] 아래와 같이 변경됩니다.

(좌:이전, 후:이후)


 


[추가] 라인넘버가 표시되길 원한다면 line으로 검색해서 "Show line numbers"를 체크


아래처럼 라인넘버가 출력됩니다.


'Computer Science > JAVA' 카테고리의 다른 글

Thread-2 (Wait & notify)  (1) 2015.12.03
Thread-1 (Basic)  (0) 2015.12.03
Hashmap 과 Treemap 의 차이  (0) 2015.12.02
StringBuilder  (0) 2015.11.18
Inner Class(내부 클래스)  (0) 2015.11.18
Posted by HHHimchan
,

StringBuilder

Computer Science/JAVA 2015. 11. 18. 15:37

StringBuilder


- String Class 는 메모리 내에서 상수 취급하여 처리하기 때문에 수정할 때마다 새로운 객체를 생성하여 처리된다.

- 따라서 많은 편집을 요하는 문자열을 StringBuilder를 사용하는 것이 성능향상에 좋다


ex) 어떠한 클래스에서 toString()을 Override 할 때 여러 맴버변수값들에 대한 조합을 통해 toString()시 반환될 문자열을 생성할 때 사용한다.


append(String s)

insert(int offset, String s)

reverse()

setChatAt(int index, char ch)

setLength(int newLength)


아래 페이지를 보면 함수들에 대한 내용이 많이 있다.

String Builder의 Document : https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html


// Example
//Example.java
public class Example {
	public static void main(String args[]){
		Student student1 = new Student(123456,"철수","제주","컴퓨터공학");
		System.out.println(student1);
	}
}

// Example
//Student.java

public class Student {
	private int id;
	private String name;
	private String address;
	private String major;
	
	public Student(int id,String name, String address, String major){
		this.id=id;
		this.name=name;
		this.address=address;
		this.major=major;
	}
	@Override
	public String toString(){
		StringBuilder sb = new StringBuilder();
		
		sb.append(id);sb.append("\t|");        // Tab 하고 | 추가
		sb.append(name);sb.append("\t|");
		sb.append(address);sb.append("\t|");
		sb.append(major);
		
		return sb.toString(); 
             
       //아래2줄은 StringBuilder를 사용하지 않고 String 객체를 이용하여 출력하는 방법. 결과는 동일하다.
       // String printTemp = id + "\t|" + name + "\t|" + address + "\t|" +major;  
       // return printTemp;
	}
}

<결과>


123456 |철수 |제주 |컴퓨터공학



'Computer Science > JAVA' 카테고리의 다른 글

Thread-2 (Wait & notify)  (1) 2015.12.03
Thread-1 (Basic)  (0) 2015.12.03
Hashmap 과 Treemap 의 차이  (0) 2015.12.02
E-Clipse Java Font 수정  (0) 2015.11.18
Inner Class(내부 클래스)  (0) 2015.11.18
Posted by HHHimchan
,

아래의 내용은 자바의 정석에서 발췌 또는 참고하였습니다. 


내부클래스 : 클래스내에 선언된 클래스

장점 : 

- 내부 클래스에서 외부 클래스의 맴버들을 쉽게 접근할 수 있다.

- 코드의 복잡성을 줄일 수 있다.(Encapsulation)

용도 :

- JAVA GUI 의 이벤트 처리시 주로 사용함(AWT, Swing)



Instance, Static, local Class는 서로의 상관관계 및 신규 객체 생성방법, 접근성을 위주로 한 두번씩 시험?같은 거에서 묻기도 하네요

사용빈도는 적어도 정확히 알아놓으면 좋겠지요?


종류 :

[1] Instance Class

- 외부 클래스의 맴버변수 선언위치에 선언함, 

- 외부 클래스의 instance member 처럼 다루어 진다.

- 주로 외부클래스의 Instance member 들과 관련된 작업에 사용될 목적으로 선언


// Example
class Outer{
    class Inner{
                ....
    }
}

[2] Static Class

- 외부 클래스의 맴버변수 선언위치에 선언됨. (Instance Class와 동일 위치)

- 외부 클래스의 Static member 처럼 다루어 진다.

- 주로 외부 클래스의 static 맴버, 특히 static method에서 사용될 목적으로 선언됨.

========================

// Example
class Outer{
    static class Inner{
          ....
    }
}


[3] Local Class

- 외부 클래스의 메서드나 초기화 블럭 안에 선언하며, 선언된 영역 내부에서만 사용가능하다.

// Example
class Outer{
    void methodA{            // 외부 클래스(Outer)의 Method
        class LocalInner{     // 안에 선언된 Class 
                ......
        }
    }
}

Inner 클래스에서 따로 분류하는 것 같기도 한데 함께 포함시켰습니다.

[4] Anonymous Class (익명클래스)

- 이름이 없는 클래스

- 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용되며, 오직 하나의 객체만을 생성하는 일회성의 클래스

- new 수식의 연장이므로 {,(,).} 등에 헷갈리지 않도록 주의

=========구현 룰========

new 조상클래스이름{

...

}


or


new 구현인터페이스이름{

...

}

=========================


>> 예제

===================================================

// Example
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Inner {
	public static void main(String args[]) {
		Frame f = new Frame("Frame");
		Button b = new Button("btn");
		
               // ActionListener Interface를 구현
                b.addActionListener(new ActionListener() {
                        @Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("Action Event ");
			}
		});
                // 괄호관계가 복잡하므로 차근차근 살펴보자
		f.setSize(300,200);
		f.add(b);
		f.setVisible(true);
	}
}

각 클래스별의 상세한 접근성 부분은 별도로 추가작성하겠습니다.


'Computer Science > JAVA' 카테고리의 다른 글

Thread-2 (Wait & notify)  (1) 2015.12.03
Thread-1 (Basic)  (0) 2015.12.03
Hashmap 과 Treemap 의 차이  (0) 2015.12.02
E-Clipse Java Font 수정  (0) 2015.11.18
StringBuilder  (0) 2015.11.18
Posted by HHHimchan
,