//Google AdSense

상품 리스트를 만드는데 db에 데이터가 1~ 5까지 담겨있는데 리스트에 자꾸 2~5만 출력되어서 당황했다!

consol에 찍힌 log

01-01 doGet() GControllersec GControllersec.java 02 doPro() GControllersec GControllersec.java /OraMVCMG35SEC/Gli/g_list.ksmart_g<-- RequestURI GControllersec.java /OraMVCMG35SEC<-- contextPath GControllersec.java 14<-- contextPath.length() GControllersec.java /Gli/g_list.ksmart_g<-- command GControllersec.java ----------GControllersec.java---------------- 10-03 /Gli/g_list.ksmart_g if 조건문 통과 04_02 execute GListProAction.java javax.naming.InitialContext@51a7dfaf<-- init BoardDAO() 02 gAllSelect Gdaosec.java jdbc:oracle:thin:@localhost:1521:XE, UserName=DEV35ID, Oracle JDBC driver<-- conn oracle.jdbc.driver.T4CPreparedStatement@55984143<-- pstmt org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@109ad594<-- rs true 쿼리실행결과활용 [Goods [g_code=goods_2, ora_id=id002, g_name=2, g_cate=2, g_price=2, g_color=2, g_size=2, g_date=20/05/08, g_desc=2]]<-alg 쿼리실행결과활용 [Goods [g_code=goods_2, ora_id=id002, g_name=2, g_cate=2, g_price=2, g_color=2, g_size=2, g_date=20/05/08, g_desc=2], Goods [g_code=goods_3, ora_id=id003, g_name=3, g_cate=3, g_price=3, g_color=3, g_size=3, g_date=20/05/08, g_desc=3]]<-alg 쿼리실행결과활용 [Goods [g_code=goods_2, ora_id=id002, g_name=2, g_cate=2, g_price=2, g_color=2, g_size=2, g_date=20/05/08, g_desc=2], Goods [g_code=goods_3, ora_id=id003, g_name=3, g_cate=3, g_price=3, g_color=3, g_size=3, g_date=20/05/08, g_desc=3], Goods [g_code=goods_4, ora_id=id003, g_name=3, g_cate=3, g_price=3, g_color=3, g_size=3, g_date=20/05/08, g_desc=3]]<-alg 쿼리실행결과활용 [Goods [g_code=goods_2, ora_id=id002, g_name=2, g_cate=2, g_price=2, g_color=2, g_size=2, g_date=20/05/08, g_desc=2], Goods [g_code=goods_3, ora_id=id003, g_name=3, g_cate=3, g_price=3, g_color=3, g_size=3, g_date=20/05/08, g_desc=3], Goods [g_code=goods_4, ora_id=id003, g_name=3, g_cate=3, g_price=3, g_color=3, g_size=3, g_date=20/05/08, g_desc=3], Goods [g_code=goods_5, ora_id=id003, g_name=3, g_cate=3, g_price=3, g_color=3, g_size=3, g_date=20/05/08, g_desc=3]]<-alg false<-isRedirect MActionForwardsec.java /glist/g_list.jsp<-path MActionForwardsec.java 11-02 forward 조건문 통과 /glist/g_list.jsp<--forward.getPath() [Goods [g_code=goods_2, ora_id=id002, g_name=2, g_cate=2, g_price=2, g_color=2, g_size=2, g_date=20/05/08, g_desc=2], Goods [g_code=goods_3, ora_id=id003, g_name=3, g_cate=3, g_price=3, g_color=3, g_size=3, g_date=20/05/08, g_desc=3], Goods [g_code=goods_4, ora_id=id003, g_name=3, g_cate=3, g_price=3, g_color=3, g_size=3, g_date=20/05/08, g_desc=3], Goods [g_code=goods_5, ora_id=id003, g_name=3, g_cate=3, g_price=3, g_color=3, g_size=3, g_date=20/05/08, g_desc=3]]<- get_alg
Gdao.java
//02 리스트 출력 메서드 선언
		public ArrayList<Goods> gAllSelect() throws SQLException {
			System.out.println("02 gAllSelect Gdaosec.java" );
			//db연결
			conn = ds.getConnection();
			System.out.println(conn + "<-- conn");
			//쿼리준비
			pstmt = conn.prepareStatement("select * from oracle_goods");
			System.out.println(pstmt + "<-- pstmt");
			//쿼리실행
			rs = pstmt.executeQuery();
			System.out.println(rs + "<-- rs");
           	System.out.println(rs.next());
			//쿼리실행결과활용
			alg = new ArrayList<Goods>();
			while(rs.next()) {
				System.out.println("쿼리실행결과활용");
				g = new Goods();
				g.setG_code(rs.getString("G_CODE"));
				g.setOra_id(rs.getString("ORA_ID"));
				g.setG_name(rs.getString("G_NAME"));
				g.setG_cate(rs.getString("G_CATE"));
				g.setG_price(rs.getString("G_PRICE"));
				g.setG_color(rs.getString("G_COLOR"));
				g.setG_size(rs.getString("G_SIZE"));
				g.setG_date(rs.getString("G_DATE"));
				g.setG_desc(rs.getString("G_DESC"));
				alg.add(g);
				System.out.println(alg+"<-alg");
			}
			//db연결종료
			rs.close();
			pstmt.close();
			conn.close();
			return alg;
		}

 

