TIL 0311

먼지·2024년 3월 11일
0

Today I Learned

목록 보기
16/89
post-thumbnail

객체의 직렬화

  • 직렬화(serialization) : 객체를 스트림으로 만드는 작업
  • 역직렬화 (deserialization) : 스트림을 객체로 만드는 작업

    Serializable 인터페이스를 구현한 클래스를 작성하면 해당 클래스의 모든 멤버 변수가 직렬화 대상이 된다.
    객체가 스트림을 통해 직렬화 될 때는 객체에 있는 멤버변수가 직렬화 되는 것이다.
    객체의 멤버변수 중에 직렬화 대상에 제외하고 싶다면 transient 키워드를 사용한다.

객체의 직렬화 실습 1

package kr.s28.iostream;

import java.io.*;

/*
 * Serializable 인터페이스를 구현하면 해당 클래스를 객체 직렬화 대상이 
 되어 언제든지 객체 직렬화를 수행할 수 있다
 * Serializable 인터페이스가 구현되지 않으면 객체 직렬화가 불가능하다.
 */

class Customer implements Serializable{
	
	private String name;
	
	public String getName() {
		return name;
	}

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

	public Customer(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "당신의 이름은 " + name + "입니다";
	}

	
}

public class SerialMain01 {
	public static void main(String[] args) {
		//직렬화할 객체를 생성
		Customer c = new Customer("홍길동");
		
		System.out.println("---- 객체 직렬화 하기 ----");
		FileOutputStream fos = null;
		ObjectOutputStream oos = null;
		
		try {
			// 파일 생성
			fos = new FileOutputStream("object.ser");
			oos = new ObjectOutputStream(fos);
			//객체 직렬화 수행
			oos.writeObject(c);
			
			System.out.println("객체 직렬화가 완료되었습니다.");
			
		}
		catch(IOException e) {
		e.printStackTrace();
		}
		finally {
			if (oos != null) {try {oos.close();} catch(IOException e ) {} }
		}
		
	}
}

객체의 직렬화 실습 2

package kr.s28.iostream;

import java.io.*;

public class SerialMain02 {
	public static void main(String[] args){
		System.out.println("----객체 역직렬화 하기----");
		FileInputStream fis = null;
		ObjectInputStream ois = null;
		
		try {
			// 파일 읽기
			fis = new FileInputStream("object.ser");
			ois = new ObjectInputStream(fis);
			
			//역직렬화 수행
			Customer m = (Customer) ois.readObject()	;
			System.out.println(m);
		}
		catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		finally {
			if(ois!=null) { try { ois.close();} catch(IOException  e) {} }
			if(fis!=null) { try { fis.close();} catch(IOException  e) {} }
		}
	}
}

객체의 직렬화 실습 3

package kr.s28.iostream;

import java.util.*;
import java.io.*;

class UserInfo implements Serializable {
	private String name;
	private int age;
	private String address;

	// 생성자
	public UserInfo (String name , int age , String address) {
		this.address = address;
		this.name = name;
		this.age = age;

	}

	@Override
	public String toString() {
		return "이름 : " + name + ", 나이 : " + age + ", 주소 : " + address;
	}


}



public class SerialMain03 {
	public static void main(String[] args) {
		// 직렬화할 객체 생성
		UserInfo u1 = new UserInfo("John" , 20 , "서울시");
		UserInfo u2 = new UserInfo("Sunny" , 18 , "부산시");

		ArrayList <UserInfo> list = new ArrayList<UserInfo>();

		list.add(u1);
		list.add(u2);

		FileOutputStream fos  = null;
		ObjectOutputStream oos = null;

		try {
			fos = new FileOutputStream("UserInfo.ser");
			oos = new ObjectOutputStream(fos);
			
			oos.writeObject(list);
			
			System.out.println("직렬화가 성공적으로 완료되었습니다.");
		}
		catch(IOException e) {
			e.printStackTrace();
		}
		finally {
			if (oos != null) { try { oos.close();} catch(IOException e) {} }
			if (fos != null) { try {fos.close();} catch(IOException e) {}}
		}

	}
}

