국비학원/수업기록

국비 지원 개발자 과정_Day25

루팽 2022. 12. 30. 23:11

<시험1-네트워크 프로그래밍 구현 문제해결시나리오>

제시된 서버 IP(192.168.20.34)가 사용되지 않았다.

 

 

기존 파일 내용 끝에 데이터를 추가할 경우 두 번째 매개값에 true를 줘야 한다.

마지막에 close()로 닫아줘야 한다.

 

 

<시험2-네트워크 프로그래밍 구현 서술형(신)>

다형성

하나의 객체가 여러 가지 타입을 가질 수 있는 것

 

인터페이스 추상클래스 차이

1. 추상 클래스는 extends키워드, 인터페이스는 implements 키워드를 사용한다.

2. 추상 클래스는 단일 상속만 가능하지만 인터페이스는 다중 상속이 가능하다.

3. 추상 클래스는 일반변수, 생성자, 일반 메소드, 추상 메소드를 모두 가질 수 있지만, 인터페이스는 상수와 추상 메소드만 가질 수 있기에 인터페이스가 더 추상적이다.

4. 인터페이스는 모든 메소드가 추상메소드이므로 abstract를 생략할 수 있다.

5. 추상 클래스는 상속받아 기능을 확장시키는데 목적이 있고, 인터페이스는 동일한 실행 기능을 보장하기 위한 목적이 있다.

 

문자열”10” int로 변환

Integer.parseInt("10");

 

문자열 “13.45”를 double로 변환

Double.parseDouble("13.45");

 

Math 메소드

1. static min(int num1, int num2) : 두 인자값 중 더 작은 값을 리턴합니다.

2. static max(int num1, int num2) : 두 인자값 중 더 큰 값을 리턴합니다.

3. static abs(int num) : 인자값에 대한 절댓값을 리턴합니다.

4. static round(double num) : 반올림값을 리턴합니다.

5. static floor(double num) : 내림값을 리턴합니다.

 

StringTokenizer 메소드

1. countTokens() : StringTokenizer 객체 안에 남아있는 토큰 개수를 반환합니다.

2. hasMoreTokens() : StringTokenizer 객체 안에 토큰이 존재하면 true, 존재하지 않으면 false를 반환합니다.

3. nextToken(): StringTokenizer 객체 안에 있는 토큰 하나를 가져와서 반환합니다.

 

예외처리

 

Set 메소드

1. add(E e) : 해당 요소가 존재하지 않던 것이라면 Set에 추가하고 true를 반환하지만, 이미 존재하는 것이라면 false를 반환합니다.

2. isEmpty() : Set이 비어있다면 true, 비어있지 않다면 false를 반환합니다.

3. size() : Set에 저장된 객체의 개수를 반환합니다.

 


 

작업지시서
1. 우편번호 테이블 생성을 위한 스키마 파일로 테이블 추가하기
:테이블 삭제하기
drop table zipcode_t

2. zipcode_t 테이블 백업파일 공유된 것으로 테이블에 데이터 붓기

SELECT zipcode, address 
FROM zipcode_t
WHERE dong LIKE '역삼'||'%'

SELECT zipcode, address 
FROM zipcode_t
WHERE dong LIKE :x||'%'

SELECT zipcode
FROM zipcode_t
WHERE dong LIKE :x||'%'

SELECT zipcode
FROM zipcode_t
WHERE zdo LIKE :x||'%'

 

package dev_java.week6;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

class S1 {
  int age = 30;
}

class S2 {
  String animal = "사자";
  int leg = 4;
}

public class MapTest1 {
  List<Map<String, Object>> list = null;

  public static void main(String[] args) {
    S1 s1 = new S1();
    System.out.println(s1.age); // 30
    Map<String, Object> map1 = new HashMap<>();
    Map<String, String> map1_1 = new HashMap<>();
    Map<String, Object> map2 = new Hashtable<>();
    map1.put("s1", s1);
    // map1_1.put("s1", s1); // 타입이 다른 값을 담을 수 없다

    System.out.println(map1.get("s1")); // 객체 주소가 출력됨
    S1 s1_1 = (S1) map1.get("s1"); // 그 주소를 s1_1에 넣어줌, 강제형변환
    System.out.println(s1_1.age); // 30, 해당 주소의 age변수 호출

    S2 s2 = new S2();
    map2.put("s2", s2);
    S2 s2_1 = (S2) map2.get("s2");
    System.out.println(s2_1.animal); // 사자
    System.out.println(s2_1.leg); // 4
    
    if (s2_1.animal instanceof String) {
      System.out.println(s2_1.animal + "는 문자열입니다."); // 사자는 문자열입니다.
    }
    // Deprecated
    if (new Integer(s2_1.leg) instanceof Integer) {
      System.out.println(s2_1.leg + "는 정수형 입니다."); // 4는 정수형 입니다.
    }
  }
}

 

