(20)-23.10.20[JAVA]

DANA·2023년 10월 20일

KDT-구디아카데미

목록 보기
20/56

SQL

SELECT empno,ename,job FROM emp;
--"emp" 테이블에서 "empno," "ename," "job" 열을 선택

CREATE TABLE book1( -- "book1" 이름의 데이터베이스 테이블 생성
    b_no NUMBER(5) CONSTRAINTS book1_pk PRIMARY KEY,
    b_title VARCHAR2(30) NOT NULL,
    b_author VARCHAR2(30) NOT NULL,
    b_price NUMBER(7) DEFAULT 0
);

INSERT INTO book1(b_no, b_title, b_author, b_price) 
VALUES(1, '자바의정석', '남궁성', 30000);
--"book1" 테이블에 데이터 삽입
--"b_no," "b_title," "b_author," "b_price" 열에 값을 삽입
INSERT INTO book1(b_no,b_title,b_author,b_price)
VALUES(2, '오라클','나신입',20000);
--"book1" 테이블에 또 다른 데이터 삽입
INSERT INTO book1(b_no,b_title,b_author,b_price)
VALUES(3, 'html5','나초보',50000);
--"book1" 테이블에 또 다른 데이터 삽입

SELECT b_no, b_title, b_author, b_price FROM book1;
--"book1" 테이블에서 "b_no," "b_title," "b_author," "b_price" 열을 선택
--"book1" 테이블의 데이터를 가져옴

데이터 타입

1. 가변형 타입(Variable-Length Data Type)

  • 필요한 공간만을 할당하며, 실제로 사용된 크기만을 할당
  • 나머지 공간은 (운영체제에게) 반납되며, 즉, 필요하지 않은 공간은 메모리에서 해제(메모리 관리 측면에서 효율적, 공간 절약)
  • ex) 문자열의 경우 문자열의 길이에 따라 메모리가 동적으로 할당

2. 고정형 타입(Fixed-Length Data Type)

  • 고정된 크기의 공간을 할당. 할당된 공간은 항상 고정된 크기로 유지되며, 필요하지 않은 공간은 빈 공간(white space)으로 유지
  • 메모리를 미리 할당하고, 모든 항목에 동일한 크기의 메모리를 사용하는 경우에 해당
  • ex) 정수 또는 고정 길이 문자열은 항상 동일한 크기의 메모리를 사용
SELECT LENGTH('hello') FROM dual;

실제 id값이 hello로 동일하더라도 char타입의 경우 white space가 5자리가 더 있으므로 두 아이디 값은 다르다로 판정되므로 에러발생임

commit;
  • 데이터베이스 트랜잭션을 확정

List

  • Java 컬렉션 프레임워크의 인터페이스 중 하나
  • 순서가 있는 데이터의 집합을 다루는 데 사용
  • 중복된 요소를 허용하며, 각 요소는 인덱스(순서)로 식별

List 인터페이스의 일부 주요 메서드

  • add(E element): 요소를 리스트에 추가
  • remove(int index): 지정된 인덱스의 요소를 삭제
  • get(int index): 지정된 인덱스의 요소를 반환
  • size(): 리스트의 크기(요소의 수)를 반환
  • clear(): 리스트의 모든 요소를 제거
  • contains(Object o): 지정된 요소가 리스트에 포함되어 있는지 여부를 확인
  • indexOf(Object o): 지정된 요소의 첫 번째 등장 위치(인덱스)를 반환

List 인터페이스를 구현하는 주요 클래스

  • ArrayList
  • LinkedList
  • Vector

List1

package jdbc.oracle;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Vector;

public class List1 {