객체의 직렬화 실습 4

package kr.s28.iostream;

import java.io.*;
import java.util.*;

public class SerialMain04 {

	public static void main(String[] args) {
		FileInputStream fis = null;
		ObjectInputStream ois = null;
		
		try {
			fis = new FileInputStream("UserInfo.ser");
			ois = new ObjectInputStream(fis);
			// 역직렬화 작업
			ArrayList<UserInfo>list = (ArrayList<UserInfo>) ois.readObject()	;
			System.out.println(list);
		} 
		catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		finally {
			if (ois != null) {
				try { ois.close(); } catch (IOException e)	{			}
			}
			if (fis != null) {
				try { fis.close(); } catch (IOException e)	{			}
			}
		}
	}

}

🛜 네트워크

  • 네트워크
    네트워크란 다른 장치로 데이터를 이동시킬 수 있는 컴퓨터들과 주변 장치들의 집합이다.
    네트워크의 연결된 모든 장치들을 노드라고 한다.
    다른 노드에게 하나 이상의 서비스를 해주는 노드를 호스트라 부른다.
    하나의 컴퓨터에서 다른 컴퓨터로 데이터를 이동시킬 때 복잡한 계층을 통해 전송되는데, 이런 복잡한 레이어의 대표적인 모델이 OSI 계층 모델이다.
    OSI 계층 모델은 모두 7계층으로 이루어졌다.
    데이터 통신을 이해하는데 OSI 계층 모델은 상당한 역할을 하지만, 인터넷 기반의 표준 모델로 사용하는 TCP/IP 계층 모델을 주로 사용하고 있다.
    자바에서 이야기하는 네트워크 프로그래밍은 TCP/IP모델을 사용하고 있다.

  • InetAddress 클래스
    InetAddress 클래스는 IP 주소를 표현한 클래스이다.
    자바에서는 모든 IP 주소를 InetAddress 클래스를 사용한다.

  • URL 클래스
    URL(Uniform Resource Locator)이란 인터넷에서 접근 가능한 자원의 주소를 표현할 수 있는 형식을 말한다

🛜 네트워크 실습 1

package kr.s29.network;

import java.io.*;
import java.net.*;


public class InetAddressMain01 {
	public static void main(String[] args) {
		BufferedReader br = null;
		InetAddress iaddr = null;
		String name = null;

		try {
			br = new BufferedReader(new InputStreamReader(System.in));
			System.out.print("도메인명 입력 > ");
			name =  br.readLine()	;
			
			//Inet address를 이용해서 ip 주소 구하기
			iaddr = InetAddress.getByName(name);
			System.out.println("호스트 이름 > " +iaddr.getHostName());
			System.out.println("호스트 ip 주소 > " + iaddr.getHostAddress());
			
			System.out.println("----------------------------------");
			
			//로컬 호스트 ip 주소
			iaddr = InetAddress.getLocalHost()	;
			System.out.println("로컬 호스트 이름 > " + iaddr.getHostName());
			System.out.println("로컬 호스트 IP주소 > " + iaddr.getHostAddress());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
		finally {
			if(br != null)
				try { br.close(); } catch (IOException e) {	}
		}

	}
}

🛜 네트워크 실습 2

package kr.s29.network;
import java.io.*;
import java.net.*;

public class InetAddressMain02 {
	public static void main(String[] args) {
		BufferedReader br = null;
		InetAddress[] addresses;
		String name;

		try {
			br = new BufferedReader(new InputStreamReader(System.in));
			System.out.print("도메인명 입력 > ");
			name = br.readLine()	;

			//해당 도메인과 매핑되어있는 모든 주소를 읽어옴
			addresses = InetAddress.getAllByName(name);
			for ( int i = 0 ; i < addresses.length; i++) {
				System.out.println("호스트 이름 > " + addresses[i].getHostName()
						+ " , IP 주소 > "  + addresses[i].getHostAddress());
			}
		} 
		catch (UnknownHostException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();	
		}
		finally {
			if ( br != null ) {
				try { br.close(); } catch (IOException e) { }
			} //end of if
		} //end of finally
	}
}

🛜 네트워크 실습 3

package kr.s29.network;
import java.net.*;

public class URLMain01 {
	public static void main(String[] args) {
		try {
		URL url = new URL ("http://java.sun.com/index.jsp?name=kim#content");
		System.out.println("프로토콜 > " + url.getProtocol());
		System.out.println("호스트 > " + url.getHost());
		System.out.println("기본 포트 > " + url.getDefaultPort());
		//포트를 명시하지 않아서 -1 반환
		System.out.println("포트 > " + url.getPort());
		System.out.println("패스 > " + url.getPath());
		System.out.println("쿼리 > " + url.getQuery());
		System.out.println("ref > " + url.getRef());
		}
		catch (MalformedURLException e) {
			e.printStackTrace()	;
		}
	}
}

🛜 네트워크 실습 4

package kr.s29.network;

import java.net.*;
import java.io.*;


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