package dev_java.week6;

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

public class MapTest2 {
  public static void main(String[] args) {
    List<Map<String, Integer>> list = new ArrayList<>();
    Map<String, Integer> map1 = new HashMap<>();
    map1.put("one", 1);
    map1.put("two", 2);
    map1.put("three", (int) 3.0);

    Map<String, Double> map2 = new HashMap<>();
    map2.put("one1", (double) 1);
    map2.put("two1", new Double(2));
    map2.put("three1", 3.0);

    Map<String, Object> map3 = new HashMap<>();
    map3.put("one2", 1);
    map3.put("two2", 2);
    map3.put("three2", 3.0);
  }
}

 

package dev_java.week6;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import dev_java.util.DBConnectionMgr;

public class ZipCodeSearch {
  Connection con = null; // 인터페이스
  PreparedStatement pstmt = null; // 인터페이스
  ResultSet rs = null; // 인터페이스
  DBConnectionMgr dbMgr = new DBConnectionMgr();

  public Integer[] getZipcode(String dong) {
    System.out.println("getZipcode 호출 성공 => " + dong);
    Integer[] zipcodes = null;
    // List<Integer> imsi = new ArrayList<>();
    Vector<Integer> imsi = new Vector<>();
    StringBuilder sql = new StringBuilder(); // 쿼리문 담을 때 String쓰지않고 StringBuilder를 씀
    sql.append("SELECT zipcode ");
    sql.append("FROM zipcode_t ");
    sql.append("WHERE dong LIKE ?||'%'");
    try {
      con = dbMgr.getConnection();
      pstmt = con.prepareStatement(sql.toString());
      pstmt.setString(1, dong);
      rs = pstmt.executeQuery();
      while (rs.next()) {
        // System.out.println(rs.getInt("zipcode"));
        int code = rs.getInt("zipcode");
        imsi.add(code);
      }
      zipcodes = new Integer[imsi.size()];
      imsi.copyInto(zipcodes);
      for (int c : zipcodes) {
        System.out.println(c);
      }
    } catch (Exception e) {
      e.printStackTrace(); // 라인번호, 이력 출력
    } finally {
      // 사용한 자원 반납하기
      dbMgr.freeConnection(con, pstmt, rs);
    }
    return zipcodes;
  }

  public List<Integer> getZipcode2(String dong) {
    return null;
  }

  public static void main(String[] args) {
    ZipCodeSearch zcs = new ZipCodeSearch();
    zcs.getZipcode("역삼");
  }
}

 

package dev_java.week6;

public class T {
  ZipCodeSearch zcs = null;

  // 매소드를 통해서도 객체주입을 받을 수 있다 - 싱글톤패턴
  public ZipCodeSearch getInstance() {
    if (zcs == null) {
      zcs = new ZipCodeSearch();
    }
    return zcs;
  }

  public static void main(String[] args) {
    T t = new T();
    t.zcs = t.getInstance();
    t.zcs.getZipcode("역삼동");
  }
}

 

package dev_java.week6;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class Y {

  public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    Vector<Integer> vlist = new Vector<>();
    Integer[] is = new Integer[3];
    is[0] = 1;
    is[1] = 2;
    is[2] = 3;

    // 인터페이스 List에는 copyinto()가 정의되어있지 않다
    // list.copyinto(is); // 사용불가
    vlist.copyInto(is);
  }
}

 

package dev_java.week6;

class Sup {
  void go() {
    System.out.println("Sup go 호출");
  }

  void stop() {
    System.out.println("Sup stop 호출");
  }
}

class Sub extends Sup {
  Sub() {
    super.stop(); // 부모의 메소드
    this.stop(); // 자신의 메소드, 현재 인스턴스화(생성되어진) 객체의 메소드
  }

  @Override
  void stop() {
    System.out.println("Sub stop 호출");
  }
}

public class SuperMain {

  public static void main(String[] args) {
    Sup sup = new Sup();
    Sub sub = new Sub();
    sup.go(); // Sup go 호출
    sub.go(); // Sup go 호출, 자손 클래스는 부모 클래스의 메소드 호출 가능
    // sup.stop(); //부모 클래스는 자손 클래스의 메소드 호출 불가!
    sub.stop(); // Sub stop 호출

    sup = sub; // 객체 주소 대입
    // sup.stop(); //선언부 타입이 다르기에 사용 불가
    sub.stop(); // Sub stop 호출

    // 부모 클래스에 stop() 추가하고 자식 클래스에서 오버라이드한 경우
    sup.stop(); // 35번이 주석이면 Sup의 메소드, 주석이 아니면 Sub 메소드 호출
    // 자손 메소드가 출력될 때 부모가 가진 stop()는 은닉 메소드(shadow method)라고 함

    // this나 super 예약어는 static이 있는 메소드 영역에서 사용 불가하다(컴파일에러)
    // super.stop();
  }
}

 

