상위 계층(데이터의 생성 담당)

 

7 계층 응용 계층(Application) : 사용자와 직접 상호 작용(HTTP,SMTP,FTP …), 파일 전송, 데이터베이스, 원격 접속, 이메일 전송 응용 서비스를 네트워크에 접속 시키는 역할을 하며 여러가지 서비스를 제공한다.

 

6 계층 표현 계층(Presentation) : 데이터 표현의 차이를 해결함(인코딩/암호화/압축 기능)

 

5 계층 세션 계층(Session) : 응용 프로그램 사이의 접속을 설정, 유지, 종료 시켜주는 역할. 사용자와 전송 계층 간의 인터페이스 역할.

 

 

하위 계층(데이터의 전송 담당)

 

4 계층 전송 계층(Transport) : 프로토콜과 관련된 계층으로 오류 복구와 흐름 제어 등을 담당. 데이터를 양방향으로 전송함.

 

3 계층 네트워크 계층(Network), IP 패킷 전송 : 상위 계층에 연결하는 필요한 데이터 전송과 경로 선택 기능 제공. 라우팅 프로토콜을 이용하여 최적화된 경로 선택(논리적 주소로 최초 출발지에서 최종 목적지까지의 최적 경로 설정) -> 패킷 단위

 

2 계층 데이터 링크 계층(Data Link), 데이터 전송/오류 검출 : 물리적 주소를 이용하여 노드 연결, 트레일러 정보(오류 검사) 붙여 물리 계층에 전달

 

1 계층 물리 계층(Physical), 허브 : 데이터를 전송 전기적 신호를 데이터로 변환 주는 역할. LAN 카드, 케이블, 허브, 라우터 물리적인 것과 데이터 전송에 사용되는 계층

 

1) 계층형 데이터베이스 : 데이터의 관계를 트리 구조로 정의하고, 부모와 자식 형태를 갖는 구조이다. 즉 상위의 레코드가 복수의 하위 레코드를 갖는 구조라고 할 수 있다.

 

 1-1) 데이터 간에 1:N 관계를 유지한다.

 1-2) 데이터가 트리 형태로 저장 되는 모델을 사용한다.

 1-3) 가장 오래됨

 1-4) 각 계층이 물리적 포인터로 연결 돼 있으며, 종속적 관계를 지닌다.

 

장점)

1/ 부모, 자식 노드 사이에 항상 연결 될 수 있기 때문에 1:N 관계를 갖는 대용량 데이터베이스 처리에 매우 강력하다.

2/ 데이터베이스 무결성 조건에 대해 좋은 성능의 관리가 가능하다.

 

단점)

1/ 한 번 구축하면 구조를 변경하기 어렵다.

2/ 트리 구조 내에서는 순환이 불가능하다.

3/ 데이터 저장의 물리적 구조에 대한 이해도가 높아야 한다.

4/ 계층형 구조 상의 한계로 1:N 기준에 맞지 않는 일반적 관계를 구현하기 어렵다.

 

 

2) 네트워크형 데이터베이스 : 계층형 데이터베이스에서 나타나는 중복 문제를 해결 해결 했고, 레코드 간의 관계가 그물처럼 되어 있는 구조이다. 하지만 이러한 복잡한 구조 때문에 추후에 구조를 변경 할 경우 많은 어려움이 따른다.

 

 2-1) 데이터 간에 N:N 관계를 유지한다.

 2-2) 망 형태로 구성된 모델을 사용하며 계층형 트리를 확장한 형태다.

 2-3) 레코드 간의 관계가 링크로 표현 되는 점은 계층적 모델과 유사하나, 구조는 순환을 허용한다.

 

장점)

1/ 계층 구조에 링크를 추가하여 유연성과 접근성이 우수하다.

2/ 데이터 추출이 빠르고 효과적이다.

 

단점)

1/ 유지 및 보수 비용이 많이 든다.

