명령어&실습9_branch만들기
정리&요약
git의 branch는 버전관리시스템들보다 간편함.

정리&요약
branch를 해야할 때의 예시(아래): 원소스를 변경하거나 더럽히지 않고, 개발을 하고자 할때
- 고객이 특정기능을 커스터마이징 요구할때, 원소스를 유지하고 추가된 소스들과는 별개로 보관하고 싶을때,
- 불필요하다고 판단되는 기능들을 고객이 요구할때, 원소스를 유지하고 작업을하면, 나중에 그 부분을 지울수 있음
- 메인되는 작업과 테스트만을 위한 작업을 구분해서 작업하고자 할때,

정리&요약
branch는 branch할 때의 시점의 모든 기록을 같이 공유한다.


실습
새로 작업폴더 만듦.
C:\developGit\branch_test

git bash 열기

cd C:/developGit/branch_test
해당경로 이동


> git init


f1.txt파일을 만들고, a입력
> vim f1.txt
insert
a 입력
esc 누르고
:wq


> git add f1.txt


> git commit -m "1"


> vim f1.txt
insert
b 입력
esc 누르고
:wq


> git commit -am "2"
리&요약
git commit -a
유의할점: commit을 한번도 제대로 하지 않는 경우, -a가 먹히지 않음.


> git branch
현재의 branch들 상태보기

정리&요약1
*표시가 되어있음.
의미: 표시된 branch를 사용하게 됨.

정리&요약2
master의 의미
git을 처음 사용하는 순간부터 기본branch를 사용하게됨.
그 branch의 이름이 "master"


> git branch exp
"exp"라는 branch 만들기


> git branch
현재의 branch들 상태보기
exp 브랜치가 생성됨을 확인할 수 있음.


> git checkout exp
"master"에서 "exp" branch를 사용


> git branch
"exp" branch를 사용하고 있음을 확인


> git log
"exp"의 git log기록이 "master"의 로그기록이 같음을 확인할수 있음.
branch한 시점에서의 "master" branch의 log를 같이 갖게됨.


> vim f1.txt
insert 누르기
c 추가입력
esc 누르기
:wq
f1.txt를 수정 "c"를 추가입력


> git add f1.txt


> git commit -m "3"
"3"이름으로 commit하기


> git log
"exp" branch의 commit이 추가됨을 확인할수 있음



> git checkout master
"exp" 에서 "master" branch 바꿈.


> git log
"master" branch 에서의 commit 기록을 볼수 있음.
3번 commit이 없음을 확인할 수 있음.



> cat f1.txt
f1.txt에 입력한 c도 없음을 확인할 수 있음

> git checkout exp
다시 "exp" branch로 이동

> vim f2.txt
f2.txt 파일을 "exp" branch에 만들어둚.

> git add f2.txt
f2.txt를 추가함.
insert키 누름
a 입력
esc 누름
:wq

> git commit -m "4"
4번으로 commit

실제 폴더에 있는 파일에 "f2.txt" 가 있음을 확인할 수 있음(현재 branch "exp")

> git checkout "master"
f2.txt파일이 사라진 것을 확인할 수 있음.
"master" branch에서 commit한 내용에는 f2.txt가 없기때문

> git checkout "exp"
f2.txt가 생겨나는 것을 확인할 수 있음.


명령어&실습10_branch 정보 확인

> git log -- branches --decorate
작업중인 branch 이외의 기록까지 볼 수 있음.
(master)라는 의미:
commit2까지가 master라는  branch의 commit 기록임
(HEAD -> exp)의미
exp라는 branch를 현재 작업중



> git log --branches --decorate --graph
좀더 그래픽화하여 보여줌.
현재는 분기점에서의 확연한 차이점이 없어서 1줄로 표기됨.



확실한 차이점을 만들기 위해서 "master"로 이동
f3.txt를 만들어줌.
> git checkout "master"


> vim f3.txt
insert 누름
a 입력
esc 누름
:wq


> git add f3.txt


> git commit -m "5"
5라는 메세지와 함께 commit


> git log
"master" branch의 기록을 확인


> git log --branches --decorate --graph
이제 2번 commit을 기준으로 분기점이 확실히 나누어지는 것을 확인할 수 있음



> git log --branches --decorate --graph --oneline
좀더 짧게 확인할 수 있음


> git log master..exp
master를 기준으로 exp의 차이점은 뭔지 확인할 수 있음


> git log exp..master
exp를 기준으로 master의 차이점을 확인할 수 있음


> git diff master..exp
master를 기준으로 exp의 차이점을 상세하게 확인할 수 있음






명령어&실습11_branch 병합(merge)
현재 branch는 master

> git merge exp
exp를 master로 merge함

esc키 누름
:wq


