데이터베이스

  • DBMS에 의해서 관리되는 파일
  • 데이터가 방대해지면 비효율적이고, 무결성을 보장하지 못하는 등 단점이 생김
  • 방대한 데이터를 보관하기 위해 DBMS를 만듦
  • Oracle(Oracle)
    1. 오라클 사에서 판매하는 상업용 데이터베이스
    2. 대기업에서 주로 사용함
    3. 기술 지원에 책임이 있어 업데이트가 빠름
    4. 뛰어난 기술과 성능을 가짐
  • MySql(GNU)
    1. GNU에서 배포한 오픈 소스 데이터베이스
    2. 중소 기업에서 많이 씀
  • MSSQL(Microsoft)
    1. Microsoft 사에서 판매하는 상업용 데이터베이스
    2. 매니아 층이 있음

 

DBMS

  • 데이터베이스를 관리하는 프로그램
  • SQL 명령을 통해 데이터를 관리하는 솔루션
  • 하드디스크에 데이터를 저장 / 수정 / 삭제 / 조회하는 목적
  • 데이터베이스는 App과 연결되어 사용, 1 : n으로 연결 가능
  • but, 사용자가 많아지면 트래픽이 높아져 성능이 떨어짐
  • 실제로는 1 데이터베이스 1 App으로 많이 씀
  • 계정을 이용한 보안 체계를 가지고 있음
  • App마다 계정이 있음

 

 

오라클의 종류

  • 스탠다드 에디션(SE: Standard Edition): 기업용
  • 엔터프라이즈 에디션(EE: Enterprise Edition): 유료, 기업용
  • 익스프레스 에디션: 무료, 교육용

 

 

 

 

 

 

▽ Server 예제 코드 ▽

 

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server_test {

	public static void main(String[] args) {

		try {
			
			ServerSocket server = new ServerSocket(50000);
			Socket sock = server.accept();

			OutputStream os = sock.getOutputStream();
			InputStream is = sock.getInputStream();

			DataOutputStream dos = new DataOutputStream(os);
			DataInputStream dis = new DataInputStream(is);


			System.out.println(sock.getInetAddress() + "에서 연결하였습니다.");

			while(true) {


				File root = new File("D:\\디지털컨버전스2월-2");
				File[] list = root.listFiles();

				dos.writeInt(list.length);
				dos.flush();

				for(File f : list) {

					dos.writeUTF(f.getName());
					dos.flush();

				}

				String fname = dis.readUTF();
			    System.out.println(sock.getInetAddress()+ "님의 선택 파일 : " + fname);
			    File target = new File("D:\\디지털컨버전스2월-2\\" + fname);
				
			    // 하드디스크-Ram 간의 데이터를 주고받을 때도 Stream이 필요함
				// Ram을 기준으로, 데이터가 Ram으로 들어오면 input, Ram에서 나가면 output
				FileInputStream fis = new FileInputStream(target);
				DataInputStream fileDis = new DataInputStream(fis);

				// 하드디스크의 있는 파일을 Ram으로 불러옴
				// 배열 만들 때 사이즈는 int로만 정할 수 있음(Casting 필요)

				dos.writeLong(target.length());
				dos.flush();

				byte[] fileContents = new byte[(int)target.length()];
				fileDis.readFully(fileContents);

				dos.write(fileContents);
				dos.flush();
				
				if(dis.readBoolean()) break;
				
			}

		} catch(Exception e) {
			e.printStackTrace();
		}


	}

}

 

 

▽ Client 예제 코드 ▽

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class Client_test {

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


		Socket sock = new Socket("127.0.0.1", 50000);
		OutputStream os = sock.getOutputStream();
		InputStream is = sock.getInputStream();
		DataOutputStream dos = new DataOutputStream(os);
		DataInputStream dis = new DataInputStream(is);


		while(true) {
			
			int leng = dis.readInt();
			System.out.println("파일의 개수 : " + leng);
			System.out.println("파일의 명단");
			for(int i =0 ; i < leng; i++ ) {
				System.out.println((i+1)+"번 파일 : " + dis.readUTF());
			}

			dos.writeUTF(JOptionPane.showInputDialog("읽을 파일을 입력하세요"));
			dos.flush();

			long fsize = dis.readLong();
			System.out.println("파일 사이즈 : " + fsize);
			
			byte[] fileContents = new byte[(int)fsize];
			dis.readFully(fileContents);

			// 하드디스크-Ram 간의 데이터를 주고받을 때도 Stream이 필요함
			// Ram을 기준으로, 데이터가 Ram으로 들어오면 input, Ram에서 나가면 output
			FileOutputStream fos = new FileOutputStream("C:\\Users\\user1\\Desktop\\대왕감자3.txt");
			DataOutputStream fileDos = new DataOutputStream(fos);

			fileDos.write(fileContents);
			fileDos.flush();
			fileDos.close();
			
			dos.writeBoolean(true);
			dos.flush();
			break;

		}
	}

}

 

 

 

 

 

 