rs.next()를 콘솔에 출력해서 첫번째 줄이 리스트에 안나오는 거였음... 찾아내고 완전 웃겨서 뒤집어졌음

'JSP' 카테고리의 다른 글

[Servlet] filter  (0) 2020.05.13
[Servlet] Servlet  (0) 2020.05.13
MVC Pattern / Servlet  (0) 2020.05.13
java servlet life cycle  (0) 2020.05.08

서블릿 생성하기

package kr.or.ksmart.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Controller01
 */
@WebServlet("/Controller01")
public class Controller01 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Controller01() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

서블릿 설정하고 생성하기

 

 

package kr.or.ksmart.controller;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
		description = "콘트롤러 테스트", 
		urlPatterns = { "*.do" }, 
		initParams = { 
				@WebInitParam(name = "firstParam", value = "초기값확인", description = "초기값")
		})
public class Controller02 extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public Controller02() {
        super();
        // TODO Auto-generated constructor stub
    }

	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
	}

	public void destroy() {
		// TODO Auto-generated method stub
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

서블릿 생성시 eclipse에서 제공하는 기능을 통해 쉽게 서블릿 내부 설정 가능

 


분기처리

package kr.or.ksmart.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet은 HttpServlet 클래스를 상속받아 구현한다.
 * Servlet의 정보(url 맵핑 및 초기 설정값)은 @WebServlet 어노테이션 혹은 web.xml에서 설정할 수 있다.
 * 
 */

@WebServlet(
		description = "콘트롤러 테스트", 
		urlPatterns = { "*.do" }, 
		initParams = { 
				@WebInitParam(name = "firstParam", value = "초기값확인", description = "초기값")
		})
public class Controller02 extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public Controller02() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    /**
     * Servlet이 객체화 되었을 때 초기 1회 실행되는 메서드
     * (객체화 되었을 때 -> 1회 처음 호출되었을 때 객체화 됨)
     */
	public void init(ServletConfig config) throws ServletException {
		String firstParam = config.getInitParameter("firstParam");
		System.out.println(firstParam + "<<- Servlet 실행시 초기 1회 실행되는 메서드의 파라미터 ");
	}

	public void destroy() {
		System.out.println("해당 서블릿의 객체가 소멸될 때 호출되는 메서드");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*
		 * 콘트롤러에서 분기작업하기
		 * HttpServletRequest : 호출에 관련된 정보가 담겨있다.
		 * 
		 */
		
		String uri = request.getRequestURI();
		String contextPath = request.getContextPath();
		//contextPath는 변동 우려가 있으므로 불안한 요소가 된다. 불안요소를 제거하여 분기작업을 한다.
		uri = uri.replace(contextPath, "");
		
		System.out.println(uri + "호출된 uri");
		
		if("/*.do".equals(uri)) {
			//응답코드를 페이지 없는 응답코드로 지정
			response.setStatus(404);
		}else if("/main.do".equals(uri)){
			//forward -> request, response 객체를 getRequestDispatcher에 서술된(인수) 페이지로 위임
			request.setAttribute("myName", "홍길동");
			request.getRequestDispatcher("/main.jsp").forward(request, response);
		}else {
			
			/*
			 * 서블릿 자체에서 화면을 직접 그리기가 어려우므로 포워드의 기술을 활용하여 화면 렌더링을 jsp로 전달
			 * 
			 * 웹 화면에서 필요한 정보 
			 * Encoding, header, content type
			 */
			
			response.setCharacterEncoding("UTF-8");
			response.setContentType("text/html");
			
			PrintWriter out = response.getWriter();
			out.println("<meta charaset=\"UTF-8\">");
			out.println("Call My Servlet 내 서블릿 호출");
			out.flush();
			out.close();
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		doGet(request, response);
	}

}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>my name</h1>
<%= request.getAttribute("myName") %>

</body>
</html>

 

확장자를 통해 분기됨을 알 수 있음.

 

 

연결이 정상적으로 되었을 경우의 status는 200.

*.do 페이지가 열렸을 경우 연결이 실패하도록 함.

 


실습

CotrollerEx01.java
package kr.or.ksmart.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
		description = "콘트롤러 분기작업 실습", 
		urlPatterns = { 
				"*.my"
		})