> git log --branches --decorate --graph --oneline
아래 사진에서처럼 exp가 master쪽으로 합쳐진 것을 확인할 수 있음


> ls -al
폴더에서도 f2.txt가 추가되어서 늘어난것을 확인할 수 있음


master를 exp로 가져오고 싶다.
> git checkout exp
"exp" branch로 이동

> git merge master
master가 exp쪽으로 merge하기


git log --branches --decorate --graph --oneline
branch "exp"도 5번 commit을 가지게됨을 확인 할 수 있음.
exp와 master는 현재 똑같음을 확인할 수 있음을 확인 할 수 있음


> git checkout master
"master" branch 이동


> git branch -d exp
"exp" branch 삭제하기


git log --branches --decorate --graph --oneline
삭제 됨을 확인할 수 있음




명령어&실습12_merge하면서 겪는것들(fast-forward, recursive' strategy)
merge를 했을때, 겪는것들
- fast-forward: commit을 할 필요없이 바로 merge
Merge made by the 'recursive' strategy: commit을 한 다음에 하는 merge

git의 공식 메뉴얼(한국어 선택하기)




3.2 Git 브랜치 - 브랜치와 Merge 의 기초
에 나와 있는 글

위와 같은 commit 히스토리가 있다고 했을때,

> git checkout -b iss53
Switched to a new branch "iss53"
iss 53이라는 브랜치를 생성하고 'master'에서 'iss53'으로 이동(git branch iss53 과 git checkout iss53을 줄여놓은 말)



> vim index.html
> git commit -a -m 'added a new footer [issue 53]'
index.html 파일을 생성
'added a new footer [issue 53]'로 commit


git checkout master
Switched to branch 'master'
'master' branch로 이동

이때, master에서 갑자기 branch 'hotfix'를 만들고 작업을 하게됨.
> git checkout -b hotfix
Switched to a new branch 'hotfix'
'hotfix'라는 branch를 생성하고 이동
> vim index.html
> git commit -a -m 'fixed the broken email address'
[hotfix 1fb7853] fixed the broken email address
1 file changed, 2 insertions(+)
index.html 파일생성하고
'fixed the broken email address' 메세지와 함께 commit


$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)

hotfix를 master쪽으로 merge시킴.
이때 실제로는 master 와 hotfix가 merge가 일어나는것이아니라, hotfix쪽으로 merge point가 이동하는것이 됨.
이것을 fast forward라고 부름.

> git branch -d hotfix
Deleted branch hotfix (3a0874c).
'hotfix'  branch 지우기


다시 iss53으로 돌아가기
> git checkout iss53
Switched to branch "iss53"
> vim index.html
> git commit -a -m 'finished the new footer [issue 53]'
[iss53 ad82d7a] finished the new footer [issue 53]
1 file changed, 1 insertion(+)
index.html 만들고, 'finished the new footer [issue 53]' 메세지로 commit


$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
README | 1 +
1 file changed, 1 insertion(+)


최종 결과







명령어&실습13_conflict해결
git bash를 연다.

> cd C:/developGit/practice2
새 작업폴더로 이동


> git init
git 시작을 알림


> vim function.txt
con.txt를 만들어서
insert키 누름
function a() {
}
입력
esc키 누름
:wq

> git add function.txt


> git commit -m '1'


> git branch contest
'contest'라는 branch를 만듦.


> git checkout contest
'contest' branch로 이동


> vim function.txt
insert키 누름

function c(){}를 function a(){} 아래에 기재
esc키 누름
:wq


> git commit -am '2'
'2'라는 메세지로 commit하기


> git checkout master
'master' branch로 이동


> vim function.txt

insert키 누름
function a(){}위에
fucntion b(){}를 기재
esc키 누름
:wq


> git commit -am '3'
방금 바꾼 파일 function.txt를 '3' 메세지와 함께 commit하기


> git merge contest

master를 기준으로 'contest' branch의 내용이 merge됨.
아래와 같은 merge관련 메세지 입력창이 나옮.
입력하지 않아도됨.
esc키 누름
:q


> cat function.txt
파일내용이 function a(){}를 기준으로 위, 아래에 b, c가 추가되었음을 알수 있음.(conflict가 없었음)




그렇다면, 같은 자리, 영역에 수정이 일어나고, 이것을 합치게된다면? conflict가 일어나게됨.
> vim function.txt

insert키 누름
a함수의 매개변수 자리에 con1추가
esc키 누름
:wq

> git commit -am '4'


> git checkout contest
'contest' branch로 이동


> vim function.txt
insert키 누름
아래와 같이 수정
esc키 누름
:wq


> git commit -am '5'
'5'라는 메세지와 함께 commit


> git checkout master
'master' branch로 이동