package dev_java.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Vector;
import java.sql.ResultSet;

public class DBConnectionMgr {
  public static final String _DRIVER = "oracle.jdbc.driver.OracleDriver";
  public static final String _URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl11";
  public static String _USER = "scott";
  public static String _PW = "tiger";

  public Connection getConnection() {
    Connection con = null;
    try {
      Class.forName(_DRIVER);
      con = DriverManager.getConnection(_URL, _USER, _PW);
    } catch (ClassNotFoundException ce) {
      System.out.println("드라이버 클래스를 찾을 수 없습니다.");
    } catch (Exception e) { // 멀티 블럭 작성 시 범위가 넓은 Exception을 바깥쪽에 적기
      System.out.println("오라클 서버와 연결 실패");
    }
    return con;
  }

  // 사용한 자원을 반납하는 코드는 명시적으로 하는 것을 원칙으로 함
  // 반납하는 순서는 생성된 역순으로 진행할 것 - 자바튜닝팀 지적사항
  // 사용한 자원 반납하기 - INSERT, UPDATE, DELETE
  public void freeConnection(Connection con, Statement stmt) {
    if (stmt != null) {
      try {
        stmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if (con != null) {
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  } // end of freeConnection

  public void freeConnection(Connection con, PreparedStatement pstmt) {
    if (pstmt != null) {
      try {
        pstmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if (con != null) {
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  } // end of freeConnection

  // 사용한 자원 반납하기 - SELECT(커서 조작 필요)
  public void freeConnection(Connection con, Statement stmt, ResultSet rs) {
    if (rs != null) {
      try {
        rs.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if (stmt != null) {
      try {
        stmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if (con != null) {
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  } // end of freeConnection

  public void freeConnection(Connection con, PreparedStatement pstmt, ResultSet rs) {
    if (rs != null) {
      try {
        rs.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if (pstmt != null) {
      try {
        pstmt.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
    if (con != null) {
      try {
        con.close();
      } catch (Exception e) {
        // TODO: handle exception
      }
    }
  } // end of freeConnection

  public static void main(String[] args) {
    DBConnectionMgr dbMgr = new DBConnectionMgr();
    Connection con = dbMgr.getConnection();
    System.out.println("con ==> " + con);
  }
}

/*
 * JDBC API를 이용하여 DB연동하기
 * 1. 각 제조사가 제공하는 드라이버 클래스를 로딩한다.(ojdbc6.jar)
 * Class.forName(드라이버 클래스 풀네임 적기);
 * 
 * 2. 물리적으로 떨어져있는 오라클 서버와 연결 통로를 확보한다.
 * Connection은 인터페이스이다 -> 오른쪽에 구현체 클래스가 와야한다
 * Connection con = DriverManager.getConnection(URL, "scott", "tiger");
 * 
 * 3. DML문을 자바에서 오라클 서버로 전달해 줄 인터페이스를 생성한다.
 * Statement: 정적쿼리문, PreparedStatement:동적쿼리문 지원
 * 
 * 4. SELECT문의 경우 오라클 서버에서 제공하는 커서를 지원하는 ResultSet 인터페이스를 활용하여
 * 테이블에 제공되는 커서를 조작해 해당 로우에 데이터가 존재하면 Cursor..open..fetch과정을 통해
 * 오라클 서버로부터 데이터를 꺼내서 List<DeptVO>에 담을 수 있다.
 * 주의: INSERT, UPDATE, DELETE에서는 커서가 필요없음 - commit, rollback
 * 리턴값은 int
 * 이것들을 요청할 떄는 executeUpdate(INSERT문 or UPDATE문 or DELETE문)
 * 
 * SELECT일때는
 * ResultSet rs = executeQuery("SELECT * FROM dept");
 * 오라클에서 제공되는 커서를 조작하는 인터페이스를 리턴타입으로 제공받아서
 * 조회 결과를 Collection에 담을 수 있다.
 * List<DeptVO> deptList = new ArrayList<>();
 * DeptVO dVO = null;
 * while(rs.next()){
 * dVO = new DeptVO();
 * deptList.add(dVO);
 * }
 * 
 * 사용한 자원을 반납할 때는 사용한 역순으로 닫아주면 됨
 * SELECT인 경우
 * ResultSet 먼저 닫고
 * Statement 혹은 PreparedStatement 두 번째로 닫고
 * Connection을 맨 나중에 닫아주면 됨
 * 닫지 않으면 나중에 자동으로 닫아주기는 하지만
 * 명시적으로 닫아주면 닫는 시간을 앞당길 수 있어, 프로젝트에서는 명시적으로 닫는 코드 작성을 가이드로 정함
 * 
 * INSERT, UPDATE, DELETE는 두 번째와 세 번째만 닫으면 됨
 * 왜냐하면 리턴타입이 커서가 필요없으니까
 */