네트워크 프로그래밍

서버: 서비스 제공자(장치)

클라이언트: 서비스 이용자(제공받는 장치)

 

 

IP

  • 네트워크 상에서 장치를 식별하는 고유 주소 값

 

Port

  • 장치 내에서 서비스를 식별하는 고유 번호 값
  • 네트워크에서 오는 데이터를 어떤 프로세스에 보내야 할지 식별해 줌
  • 서버 만드는 사람이 포트 번호 정함
  • 1~1024 포트는 Well-known 포트이기 때문에 사용 자제

 

프로토콜

  • 통신 방법을 정해 놓은 규칙
  • TCP(Transmission Control Protocol)
    1. 안정성을 중시함
    2. But 상대적으로 성능(속도) 떨어짐
  • UDP(User Datagram Protocol)
    1. 성능(속도)를 중시함
    2. 상대적으로 데이터 안정성이 떨어짐
    3. 동영상 스트리밍

 

Socket

  • 네트워크 프로그램 내에서 통신을 위해 필수적으로 필요한 논리적 단말기
  • 데이터 통신을 제외한 세션의 연결(통신 정보의 교환)까지만을 담당
  • IP, Port, Protocol 등으로 소켓을 정의함
  • 프로세스가 데이터를 주고받기 위해 반드시 열려야 하는 창구 같은 것

 

Stream

  • 네트워크 프로그램에서 실질적 데이터 통신을 담당하는 논리적 통로
  • 보내는 사람의 Output Stream과 받는 사람의 Input Stream이 연결되어야 데이터 주고받을 수 있음

 

ServerSocket

  • 서버는 기본적으로 1 대 n 소통
  • 서버 전용 소켓
  • 접속과 동시에 소켓을 만들어내는 것
  • 즉, 서버 측 네트워크 프로그램이 n 대의 클라이언트와 통신하기 위해 Socket을 생성할 수 있도록 이용하는 객체

 

 

 

 

 

 

 

 

상속(IS-A 문법)

  • 클래스 간 관계와 관련이 있음
  • 코드 중복도 문제를 해결할 수 있음
  • Super(): 부모 클래스 생성자를 call
  • 모든 클래스는 Object 클래스를 상속하는 코드가 생략되어 있음(extends Object), 예외 X

 

 

다형성

  • 변수 하나가 여러 자료형을 담는 형태
  • 클래스 간 결합도(클래스끼리 의존도) 문제를 해결할 수 있음
  • 편의성을 높이고, 모듈화에 용이함
  • 부모 클래스가 여러 자료형의 하위 클래스를 담을 수 있음
  • 상위 클래스의 참조 변수는 자신을 상속받는 하위 클래스 인스턴스의 주소를 저장할 수 있음 -> Up casting
  • 이때, 부모 클래스는 자식 클래스 안에 있는 자신의 클래스 내용만 가짐, 즉, 부모 자료형 인스턴스만 인식
  • 하위 인스턴스까지 인식하려면 Down casting을 해 줘야 함
  • Down casting을 쓰지 않고도 하위 클래스의 인스턴스를 사용할 수 있는 방법
    1. Override
    2. implements

 

 

Method Overring

  • 부모 클래스 메서드를 무효화시킴
  • 상속 관계에서 쓰임, 메서드를 자식 클래스가 재정의함

 

Method implements

  • 부모의 추상 클래스 메서드를 정의함

 

 

추상화

  • 설계 목적의 클래스
  • new가 안 됨, 즉, instance를 못 만듦
  • abstract public method
    1. 설계 목적 코드
    2. 자식 클래스가 overriding 하는 것에 강제성을 줌

 

 