> cat funtion.txt
 ch

> git merge contest
같은 분기점에서 시작한 내용중에서 같은 영역의 내용이 다르게 바뀌었을때 아래와 같이 충돌이 일어나게됨.
이때는 사용자가 일일이 하나씩 보고 맞는것을 수정&저장해야만 merge가 제대로 끝남.


> cat function.txt
아래와 같이 합쳐져있음.
이것을 올바로 수정한다음 저장후, commit해야함.
======== 을 기준으로 현재 브랜치내용(<<<<<아래), contest브랜치내용(>>>>>>위)가 상이한 부분임.


> vim function.txt
insert키 누름
아래와 같이 고침
esc키 누름
:wq


> git commit -am 'complete'


정상적으로 conflict를 해결하고 commit하게됨.





명령어&실습13_stash(숨겨두기)
작업중인 branch에서 commit을 할수없는데, 다른 branch로 이동해서 작업을 해야할때, 쓰는 기능
잠깐 기록해서 멈춰두고, 다른 작업 가능
그러나, branch를 활발하게 사용하지 않으면 사용빈도가 낮음.
git stash는 최소한 버전관리가 되고 있는(tracked) 것에만 적용이됨.

WIP: Working In Process(작업중인게 저장되었다라는 의미)
stash의 list안에 저장된 내용은 삭제하지 않는한, 항상 살아있음.

stash 옵션명령 종류


실습
cd C:/developGit/practice3
practice3프로젝트로 이동


> git init


> vim f1.txt
f1.txt를 만들어 a입력, 저장


> git add f1.txt



> git commit -m '1'
'1' 메세지와 함께 commit


> git checkout -b stashtest
'stashtest' 라는 branch로 이동


> vim f1.txt
f1.txt에 b라는 내용을 수정기재 


> git status
파일이 변경되었으며, 아직 staged 상태가 아니라는 것을 알수있음


이때, 갑자기 다른 브랜치로 가서 일을 해야하는데, commit하기에는 확신할수 없음.
이런경우 stash를 사용함. 즉, commit전의 변경된 내용을 저장할수 있음

> git stash --help
stash관련 추가 옵션명령어들을 볼 수 있음.

> git stash
방금 수정된 내용이 stash 기록으로 남고, 수정되지 않은 상태로 바뀜.


> git status
수정이력이 없음을 확인할 수 있음


> git stash apply
stash에 저장해둔 최근 기록을 다시 적용함


> git stash list
stash 리스트를 볼수 있음.
아래 1개가 기록되어 있음을 볼수 있음.


> git reset --hard HEAD
기록은 없어지지만, stash 리스트는 남아 있음.


> git stash list
stash는 남아 있음을 볼수 있음.


> git stash drop
stash 최근 기록 삭제


> git stash apply; git stash drop;
최근 stash 를 적용하고 stash 지우기


> git stash list
stash 리스트에 남아 있는게 없음을 볼수 있음.


> git stash pop
git stash apply; git stash drop;과 같은 기능



f1.txt는 한번 commit된적이 있어서 tracked 되고 있음.
이상황에서 f1.txt를 수정하고, f2.txt는 새로 만들어보자.
> vim f1.txt
> vim f2.txt 


> git status
아래와 같이 나옮. (f1.txt는 한번이라도 git add 된적이 있지만, f2.txt는 한번도 git add된적이 없음을 확인가능)



> git stash
이때, stash를 해주기


> git status
stash에는 한번이라도 git add되었었던 f1.txt의 변경내용만 stash에 저장이되고, f2.txt내용은 stash에 기록이 안됨 확인.


아래 글을 읽을 때 참고할것!

> 은 콘솔창을 뜻하는 것으로 별의미 없는 것!

버전관리시스템
대표적인 것
CVS, SVN, GIT


윈도우에 git 설치
위 사이트로 가서 설치파일다운
기본값, NEXT.....
설치가 완료됨

윈도우 -> 검색-> GITBASH가 나오면 설치가 완료된 것임.
GITBASH는 리눅스계통의 명령어가 윈도우 OS에서 사용가능할수 있게해줌.

> git
위 명령어를 치면 



명령어&실습1_git bash 사용
현재 위치경로
> pwd

경로로 이동
> cd 경로

폴더 생성
> mkdir 폴더명

git 명령어리스트보기
> git


명령어&실습2_git 초기설정, 명령입력
작업시작시 git에게 작업을 하겠다는 것을 알려주는 기능
.git폴더를 만듦. .git에 버전관리폴더,파일들이 저장됨.
git을 통해 관리되어질 프로젝트 workspace의 경로로 이동하여 설치할것!
> git init
ex) git_practice폴더아래 git 프로젝트관리를 시작함.
> cd C:/developGit/git_practice
> git init