		BufferedReader br = null;
		BufferedReader input = null;
		try {
			// 콘솔에서 입력 처리
			br = new BufferedReader(new InputStreamReader(System.in));
			System.out.print("웹사이트 주소 입력 > ");
			String name = br.readLine();
			
			URL url = new URL (name);
			
			// 네트워크를 통해서 서버로부터 데이터를 읽어들여 입력 처리
			input = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
			String line;
			while((line =input.readLine()) != null) {
				System.out.println(line);
			}
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}  catch (IOException e) {
			e.printStackTrace();
		} finally {
			if ( br != null) try { br.close();} catch(IOException e) { }
			if ( input != null) try {input.close(); } catch (IOException e ) {}
		}
		
	}
}

🫙 Database

1) 데이터베이스란?

  • 지속적으로 저장되는 연관된 정보의 모음. 특정 관심의 데이터를 수집하여 그 데이터의 성격에 맞도록 잘 설계하여 저장하고 관리함으로써 필요한 데이터를 효율적으로 사용할 수 있는 자원

2) DBMS

  • 데이터를 효율적으로 관리할 수 있는 시스템
  • 데이터를 효율적으로 관리하기 위해서 데이터베이스에 추가, 삭제, 변경, 검색을 할 수 있는 기능 제공

3) 관계형 데이터 베이스 (RDBMS)

  • 관계형 모델의 구성
    • 데이터를 저장하는 객체 또는 관계의 모음
    • 관계에 적용되어 다른 관계 생성을 할 수 있도록 해주는 연산자 집합
    • 정확성과 일관성을 위한 데이터 무결성
  • 관계형 데이터 베이스의 특징
    • SQL문을 실행하여 액세스하고 수정
    • 물리적인 포인터가 없는 테이블을 가고 있다.
    • 연산자 집합을 사용한다.

ℹ️ SQL

1) SQL이란?

  • SQL은 데이터베이스에서 데이터를 검색, 삽입, 갱신, 삭제할 수 있는 표준 언어
  • SQL은 1970년대 IBM에 의해서 처음 공개된 이후 ANSI/ISO 표준으로 편입됨

2) SQL문의 종류

  • DDL : 데이터와 그 구조를 정의
    • CREATE : 데이터베이스 객체를 생성
    • DROP : 데이터베이스 객체를 삭제
    • ALTER : 기존에 존재하는 데이터베이스 객체를 다시 정의하는 역할
  • DML : 데이터의 검색과 수정 등의 처리
    • INSERT : 데이터베이스 객체에 데이터를 입력
    • DELETE : 데이터베이스 객체에 데이터를 삭제
    • UPDATE : 기존에 존재하는 데이터베이스 객체안의 데이터 수정
    • SELECT : 데이터베이스 객체로부터 데이터를 검색
    • MERGE : 조건에 따라 데이터를 테이블에 삽입 또는 갱신
  • DCL : 데이터베이스 사용자의 권한을 제어
    • GRANT : 데이터베이스 객체에 권한을 부여
    • REVOKE : 이미 부여된 데이터베이스 객체의 권한을 취소
  • TCL : 데이터베이스 트랜잭션 제어
    • COMMIT: 보류 중인 모든 변경 내용을 영구히 저장
    • ROLLBACK : 저장점 표시자까지 롤백하는데 사용
    • SAVEPOINT : 보류중인 데이터 변경 내용을 모두 버림