2/ 프로그램 작성 시 프로그램의 구조를 이해해야만 작성이 가능하다.

3/ 데이터베이스 구조 변경 시에 이를 참조 했던 모든 응용 프로그램에 대한 수정이 필요하다.

 

 

3) 관계형 데이터베이스 : 우리가 흔히 표현하는 행(Column), (Record)로 구성된 테이블 간의 관계를 나타낼 때 사용한다. 이렇게 표현된 데이터를 SQL(Structured Query Language)을 사용하여 데이터를 관리 및 접근 한다.

 

 3-1) 데이터 간 1:1 관계를 유지한다.

 3-2) 데이터가 2차원 구조의 테이블로 구성된 관계형 모델을 사용한다.

 3-3) 한 테이블은 다수의 열로 구성된다.

 3-4) 각 열은 레코드 단위로 구성된다.

 3-5) 데이터 간의 연결은 키의 중복으로 생성된다.

 3-6) 현재 판매 되는 대부분의 DBMS

 

장점)

1/ 다양한 용도로 사용이 가능하고, 범용적이며 고성능이다.

2/ 데이터의 일관성을 보증한다.

3/ 정규화에 따른 갱신 비용 최소화

4/ 다른 DB로의 변환이 용이하고, 간결하며 판독이 용이하다.

5/ 네트워크, 계층형에서 발견되지 않는 구조적 독립성을 가진다.

 

단점)

1/ 대량의 데이터 입력 처리

2/ 갱신이 발생한 테이블의 인덱스 생성 및 스키마 변경

3/ 컬럼 확장의 어려움

4/ 단순히 빠른 결과

5/ 데이터 종속성, 구조적 종속성 및 강력한 질의 처리의 장점을 해결하기 위해 실제적인 하드웨어와 운영체제 등의 오버헤드가 필요시 된다.

 

 

4) NoSQL데이터베이스(Not-Only SQL) : 관계형 데이터베이스보다 덜 제한적인 일관성 모델을 사용한다. (key)와 값(Value) 형태로 저장 되고, 키를 사용해 데이터를 관리 및 접근 한다.

 

장점)

1/ 대용량 데이터

2/ 데이터 분산 처리

3/ 클라우드 컴퓨팅

4/ 빠른 읽기 및 쓰기

5/ 유연한 데이터 모델링

 

종류)

1/ key – value Model : 휘발성 / 영속성

2/ Big Table(Column ) DB

 

5) 객체 지향 데이터베이스 : 정보 은닉, 상속성, 다형성 등을 포함 하며, 데이터베이스로서 오브젝트 식별자와 오브젝트 관계와 같은 추가적 특징을 지닌다.

 

1) pwd - 현재 내가 작업 중인 폴더의 절대 경로를 보여준다. (ex. pwd)

 

 

2) cd – 이동하고자 하는 폴더로 이동한다.(ex. cd /home/)

 

 

3) ls - 폴더의 목록을 볼 수 있다.

 

 3-1) -a : 경로에 위치한 모든 파일과 폴더를 출력해준다. (all)

 3-2) -l : 지정한 폴더의 내용을 자세하게 출력해준다. (long)

 3-3) -d : 지정한 폴더의 정보를 출력해준다.

 3-4) -n : 파일 및 폴더 정보 출력시 소유자(UID)와 소유 그룹(GID)에 대해 출력해준다.

 3-5) -F : 파일 형식을 알리는 문자를 각 파일 뒤에 출력 해준다.

 3-6) -R : 하위 경로와 그 안에 있는 모든 파일들도 같이 나열 해준다.

 

 

4) cp - 파일과 폴더를 복사한다(ex. cp /home/a/file /home/a/b)

 

 4-1) -r : 폴더를 복사할 경우에 하위 폴더와 그 안에 있는 파일까지 모두 복사한다.

 

 

5) mv - 파일이나 폴더를 이동할 때 사용하며, 같은 폴더 내에서 사용할 경우 파일의 이름도 변경할 수 있다.

 

 