	public static void main(String[] args) {
		// 인터페이스와 추상클래스는 단독으로 인스턴스화 불가
        // List는 인터페이스이므로 직접 인스턴스화할 수 없음
        // List li2 = new List();

        // Map 객체를 생성하고 "map" 변수에 할당
		Map<String, Object> map = new HashMap<>();
        // Map 객체 출력 {}
		System.out.println(map); 
        
        // List 인터페이스를 구현한 ArrayList 객체를 생성하고 "li" 변수에 할당
        //li.size()=0 - 다형성
		List li = new ArrayList();
        // ArrayList 객체 출력 []
		System.out.println(li); 
        // ArrayList 크기 출력 (초기 크기:0)
		System.out.println(li.size()); 
        
        // "li" 리스트에 "map" 추가 
		li.add(map);
        // "li" 리스트 크기 출력 (크기:1)
		System.out.println(li.size());
        
        // "map"에 키-값 쌍을 추가
		map.put("b_no",1);
		map.put("b_title", "자바의 정석");
		System.out.println("==============================");
        
        // "li"가 List 타입인지 확인하고 결과 출력
		System.out.println(li instanceof List);
        // "li"가 ArrayList 타입인지 확인하고 결과 출력
		System.out.println(li instanceof ArrayList); // 
		System.out.println("==============================");
        
        // "map"의 내용 출력
        // {b_no=1, b_title=자바의 정석}
		System.out.println(map); 
        // "map"에서 "b_author" 키의 값을 가져와서 출력 (null)
		System.out.println(map.get("b_author")); 
        // "map"에서 "b_price" 키의 값을 가져와서 출력 (null)
		System.out.println(map.get("b_price")); 
        
        
		// "map"에서 "b_price"의 값을 가져와서 정수로 캐스팅하고 "b_price" 변수에 할당
        // VO와 Map을 제네릭으로 선택했을 때의 차이점이라는 걸 인지해야 함
		int b_price = (int)map.get("b_price"); 
        
        // "map"에서 "b_author"의 값을 가져와서 정수로 캐스팅하고 "b_price" 변수에 다시 할당
		b_price = (int)map.get("b_author");
        
        // "b_price" 변수의 값을 출력 (NullPointerException)
		System.out.println(b_price); 
        
        // "li" 변수를 Vector 객체로 다시 할당
		li = new Vector();
        // "li" 변수를 LinkedList 객체로 다시 할당
		li = new LinkedList();
        
        // List 인터페이스를 구현한 ArrayList 객체를 생성하고 "li2" 변수에 할당
		List<Map<String, Object>> li2 = new ArrayList<>();
	}
}
  • 제네릭을 사용하지 않는 경우에는 컴파일러가 타입 체크를 수행하지 않으며, 개발자가 직접 형 변환 및 타입 검사를 수행해야 함
  • 제네릭을 사용함으로써 컴파일러는 코드에서 타입 안정성을 보장하고 런타임 시에 형 변환 오류를 방지할 수 있도록 도와줌

BookVO

package jdbc.oracle;

public class BookVO {
	// 책 번호를 나타내는 변수
	private int    b_no     = 0; 
    // 책 제목을 나타내는 변수
	private String b_title  = "";
    // 책 저자를 나타내는 변수
	private String b_author = null;
    // 책 가격을 나타내는 변수
	private int    b_price  = 0;
	
    // 책 번호(getter)
	public int getB_no() {
		return b_no;
	}
    // 책 번호(setter)
	public void setB_no(int b_no) {
		this.b_no = b_no;
	}
    
    // 책 제목(getter)
	public String getB_title() {
		return b_title;
	}
    // 책 제목(setter)
	public void setB_title(String b_title) {
		this.b_title = b_title;
	}
    
    // 책 저자(getter)
	public String getB_author() {
		return b_author;
	}
    // 책 저자(setter)
	public void setB_author(String b_author) {
		this.b_author = b_author;
	}
    
    // 책 가격(getter)
	public int getB_price() {
		return b_price;
	}
    // 책 가격(setter)
	public void setB_price(int b_price) {
		this.b_price = b_price;
	}  
}
  • Getter 메서드: 변수 값 반환
  • Setter 메서드: 변수 값 설정

List2

package jdbc.oracle;

import java.util.List;
import java.util.Map;

public class List2 {
	void methodA(List<BookVO> bookList) {
		// 사용권 - 나신입 - 로그인 - 권한
		// BookVO 객체 생성
        //b_no,b_title,b_author,b_price-private - thread가 관리함 List<ChatServerThread>
        BookVO bVO = new BookVO();
        
		// bVO.b_title="수학의 정석";
        // BookVO 객체의 제목과 저자 설정
		bVO.setB_title("수학의 정석");
		bVO.setB_author(null);
        
		System.out.println(bVO.getB_title()); // "수학의 정석"
		System.out.println(bVO.getB_author()); // null
        
		// BookVO 객체의 저자가 null이므로 저자의 길이를 구하면 NullPointerException이 발생
	   	~~System.out.println(bVO.getB_author().length()); ~~

        // 빈 문자열의 길이는 0
		System.out.println("".length()); 
        
		// BookVO 객체를 새로 생성
		bVO = new BookVO(); //LifeCycle - 생성 - 호출 - 죽임(메모리 회수 - 캔디데이트 - gc)
		
        // BookVO 객체의 제목 출력
        // 새로운 객체이므로 초기값인 빈 문자열
        System.out.println(bVO.getB_title());
	}
    