파일 생성
만약 vim이 아니라 nano와 같은 에디터가 실행시 git config --global core.editor "vim"
> vim 파일명
ex) vim f1.txt

i를 누른후, 생성된 파일에 입력가능

esc                삽입모드에서 명령모드로 가기
i                    명령모드에서 삽입모드 가기
:w                방금적고, 수정한내용 저장
:q                나가기

폴더내역보기
> ls -al


파일내용 보기
> cat 파일명


git 프로젝트 폴더의 상태확인(변경내역에 대한 git의 추적상태를 알수 있음)
> git status


변경된 파일을 git이 추적하게 만듦.
> git add 파일명



버전을 만든 사람의 정보를 설정하기(이게 있어야, 다른 협업개발자도 작성자 정보를 알수 있음)
한번만 만들면됨.
> git config --global user.name "닉네임"
> git config --global user.email "이메일"


명령어&실습3_commit하기
이전에 작업한 내용을 commit해보기
> git commit

vim을 쳐서 보여지는 화면이 보임.
#~~~~~ 내용들은 무시해도됨.
1입력
esc 누르기
:wq
엔터

git 기록들을 볼수있음
> git log


f1.txt를 수정하기
> vim f1.txt

souce: 1을 2로수정
esc 누르기
:wq
엔터


> git status
수정된 파일이 추적확인되지 않았다고 나옮.


수정된 내용을 추적하라고 다시 명령
> git add f1.txt


다시 확인해보기
> git status




명령어&실습4_commit대기(staged)개념 알기


commit전에 변경된 파일들의 내용을 최종확인후, 아래의 명령어를 시켜둔것만 git commit하면 버전관리기록상 변경된것으로 기록이 됨.
"git add 파일"

> ls -al


f1.txt를 복사해서 f2.txt로 만들기
> cp f1.txt f2.txt


f2.txt만들어진것 확인
> ls -al


git 상태확인
> git status


변경된 파일을 추적하게 명령
> git add f2.txt


git 상태확인
> git status


add추적확인한 변경된 내역 git commit 하기
> git commit


commit 기록 볼수 있음
> git log





명령어&실습5_시점별 변경된 내용 확인
각각의 commit간의 차이점을 확인
> git log -p



commit 아이디를 활용하여, 해당 commit 시점이전의 git log를 볼수 있음
> git log fdf4d2deb87ae04a2fa1844339ecad7f920cfff8

commit 아이디2개간의 차이점보기
git diff 2d52dfcd844ac7fba20297932a4ed577a37231ea..d78b479b312306de7e146b0f88cc51b23c30a874


commit전 방금 전까지 작업했었던 내용들을 마지막으로 review하기 위해서 사용
> git diff



명령어&실습6_과거버전으로 돌아가기
commmit 아이디를 시점으로 그 이전 기록 없애기
> git reset d78b479b312306de7e146b0f88cc51b23c30a874
reset을 하게되면, 실제 commit기록은 사라진것은 아니지만, commit기록은 그 시점 이후로 사라지며, 그 시점으로 작업환경이 바뀜
공유한 이후에는 reset을 이용하지 말자!
reset은 로컬내에서만 작업할때 사용


해당 기록들이 사라졌고, 파일내용들이 바꼈음을 알수 있음.
> git log


해당 commit 아이디를 취소하고 새로운 버전으로 만듦.
> git revert  d78b479b312306de7e146b0f88cc51b23c30a874


명령어&실습7_도움명령어(메뉴얼 보기)
git 명령어
git --help
> git --help


특정 명령어
git 특정명령어 -help
> git commit -help

변경된 내용 commit(기본값)
> git commit -a

구글에서 git 명령어 관련 키워드별 검색 빈도수
mand
google results
%
commit
528,000
7.981980075
push
523,000
7.906393143
pull
506,000
7.649397572
clone
489,000
7.392402002
checkout
470,000
7.105171658
add
446,000
6.742354382
branch
439,000
6.636532676
log
388,000
5.865545964
diff
369,000
5.578315621
fetch
355,000
5.36667221
merge
354,000
5.351554823
init
343,000
5.185263572
status
286,000
4.323572541
reset
267,000
4.036342197
tag
246,000
3.718877081
rebase
203,000
3.068829461
rm
142,000
2.146668884
show
104,000
1.572208197
bisect
62,800
0.9493718726
grep
49,400
0.7467988934
mv
44,700
0.6757471768



명령어&실습8_git의 원리
- git은 파일의 이름이 달라도, 파일의 내용이 같으면, 같은 오브젝트를 바라본다!
위 사이트에서 sha-1이용한 원리를 확인할 수 있음

