GIT 알아가기

 아래내용은 git-scm.com 의 메인페이지에 있는 글이다.
 짧게 말하면 버전 컨트롤 시스템, 우리말로 표현하자면 형상관리 시스템이라고 한다

    Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

  • 형상관리 시스템은 어떻게 사용될까

형상관리 개념을 모르던 시절, 대학시절 졸업 프로젝트를 할때가 생각난다. 

매주 산출물에 대한 결과를 교수님께 발표를 해야할때면 같이 프로젝트 하던 친구와 메신저로 업데이트한 소스를 주고받아서 합친 후 잘 구동되면 새로운 폴더에 날짜이름을 붙여 매번 저장했었다. 해당 폴더에 텍스트 파일을 만들어 업데이트 된 내용들을 적어놓곤 했다.

그리고 업데이트된 프로젝트파일을 압축해서 함께 프로젝트 하던 친구에게 다시 배포하였다.


졸업 후 회사에 입사하여 현업에 배치되면서 가장 먼저 익힌게 GIT이다.

이 중요한 걸 학교에서는 많이 안 가르쳐 주는 것 같다.


GIT 과 같은 형상관리 시스템을 사용하면 위와 같은 과정을 굉장히 세련(?)되고 스마트하게 처리할 수 가 있다. 지금은 나름 git에 능숙한 user로 학창시절을 생각하면 이불킥을 떠올리게끔 한다.


위의 내 흑역사를 통해 git으로 어떤일을 할 수 있는지 알아보자.


1. 프로젝트 인원 각자가 작업을 하여 업데이트 한다.

 >> git에는 변경된 것들을 일일히 추적하고 있는데 변경점 단위를 나타내주는 commit을 생성할 수있다. commit에는 자유롭게 메세지를 남길수 있다. 메세지에는 무엇을 변경했는지, 왜 변경했는지 등을 표현하는게 적절하다. 또한 생성된 commit은 협업을 위해 git server에 업데이트하여 다른 사람이 받아갈 수 있게끔 한다. (add, commit, push)


2. 친구와 메신저를 통해 업데이트 된 소스를 주고 받았다

  >> github나 bitbucket 또는 다른 opensource 의 git 관리 시스템을 이용해서 git 서버에 있는 업데이트 된 소스를 다운 받을 수 있다. (clone, pull, fetch)


3. 새로운 폴더에 날짜 이름을 붙여 매번 저장했다

 >> 특정 변경 이력을 기준으로 책갈피 처럼 TAG를 붙일 수 있다. 또는 Branch라는 개념을 통해 추가적인 복사본 없이 왔다갔다 할 수 있다. commit이라는 것을 통해서 (tag, branch, checkout)


4. 다시 배포하였다.

 >> 서버에 다시 업데이트 해놓으면 프로젝트 인원 누구나 최신소스까지 업데이트 받을 수 있다.



commit 이라는 단위를 통해 자그마한 모든 변경점을 추적하고 관리할 수 있다. 

언제, 어디에서 문제가 생겼는지 또는 누가 수정한 내용이었는지도 파악할 수 있다.

Branch 전략을 이용해서 다양한 목적으로 협업을 할 수 있다. 


  • 다른 형상관리 시스템은?

  • GIT과 견주어 많이 사용하는 형상관리 시스템은 SVN 이 있다.

    하지만 GIT이 빠르게 발전하면서 Git의 사용 추세가 늘어나고 있다. 

    다만 GIT이 SVN 보다는 어렵다(?)라는 말이 있다. 

    Google Trends 에서 git 과 svn 을 비교한 결과는 아래와 같다~





  • 탄생 역사

리눅스 창시자인 토발즈는 BitKeeper 라는 상용 DVCS를 이용했었다.
2005년에 여러가지 이유로 BitKeeper 사용을 포기하고, 사용중에서 느꼈던 교훈을 바탕으로 git을 개발하게 된다. git이 세상에 나온지 10년이 조금 지나있다.

그 교훈은 5개이다.
  • Speed

  • Simple design

  • Strong support for non-linear development (thousands of parallel branches)

  • Fully distributed

  • Able to handle large projects like the Linux kernel efficiently
    (speed and data size)