public class CotrollerEx01 extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
    public CotrollerEx01() {
        super();

    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*
		 * 실습1. main.my와 mypage.my 페이지가 있다.
		 * 콘트롤러에서 해당 url을 받아와 view단과 연결하는 코드를 작성하여라.
		 */
		
		String uri = request.getRequestURI();
		String contextPath = request.getContextPath();
		uri = uri.replace(contextPath, "");
		System.out.println(uri+"<<uri");
		
		String forwardPath = null;
		
		if("/main.my".equals(uri)) {
			forwardPath = "/main.jsp";
		}else if("/mypage.my".equals(uri)) {
			forwardPath = "/mypage.jsp";
		} else {
			response.setStatus(404);
		};
		
		if(forwardPath != null) {
			request.getRequestDispatcher("/WEB-INF/views"+forwardPath).forward(request, response);
		};
				
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	}

}
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>my name</h1>
<%= request.getAttribute("myName") %>
<a href = "<%=request.getContextPath()%>/mypage.my">mypage</a>
</body>
</html>
mypage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>my page</h1>
<a href = "<%=request.getContextPath()%>/main.my">main</a>
</body>
</html>

*.jsp 파일이 실행되면 안되므로 파일의 경로를 wepcontent >wep-inf 하위로 설정.

경로에서 jsp파일 직접 실행 되지는 않지만 forward를 통해서는 화면이 보여진다.

WebContent/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
response.sendRedirect(request.getContextPath()+"/main.my");
%>

 

index를 생성해 http://로컬호스트:포트번호/프로젝트명/ 으로 접근시 index 페이지가 열리고, index에서 main.my로 접근하도록 리다이렉트. main.my는 컨트롤러에서 forward를 이용해 main.jsp로 request,response 정보를 위임.

'JSP' 카테고리의 다른 글

[Servlet] filter  (0) 2020.05.13
[Model2] 실습하기  (0) 2020.05.13
MVC Pattern / Servlet  (0) 2020.05.13
java servlet life cycle  (0) 2020.05.08

Model 1 > 직관적인 작업으로 작업속도가 빠르지만 같은 코드가 반복되고 분기작업을 하기 애매함.

Model 2

장점

  • 코드간결
  • 유지보수 용이
  • 확장 용이 : 역할을 분리하였기 때문에 조합을 통해 확장하기가 용이함.

단점

  • 초기 설정 작업이 MODEL1 보다 많아 작업 시간 오래 걸린다.
  • 아키텍처에 관련한 이해도 필요 (분기작업에 대한 설계가 필요)
  • 관리할 파일이 많아짐 

Controller : servlet 위에서 url기준으로 분기작업. = front controller

Cotroller>Service>Dao

(FrameWork가 작업을 쉽게 도와줌)

 


Servlet

  • 자바를 사용하여 웹을 만들기 위해 필요한 기술
  • 웹페이지 등을 동적으로 생성하거나 데이터 처리를 수행하기 위해 자바로 작성된 프로그램
  • Java Thread를 이용하여 동작한다 (was의 mainmethod 실행후의 thread)
  • 자바로 구현 된 CGI (공통게이트웨이인터페이스)
* CGI (common gateway interface : 공통 게이트웨이 인터페이스)

-공통 게이트웨이 인터페이스(common gateway interface)의 약어로, 웹서버와 외부 프로그램 사이에서 정보를 주고받는 방법이나 규약

-웹서버는 요청에 의해 응답을 HTML로만 보여주기때문에 HTML만으로는 모든 정보를 다 처리 할 수가 없다. 따라서 요청과 응답에 따른 양방향으로 정보처리 하기 위해서는 외부 프로그램을 수행하여 그 결과를 HTML형태로 보여주는 방식인데 이것을 CGI라고 한다.


-넓은 의미로는 CGI를 수행하는 프로그램을 CGI라고 하기도 한다.

 


서블릿 동작 원리

was > servlet container  : servlet의 객체화 및 종료

요청>request,respose생성>servlet분석>servlet검색(thread)> service >doGet ,doPost() 순환

 


서블릿 생명주기

  • servlet 생명주기는 servlet container에서 관리하며, servlet 생성과 소멸 관리
  • servlet 소멸 후에 Garbage Collection에서 메모리 관리
  • 메서드 실행 순서
    1. init() :  최초 1실행 시 (객체화 시) 실행
    2. sevice() : doGet(), doPost(), toDelete(), toPut()  http환경으로 최적화 되어 분기되어 실행
    3. destroy() :  서블릿 제거 시 실행 1실행 (garbage collection 수행 시)

