[2023.10.20] 개발자 교육 20일 차 : 강의-복습, , 오라클 [구디 아카데미]

DaramGee·2023년 10월 20일
0
post-thumbnail

오늘 정리

코딩에 정답은 없다? 설계하고자 하는 프로젝트에 따라 어떻게 변수를 선언할지, 클래스를 어떻게 나눌지, 어떤 메소드를 만들고 배치할지, 삭속을 받을지, 인터페이스를 활용할지 등 여러 고민을 하고 세워야 한다.

복습

  • UI/UX-솔루션 제공- Dataset - 테이블구조 (오브젝트 : JSON, List, Map) 제공
    • 투비소프트 : UI로 첫 주식으로 상장된 회사

  • 자바 컬렉션 프레임워크(자료구조 - List, Map, Set)
    • List, Map은 추상메소드(미정, 선택x)를 제공, 구현체클래스 사용(ArrayList, Vector, HashMap 등)
      • List : [] 대괄호/Map : {}/JSON : 하이브리드
    • 다형성
      • ‘인터페이스 변수명 = new 구현체클래스’와 같이 생성부, 선언부 다름
      • 클래스 사이의 결합도가 낮아짐. 따라서 결합도가 높은 상속보다는 인터페이스를 먼저 설계해야 함. →Spring F/W로
    • instanceof → 자료구조의 속성을 확인
      • 이종 간의 연계 처리 시(자바-자료구조 & UI-Dataset, 오라클 등) 서로 만나는 부분에 대한 추가적인 처리코드(예 : 자료구조를 Dataset에 초기화하는 코드) 필요함. 따라서 현 자료구조의 속성을 확인할 줄 알아야 함.

      • 연동을 하려면 둘 사이의 인터페이스 부분이 필요하다.

        System.out.println(li instanceof List);          //true
        System.out.println(li instanceof ArrayList);     //true
      • 예) 같은 백엔드 영역인 자바, 오라클도 같은 타입이어도 표현하는 타입 이름이 다름

        자바오라클
        정수int, longnumber(5)
        실수double, floatnumber(7,2)
        문자Stringvarchar2(가변형10), char(고정형10)
      • 오라클에 ‘hello’입력시

        • 가변형 타입에서는 실제로 사용된 크기만 할당되고, 나머지 공간은 반납이 됨(윈도우에 5 반납)
        • 고정형 타입에서는 나머지 공간을 화이트 스페이스로 채워줌(5자리 채워줌)
  • 실습(List 활용)
    • VO객체가 생성되면 바로 그 객체에 대한 스레드가 생겨서 관리함

      package jdbc.oracle;
      
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Map;
      
      public class List2 {
      	/*정의메소드*/
      	void methodA(List<BookVO> bookList) {
      		BookVO bVO = new BookVO(); //내 안에 변수는 네 가지(No, Title, Author, Price) 생기자마자 스레드가 관리함!
      		System.out.println(bVO.getB_title());
      //		bVO.b_title = "수학의정석"; //캡슐화되어있어서 초기화 불가 -> getter/setter를 사용하여 입력, 출력 가능 
      		bVO.setB_title("수학의정석");     
      		System.out.println(bVO.getB_title());
      		bVO = new BookVO();             //타입은 같지만, 객체가 달라짐. 
      		System.out.println("=============");
      		System.out.println(bVO.getB_title());
      		System.out.println("=============");
      	}
      	void methodB(List<Map<String, Object>> bookList) {
      	}
      	/*메인메소드*/
      	public static void main(String[] args) {
      		List2 l2 = new List2();
      		l2.methodA(null);
      	}
      }

💡 List의 제네릭 타입으로 VO를 선택할까? 아니면 Map이 맞을까?
VOMap
갖는 값 ?타입(값을 주고받는) 정해져 있음키(VO의 변수명, 오라클에선 컬럼명)와 값(추상적, 미정, 다된다)
  • 서로 다른 키가 참조하는 값으로 연산을 한다면? 어떤 점을 고려할까? 타입이 중점 문제될 것이다.
  • 결국, 코드를 사용해야하는 상황에 맞는 형식으로 사용하고, 이를 위해 코드의 설계를 그려보는 것이 중요하다.(not 시행착오😭)
    • 연산을 해야하는 상황일 때는 타입이 다 정해져있는 VO를 사용
    • 테이블을 두 개 이상 조인을 걸어야 하는 상황일 때는 Map을 사용 (예 : Map<empVO, edptVO>)
public class List3 {
	/*정의메소드*/
	void methodA(List<BookVO> bookList) {
		// 사용권 나신입 로그인 권한
		System.out.println(bookList);
		BookVO rbVO = bookList.get(0);
		System.out.println((Integer)rbVO.getB_price() instanceof Integer);   //인티저 타입인가? true
		System.out.println((Integer)rbVO.getB_price() * 5);                  //인트로 타입이 정해져있기 때문에 연산 가능하다. 
	}
	void methodB(List<Map<String, Object>> bookList) {
		System.out.println(bookList);
		Map<String, Object> rmap = bookList.get(0);
		System.out.println(rmap.get("b_price") instanceof Integer);  //인티저 타입인가? true
		System.out.println(rmap.get("b_price") instanceof Object);   //오브젝트 타입인가? true
		System.out.println(rmap.get("b_price") instanceof String);   //스트링 타입인가? false
//		System.out.println(rmap.get("b_price") * 5);               //인트가 아닌 오브젝트타입이어서 계산 x
	}