	void methodB(List<Map<String,Object>> bookList) {
		
	}
	
	public static void main(String[] args) {
		List2 list2 = new List2();
		list2.methodA(null); // 파라미터를 사용하지 않았기 때문에 에러가 나지 않는다
		

	}

}
<예제3-1>
package jdbc.oracle;
/*
 *  List의 제네릭 타입으로 VO를 선택할 것인가? 아니면 Map을 선택하는 것이 맞는걸까?
 *  기준이 뭐야?
 *  관찰 - 생각, 고민
 *  BookVO - 타입이 정해져 있다. - 값(원시형과참조형)을 담는다
 *  
 *  Map<String,Object> - 키(VO에서 변수명이고 ,오라클 컬럼명) 와 값( 추상적이다. - Object - 결정이 안됨, 미정, 다된다)
 *  문제제기 
 *  서로 다른 키가 참조하는 값으로 연산을 해야 한다면??? 어떤 점을 고려해야 하나요? -> 타입이 문제 되지 않는걸까???
 *  
 */
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class List3 {
	void methodA(List<BookVO> bookList) {
		// 사용권 -  나신입 - 로그인 - 권한
		//bookList.size()=0
		System.out.println(bookList);
		BookVO rbVO = bookList.get(0);
		System.out.println((Integer)rbVO.getB_price() instanceof Integer);
		System.out.println("10"+10);//1010 -> 20
		//CastingException, NumberFormatException,....
		System.out.println(rbVO.getB_price()*5);
	}
	void methodB(List<Map<String,Object>> bookList) {
		//bookList.size()=0
		System.out.println(bookList);
		Map<String,Object> rmap = bookList.get(0);
		System.out.println(rmap.get("b_price") instanceof Integer);
		System.out.println(rmap.get("b_price") instanceof String);
		System.out.println(rmap.get("b_price") instanceof Object);
		// System.out.println(rmap.get("b_price")*5);
	}
	public static void main(String[] args) {
		List3 list2 = new List3();
		List<BookVO> bookList = new ArrayList<>();
		BookVO bVO = new BookVO();//b_no, b_title, b_author, b_price - private - thread가 관리함 List<ChatServerThread>
		//bVO.getB_no()0 bVO.getB_title()"" bVO.getB_author()null bVO.getB_price()0
		bVO.setB_no(1);
		bVO.setB_title("자바의정석");
		bVO.setB_author("남궁성");
		bVO.setB_price(30000);
		//뭐가 담겼지? BookVO주소번지가 하나 담겼다. BookVO 안에는 변수가 4개 선언되어 있다.
		//4개중에서 2개는 int 2개 는  String  - 관찰하기
		bookList.add(bVO);//bookList.size()=1 - 뭐가 하나지?
		List<Map<String,Object>> bookMap = new ArrayList<>();
		//bookMap.add(bVO);//제네릭 타입이 달라서 컴파일 에러 발생함
		Map<String,Object> map = new HashMap<>();
		map.put("b_no", 1);
		map.put("b_title","자바의정석");
		map.put("b_author", "남궁성");
		map.put("b_price",30000);
		bookMap.add(map);//빈깡통이다.
		list2.methodA(bookList);
		list2.methodB(bookMap);
	}

}
<예제3-2>
package jdbc.oracle;
//반드시 테이블에 설계된 컬럼만 선언할 수 있는 건 아니야
//화면과는 상관이 없지만 업무 프로세스를 처리하기위해서 추가로 필요한 변수도 선언하세요 - 보이지 않는 부분 - 찾아서 변수를 선언할 수 있다. -  멘토
//개발자는 글쓰기에 대한 습관
public class BookVO {
	private int       b_no    	= 0;//  
	private String b_title 	="";//  
	private String b_author	=null;//  
	private int       b_price 	= 0;//  
	//int count = 5;//도서 주문량
	//페이징 처리 - 페이지네비게이션
	//int start = 0;
	//int end = 0;
	//int pagePerList = 10;
	//int totalRecord = 45;
	public int getB_no() {
		return b_no;
	}
	public void setB_no(int b_no) {
		this.b_no = b_no;
	}
	public String getB_title() {
		return b_title;
	}
	public void setB_title(String b_title) {
		this.b_title = b_title;
	}
	public String getB_author() {
		return b_author;
	}
	public void setB_author(String b_author) {
		this.b_author = b_author;
	}
	public int getB_price() {
		return b_price;
	}
	public void setB_price(int b_price) {
		this.b_price = b_price;
	}
}

0개의 댓글