HttpServlet

  • GenericServlet(추상클래스)을 상속받아 구현이 되었으며, http 환경에 맞도록 최적화(재가공)
  • doGet(), doPost() 메서드가 분기된 클래스직렬화 : 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술

* 직렬화 : 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술

 

'JSP' 카테고리의 다른 글

[Model2] 실습하기  (0) 2020.05.13
[Servlet] Servlet  (0) 2020.05.13
java servlet life cycle  (0) 2020.05.08
MVC model2  (2) 2020.05.07

init () 메소드를 호출하여 초기화.

service () 메소드를 호출 하여 클라이언트의 요청을 처리.

(init 메소드는 처음 한번만 실행되고 이후 service()가 처리.)

destroy () 메소드를 호출하여 종료.

JVM의 가비지 컬렉터에 의해 가비지 수집.

'JSP' 카테고리의 다른 글

[Servlet] Servlet  (0) 2020.05.13
MVC Pattern / Servlet  (0) 2020.05.13
MVC model2  (2) 2020.05.07
200417  (0) 2020.04.17

ActionForward 클래스 통해 생성된 객체 내부 //redirect/forward 결정 경로세팅역할 
주소값: ~~ 
private boolean isRedirect=false; // true: Redirect 또는 false: forward(주소창의경로그대로,실제내용은forward경로의내용) 결정 
private String path=null; 

 

redirect > ?키=값으로 이루어진 데이터만 이동 가능하고, 주소가 변할 경우에 데이터가 사라진다.

forward > redirect보다 대용량의 데이터를 제어할 수 있음

 

 

 

BoardAddAction

ActionForward 클래스 통해 생성된 객체 내부 //redirect/forward 결정 경로세팅역할

주소값: ~~

private boolean isRedirect=true;

// true: Redirect 또는 false: forward(주소창의경로그대로,실제내용은forward경로의내용) 결정

private String path="./BoardList.bo";

 

expression language jhtml

 

oracle model2 분석

 

'JSP' 카테고리의 다른 글

MVC Pattern / Servlet  (0) 2020.05.13
java servlet life cycle  (0) 2020.05.08
200417  (0) 2020.04.17
[JSP + MySQL] 200416 dto dao // select 쿼리 분리  (0) 2020.04.16
package kr.or.ksmart;

interface SampleInterface{
	public void show();
}
interface SampleInterface2{
	public void print();	
}


class Sample implements SampleInterface, SampleInterface2{

	@Override
	public void print() {
		
	}

	@Override
	public void show() {
		
	}
	
}

public class JavaBasic02 {

	public static void main(String[] args) {
		/*
		 * 인터페이스
		 * - interface 라는 키워드로 선언이 가능하다.
		 * - class 키워드 대신 interface 키워드가 붙는다.
		 * - 추상메서드와 상수를 가질 수 있다.
		 * - 인터페이스를 상속받을 시 implements 키워드를 사용한다.
		 * - 인터페이스를 상속받는 클래스는 다중 상속이 가능하다.
		 */
		
		Sample s = new Sample();
		s.print();
		s.show();
		
		SampleInterface ins1= s;
		ins1.show();
		SampleInterface2 ins2= s;
		ins2.print();
		
	}

}

 

'JAVA' 카테고리의 다른 글

DBCP 실습  (0) 2020.05.14
DBCP  (0) 2020.05.14
[JavaBasic] hashCode / equals / instanceof  (0) 2020.04.29
[JavaBasic] 추상화 실습  (0) 2020.04.28
package kr.or.ksmart;

class MemberDto{
	private String name;
	private String age;
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MemberDto other = (MemberDto) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
}

class MemberDto2 {
	private String name;
	private String age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
}

public class JavaBasic01 {