6) mkdir - 폴더를 생성한다.(make directory)

 

 

7) rmdir - 폴더를 삭제한다.(remove directory)

 

* , 빈 폴더만 삭제한다. 삭제하고자 하는 폴더의 하위에 폴더가 존재할 때는 삭제 할 수 없다.

 

 

8) rm - 파일 및 폴더를 삭제한다.

 

 8-1) -f : rm을 사용할 경우 사용자에게 정말 지울 것인지 확인을 묻는 반면에, 이 옵션을 사용하면 확인 작업을 거치지 않고 바로 삭제한다.

 8-2) -r : rm을 쓰면 기본적으로 폴더는 지울 수가 없다. 하지만 이 옵션을 사용하면 폴더와 그 폴더를 포함한 하위 경로까지 모두 삭제한다.

 

 

9) chmod - 각 파일과 폴더에 사용 권한을 부여할 때 사용한다.(-rwxrwxrwx)

 

* r(read), w(write), x(execution)

 owner / group / all user (7   / 7   /  7)

* -rwx /    rwx   / rwx ( 111 / 111 / 111) => 2진수 표현

 

 

10) cat - 파일의 내용을 화면에 출력하거나, 파일을 만드는 명령(capture)

 

 10-1) more : Space bar(다음 페이지), Enter Key(다음 줄), v(vi 편집기 전환), /str(문자를 찾음), b(이전 페이지), q(more 상태를 빠져 나감), h(도움말), =(현재 라인 넘버를 보여줌)

#JAVA SERVER #JAVA CLIENT

#MULTICAST #UNICAST #BROADCAST

#TCP/IP #SOCKET #SERVERSOCKET

 

* 설명 :

( ex. N - 큰 의미, n - 좁은 의미)

1. 브로드캐스트란?(1:N 통신)

   - 데이터를 여러 방향으로 동시에 전송하여 동일 IP그룹에 있는 컴퓨터라면 데이터를 수신할 수 있는 방식이다.

 

2. 멀티캐스트란?(1:n통신)

- 다중의 수신 대상자들에게 보내는 방식이다.

 

3. 유니캐스트란?(1:1 통신)

- 특정한 대상 수신자에게만 보내는 방식이다.

 

 

#1. 클라이언트 단

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;

public class Ex01MulticastClient {