▽ 예제 코드 1 ▽

import java.util.Scanner;

// 모든 클래스는 extends Object 생략되어 있음, 예외 X

class A { // 부모 클래스 
	
	public void fucA() {
		System.out.println("A");
	}
	
} 

class B extends A { // 자식 클래스
	
	// overriding
	public void fucA() {
		System.out.println("overriding B");
	}
	
	
	public void fucB() {
		System.out.println("B");
	}
	
} 

class C extends B { 

}

class D extends C { // 다중 상속, 자동으로 부모의 부모 클래스까지 상속받음
	
}

public class Poly {
	public static void main(String[] args) {
		
		// 다형성: 변수 하나가 여러 자료형을 담는 형태
		// 부모 클래스가 여러 자료형의 하위 클래스를 담을 수 있음
		// 상위 클래스의 참조 변수는 자신을 상속받는 하위 클래스 인스턴스의 주소를 저장할 수 있음
		// A를 상속받은 B 클래스 안에 있는 A 클래스의 내용만 가짐, 즉, A형 인스턴스만 인식	
		// 기본 자료형에서는 Promotion이라 하지만, 클래스에서는 Up casting이라고 함
		A a = new B(); 
		// a.fucB(); X
		
		// down casting - B 인스턴스까지 인식
		((B)a).fucA();
		((B)a).fucB();
	
		// down casting을 쓰지 않고도 하위 클래스의 인스턴스를 사용할 수 있는 방법
		// 1. override
		// 2. implements
		a.fucA();
		
		// 모든 클래스들은 자동으로 Object를 상속받음(최고도상)
		C c= new C(); // 클래스 안에 내용이 없어도 가능
		
		Object o1 = new Object();
		Object o2 = new Scanner(System.in);
		Object o3 = new A();
		Object o4 = 10; // new Integer(10); 자동으로 변환됨 -> Auto Boxing 기본 자료형을 참조형으로 대입할 때 일어남
		
	}

}

 

 

 

 

 

Static

  • 실행하자마자 메모리에 고정적으로 할당되어 종료될 때 해제되는 변수나 메서드
  • Static 변수 = 클래스 변수
  • Static 메서드 = 클래스 메서드
  • 클래스 변수는 인스턴스를 생성하지 않고 사용할 수 있음
  • 프로그램이 실행될 때, 즉, 클래스가 메모리에 올라갈 때 자동적으로 생성되기 때문임
  • 그래서 호출이 되면 찾는 과정이 없기 때문에 호출 시간이 빠름
  • 모든 인스턴스가 공통적으로 사용해야 하는 멤버 변수에 붙임
  • 인스턴스는 각각 독립적이기 때문에 서로 다른 값을 유지함
  • 프로그램 실행 시 생성되고, 종료 시 없어지기 때문에 GC(Garbage Collectior)의 관리를 받지 않음
  • 하지만 종료까지 메모리가 할당된 채로 존재하기 때문에 자주 사용하게 되면 성능에 영향을 줌
  • 클래스 메서드에서는 non static 변수, 즉, 인스턴스 변수를 사용할 수 없음
  • 호출 시점에 사용하는 인스턴스의 생성 여부를 알 수 없기 때문임
  • 메서드 내에서 인스턴스 변수를 사용하지 않는다면 메서드에 static 붙이는 것을 고려

 

▽ 예제 코드 1 ▽

public class Temp {
	
	public int a; // instance member field
	public static int b; // class member field, 전역 변수
	// static 변수는 instance 내부에 생성되지 않음
	// new 선언할 때 생성되지 않고, 프로그램이 실행될 때 생성됨
	// Heap 메모리가 아닌 data 메모리에 생성됨
	
}

 

▽ 예제 코드 2▽

		// static 변수는 인스턴스를 생성하지 않아도 바로 사용 가능
		// 인스턴스들 간의 공유 변수
		Temp.b = 50;
		
		Temp t1 = new Temp();
		Temp t2 = new Temp();
		Temp t3 = new Temp();
		
		System.out.println(t1.b);
		System.out.println(t2.b);
		
		t1.b = 30;
		System.out.println(t3.b);

 

 

 

 

+ Recent posts