위에서는 여러가지 이유라고는 했지만, 내막에는 재미있는 사건들이 있다.
https://www.linux.com/news/bitkeeper-and-linux-end-road
https://en.wikipedia.org/wiki/BitKeeper

http://www.zdnet.co.kr/news/news_view.asp?artice_id=00000039135721&type=det&re= (zdnet에서 2005년도에 쓴 기사가 있다.)

  • 여러 오픈 강좌들

오픈된 강좌들이 있다

https://www.udacity.com (유다시티)

https://opentutorials.org/course/2708 (생활코딩)

https://git-scm.com (Window.Mac용 Git 공식사이트, Pro Git 문서를 번역하여 무료로 배포하고 있다.)




Posted by HHHimchan
,

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
,

Python에서 xml을 파싱하여 처리하는 간단한 방법을 소개합니다. 


각종 사이트에서 전달되는 RSS(Rich Site Summary) 컨텐츠를 가지고 쉽게 재가공 하여 사용할 수 있도록 도와주는 외부 모듈입니다.

최신정보등을 자동 수집할 수 있다는 장점이 있다.( ex) 기상정보, 뉴스정보 등)


RSS에 대해 더 자세히 알고 싶다면 위키백과를 참고하세요 : https://ko.wikipedia.org/wiki/RSS


Pypi : https://pypi.python.org/pypi/beautifulsoup4/4.4.1

BeautifulSoup 공식사이트 : http://www.crummy.com/software/BeautifulSoup/bs4/doc/


Root부터 찾을 필요없이, 직접 명시하는 TAG에 접근이 가능한 것이 무척 편합니다.

xml을 직접 open 하는 것과, 기상청 RSS 를 가져와서 처리하는 예제 두개를 아래에 올립니다.

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


	
		
			Track1
			3:15
		

		
			Track2
			2:22
		

		
			Track3
			5:33
		
		
		
			Track4
			4:33
		
	




#Example1

from bs4 import BeautifulSoup

fp = open("song.xml","r")
soup = BeautifulSoup(fp, "html.parser")

# findAll로 해당되는 TAG를 검색
for songElement in soup.findAll('song'):
    # 해당 TAG안의 Attribute(속성) 값을 가져올때는 아래와 같이 사용
    print(songElement['singer'],songElement['album'])
    
    # Tag 아래에 있는 다른 Tag를 가져올경우 아래와 같이 사용
    print(songElement.title.string,songElement.length.string)
    
 


<결과>
singer1 album1
Track1 3:15
singer2 album2
Track2 2:22
singer3 album3
Track3 5:33
singer4 album4
Track4 4:33

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

#Example2

from bs4 import BeautifulSoup
import urllib.request as MyURL

# 서울/경기도 RSS
japi = 'http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109' # 서울/경기

response = MyURL.urlopen(japi)
weather = BeautifulSoup(response, "html.parser")

for location in weather.findAll('location'): # location 까지 알아서 찾음.
        
    print(location.city.string)
    print("="*20)

    for data in location.findAll('data'):
        # xml에서 태그명은 대소문자 구분을 하지 않음
        print("시간:",data.tmef.string)      
        print("날씨:",data.wf.string)
        print("최저:",data.tmn.string)
        print("최고:",data.tmx.string)
        print("신뢰도:",data.reliability.string)
        print("")


#Example3


	
		서울ㆍ인천ㆍ경기도
		서울
		
			A02
			2015-12-05 00:00
			구름많음
			-1
			5
			보통
		
		
			A02
			2015-12-05 12:00
			구름조금
			-1
			5
			보통
		
		
			A02
			2015-12-06 00:00
			구름많음
			-2
			5
			보통
		


결과

서울

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

시간: 2015-12-05 00:00

날씨: 구름많음

최저: -1

최고: 5

신뢰도: 보통


시간: 2015-12-05 12:00

날씨: 구름조금

최저: -1

최고: 5

신뢰도: 보통

....


Posted by HHHimchan
,

http://www.itworld.co.kr/slideshow/89928

Posted by HHHimchan
,