아래의 폴더에, hi라는 값이 저장되게됨.
objects/c2/2b5f9178342609428d6f51b2c5af4c0bde6a42

objects 폴더아래의 object는 commit, tree, blob 3가지로 구성되어있음.



문자저장기


선생님이한 등록 저장기

메뉴바를 달고, 메뉴를 달고, 아이템을 달아야한다!!!!

 


flush







문자저장기
public class MAIN {

       public static void main(String[] args) {
             // TODO Auto-generated method stub

             new GUI();
            
      }

}

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;


public class MANAGER {

      FileOutputStream fos =null ;
      FileWriter fw = null;
      
       // File(): 숫자를 파일을 만들거나 연결시켜준다. 파일을 생성한다.  //FileWriter(); 문자열을 파일로 저장한다.
      
       public void writeMessage(String dir, String contents){    // 디렉토리랑 내용을 가져오면, 해당 디렉토리에 해당 파일명에 내용을 넣을것이다.

                   try {
                         contents=contents .replaceAll("\n", "\r\n");  // .replaceAll: 특정 문자열을 찾기&바꾸는 메소드
                         fw= new FileWriter(dir ); 
                         fw.write( contents);
                         fw.flush();
                  } catch (IOException e1 ) {
                         // TODO Auto-generated catch block
                         e1.printStackTrace();
                  } 
                   try {
                         fw.write( contents);
                  } catch (IOException e ) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                  }

      }
      
}



import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;

public class GUI extends JFrame {
       private JTextField textField ;
       private JTextArea textArea ;
       private JMenuItem mntmNewMenuItem ;
       private MANAGER tm ;
      
      
       public GUI() {
             super("텍스트저장기" );
             tm= new MANAGER();  // MANAGER 객체화
            
            getContentPane().setLayout( null);
            
            JLabel label = new JLabel("\uC81C\uBAA9");
             label.setBounds(17, 56, 60, 36);
            getContentPane().add( label);
            
             textField = new JTextField();
             textField.setBounds(74, 61, 570, 27);
            getContentPane().add( textField);
             textField.setColumns(10);
            
            JSeparator separator = new JSeparator();
             separator.setBounds(27, 107, 642, 2);
            getContentPane().add( separator);
            
            JLabel label_1 = new JLabel("\uB0B4\uC6A9");
             label_1.setBounds(17, 124, 60, 36);
            getContentPane().add( label_1);
            
             textArea = new JTextArea();
             textArea.setBounds(74, 133, 570, 332);
            getContentPane().add( textArea);
            
            JMenuBar menuBar = new JMenuBar();
            setJMenuBar( menuBar);
            
            JMenu mnNewMenu = new JMenu("\uBA54\uB274");
             menuBar.add(mnNewMenu );
            
             mntmNewMenuItem = new JMenuItem("\uC800\uC7A5");
             mnNewMenu.add(mntmNewMenuItem );
            
             mntmNewMenuItem.addActionListener(new aListener());
            
            setVisible( true);
            setSize(742,590);
            
      }
      
       public class   aListener implements ActionListener{
            
             @Override
             public void actionPerformed(ActionEvent e){
                  
                   if(e .getActionCommand().equals("저장")){
                        
                        FileDialog fd= new FileDialog(GUI.this ,"파일저장" ,FileDialog.SAVE);   // ()안에 첫번째:아버지가 될 frame,두번째:파일 탐색기 제목, 세번째:모드
                        
                        String content=textArea .getText();
                        String Filename=textField .getText();
                        
//1
                         fd.setFile( Filename+".txt" );   // 이렇게 하면 파일이름을 따로 하지 않아도 된다.
//2
                         fd.setVisible( true);  // 보여줘야하므로, setVisible(true); 를 해줘야함.
//3                     
                        String dir=fd .getDirectory();
                        
                         tm.writeMessage( dir+Filename +".txt" ,content );
                        

                        
                  }
                  
            }
            
      }

}







등록저장기(보기만 한것)
package test;

public class Main {

    public static void main(String[] args) {
        new GUI();
    }
}




package test;

public class VO {

    private String name;
    private String age;

    public VO(String name, String age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "이름=" + name + "  나이=" + age;
    }

}