3) SQL문의 작성

  • SQL 문은 대소문자를 구분하지 않음
  • SQL 문은 한 줄 또는 여러 줄에 입력할 수 있음
  • 키워드는 약어로 표기하거나 여러줄에 걸쳐 입력할 수 없음
  • 절은 대개 별도의 줄에 입력함
  • 가독성을 높이기 위해 들여쓰기 사용
  • 키워드는 일반적으로 대문자로 입력, 테이블 이름, 열 이름 등의 다른 단어는 모두 소문자로 입력


SELECT문

  • 데이터베이스로부터 저장되어있는 데이터를 검색하는데 사용

전체 칼럼의 데이터 읽기

SELECT empno, ename,job,mgr,hiredate,sal,comm,deptno FROM emp;
SELECT *  FROM emp;

부분 칼럼의 데이터 읽기

SELECT ename,sal FROM emp;

주석 처리

/* SELECT * FROM emp; */

DUAL문

  • 함수 및 계산의 결과를 볼 때 사용할 수 있는 공용(public) 테이블
  • 사용자 데이터가 있는 테이블에서 유래하지 않은 상수 값 의사열(pesudo-coumn), 표현식 등의 값을 단 한번만 돌리거나 현재 날짜,시각을 알고자 할 때 이용. 일시적인 산술, 날짜 연산 등에 주로 사용
SELECT SYSDATE FROM dual;
SELECT ASCII('A') FROM dual;
SELECT ASCII(0) FROM dual;
SELECT 7 + 10 FROM dual;

연산하기

select ename,sal from emp;
select ename, sal, sal + 300 from emp;

NULL

  • null은 사용할 수 없거나, 할당되지 않았거나, 알 수 없거나, 적용할 수 없는 값 (null은 0이나 공백과 다름)
SELECT empno,ename,job,comm FROM emp;

산술식의 NULL값

  • NULL 값을 포함하는 산술식은 NULL로 계산
SELECT ename, (sal+comm)*12 FROM emp; 

ALIAS

  • 열의 별칭 , 열 이름 바로 뒤에 나온다. 열 이름과 ALIAS 사이에 선택사항인 AS 키워드가 올 수 있음
    알리아스에 큰따옴표를 사용하는 경우
  • 대소문자 구별을 원할 때
  • 공백 포함시
  • _,# 등 특수문자 사용시(_는 ""없이 중간에는 올 수 있으나 맨 앞에 오면 오류 발생)
  • 숫자로 시작할 경우
SELECT sal*12 ASal FROM emp;
SELECt sal*12 AS AsAl FROM emp;
SELECT sal*12 "Annual Salary" FROM emp;

연결 연산자

  • 열이나 문자열을 다른 열에 연결, 두개의 세로선(||)으로 나타냄 결과 열로 문자식을 생성
SELECT ename || ' has $' || sal FROM emp;

연결 연산자와 null 값

  • 문자열에 nulll값을 결합할 경우 결과는 문자열
SELECT ename || comm From emp;

DISTINCT

  • 중복행 삭제
SELECT DISTINCT deptno FROM emp;

[실습 문제]

  1. emp 테이블에서 사원번호, 사원 이름, 월급을 출력하시오.
  2. emp 테이블에서 사원이름과 월급을 출력하는데 컬럼 명은 "이 름" , "월 급"으로 바꿔서 출력하시오.
  3. emp테이블에서 사원 번호, 사원 이름, 월급, 연봉을 구하고 각각 칼럼명은
    "사원번호" , "사원이름", "월급", "연봉" 이다.
  4. emp 테이블의 업무를 중복되지 않게 표시하시오.
