패키지

자바 interface, implement 실습 본문

Server-Side/Java

자바 interface, implement 실습

업단업업 2016. 3. 28. 23:55

interface는 선언만** 로직 x (객체지향적 프로그래밍)

implement 는 interface를 상속

extend - 일반클래스와 abstract클래스를 상속

 

반복되는 메소드 클래스로 빼기(인터페이스, 추상메소드)

 1.메소드 추출
2. 클래스 추출 --->>> 코드 중복 방지 / 재사용 높음

 

* 외부클래스, 내부 클래스

* 객체를 사용하기 위해서는 객체를 생성해야 한다

* 클래스 아래 변수는 읽기 전용이므로 원래는 private를 써주는게

 

샘플 UserDAO라는 클래스를 만들고, 소스수정(소스수정-> 서버 on/off -> 비효율)을 하면서 생기는 비효율적인 부분을 해결하기 위한 Interface, implement에 대한 실습.


ConnectionMaker라는 인터페이스를 만들고 각각의 디비에 접근가능하게 하는 implement를 해줌으로서 클라이언트가 메인 메소드에 접근할 때 해당 db를 연결해주는 클래스를 수정하지 않고도 찾아가게 해줌으로서
소스 작업의 효율성을 높여준다는 것을 배울 수 있었다. 또한 생성자에 대한 부분도 다시 알 수 있었다(생성자 생성 중요).

 

}

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.iffice.test.domain.User;

public class UserDAO {
 
 // SimpleConnectionMaker scm = new SimpleConnectionMaker();
 //이렇게 선언해줘도 돌아가지만,
 //scm으로 메소드를 불어올 필요가 없을 때도 선언이 되어버림으로
 //필요없는 메모리가 낭비됨...
 ConnectionMaker scm;

 //생성자를 이런식으로 선언해야 하는 이유
 //connection이 필요할 때만 불러오게 함으로서
 //jvm의 메모리에 과부하가 걸리지 않도록 한다.

//변수 네이밍 주의할 것 (직관적으로 알아볼 수 있게)
 public UserDAO(ConnectionMaker cm) {
  this.scm = cm;
 }

 //default 
 public UserDAO() {
 }


 
 public void add(User user) throws ClassNotFoundException, SQLException {
  Connection c = scm.getConnection();
  PreparedStatement ps = c
    .prepareStatement("insert into test_users(id,name,password) values(?,?,?)");

  ps.setString(1, user.getId());
  ps.setString(2, user.getName());
  ps.setString(3, user.getPw());


  //executeUpdate() 메소드는 INSERT, UPDATE, DELETE 쿼리 전용
  ps.executeUpdate();

  ps.close();
  c.close();

 }

 public User get(String id) throws SQLException, ClassNotFoundException {
  Connection c = scm.getConnection();
  PreparedStatement ps = c
    .prepareStatement("select * from test_users where id = ?");

  //데이터바인딩
  ps.setString(1, id);


  //executeQuery() 메소드는 SELECT 쿼리 전용
  ResultSet rs = ps.executeQuery();


  //next() 메소드는 ROW 단위 접근
  //결과 집합(ResultSet)에서 순차적으로 ROW를 접근하고
  //더 이상 접근할 ROW가 없으면 false를 반환한다.
  rs.next();

  User user = new User();
  user.setId(rs.getString("id"));
  user.setName(rs.getString("name"));
  user.setPw(rs.getString("password"));

  rs.close();
  ps.close();
  c.close();

  return user;

 }

 
 public static void main(String[] args) throws ClassNotFoundException,
   SQLException {

//인터페이스와 인터페이스를 상속받은(implement) 클래스

  ConnectionMaker cm = new OracleConnectionMaker();
    
  UserDAO dao = new UserDAO(cm);

 

  User user = new User();

  user.setId("tester55");
  user.setName("테스터");
  user.setPw("tester");

  dao.add(user);

  System.out.println(user.getId() + " 등록성공");

  User user2 = dao.get(user.getId());
  System.out.println(user2.getName());
  System.out.println(user2.getPw());

  System.out.println(user2.getId() + " 조회성공");

 }
}

 

package com.iffice.test.dao;

import java.sql.Connection;
import java.sql.SQLException;

public interface ConnectionMaker {
 
 //getConnection이라는 메소드를 만듬
 //interface에서는 로직생성 하지 않음.
 public Connection getConnection() throws ClassNotFoundException, SQLException;

}

 

package com.iffice.test.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class SimpleConnectionMaker implements ConnectionMaker{
 
 public Connection getConnection() throws ClassNotFoundException, SQLException {

//디비 커넥션

  Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

  Connection c = DriverManager.getConnection(
    "jdbc:sqlserver://ip주소:1433;databaseName=ㅇㅇ",  "아이디", "비밀번호");

  return c;
  
 }

}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

public class OracleConnectionMaker implements ConnectionMaker{
 
 public Connection getConnection() throws ClassNotFoundException, SQLException {

//디비 커넥션

  Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

  Connection c = DriverManager.getConnection(
    "jdbc:sqlserver://ip주소:1433;databaseName=ㅇㅇ",  "아이디", "비밀번호");

  return c;

 }
 
}

 

 

 

Comments