package test;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class Manager {
    private FileWriter fw;
    private ArrayList<VO> alist = new ArrayList<>();

    public ArrayList<VO> getAlist() {
        return alist;
    }

    public void setAlist(ArrayList<VO> alist) {
        this.alist = alist;
    }

    public void addList(VO vo) {
        alist.add(vo);
    }

    public void save(String dir) {
        try {
            fw = new FileWriter(dir);
            fw.write(alist.toString());
            fw.flush();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}




package test;

import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JTextField;
import javax.swing.JList;
import javax.swing.JSeparator;
import javax.swing.JLabel;

public class GUI extends JFrame {
    private JTextField textField;
    private JTextField textField_1;
    private JList list;
    private JMenuItem menuItem;
    private JMenuItem menuItem_1;
    private Manager mg;

    public GUI() {
        super("간단등록부");
        mg = new Manager();
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        JMenu mnNewMenu = new JMenu("\uBA54\uB274");
        menuBar.add(mnNewMenu);

        menuItem = new JMenuItem("\uC800\uC7A5");
        mnNewMenu.add(menuItem);

        menuItem_1 = new JMenuItem("\uB4F1\uB85D");
        mnNewMenu.add(menuItem_1);
        getContentPane().setLayout(null);

        textField = new JTextField();
        textField.setBounds(72, 29, 116, 21);
        getContentPane().add(textField);
        textField.setColumns(10);

        textField_1 = new JTextField();
        textField_1.setBounds(255, 29, 116, 21);
        getContentPane().add(textField_1);
        textField_1.setColumns(10);

        list = new JList();
        list.setBounds(27, 92, 376, 124);
        getContentPane().add(list);

        JSeparator separator = new JSeparator();
        separator.setBounds(12, 71, 391, 11);
        getContentPane().add(separator);

        JLabel lblNewLabel = new JLabel("\uC774\uB984");
        lblNewLabel.setBounds(12, 32, 57, 15);
        getContentPane().add(lblNewLabel);

        JLabel lblNewLabel_1 = new JLabel("\uB098\uC774");
        lblNewLabel_1.setBounds(200, 32, 57, 15);
        getContentPane().add(lblNewLabel_1);

        menuItem.addActionListener(new alistener());
        menuItem_1.addActionListener(new alistener());
        setSize(446, 301);
        setVisible(true);

    }

    private class alistener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            if (e.getActionCommand().equals("등록")) {
                String name = textField.getText();
                String age = textField_1.getText();

                VO vo = new VO(name, age);
                mg.addList(vo);
                list.setListData(mg.getAlist().toArray());
                textField.setText("");
                textField_1.setText("");

            } else if (e.getActionCommand().equals("저장")) {

                FileDialog fd = new FileDialog(GUI.this, "저장", FileDialog.SAVE);
                fd.setVisible(true);
                String dir = fd.getDirectory();
                String fileName = fd.getFile();
                mg.save(dir + fileName);
            }
        }

    }
}








자바정리

자바 JDK 설치

자바 JDK 설치
교재: 자바 프로그래밍 바이블
JAVA DEVELOPMENT KIT (자바개발도구)

프로그램이란 무엇인가요?
컴퓨터를 가지고 어떤 일을 할 수 있도록 만들어 진 것!

프로그래밍 언어 종류: JAVA, C언어, C++, JSP, ASP, PHP 등등

설치방법
WWW.ORACLE.COM -> JAVA SE DOWNLOADS -> JAVA DOWNLOAD ->JAVA SE DEVELOPMENT KIT 8U101를 ACCECPT 동의 -> 자신의 컴퓨터 OS 사양에 맞는 프로그램을 선택하여 저장 -> 예 계속 누루고 설치 

CMD 창에서 java를 쳐서 제대로 설치됬는지 확인가능
java -version 누르면, 자바가 설치된 버전도 확인할 수 있음.







자바 응용프로그램의 구조&기본 규칙, path설정

# 추가 개발도구인 이클립스를 사용하기전에, 익숙해지기위해서 메모장활용
# 영문 대소문자를 정확하게 적어준다.
# 대부분의 컴퓨터 언어는 bin 밑에 명령어들이 모여있음(bin 아래에 javac 도 있다.)

자바 응용프로그램의 구조&기본 규칙
1) 반드시 하나이상의 클래스로 구성된다.  class 클래스명 {}
2) 반드시 하나의 main 메소드를 가져야한다.
3) 클래스명의 첫글자는 대문자로 한다. 파일명은 공백을 포함할수 없음.
4) 소스파일저장시 파일명은 클래스명과 동일하게 해준다.  확장자 java로 하기


path설정: 자바를 컴파일하고 실행하는 명령어(javac, java)를 어느 폴더에서라도 자유롭게 사용하기 위해서 path를 설정 
기존에 path 설정이 되었다고 한다면, 파일경로 맨끝에 ;을 하고 추가 경로를 복사붙여놓기를 하면 된다.

"c:\program\ProgramFiles\java\jdk1.8.0_101\bin"경로를 복사해서, 내컴퓨터 -> 속성 -> 고급시스템변수설정에서 환경변수설정 시스템 변수에서 Path에 추가! 변수값 해당경로를 복사 해서 붙여준다. 이후, 확인, 확인.

