C:\Users\bitcamp> a.exe(엔터)
a.exe
./a.exe
C:\Users\bitcamp\a.exe
../a.exe
C:\Users\a.exe
../../a.exe
C:\a.exe
../../dev/a/a.exe
C:\dev\a\a.exe
.
: 현재 폴더..
: 상위 폴더a.exe
: 컴파일된 기계어 명령 실행 파일> a.exe
(exe는 생략 가능)> a
a.exe
: 컴파일된 기계어 명령 실행 파일$ a + 엔터
(PATH 환경 변수에 등록된 경로를 따라가며 찾는다.)$ ./a + 엔터
(현재 폴더에 있는 파일을 실행하고 싶으면 경로를 명시해야한다!)$ ls -al
rw-r--r-- a
: 실행파일에 대해 사용자에게 실행권한을 부여하지 않았기 때문에 실행할 수 없다.rw-
: user 권한r--
: group 권한r--
: other 권한a
: 실행 파일명$ chmod 744 a
⇒ 이제 실행 가능
a.bat
+ 엔터a
+ 엔터node hello.js
a.sh
파일
⇒ 명령문을 작성할 때 사용하는 스크립트에 zsh
, csh
, bash
, bsh
, tsh
, sh
, ... 문법을 사용할 수 있다.
$zsh a.sh
a.sh
파일: 스크립트 파일zsh
: 스크립트 인터프리터 (스크립트 파일에 사용된 문법 언어에 따라 인터프리터가 달라진다.zsh
로 실행할 경우, a.sh
스크립트 파일은 zsh
문법 언어로 쓰여진 스크립트 파일인 것이다.)shell script
자동 실행a.sh
파일: #!/bin/zsh
이 파일을 실행시킬 shell script 인터프리터를 설정한다.
→ $ cgmod 744 a.sh
: a.sh
스크립트 파일에 대해 실행권한을 부여
→ $ ./a.sh
→ 쉘 스크립트 파일 실행
이 때, 쉘 스크립트 파일을 실행하는 것이 아니라, zsh가 실행되어 이 파일이 a를 실행시키는 것이다.
목록관리 | List | Set | Map |
---|---|---|---|
데이터 저장 및 조회시 사용하는 인덱스 | 값: 0부터 순차적으로 증가하는 정수 값 (양수) | key: hash 알고리즘으로 계산한 정수값 | hash 알고리즘으로 계산한 정수값 |
입력 순서 유지 | O | X | X |
객체 중복 저장 | O | X | Key가 중복되지 않는다. |
특징 | 입력 순서 유지 | 중복 제거 | 빠른 조회 → key를 이용 |
- ArrayList - LinkedList - Vector | HashSet | - HashMap: key, value, null 허용 - HashTable:key, value, null 불가! |
Hashtable<String, Servlet> servletMap = new Hashtable<>();
servletMap.put("board", new BoardServlet("board"));
servletMap.put("reading", new BoardServlet("reading"));
servletMap.put("visit", new BoardServlet("visit"));
servletMap.put("notice", new BoardServlet("notice"));
servletMap.put("daily", new BoardServlet("daily"));
servletMap.put("member", new MemberServlet("member"));
이전 코드
switch(dataName) {
case "board": boardServlet.service(in, out); break;
case "reading": readingServlet.service(in, out); break;
case "visit": visitServlet.service(in, out); break;
case "notice": noticeServlet.service(in, out); break;
case "daily": dailyServlet.service(in, out); break;
case "member":memberServlet.service(in, out);break;
default:out.writeUTF("fail");
}
이후 코드
Servlet servlet = servletMap.get(dataName); // dataName(key)를 가지고 BoardServlet을 데려옴
package com.bitcamp.board;
public class ServerApp {
public static void main(String[] args) {
System.out.println("[게시글 데이터 관리 서버]");
try (
ServerSocket serverSocket = new ServerSocket(8888);)
{
System.out.println("서버 소켓 준비 완료!");
// 클라이언트 요청을 처리할 객체 준비
Hashtable<String, Servlet> servletMap = new Hashtable<>();
servletMap.put("board", new BoardServlet("board"));
servletMap.put("reading", new BoardServlet("reading"));
servletMap.put("visit", new BoardServlet("visit"));
servletMap.put("notice", new BoardServlet("notice"));
servletMap.put("daily", new BoardServlet("daily"));
servletMap.put("member", new MemberServlet("member"));
while(true) {
try(
Socket socket = serverSocket.accept();
DataInputStream in = new DataInputStream( socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
)//try()
{
System.out.println(" 클라이언트와 연결 되었음!");
while(true) {
String dataName = in.readUTF();
// 명령 읽기
if(dataName.equals("exit")) {
break;
}
Servlet servlet = servletMap.get(dataName); // dataName(key)를 가지고 BoardServlet을 데려옴
if(servlet != null) {
// 클라이언트가 달라질 때마다 그에 맞는 in, out을 서버에 전달한다.
servlet.service(in, out);
} else {
out.writeUTF("fail");
}
}
System.out.println("클라이언트와 연결을 끊었음!");
}// 안쪽 try
}// 서버 while
}catch (Exception e) {
e.printStackTrace();
}// 바깥쪽 try-catch()
System.out.println("서버 종료!");
}//main()
}
이전 코드
Handler[] handlers = new Handler[] { // 파일명을 목적에 맞게 각각 전달
new BoardHandler("board", in, out), // 게시판
new BoardHandler("reading", in, out), // 독서록
new BoardHandler("visit", in, out), // 방명록
new BoardHandler("notice", in, out), // 공지사항
new BoardHandler("daily", in, out), // 일기장
new MemberHandler("member", in, out) // 회원
};
이후 코드
// 핸들러를 담을 컬렉션을 준비한다.
ArrayList<Handler> handlers = new ArrayList<>();
handlers.add(new BoardHandler("board", in, out));
handlers.add(new BoardHandler("reading", in, out));
handlers.add(new BoardHandler("visit", in, out));
handlers.add(new BoardHandler("notice", in, out));
handlers.add(new BoardHandler("daily", in, out));
handlers.add(new MemberHandler("member", in, out));
해당 핸들러 실행 코드 → get() 메소드 이용
handlers.get(mainMenuNo-1).execute();
package com.bitcamp.board;
public class ClientApp {
//breadcrumb 메뉴를 저장할 스택을 준비
public static Stack<String> breadcrumbMenu = new Stack<>();
public static void main(String[] args) {
System.out.println("[게시글 관리 클라이언트]");
// 네트워크 준비
//=> 정상적으로 연결되었으면, Socket 객체를 리턴한다.
try (Socket socket = new Socket("127.0.0.1", 8888 );
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
DataInputStream in = new DataInputStream(socket.getInputStream());){// 같은 컴퓨터 내에 서버와 클라이언트가 존재하므로 정확한 IP address 대신, 127.0.0.1(local host)이 가능하다. (접속할 IP address, port num)
System.out.println("연결되었음!");
welcome();
// 핸들러를 담을 컬렉션을 준비한다.
ArrayList<Handler> handlers = new ArrayList<>();
handlers.add(new BoardHandler("board", in, out));
handlers.add(new BoardHandler("reading", in, out));
handlers.add(new BoardHandler("visit", in, out));
handlers.add(new BoardHandler("notice", in, out));
handlers.add(new BoardHandler("daily", in, out));
handlers.add(new MemberHandler("member", in, out));
// "메인" 메뉴의 이름을 스택에 등록한다.
breadcrumbMenu.push("메인");
// 메뉴명을 저장할 배열을 준비한다.
String[] menus = {"게시판", "독서록", "방명록", "공지사항", "일기장", "회원"};
loop:
while (true) {
// 메인 메뉴 출력
printTitle();
printMenus(menus);
System.out.println();
try {
int mainMenuNo = Prompt.inputInt(String.format(
"메뉴를 선택하세요[1..%d](0: 종료) ", handlers.size()));
if (mainMenuNo < 0 || mainMenuNo > menus.length) {
System.out.println("메뉴 번호가 옳지 않습니다!");
continue; // while 문의 조건 검사로 보낸다.
} else if (mainMenuNo == 0) {
out.writeUTF("exit"); // client가 서버와의 연결에서 나가겠다고 하는 순간. // out은 서버로 보내는 것이다.
break loop;
}
// 메뉴에 진입할 때 breadcrumb 메뉴바에 그 메뉴를 등록한다.
breadcrumbMenu.push(menus[mainMenuNo - 1]);
// 메뉴 번호로 Handler 레퍼런스에 들어있는 객체를 찾아 실행한다.
handlers.get(mainMenuNo-1).execute();
breadcrumbMenu.pop();
} catch (Exception ex) {
System.out.println("입력 값이 옳지 않습니다.");
}
} // while
Prompt.close();
System.out.println("연결을 끊었음!");
} catch (Exception e) {
e.printStackTrace();
}//try-catch()
System.out.println("종료!\n");
}//main()
...