	public static void main(String[] args) {
		/*
		 * equals : 두 객체가 동일한지 비교하는 메서드
		 */
		
		//object의 메서드로 비교
		MemberDto2 m21 = new MemberDto2();
		MemberDto2 m22 = new MemberDto2();
		MemberDto2 m23 = m21;
		
		System.out.println(m21.hashCode() + " <<- m21 object hashcode");
		System.out.println(m22.hashCode() + " <<- m22 object hashcode");
		System.out.println(m21.equals(m22) + " <<- m21/m22 object equals");
		System.out.println(m21.equals(m23) + " <<- m21/m23 object equals");
		
		//오버라이딩 한 메서드로 비교
		MemberDto m1 = new MemberDto();
		MemberDto m2 = new MemberDto();
		System.out.println(m1.hashCode() + " <<- m1 object hashcode");
		System.out.println(m2.hashCode() + " <<- m2 object hashcode");
		System.out.println(m1.equals(m2) + " <<- m1/m2 object equals");

		//해쉬코드
		String str = "홍길동2";
		System.out.println(str.hashCode()+" <<- str hashcode 54150062");

		/**
		 * instanceof 연산자
		 * 두 변수가 같은지 비교할 수 있는 연산자 (클래스 비교)
		 */
		System.out.println((m1 instanceof MemberDto) + " <<- instanceof ");
		
		try {
			//Class  class는 클래스의 메타정보 (jvm에서 활용 등 )
			//Class.forName 사용시 인수에 해당하는 네임스페이스 클래스는 메모리에 등록된다.
			Class getClass = Class.forName("kr.or.ksmart.TestClass");
			System.out.println(getClass.getName() + " <<-getClass.getName()");
			System.out.println(getClass.hashCode() + " <<-getClass.hashCode()" );
			
			
			//동적으로 객체화
			/**
			 *  Class 클래스 내의 newInstance 메서드를 활용하여 동적 인스턴스화
			 *  object 타입으로 결과값이 나온다.
			 */
			Object mObject = getClass.newInstance();
			//동적 인스턴스화는 결과를 다운 캐스팅
			//instanceof 연산자로 비교
			if(mObject instanceof TestClass) {
				TestClass t = (TestClass) mObject;
				t.setName("홍길동");
				System.out.println(t.getName() + " <<- t.getName()");
			}
			
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		
	}

}
package kr.or.ksmart;

public class TestClass {
	private String name;

	public String getName() {
		return name;
	}

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

object의 메서드로 비교


오버라이딩 한 메서드로 비교


해쉬코드

 


instanceof

 

'JAVA' 카테고리의 다른 글

DBCP  (0) 2020.05.14
[JavaBasic] 인터페이스  (0) 2020.04.29
[JavaBasic] 추상화 실습  (0) 2020.04.28
[JavaBasic] 오버라이딩 / final / 추상클래스  (0) 2020.04.28
package kr.or.ksmart;

abstract class User{
	protected String name;
	protected String age;
	public final String getName() {
		return name;
	}
	public final String getAge() {
		return age;
	}
	
	public abstract void setUserInfo(String name, String age);
	
}

class CompanyUser extends User {

	@Override
	public void setUserInfo(String name, String age) {
		super.name = name;
		this.age = age;
		
	}
}


public class JavaBasicEx01 {
	public static void main(String[] args) {
		/*
		 * 실습1. 
		 * User 추상 클래스가 있다. User 추상 클래스를 확장하여 CompanyUser를 구현하고 호출하여라.
		 */
		
		User u = new CompanyUser();
		u.setUserInfo("홍길동", "18");
		System.out.println("이름 : "+u.getName()+"\n나이 : "+u.getAge());
	}
}


package kr.or.ksmart;
abstract class Car{
	private int gas;
	private int num;
	private String  carName;
	public Car (int gas, int num, String  carName) {
		this.gas = gas;
		this.num = num;
		this.carName = carName;
	}
	
	public abstract String carInfo();
	
	public final int getGas() {
		return gas;
	}
	public final int getNum() {
		return num;
	}
	public final String getCarName() {
		return carName;
	}
}

class Bus extends Car {

	public Bus(int gas, int num, String carName) {
		super(gas, num, carName);
		// TODO Auto-generated constructor stub
	}

	@Override
	public String carInfo() {
		int gas = super.getGas();
		int num = super.getNum();
		String carName = super.getCarName();
		String carInfo = "연료 : "+ gas +"\n번호 : "+ num +"\n차이름 : "+ carName; 
		return carInfo;
	}
	
}

public class JavaBasicEx02 {

	public static void main(String[] args) {
		/*
		 * 실습2.
		 * Car라는 추상 클래스가 있다. 
		 * Car라는 추상 클래스를 확장하여 Bus클래스를 구현하고 carInfo()메서드를 호출하여라.
		 * carInfo : 부모 필드의 gas, num, carName의 값을 문자 결합 연산자를 사용하여 car의 정보를 출력시키는 메서드 
		 */
		Car car = new Bus(20, 1234, "버스1234");
		System.out.println(car.carInfo());
	}
}


package kr.or.ksmart;

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

class ProductDto{
	private String productName; //상품명
	private int price; //가격
	private String productType; //상품분류 (임대 혹은 판매)
	public String getProductName() {
		return productName;
	}
	public void setProductName(String productName) {
		this.productName = productName;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public String getProductType() {
		return productType;
	}
	public void setProductType(String productType) {
		this.productType = productType;
	}
}

//상품매출 클래스
abstract class ProductSales{
	/**
	 * 총 분류 총합 판매 내역 등록
	 * */
	public abstract void setProductSale(List<ProductDto> productList);
	/**
	 * 분기 및 분류별 합산
	 * @return int
	 */
	public abstract int quarterSum();
	/**
	 * 분기별 최대 판매 및 임대 상품명
	 * @return String
	 */
	public abstract String maxProductName();
	/**
	 * 분기별 최소 판매 및 임대 상품명
	 * @return String
	 */
	public abstract String minProductName();
}
//임대상품 
class ProductLease extends ProductSales{
	List<ProductDto> productLeaseList = null;
	ProductDto pDto = null;
	@Override
	public void setProductSale(List<ProductDto> productList) {
		productLeaseList = new  ArrayList<ProductDto>();
		if(productList != null) {
			System.out.println("-----임대상품등록시작-----");
			for(int i = 0 ; i <productList.size(); i++) {
				if("임대".equals(productList.get(i).getProductType())) {
					System.out.println(i);
					pDto = new ProductDto();
					pDto.setPrice(productList.get(i).getPrice());
					pDto.setProductName(productList.get(i).getProductName());
					pDto.setProductType(productList.get(i).getProductType());
					productLeaseList.add(pDto);
				}
			}
			System.out.println("-----임대상품등록완료-----");
		}
	}