path 설정이 끝나면, cmd창에서 cd\ 치면 c:\로 이동한다.
cd javaTest\day0817 쳐서 javatest/day0817폴더로 이동
dir을 쳐보면 해당폴더에 저장된 파일현황을 보여준다.

컴파일: 원시파일(소스파일)을 컴퓨터가 알아 들을 수 있는 상태로 번역 하는 작업
cmd 창에서 javac 확장자를 포함한 파일명을 쳐준다.
ex) javac Hello.java

이후, dir을 눌러보면, 파일2개가 나온것을 알수 있다.

실행: java 클래스명하면 실행이 된다.
ex) java Hello 치면 출력화면: Hello World


Hello World 출력 연습

public class Hello
{
 public static void main(String []args)
 {
  System.out.println("Hello World"); // System은 자바가 미리 만들어둔 4000여개의 클래스(API) 중 1개로 기본적인 시스템언어들이 있다.

 }
}




Scanner 사용연습


import java.util.Scanner;  // Scanner라는 클래스를 쓰겠다고 선언하기

class Soge{

 public static void main(String []args){
  String name;  // 이름과 나이를 저장할 변수를 선언한다.
  int age;
  
  Scanner sc = new Scanner(System.in);  // 키보드로 부터 입력받기 위하여, Scanner 객체를 생성
  
  System.out.println("이름을 입력해주세요.");
  name = sc.next();  //사용자로부터 이름을 입력받는다.  "="는 java에서는 대입을 뜻함.
  System.out.println("나이를 입력해주세요.");
  age = sc.nextInt();   //사용자로부터 나이를 입력받는다.

  System.out.println("이름: "+name+ "\n나이: "+age);
  
 }
}



""안에 \n을 치면 자동줄바꿈이 된다.
System.out.println("김준성 \n 31);
출력화면
김준성
31



API 보는 방법

API 보는 방법
왼쪽화면 윗부분 클래스 위치





클래스 위치는 패키지라고 하며, 기능, 특성등을 위주로 만든 폴더같은 개념이다.
세부 설명들은 해당 class(API)안의 메소드의 데이터 형태와 설명이 있다.








에디트 플러스 다운 설치하기

에디트 플러스 다운 설치하기 -> 자신 컴퓨터 os 사양에 맞는것을 다운


예 계속... 그 다음 설치완료



계산연습

//  사용자한테 상품명, 수량, 단가를 입력받아 판매가격을 구하여 출력하는 프로그램을 작성한다.
//  (클래스명, 변수명, 출력화면 등은 자유롭게 한다.)

import java.util.Scanner;

public class ProductMoney{

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

  String pName;
  int num;
  int payUnit;
  int totalSell;
  
  System.out.println("상품명을 입력해주세요.");
  pName = sc.next();

  System.out.println("수량을 입력해주세요.");
  num = sc.nextInt();
  
  System.out.println("단가를 입력해주세요.");
  payUnit = sc.nextInt();

  totalSell = num*payUnit;
  
  System.out.println("**상품 정보**");
  System.out.println("상품명: "+pName);
  System.out.println("수량: "+num);
  System.out.println("단가: "+payUnit);
  System.out.println("판매가격: "+totalSell);


 }
}




오류:
1. 문법오류:
 - 자바가 알아들을 수 없는 문장
 - 자바 규칙에 맞지 않는 문장으로 발생한 오류
 - 컴파일시 오류 메시지를 확인하고 오류를 제거한다.

2. 논리오류:
 - 컴파일이되고 실행도 되지만 결과가 이상한 값이 나오는 오류 (버그라고 함. 디버깅을 통해 오류를 해결한다.)

3. 실행오류: 컴파일이 되고 사용자가 정상적인 실행시에는 잘동작하지만 사용자의 부주의로 인해 실행시에 발생하는 오류를 말함.(예외라고 함. 예외처리를 통해서 해결함)

4. 예외가 발생할 만한 문장들을 try{}로 묶는다.




예외오류 연습

import java.util.Scanner;

class ErrorTest01
{
 public static void main(String[] args)
 {
  
  try{  // try catch 구문으로 예외오류 잡기 선행학습
  Scanner sc = new Scanner(System.in);
  int n1,n2,sum;
  
  System.out.println("첫번째수를 입력하시오.");
  n1 = sc.nextInt();

  System.out.println("두번째수를 입력하시오.");
  n2 = sc.nextInt();

  sum = n1+n2;
  System.out.println("두수의 합은 "+sum+"입니다.");
  }catch(Exception e){
   System.out.println("경고! 숫자를 입력하세요.");
  }
 }
}





상수의 이해 연습

식별자
클래스명, 메서드명, 변수명과 같이 서로를 구별하는 이름을 의미