 public static void main(String[] args) {
  
  DatagramPacket packet = null;
  MulticastSocket socket = null;
  
  try {
   socket = new MulticastSocket(9006);
   System.out.println("클라이언트 생성.");
   
   // 그룹에 조인(라우터가 보냄)
   InetAddress address = InetAddress.getByName("224.128.1.5"); // 멀티 캐스트를 위한 아이피 설정
   socket.joinGroup(address);
   
   byte[] buf = new byte[512];
   
   packet = new DatagramPacket(buf, buf.length);
   
   while (true) {
    // 패킷 수신
    socket.receive(packet);

    String msg = new String(packet.getData(), 0, packet.getLength());
    System.out.println("수신 > " + msg);
   }
   
  } catch (SocketException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}


 

#2. 서버 단

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class Ex01MulticastServer {

 public static void main(String[] args) {
  
  DatagramPacket packet = null;
  MulticastSocket socket = null;
  
  try {
   socket = new MulticastSocket();
   System.out.println("서버 생성 성공.");
   
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   
   // IPv4 아래의 내용은 이전의 포스팅을 통해 설명 해두었음.
   // A Class : 0000 (0000) => 0.0.0.0 ~ 127.255.255.255
   // B Class : 1000 (0000) => 128.0.0.0 ~ 191.255.255.255
   // C Class : 1100 (0000) => 192.0.0.0 ~ 223.255.255.255
   // D Class : 1110 (0000) => 224.0.0.0 ~ 239.255.255.255
   // E Class : 1111 (0000) => 240.0.0.0 ~ 255.255.255.255
   InetAddress address = InetAddress.getByName("224.128.1.5"); // 멀티캐스트 방식으로 서버 주소를 설정함.

   
   while(true) {
    System.out.print("입력 : ");
    String msg = reader.readLine();
    
    if(msg==null) {
     break;
    }
    
    packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length, address, 9006);
    
    socket.send(packet);
   }
   
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

   // IPv4
   // A Class : 0000 (0000) => 0.0.0.0 ~ 127.255.255.255 = NetworkAddr.HostNum.HostNum.HostNum (대형 - 주로 정부 기관)


   // B Class : 1000 (0000) => 128.0.0.0 ~ 191.255.255.255 = NetworkAddr.NetworkAddr.HostNum.HostNum (중형 - 대학교)


   // C Class : 1100 (0000) => 192.0.0.0 ~ 223.255.255.255 = NetworkAddr.NetworkAddr.NetworkAddr.HostNum


   // D Class : 1110 (0000) => 224.0.0.0 ~ 239.255.255.255 = N/A, Multicast IP 대역.


   // E Class : 1111 (0000) => 240.0.0.0 ~ 255.255.255.255 = 연구용으로 예약된 번호.

 

다음 포스팅에선, 위처럼 구성된 네트워크에서 Multicast IP 대역을 이용하여 자바 클라이언트/서버를 연결하는 내용을 포스팅 하겠다.

위처럼 구성된 클래스들을 실제로(ex.A클래스) "할당" 받아 사용하는 것은 아니니 참고하도록 하자.

// 메서드 오버로딩 : 한 클래스 내에서 같은 이름의 메소드를 중복적으로 정의하는 것


class Calculator {

public int plus(int a, int b) {

return a+b;

}

public int plus(int a, int b, int c) { // 메서드 오버로딩

return a+b+c;

}

public float plus(float a, float b) { // 메서드 오버로딩

return a+b;

}

public int minus(int a, int b) {

return a-b;

}

public int multiple(int a, int b) {

return a*b;

}

public int divide(int a, int b) {

return a/b;

}

}

////////////////////////////////////////////////////////////////////

public static void main(String[] args) {

Calculator calc = new Calculator();

int x = 10;

int y = 20;

int z = calc.plus(x, y);

System.out.println("z = " + z);

float a = calc.plus(3.14F,2.14F);

System.out.println("a = " + a);

}


#이름 #나이 # 성별 #몸무게 #결혼여부 #전화번호

public static void main(String[] args) throws IOException {


// 개인정보(3명) 출력

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));


int manCnt = 3;

String[] name = new String[manCnt];

int[] age = new int[manCnt];

char[] gender = new char[manCnt];

float[] weight = new float[manCnt];

boolean[] married = new boolean[manCnt];

String[] phone = new String[manCnt];


for (int i = 0; i < manCnt; i++) {

System.out.print("이름 : ");

name[i] = reader.readLine();


System.out.print("나이 : ");

age[i] = Integer.parseInt(reader.readLine());


System.out.print("성별 : ");

gender[i] = (char) reader.read();

reader.readLine();


System.out.print("몸무게 : ");

weight[i] = Float.parseFloat(reader.readLine());


System.out.print("결혼여부 : ");

married[i] = Boolean.parseBoolean(reader.readLine());


System.out.print("전화번호 : ");

phone[i] = reader.readLine();

}

System.out.println("========== 개인 정보 출력 ==========");

System.out.println("번호\t 이름\t 나이\t 성별\t 몸무게\t 결혼여부\t 전화번호");

for (int i = 0; i < manCnt; i++) {

System.out.printf("%d\t %s\t %d\t %c\t %.2f\t %b\t %s\n",(i+1),name[i], age[i], gender[i], weight[i], married[i],

phone[i]);

}

}

#자바 #배열 #윤년 #평년 #달력 #캘린더

 

 public static void main(String[] args) throws NumberFormatException, IOException {
  
  // 년와 월을 입력 받아 달력을 출력
  BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
  
  System.out.print("년을 입력해주세요 : ");
  int year = Integer.parseInt(read.readLine());
  
  System.out.print("월을 입력해주세요 : ");
  int month = Integer.parseInt(read.readLine());
  
  // 해당 월의 1일까지의 일자의 갯수

  int[] maxDate = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  
  if(year % 4 ==0 && year % 100 !=0 || year % 400 ==0) {
   maxDate[1]=29; // 윤년일 경우
  }
  
  // 작년
  int lastYear = year-1;
  // 작년까지 발생한 윤년의 횟수
  int leapYear_cnt = (lastYear/4) - (lastYear/100) + (lastYear/400);
  // 해당년의 해당월의 1일까지의 일자 수 구하기
  int dayOfYear = 1;
  

  
  for(int i=0; i<month-1; i++) {
   dayOfYear += maxDate[i];
  }  
    // 해당 월의 첫번째 날짜의 요일
    int dayOfweek = (lastYear + leapYear_cnt + dayOfYear)%7;
    

    System.out.printf("%d년 %02d월\n", year, month);
    System.out.printf("일\t월\t화\t수\t목\t금\t토\n");
    
    // 공백 출력
    for(int i =0; i<dayOfweek; i++) {
     System.out.print("\t");
    }
     // 월에 따른 날짜 출력 조건
    int lastDay = maxDate[month-1];
    
    // 날짜 출력
    for(int i = 1; i<=lastDay; i++) {
     System.out.print(i + "\t");
     if((dayOfweek+i)%7 ==0) {
      System.out.println();
     }
    }

    
 }

#BufferedReader #Array

 

 public static void main(String[] args) throws NumberFormatException, IOException {
  
  // 국어, 영어, 수학 점수 입력 받아 총점 평균 구하기
  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  
  
  String[] subject = {"국어", "영어", "수학"};
  int[] score = new int[subject.length +1]; // 총점까지 계산하기 위해 길이값을 +1 해준다.
  
  for(int i =0; i<subject.length; i++) {
   do {
    System.out.print(subject[i] + " : ");
    score[i] = Integer.parseInt(reader.readLine());
   }while(score[i] < 0 || score[i] > 100); // score 값이 0보다 작거나 또는, 100보다 큰 경우 다시 입력받는다.


   // 총점 score[score.length -1] -- 마지막 포인트
   score[score.length-1] += score[i];
  }
  
  // 평균
  float avg = score[score.length-1] / (float)subject.length;
  
  System.out.println("======= 기말고사 성적 =======");
  for(int i=0; i<subject.length; i++) {
   System.out.print(subject[i] + "\t");
  }
  System.out.println("총점\t 평균");
  for(int i = 0; i<score.length; i++) {
   System.out.printf("%d\t",score[i]);
  }
  System.out.printf("%.2f",avg);
 }

#자바 #로또 #로또번호출력

 public static void main(String[] args) throws InterruptedException {
  
  // 로또 예제(1~45) 번호 중 6개 출력(중복 X)
  
  int[] lotto = new int[45];
  
  for(int i=0; i<lotto.length; i++) {
   lotto[i] = (i + 1);
   System.out.print(lotto[i] +", "); // 1부터 45의 숫자 출력
  }
  System.out.println();
  
  
  int temp = 0;
  // lotto = {1, 2, 3, 4, 5, 6, ... 44, 45}
  for(int i =0; i<100; i++) {
   int idx = (int)(Math.random() * lotto.length); // 임의의 인덱스 번호
   
   // 정렬
   temp = lotto[0]; // temp에 원래 lotto[0] 의 값을 담아준다.
   lotto[0] = lotto[idx];
   lotto[idx] = temp;
  }


  System.out.println("====== 금주의 로또 당첨 번호 ======");
  for(int i = 0; i<6; i++) {
   Thread.sleep(1000);
   System.out.print(lotto[i] + "  ");
  }

 }

+ Recent posts