	@Override
	public int quarterSum() {
		System.out.print("분기 임대 총합 : ");
		int sum = 0;
		for(int i = 0 ; i <productLeaseList.size(); i++) {
				sum += productLeaseList.get(i).getPrice();
			}
		return sum;
	}

	@Override
	public String maxProductName() {
		System.out.print("분기 최대 임대 상품 : ");
		String maxProductName = null;
		int num = 0;
		
		for(int i = 0 ; i <productLeaseList.size(); i++) {
			if(num == 0) {
				num = productLeaseList.get(i).getPrice();
				maxProductName = productLeaseList.get(i).getProductName();
			} else {
				if(productLeaseList.get(i).getPrice() > num) {
					maxProductName = productLeaseList.get(i).getProductName();
					num = productLeaseList.get(i).getPrice();
				}
			}
		}
		return maxProductName;
	}

	@Override
	public String minProductName() {
		System.out.print("분기 최소 임대 상품 : ");
		String minProductName = null;
		int num = 0;
		for(int i = 0 ; i <productLeaseList.size(); i++) {
			if( num == 0) {
				minProductName = productLeaseList.get(i).getProductName();
				num = productLeaseList.get(i).getPrice();
			} else {
				if(productLeaseList.get(i).getPrice() < num) {
					minProductName = productLeaseList.get(i).getProductName();
					num = productLeaseList.get(i).getPrice();
				}
			}
		}
		return minProductName;
	}
}
//판매상품
class ProductSale extends ProductSales {
	List<ProductDto> productLeaseList = null;
	ProductDto pDto = null;
	@Override
	public void setProductSale(List<ProductDto> productList) {
		System.out.println("-----판매상품등록시작-----");
		productLeaseList = new  ArrayList<ProductDto>();
		for(int i = 0 ; i <productList.size(); i++) {
			if("판매".equals(productList.get(i).getProductType())) {
				System.out.println(i);
				pDto = new ProductDto();
				pDto.setPrice(productList.get(i).getPrice());
				pDto.setProductName(productList.get(i).getProductName());
				pDto.setProductType(productList.get(i).getProductType());
				productLeaseList.add(pDto);
			}
		}
		System.out.println("-----판매상품등록완료-----");
	}

	@Override
	public int quarterSum() {
		System.out.print("분기 판매 총합 : ");
		int sum = 0;
		for(int i = 0 ; i <productLeaseList.size(); i++) {
				sum += productLeaseList.get(i).getPrice();
			}
		return sum;
	}

	@Override
	public String maxProductName() {
		System.out.print("분기 최대 판매 상품 : ");
		String maxProductName = null;
		int num = 0;
		for(int i = 0 ; i <productLeaseList.size(); i++) {
			if( num == 0) {
				num = productLeaseList.get(i).getPrice();
				maxProductName = productLeaseList.get(i).getProductName();
			}else {
				if(productLeaseList.get(i).getPrice() > num) {
					num = productLeaseList.get(i).getPrice();
					maxProductName = productLeaseList.get(i).getProductName();
				}
			}
		}
		return maxProductName;
	}

	@Override
	public String minProductName() {
		System.out.print("분기 최소 판매 상품 : ");
		String minProductName = null;
		int num = 0;
		for(int i = 0 ; i <productLeaseList.size(); i++) {
			if(num == 0) {
				num = productLeaseList.get(i).getPrice();
				minProductName = productLeaseList.get(i).getProductName();
			}else {
				if(productLeaseList.get(i).getPrice() < num) {
					num = productLeaseList.get(i).getPrice();
					minProductName = productLeaseList.get(i).getProductName();
				}
			}
		}
		return minProductName;
	}
}

public class JavaBasicEx03 {