SELECT empno , ename, sal FROM emp;

SELECT ename AS "이 름" , sal AS "월 급" FROM emp;

SELECT empno AS "사원번호",  ename AS "사원이름" , sal AS  "월급" , (sal*12) AS "연봉" FROM emp;
SELECT empno 사원번호,  ename 사원이름 , sal  월급 , (sal*12) 연봉 FROM emp;

SELECT DISTINCT job FROM emp; 

WHERE

  • 조건 체크 결과 행 제한하기 (주의) ALIAS 사용 불가
SELECT * FROM emp WHERE deptno = 10;
SELECT ename, job, deptno FROM emp WHERE ename = 'SMITH';
SELECT * FROM emp WHERE hiredate > '81-12-03' ;
81123일 이후의 입사자
SELECT * FROM emp WHERE hiredate < '81-12-03' ;
81123일 이전의 입사자
SELECT ename, sal, sal*12 ansal FROM emp WHERE  sal*12 > 15000;
(주의) WHERE절에서는 알리아스를 사용할 수 없음!!
SELECT * FROM emp WHERE hiredate != '80-12-17'; 
SELECT * FROM emp WHERE hiredate <> '80-12-17';
SELECT * FROM emp WHERE hiredate ^= '80-12-17';
801217일 입사자를 제외한 나머지 사람들 다 불러옴

BETWEEN ... AND ...

  • 두 값 사이 (지정한 값 포함)
특정 구간의 데이터를 불러온다
SELECT * FROM emp WHERE sal > 2000 AND sal <=5000 ;
SELECT * FROM emp WHERE sal >= 800 AND sal <= 3000 ;
SELECT * FROM emp WHERE sal BETWEEN 800 AND 3000;
SELECT * FROM emp WHERE sal NOT BETWEEN 800 AND 3000;
NOT BETWEEN ... AND ... > 부정을 하게 되면 그 데이터를 제외한 나머지 데이터들을 불러온다.
SELECT * FROM emp WHERE ename BETWEEN 'KING' AND 'SMITH';
SELECT * FROM emp WHERE ename NOT BETWEEN 'KING' AND 'SMITH';

IN

  • (값) 목록 중의 값과 일치
SELECT * FROM emp WHERE sal IN (1300,2450,3000);
     			> 괄호 안에 있는 데이터를 갖고 있는 사람은 다 불러오기
SELECT * FROM emp WHERE sal NOT IN (1300,2450,3000);
NOT은 부정의 의미 > 괄호 안에 있는 데이터를 갖고 있는 사람 제외하고 다 불러오기  
SELECT ename,mgr,deptno  FROM emp WHERE ename IN ('ALLEN' , 'FORD');
SELECT ename,mgr,deptno  FROM emp WHERE ename NOT IN ('ALLEN' , 'FORD');

[실습 문제] 2

  1. emp 테이블에서 사원번호가 7698인 사원의 이름, 업무, 급여를 출력하시오.
  2. emp 테이블에서 사원 이름이 SMITH인 사람의 이름과 월급, 부서번호를 구하시오.
  3. emp테이블에서 월급이 2500 이상 3500 미만인 사원의 이름, 입사일, 월급을 구하시오.
  4. emp 테이블에서 급여가 2000에서 3000사이에 포함되지 않는 사원의 이름, 업무, 급여를 출력하세요.
SELECT ename, job, sal FROM emp WHERE empno = '7698';
SELECT ename, sal ,deptno FROM emp WHERE ename = 'SMITH';
SELECT ename, hiredate, sal FROM emp WHERE sal >= 2500 AND sal < 3500 ;
SELECT ename, job, sal FROM emp WHERE sal BETWEEN 2000 AND 3000;
profile
Lucky Things🍀

0개의 댓글