파이선의 좋은점은 여기저기에 많은 3rd party 모듈이 있다는 것이다.

다양한 3rd party 모듈을 이용하면 많은 프로그래밍 분야에서 사용이 가능하다


xlsxwriter 와 openpyxl 을 파이선을 다루는 모듈을 사용할 때 많이 사용한다고 합니다.

다만 xlsxwriter는 기존의 파일을 open 하여 수정하는 것이 불가하다고 하네요.(이점 참고하세요)


엑셀을 다루는 여러 3rd party 모듈이 있으나 여기 글에서는 openpyxl 이라는 모듈을 다루어 보도록 하겠습니다.


파이선 3.4 로 진행했습니다


<PyPi : 파이선에서 운영하는 다양한 Package 릴리즈 페이지>

 http://pypi.python.org/


<openpyxl - download>

https://pypi.python.org/pypi/openpyxl/2.3.1





<openpyxl - document>

http://pythonhosted.org/openpyxl/

document를 잘 보고 예제를 따라하면 내것으로 만들기가 좋습니다

2.3.1 버전이 올라와 있으니 해당 버전으로 다운로드를 합니다.

단지 영어라는 막연한 두려움이 있지만 예제만 따라해 보셔도 대충 감이 온다는 점.



[openpyxl-2.3.1.tar.gz ] 파일을 다운로드

압축을 해제하고 풀린 경로에 가서

$ python setup.py install 하여 설치합니다



from openpyxl import Workbook from openpyxl.styles import Font, Side, Border # Workbook 생성 wb = Workbook() # Workbook을 생성하면 적어도 하나의 워크시트를 생성한다. ws1 = wb.active ws1.title = "Example1" # 1. 시트의 행렬의 번호를 입력하여 Text 입력이 가능 ws1['A1'] = "A1_Test Text" # 2-1 시트에서 셀을 변수로 만들고 c = ws1.cell('A2') # 2-2 아래처럼 각 셀에 대해 value 입력, font 설정 등을 할 수 있다. c.value = "A2 zone" c.font = Font(name='Arial', size=14) c.border = Border(left=Side(border_style="thin", color='FF000000'),right=Side(border_style="thin",color='FF000000'),top=Side(border_style="thin",color='FF000000'), bottom=Side(border_style="thin", color='FF000000')) # 3. row, column 을 지정하여 셀을 변수로 리턴할 수 있다. d = ws1.cell(row=2,column=2) d.value = "(2,2) text" # 같은 workbook에 새로운 시트를 추가할 때 ws2=wb.create_sheet() # 번호를 지정하면 아래 번호에 sheet를 추가한다. #ws2=wb.create_sheet(1) # 새로운 시트의 이름은 Sheet2 라고 하자 ws2.title="Sheet2" # 저장은 간단합니다. wb.save('example.xlsx')




간단한 예제였지만 Document 들을 보고 금방 습득할 수 있도록 간단하게 사용이 가능합니다.



어떠한 양식이 있는 text 를 엑셀화 시키고 싶다면 실사용 예로 아래와 같이 방향성을 가져도 될것같습니다.

시간이 난다면 간단한 예제로 다음시간에 한번 다뤄 보도록 할께요


[1] text 파일이 생성됨(가져오거나) (공백문자로 구분되거나 스트링 처리가 가능한 양식)

[2] 해당 text 파일을 읽어옴

[3] 라인단위나, 지정한 단위별로 list화 시킨 후에

[4] 리스트를 읽어오면서 엑셀화 시킴(loop 구문을 이용하여 row,column 변경 처리를 함)

    서식 폰트 내용 등등등등

[5] 저장 ( 현재시간 등으로 저장 )

[6] 읽어 들인 text 파일을 renaming하여 하위폴더에 포관



이렇게 코드를 짠 후 python이 설치되지 않은 컴퓨터에서도 실행될 수 있도록 배포를 하고 싶으면 py2exe 와 같은 3rd party 모듈을 사용하면 됩니다.

허나 지금 py2exe 에서 openpypl이 잘 include 되지 않는 이슈가 있긴한데, 이를 임시로 피해가는 방법도 다음 시간에 다뤄보도록 할께요.

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
,