	public static void main(String[] args) {		
		//db에서 판매 목록 가지고 왔다는 가정
		List<ProductDto> productSaleList = getPoductList();
		
		/*
		 * 실습3. ProductSales은 상품의 매출을 나타낼 수 있는 추상 클래스이다.
		 *   ProductLease 클래스는 임대상품를 담당하고,
		 *   ProductSale 클래스는 판매상품을 담당한다.
		 *   ProductLease와 ProductSale 클래스는 ProductSales 추상클래스를
		 *   확장하여 추상클래스의 메서드를 구현하고 
		 *   출력을 하여라.
		 *   메서드기능 : 
		 *   quarterSum -> 분기별 합산(분류에 맞는 전체 상품 가격 합산)
		 *   maxProductName -> 최고 매출의 상품명
		 *   minProductName -> 최소의 매출 상품명
		 */
		
		System.out.println("======임대상품매출======");
		ProductSales pl = new ProductLease();
		pl.setProductSale(productSaleList);
		System.out.println(pl.quarterSum());
		System.out.println(pl.maxProductName());
		System.out.println(pl.minProductName());
		System.out.println("====================\n");
		
		System.out.println("======판매상품매출======");
		ProductSales ps = new ProductSale();
		ps.setProductSale(productSaleList);
		System.out.println(ps.quarterSum());
		System.out.println(ps.maxProductName());
		System.out.println(ps.minProductName());
		System.out.println("====================");
	}
	
	/**
	 * 디비에서 상품 판매 및 임대 목록 가지고 온다는 가정
	 * @return List<ProductDto>
	 */
	public static List<ProductDto> getPoductList(){
		
		List<ProductDto> productSaleList = new ArrayList<ProductDto>();
		ProductDto pDto = null;
		pDto = new ProductDto();
		pDto.setPrice(50000);
		pDto.setProductName("임대상품A");
		pDto.setProductType("임대");
		productSaleList.add(pDto);
		pDto = new ProductDto();
		pDto.setPrice(60000);
		pDto.setProductName("임대상품B");
		pDto.setProductType("임대");
		productSaleList.add(pDto);
		pDto = new ProductDto();
		pDto.setPrice(30000);
		pDto.setProductName("임대상품C");
		pDto.setProductType("임대");
		productSaleList.add(pDto);
		pDto = new ProductDto();
		pDto.setPrice(15000);
		pDto.setProductName("판매상품A");
		pDto.setProductType("판매");
		productSaleList.add(pDto);
		pDto = new ProductDto();
		pDto.setPrice(21000);
		pDto.setProductName("판매상품B");
		pDto.setProductType("판매");
		productSaleList.add(pDto);
		pDto = new ProductDto();
		pDto.setPrice(24000);
		pDto.setProductName("판매상품C");
		pDto.setProductType("판매");
		productSaleList.add(pDto);	
		
		return productSaleList;
	}

}


반복작업 최소화

package kr.or.ksmart;

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

class ProductSumDto{
	private int totalPrice;
	private String maxProductName;
	private String minProductName;
	public int getTotalPrice() {
		return totalPrice;
	}
	public void setTotalPrice(int totalPrice) {
		this.totalPrice = totalPrice;
	}
	public String getMaxProductName() {
		return maxProductName;
	}
	public void setMaxProductName(String maxProductName) {
		this.maxProductName = maxProductName;
	}
	public String getMinProductName() {
		return minProductName;
	}
	public void setMinProductName(String minProductName) {
		this.minProductName = minProductName;
	}	
}

class ProductDto{
	private String productName; //상품명
	private int price; //가격
	private String productType; //상품분류 (임대 혹은 판매)
	public String getProductName() {
		return productName;
	}
	public void setProductName(String productName) {
		this.productName = productName;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public String getProductType() {
		return productType;
	}
	public void setProductType(String productType) {
		this.productType = productType;
	}
}

//상품매출 클래스
abstract class ProductSales{
	/**
	 * 총 분류 총합 판매 내역 등록
	 * */
	public abstract void setProductSale(List<ProductDto> productList);
	/**
	 * 분기 및 분류별 합산
	 * @return int
	 */
	public abstract int quarterSum();
	/**
	 * 분기별 최대 판매 및 임대 상품명
	 * @return String
	 */
	public abstract String maxProductName();
	/**
	 * 분기별 최소 판매 및 임대 상품명
	 * @return String
	 */
	public abstract String minProductName();
	