상수 앞에는 final 붙으며, 한번 정해진 테이터값은 바뀔수 없음.
이점이 상수와 변수의 차이점


class Person
{
 String name = "홍길동";  // 변수
 int age=20;  // 변수
 final String ADDR = "마포구 신수동";  //  상수;
}

class PersonTest
{
 public static void main(String[] args)
 {
  Person p = new Person();
  p.name = "강감찬";
  p.age = 40;
  //p.ADDR = "달나라";  // final 로 지정된 값은 상수로써, 결과같이 상수값은 바꿀수 없다고, 에러가 나올것이다.

  System.out.println("이름: " + p.name);
  System.out.println("나이: " + p.age);
  System.out.println("주소: " + p.ADDR);
 }
}




예약어: 특정 의미가 부여되어 이미 만들어진 식별자로써, 프로그래밍에서 식별자로 사용할 수 없음.

기본자료형의 종류
논리형: boolean
문자형: char
정수형: byte < short < int < long
실수형: float < double

BooleanTest 이해연습

class BooleanTest
{
 public static void main(String[] args)
 {
  //  boolean은 true, false를 저장하기 위한 자료형

  boolean f = false;

  System.out.println(f);  // 처음 논리값이 false이므로, 출력값 false

  int age = 20;
  f = age >= 20;

  System.out.println(f);  //  두번째 논리판단이 true인것을 다시 f에 대입하였으므로, 결과값 true
 }
}




char 이해연습

/*
하나의 글자와 문자열의 취급이 다름.
k 와 korea를 예를 든다면, 'k', "korea"로 표현한다.
즉, 한글자=>' ', 문자열=> " " 이다. 
  char ch = 'k'
  String str = "korea"
String은 클래스(API)인데, 특수하게 기본형 데이터표현방식으로 쓰일 수 있도록 허용됨.
*/

class CharTest
{
 public static void main(String[] args)
 {
  char a = 'k';
  System.out.println("a");  // 출력값: String 형식의 문자열 a
  System.out.println('a');  // 출력값: char 형식의 한글자 a
  System.out.println(a);   // 출력값: a에 대입된 k출력

  a = 'o';  // a에 새로운 데이터 대입됨.
  // a = "korea";  // 문법오류, char 형식의 변수에 문자열을 넣을 수 없음.
  String b = "korea";
  System.out.println(a);
  System.out.println(b);
 }
}




charAt, for, if 사용이해 연습1

// 문제: 사용자한테 문자열을 입력받아 입력한 문자열 중에 대문자 'A'의 개수를 파악하여 출력하는 프로그램을 작성
class CharTest02
{
 public static void main(String[] args)
 {
  int n =0;  // 개수를 세기위한 변수선언

  String str = "Abc Hello Abc java";
  // char ch = str.charAt(0);  // chatAt: 문자열 str에서 위치가 0번째인 것을 출력하라. 그리고 그것을 ch에 대입
  
  //반복문 사용
  for(int i =0; i < str.length() ; i=i+1)
  {
   char ch = str.charAt(i);
   if(ch=='A'){
    n=n+1;
   }
  }  // for의 종료

  System.out.println("대문자 A개수: "+n);
 }
}




8교시
charAt, for, if, nextLine 사용이해 연습2

// 문제: 사용자한테 문자열을 입력받아 입력한 문자열 중에 대문자 'A'의 개수를 파악하여 출력하는 프로그램을 작성
import java.util.Scanner;

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

  Scanner sc = new Scanner(System.in);
  int n =0;  // 개수를 세기위한 변수선언

  System.out.println("문자열을 입력하시오.");
  String str = sc.nextLine();  // nextLine공백까지 문자로 인식함


  //반복문 사용
  for(int i =0; i < str.length() ; i=i+1)
  {
   char ch = str.charAt(i);
   if(ch=='A'){
    n=n+1;
   }
  }  // for의 종료

  System.out.println("대문자 A개수: "+n);
 }
}




Byte, Short, Int, Long의 범위와 오버플로우, 언더플로우의 이해연습

class ByteShortIntLongTest
{
 public static void main(String[] args)
 {
  //  1byte = 8 bit

  //  int pay = 20000000;
  int pay=128;  //  -129일경우 언더플로우 결과값 127,     128일경우 오버플로우 결과값 128, -128

//  즉, 128은 byte 형변환
  System.out.println(pay);

  byte pay2 = (byte)pay; 
  System.out.println(pay2);    //  오버플로우현상으로 출력값 -128이됨!
 
  byte b = 100;  //  자바에서는 정수의 값이 오면 기본적으로 int로 취급하지만, 범위내 값의 int라 하더라도, byte 범위내 속한다면, 값이 변하지 않고, 그대로 형변환가능함.
  System.out.println(b);
}
}







+ Recent posts