  • 테이블은 로우와 컬럼으로 구성됨.
    • 로우/컬럼 → 면이 생김 → 데이터(분석 - 변화체크 - 상태값(쿠키와 세션))를 변수로 저장하여 일괄처리 가능
  • 변수(일괄처리, 같은 타입 하나만) → 배열(크기 제한, 끼워넣기x, 하나의 타입) → 객체배열(여러 타입) →컬렉션프레임워크(여러타입, 끼워넣기 가능) → 쿠키와 세션 🚩

  • 제네릭
    • 제네릭을 사용하지 않으면, 타입을 체크하여 형전환을 개발자가 직접 해야한다. * 따라서 제네릭을 사용해야 한다.

      map.put("b_no", 1);             //
      		map.put("b_title", "혼자공부하는 자바");          //
      		System.out.println(map.get("b_no"));
      		System.out.println(map.get("b_title"));
      		System.out.println(map.get("b_author"));
      //		int b_price = map.get("b_price"); // 타입이 맞지 않음. 이게 VO와 Map을 제네릭으로 선택했을 때의 차이점??
      		int b_price = (int) map.get("b_price"); //이게 VO와 Map을 제네릭으로 선택했을 때의 차이점??
      		b_price = (int) map.get("b_price"); //이게 VO와 Map을 제네릭으로 선택했을 때의 차이점??
      		System.out.println(b_price); //리턴값이 "java.util.Map.get(Object)" is null

  • 2차배열 복습
    • 요구사항 : 나초보의 연봉 5000으로 수정

    • 사용 메소드

      • int javax.swing.table.DefaultTableModel.getRowCount() → 이 테이블의 행 갯수 확인
      • Object javax.swing.table.DefaultTableModel.getValueAt(int row, int column) → 해당 행, 열 값 확인
      • void javax.swing.table.DefaultTableModel.setValueAt(Object aValue, int row, int column) → 선택된 행 값 확인
      • boolean javax.swing.JTable.isRowSelected(int row) → 지정된 인덱스의 행 선택여부 (true/false)
      	/*생성자*/
      	public EmpManager() {
      		init();
      	}
      	/*정의메소드*/
      	public void init() { //선언과 생성을 나눌 때는 아래처럼 작성해야함 
      		data = new String[][] {
      				{"7566","나신입","3000"},
      				{"7499","나초보","4000"},
      				{"7748","나일등","4500"}
      		};
      
      	/*메인메소드*/
      	public static void main(String[] args) {
      		EmpManager em = new EmpManager();
      		em.initDisplay();
      	}
      	@Override 
      	public void actionPerformed(ActionEvent e) { //여기 파라미터값은 JVM이 넣어줌 
      		Object obj = e.getSource();
      		//수정버튼 눌렀을 때
      		if(obj==jbtn_update) {//저장된 배열위치 확인 필요->초기화 진행		
      			System.out.println("수정 버튼 클릭");
      			System.out.println(dtm.getRowCount());
      			for(int i=0;i<dtm.getRowCount();i++) {   //테이블은 로우와 컬럼으로 구성되어 테이블 구조 
      				//is가 붙는 메소드는 boolean을 리턴타입으로 가져서 if문, while문에서 사용한다 . 
      				if(jt.isRowSelected(i)) { //너가 선택한 로우값은? 
      				//나초보랑 같은 row값이라면? String name = dtm.getValueAt("나초보",1,1)
      				//나초보에 해당하는 row값이면 ? setValueAt
      					String cname = (String)dtm.getValueAt(i, 1);
      					System.out.println(cname);
      					if("나초보".equals(cname)) { 
      						dtm.setValueAt(5000, i, 2);  
      					}
      					else if("나신입".equals(cname)) { 
      						dtm.setValueAt(3500, i, 2);  
      					}
      					else if("나일등".equals(cname)) { 
      						dtm.setValueAt(5500, i, 2);  
      					}
      				}
      			}
      		}
      	}

강의 내용

  • 오라클(토드) 사용 Tip
  • toad에서 가져오기 ->표 확인 해당 Object 드래그 & f4 / script / 해당 변수 복사&붙여넣기
  • 이클립스 작업하기 → ctrl + y (소문자로) / ctrl + shift + a 또는 위 아이콘(Toggle Block Selection Mode) 클릭
  • but, 반드시 설계된 컬럼만 선언할 수 있는 건 아니야! 화면과는 상관없지만 코드진행상 필요하다면 변수를 추가로 선언할 수 있어!

  • String 타입에 “” 또는 null ??
    • 문자열의 길이 확인 lenth(); 시 null인 경우 확인x

      bVO.setB_author("");     
      System.out.println("author의 길이는? "+bVO.getB_author().length());
      System.out.println("author는? "+bVO.getB_author());
      bVO.setB_author(null);     
      System.out.println("author는? "+bVO.getB_author());
      //System.out.println(bVO.getB_author().length()); //null 에러
      /*===============
      author의 길이는? 0
      author는? 
      author는? null
      ===============*/

  • getter & setter
    • set 은 입력된 값은 전변에 저장
    • get은 전변의 값을 읽어올 때 사용하기 때문에 리턴타입이 있음.

  • Front / Backend
    - Frontend : view, ui, 앞단 → 사용자와 서버사이의 소통, 화면에 입력(입력받는 값 파라미터 → 생성자, 메소드→메소드 오버로)
    - Backend : 네트워크 프로그래밍, 오라클 서버연동, Logic클래스

강의 마무리

  • 오른쪽에 오라클을 두고, 자바의 리스트와 맵이란 인터페이스로 구현체를 통해 데이터 테이블을 구성할 줄 알아야 함.
  • DB - table + List/Map + JSON 같이 놓고 본다(화면을 만지지 않음)
    • 입력한 테이블의 값은 중간중간 sysout으로 입력을 확인하는 것 필요함.

0개의 댓글