	protected final ProductSumDto setProductList(List<ProductDto> productList, String getType) {
		ProductSumDto sumDto = new ProductSumDto();
		
		int sum = 0;
		String minProductName = null;
		String maxProductName = null;
		
		if(productList != null) {
			int minPrice = 0;
			int maxPrice = 0;
			for(int i=0; i < productList.size(); i++) {
				ProductDto dto = productList.get(i);
				int price = dto.getPrice();
				String name = dto.getProductName();
				String type = dto.getProductType();
				if(getType.equals(type)) {
					sum += price;
					if(minPrice == 0) {
						minPrice = price;
						minProductName = name;
					}else {
						if(price > minPrice) {
							minPrice = price;
							minProductName = name;
						}
					}
					if(maxPrice == 0) {
						maxPrice = price;
						maxProductName = name;
					}else {
						if(price < maxPrice) {
							maxPrice = price;
							maxProductName = name;
						}
					}
				}
			}
		}
		
		sumDto.setTotalPrice(sum);
		sumDto.setMaxProductName(maxProductName);
		sumDto.setMinProductName(minProductName);
		
		return sumDto;
	} 
	
}
//임대상품 
class ProductLease extends ProductSales{
	
	private int sum;
	private String maxProductName;
	private String minProductName;
	
	@Override
	public void setProductSale(List<ProductDto> productList) {
		ProductSumDto sumDto =  super.setProductList(productList, "임대");
		this.sum = sumDto.getTotalPrice();
		this.maxProductName = sumDto.getMaxProductName();
		this.minProductName = sumDto.getMinProductName();
	}

	@Override
	public int quarterSum() {
		return sum;
	}

	@Override
	public String maxProductName() {
		return maxProductName;
	}

	@Override
	public String minProductName() {
		return minProductName;
	}
	
}
//판매상품
class ProductSale extends ProductSales{
	
	private int sum;
	private String maxProductName;
	private String minProductName;
	
	@Override
	public void setProductSale(List<ProductDto> productList) {
		ProductSumDto sumDto =  super.setProductList(productList, "판매");
		this.sum = sumDto.getTotalPrice();
		this.maxProductName = sumDto.getMaxProductName();
		this.minProductName = sumDto.getMinProductName();
	}

	@Override
	public int quarterSum() {
		return sum;
	}

	@Override
	public String maxProductName() {
		return maxProductName;
	}

	@Override
	public String minProductName() {
		return minProductName;
	}
}

public class JavaBasicEx03 {

	public static void main(String[] args) {		
		//db에서 판매 목록 가지고 왔다는 가정
		List<ProductDto> productSaleList = getPoductList();
		
		/*
		 * 실습3. ProductSales은 상품의 매출을 나타낼 수 있는 추상 클래스이다.
		 *   ProductLease 클래스는 임대상품를 담당하고,
		 *   ProductSale 클래스는 판매상품을 담당한다.
		 *   ProductLease와 ProductSale 클래스는 ProductSales 추상클래스를
		 *   확장하여 추상클래스의 메서드를 구현하고 
		 *   출력을 하여라.
		 *   메서드기능 : 
		 *   quarterSum -> 분기별 합산(분류에 맞는 전체 상품 가격 합산)
		 *   maxProductName -> 최고 매출의 상품명
		 *   minProductName -> 최소의 매출 상품명
		 * */
		
		ProductSales pro = new ProductLease();
		pro.setProductSale(productSaleList);
		System.out.println(pro.quarterSum());
		System.out.println(pro.maxProductName());
		System.out.println(pro.minProductName());

	}
	
	/**
	 * 디비에서 상품 판매 및 임대 목록 가지고 온다는 가정
	 * @return List<ProductDto>
	 */
	public static List<ProductDto> getPoductList(){
		
		List<ProductDto> productSaleList = new ArrayList<ProductDto>();
		ProductDto pDto = null;
		pDto = new ProductDto();
		pDto.setPrice(50000);
		pDto.setProductName("임대상품A");
		pDto.setProductType("임대");
		productSaleList.add(pDto);
		pDto = new ProductDto();
		pDto.setPrice(60000);
		pDto.setProductName("임대상품B");
		pDto.setProductType("임대");
		productSaleList.add(pDto);
		pDto = new ProductDto();
		pDto.setPrice(30000);
		pDto.setProductName("임대상품C");
		pDto.setProductType("임대");
		productSaleList.add(pDto);
		pDto = new ProductDto();
		pDto.setPrice(15000);
		pDto.setProductName("판매상품A");
		pDto.setProductType("판매");
		productSaleList.add(pDto);
		pDto = new ProductDto();
		pDto.setPrice(21000);
		pDto.setProductName("판매상품B");
		pDto.setProductType("판매");
		productSaleList.add(pDto);
		pDto = new ProductDto();
		pDto.setPrice(24000);
		pDto.setProductName("판매상품C");
		pDto.setProductType("판매");
		productSaleList.add(pDto);	
		
		return productSaleList;
	}

}

 

+ Recent posts