반응형

전체구조

pom.xml
->앞서 게시한 xml방식과 동일

SpringConfigClass.java

package com.springdrill.config;

//web.xml에 해당
import javax.servlet.Filter;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

//public class SpringConfigClass implements WebApplicationInitializer{
//
//	@Override
//	public void onStartup(ServletContext servletContext) throws ServletException {
//		
		// Spring MVC 프로젝트 설정을 위해 작성하는 클래스의 객체를 생성한다.
//		AnnotationConfigWebApplicationContext servletAppContext = new AnnotationConfigWebApplicationContext();
//		servletAppContext.register(ServletAppContext.class);
//		
//		// 요청 발생 시 요청을 처리하는 서블릿을 DispatcherServlet으로 설정해준다.
//		DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppContext);
//		ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", dispatcherServlet);
//		
//		// 부가 설정
//		servlet.setLoadOnStartup(1);
//		servlet.addMapping("/");
//		
//		// Bean을 정의하는 클래스를 지정한다
//		AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();
//		rootAppContext.register(RootAppContext.class);
//		
//		ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
//		servletContext.addListener(listener);
//		
//		// 파라미터 인코딩 설정
//		FilterRegistration.Dynamic filter = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
//		filter.setInitParameter("encoding", "UTF-8");
//		filter.addMappingForServletNames(null, false, "dispatcher");
//	}
//}

public class SpringConfigClass extends AbstractAnnotationConfigDispatcherServletInitializer{
	// DispatcherServlet에 매핑할 요청 주소를 셋팅한다.
	@Override
	protected String[] getServletMappings() {
		// TODO Auto-generated method stub
		return new String[] {"/"};
	}
	
	// Spring MVC 프로젝트 설정을 위한 클래스를 지정한다.
	@Override
	protected Class<?>[] getServletConfigClasses() {
		// TODO Auto-generated method stub
		return new Class[] {ServletAppContext.class};
	}
	
	// 프로젝트에서 사용할 Bean들을 정의기 위한 클래스를 지정한다.
	@Override
	protected Class<?>[] getRootConfigClasses() {
		// TODO Auto-generated method stub
		return new Class[] {RootAppContext.class};
	}
	
	// 파라미터 인코딩 필터 설정(한글설정) 
	@Override
	protected Filter[] getServletFilters() {
		// TODO Auto-generated method stub
		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
		encodingFilter.setEncoding("UTF-8");
		return new Filter[] {encodingFilter};
	}
}

 

ServletAppContext.java

package com.springdrill.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// Spring MVC 프로젝트에 관련된 설정을 하는 클래스, config/servlet-context.xml에 해당

@Configuration
// Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다.
@EnableWebMvc
// 스캔할 패키지를 지정한다.
@ComponentScan("com.springdrill.controller")
public class ServletAppContext implements WebMvcConfigurer{
	// Controller의 메서드가 반환하는 jsp의 이름 앞뒤에 경로와 확장자를 붙혀주도록 설정한다.
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("/WEB-INF/views/", ".jsp");
	}
	
	// 정적 파일의 경로를 매핑한다.
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		WebMvcConfigurer.super.addResourceHandlers(registry);
		registry.addResourceHandler("/**").addResourceLocations("/resources/");
	}
}

 

RootAppContext.java

package com.springdrill.config;

import org.springframework.context.annotation.Configuration;

// 프로젝트 작업시 사용할 bean을 정의하는 클래스
@Configuration
public class RootAppContext {

}
반응형

-수정과 삭제버튼은 로그인 한 사람과 작성한 사람이 같을 경우에만 노출한다.
-직접 주소를 입력하고 요청할 경우를 대비해 인터셉터로 처리해준다.  

-BoardController.java-

->수정하기나 삭제하기 눌렀을때 어떤걸 수정하고 삭제할 지 알아야 하기 때문의 글의 인덱스 번호가 필요하다.

-read.jsp-

 

=========수정하기 , 삭제하기 버튼 노출여부 만들기============

로그인 한사람과 작성자의 인덱스 번호를 비교해야 한다. (같을 때만 보이게 한다)

->글정보 가져올때 작성자 인덱스 정보도 가져오도록 쿼리문 추가한다

-BoardController.java-

 

직접주소를 치고 들어갈 있기에 방지처리해준다. (인터셉터로 처리)

->게시글 정보가져오기-작성자 인덱스 번호가 있으니까 호출해서 받아온다.

-BoardService.java-

//수정과 삭제에만 반응할 수 있도록 세팅한다.
->read modify 주소에서만 통과하도록 세팅  한다.

-boardController--

-not_writer.jsp-

-> 주소창에 직접입력했을때의 오류처리해준다.

======인터셉터 등록=====

boardService 주입

loginUserBean 이미 주입되있으므로 따로 안만들어도 된다.

작성자가 아닌 다른 계정으로 주소장에 delete modify 하면 다음과 같은 메시지 뜬다

 

 

 

 

반응형

===NoticeDetailController.java===

사용자가 요청할 전달했던 id, date서비스를 받아서 사용자에게 돌려주기 위한 출력로직만 남긴다.
->사용자 입력과 출력만 관할하게 한다. 

service.getNotice(id) 메소드를 통해 id값에 해당하는 데이터를 notice 변수에 넣고
notice setAtrribute한다.

===detail.jsp===

그래서 notice를 n으로 바꿔준다

 

===DetailController.java===

package com.mybulletin.web.contoller;

import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

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

import com.mybulletin.web.entity.Notice;
import com.mybulletin.web.service.NoticeService;

@WebServlet("/detail")
public class DetailController extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		int id = Integer.parseInt(request.getParameter("id")); 	
		
		NoticeService service = new NoticeService();
		Notice notice = service.getNotice(id);
	
		request.setAttribute("n", notice);
		request.getRequestDispatcher("WEB-INF/view/notice/detail.jsp").forward(request, response);
	
	
	}	
}

 

===ListController.java===

package com.mybulletin.web.contoller;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

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

import com.mybulletin.web.entity.Notice;
import com.mybulletin.web.service.NoticeService;
@WebServlet("/list")
public class ListContoller extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//list?f=title&q=a
		String field_ = request.getParameter("f");
        String query_ = request.getParameter("q");
        String page_ = request.getParameter("p");
        
        String field = "title";
        if(field_ != null && !field_.equals(""))
            field = field_;
        
        String query = "";
        if(query_ != null && !query_.equals(""))
            query = query_;        
        
        int page = 1;
        if(page_ !=null && !page_.equals(""))
            page = Integer.parseInt(page_);
        
        NoticeService service = new NoticeService(); 
        List<Notice> list = service.getNoticeList(field, query, page);
        int count = service.getNoticeCount(field, query);
        System.out.println(count);
        
        request.setAttribute("list", list);
        request.setAttribute("count", count);
        request.getRequestDispatcher("WEB-INF/view/notice/list.jsp").forward(request, response);            
        }        
    }

 

===NoticeService.java===

package com.mybulletin.web.service;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.mybulletin.web.entity.Notice;

public class NoticeService {
	public List<Notice> getNoticeList(){
	
		return getNoticeList("title", "", 1);	
	}
	public List<Notice> getNoticeList(int page){
		
		return getNoticeList("title", "", page);	
	}
	public List<Notice> getNoticeList(String field, String query, int page){
		
		List<Notice> list = new ArrayList<>();
		
		String sql = "SELECT * FROM ( " + 
				"    SELECT ROWNUM NUM, NOTICE.* " + 
				"    FROM NOTICE  WHERE "+field+" LIKE ? ORDER BY REGDATE DESC " + 
				"    ) " + 
				"WHERE NUM BETWEEN ? AND ? " ;
		
		// 1, 11, 21, 31...-> an = 1+ (page -1) *10
		//10,20, 30,..... -> page* 10		

		String url = "jdbc:oracle:thin:@localhost:1521/myoracle";			
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs= null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, "ora_user2", "0000");		
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "%"+query+"%");
			pstmt.setInt(2, 1+(page-1)*10);
			pstmt.setInt(3, page*10);
			rs = pstmt.executeQuery();
			
			while(rs.next()){ 	
				
			int id = rs.getInt("ID");
			String title = rs.getString("TITLE");		
			String writerId = rs.getString("WRITER_ID"); 
			Date regdate = rs.getDate("REGDATE"); 	
			String hit = rs.getString("HIT"); 
			String files = rs.getString("FILES");
			String content = rs.getString("Content");
			
			Notice notice = new Notice(id, title, writerId, regdate, hit, files, content);	
			
				list.add(notice);
			}				
			
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch(SQLException e) {
				e.printStackTrace();
			}
			finally {
				try {
					if(rs !=null) rs.close();
					if(pstmt !=null) pstmt.close();
				    if(conn !=null) conn.close();
				}catch (Exception e) {
					e.printStackTrace();
				}			
			}					
			return list;	
	}

	
	public int getNoticeCount() { 
		return 0;
	}

	 public int getNoticeCount(String field, String query) {  
		 
		 int count = 0;
			
		  String sql = "SELECT COUNT(ID) COUNT FROM (" + 
					"    SELECT ROWNUM NUM, NOTICE.* " + 
					"    FROM NOTICE  WHERE "+field+" LIKE ? ORDER BY REGDATE DESC " + 				
					"    ) " ;
			
			Connection conn = null;
			PreparedStatement pstmt = null;
			ResultSet rs= null;
			String url = "jdbc:oracle:thin:@localhost:1521/myoracle";	
			
			try {
				Class.forName("oracle.jdbc.driver.OracleDriver"); 
				conn = DriverManager.getConnection(url, "ora_user2", "0000");		
				pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, "%"+query+"%");
				
				rs = pstmt.executeQuery();
				
				if(rs.next())
				count = rs.getInt("count");
							
				
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				} catch(SQLException e) {
					e.printStackTrace();
				}
				finally {
					try {
						if(rs !=null) rs.close();
						if(pstmt !=null) pstmt.close();
					    if(conn !=null) conn.close();
					}catch (Exception e) {
						e.printStackTrace();
					}			
				}			
		return count;
	}

	 
	public Notice getNotice(int id) {
		Notice notice = null;
		
		String sql = "SELECT * FROM NOTICE WHERE ID=?";		
		
		String url = "jdbc:oracle:thin:@localhost:1521/myoracle";			
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs= null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, "ora_user2", "0000");		
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, id);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()){ 	
				
			int nid = rs.getInt("ID");
			String title = rs.getString("TITLE");		
			String writerId = rs.getString("WRITER_ID"); 
			Date regdate = rs.getDate("REGDATE"); 	
			String hit = rs.getString("HIT"); 
			String files = rs.getString("FILES");
			String content = rs.getString("Content");
			
			notice = new Notice(nid, title, writerId, regdate, hit, files, content);								
				}				
			
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch(SQLException e) {
				e.printStackTrace();
			}
			finally {
				try {
					if(rs !=null) rs.close();
					if(pstmt !=null) pstmt.close();
				    if(conn !=null) conn.close();
				}catch (Exception e) {
					e.printStackTrace();
				}			
			}			
		
		return notice;
	}
	
	public Notice getNextNotice(int id) {
		Notice notice = null;
		String sql = "SELECT * FROM NOTICE " + 
				"    WHERE ID = (" + 
				"    SELECT ID FROM NOTICE " + 
				"    WHERE REGDATE >(SELECT REGDATE FROM NOTICE WHERE ID =?) " + 
				"    AND ROWNUM =1 " +  
				" )";
		
		String url = "jdbc:oracle:thin:@localhost:1521/myoracle";			
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs= null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, "ora_user2", "0000");		
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, id);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()){ 	
				
			int nid = rs.getInt("ID");
			String title = rs.getString("TITLE");		
			String writerId = rs.getString("WRITER_ID"); 
			Date regdate = rs.getDate("REGDATE"); 	
			String hit = rs.getString("HIT"); 
			String files = rs.getString("FILES");
			String content = rs.getString("Content");
			
			notice = new Notice(nid, title, writerId, regdate, hit, files, content);								
				}				
			
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch(SQLException e) {
				e.printStackTrace();
			}
			finally {
				try {
					if(rs !=null) rs.close();
					if(pstmt !=null) pstmt.close();
				    if(conn !=null) conn.close();
				}catch (Exception e) {
					e.printStackTrace();
				}			
			}			
		return notice;
	}
	public Notice getPrevNotice(int id) {
		Notice notice = null;
		String sql = "SELECT ID FROM (SELECT * FROM NOTICE ORDER BY REGDATE DESC)" + 
					"WHERE REGDATE < (SELECT REGDATE FROM NOTICE WHERE ID =?)" + 
					"AND ROWNUM = 1";
		
		String url = "jdbc:oracle:thin:@localhost:1521/myoracle";			
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs= null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, "ora_user2", "0000");		
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, id);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()){ 	
				
			int nid = rs.getInt("ID");
			String title = rs.getString("TITLE");		
			String writerId = rs.getString("WRITER_ID"); 
			Date regdate = rs.getDate("REGDATE"); 	
			String hit = rs.getString("HIT"); 
			String files = rs.getString("FILES");
			String content = rs.getString("Content");
			
			notice = new Notice(nid, title, writerId, regdate, hit, files, content);								
				}				
			
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch(SQLException e) {
				e.printStackTrace();
			}
			finally {
				try {
					if(rs !=null) rs.close();
					if(pstmt !=null) pstmt.close();
				    if(conn !=null) conn.close();
				}catch (Exception e) {
					e.printStackTrace();
				}			
			}			
		return notice;
	}
}

 

===detail.jsp===

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ taglib prefix = "c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>
<%@taglib prefix = "fn" uri = "http://java.sun.com/jsp/jstl/functions" %>

<!DOCTYPE html>
<html>
	<head>
	  	<meta charset="UTF-8">
	    <title>게시글</title>	 
	</head>  
    <body>		
	    <div>
	    	<table>
				<tbody>
					<tr>				
						<th>제목</th>
						<td colspan="3">${n.title}</td>
					</tr>
					<tr>
						<th>작성일</th>
						<td>
							<fmt:formatDate pattern = "yyyy/MM/dd hh:mm:ss" value="${n.regdate}"/>
						</td>
					</tr>
					<tr>
						<th>작성자</th>
						<td>${n.writerId}</td>
						<th>조회수</th>
						<td><fmt:formatNumber value = "${n.hit}" /></td>
					</tr>
					<tr>
						<th>첨부파일</th>
						<td colspan="3">
							<c:forTokens var= "fileName" items="${n.files}" delims="," varStatus="st">
								<c:set var = "style" value = ""/>
								<c:if test="${fn:endsWith(fileName , '.zip')}">
									<c:set var = "style" value = "font-weight: bold; color:red;" />
								</c:if>							
								<a href = "${fileName}" style = "${style}" >${fn:toUpperCase(fileName)}</a>
								<c:if test="${!st.last}">
								/
								</c:if>
							</c:forTokens>
						</td>
					</tr>
					<tr class="content">
						<td colspan="4">${n.content}</td>
					</tr>
				</tbody>
			</table>	
	    </div>	
		<div>
			<a href="list">목록</a>
		</div>
				
    </body>    
</html>

===list.jsp===

<%@page import="com.mybulletin.web.entity.Notice"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%> 
<%@taglib prefix = "c" uri ="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>
<%@taglib prefix = "fn" uri = "http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
    <head>
    <meta charset="UTF-8">
    <title>JSP게시판만들기</title>
    <link href="css/list.css" type="text/css" rel="stylesheet" />
    
    </head>
    <body>    
        <div >
            <h3>글 검색 폼</h3>
            <form>
                <fieldset>
                    <legend>글 검색 필드</legend>                    
                    <label>검색분류</label>
                        <select name = "f">
                            <option ${(param.f == "title")? "selected" : ""} value = "title">제목</option>
                            <option ${(param.f == "writer_id")? "selected" : ""} value = "writer_id">작성자</option>
                        </select>
                    <label>검색어</label>
                        <input type = "text" name = "q" value = "${param.q}"/>
                        <input type = "submit" value = "검색">                
                </fieldset>        
            </form>    
        </div>
        
        <div>
            <h3 >글 목록</h3>
            <table >
                <thead>                
                    <tr>
                        <th>번호</th>
                        <th>제목</th>
                        <th>작성자</th>
                        <th>작성일</th>
                        <th >조회수</th>
                    </tr>
                </thead>                            
                <tbody>    
                
                <c:forEach var = "n" items = "${list}">
                    <tr>
                        <td>${n.id}</td>
                        <td><a href="detail?id=${n.id} ">${n.title}</a></td>
                        <td>${n.writerId}</td>
                        <td>
                            <fmt:formatDate pattern = "yyyy/MM/dd" value="${n.regdate}"/>
                        </td>
                        <td><fmt:formatNumber value = "${n.hit}" /></td>
                    </tr>                
                </c:forEach>
                
                <%-- <%}%> --%>                                        
                </tbody>
            </table>
        </div>
        
            <c:set var = "page" value = "${(param.p==null)? 1: param.p}"/>
            <c:set var ="startNum" value = "${page-(page-1)%5}"/>    
            <c:set var ="lastNum" value = "${ fn:substringBefore(Math.ceil(count/10), '.')  }"/>            
 
        <div >
            <!--현재 페이지 -->
            <div><span>${(empty param.p)? 1 : param.p}</span> / ${lastNum} pages</div>
        </div>        
                
        <div>
                    
            <c:if test="${startNum > 1}">
                <a href="?p=${startNum-1}&t=&q=" >이전</a>                
            </c:if>
            <c:if test="${startNum <= 1}">
                <span onclick="alert('이전 페이지가 없습니다.');">이전</span>            
            </c:if>
                            
            <span>
                <c:forEach var = "i" begin= "0" end = "4">
                    <c:if test="${(startNum+i) <= lastNum }">
                        <a class = "text-${(page==(startNum+i))? 'orange': '' } text-bold" href="?p=${startNum+i}&f=${param.f}&q=${param.q}" >${startNum+i}</a>
                    </c:if>
                </c:forEach>
            </span>    
            
            <c:if test="${startNum+4 < lastNum}">
                <a href="?p=${startNum+5}&t=&q=" >다음</a>
            </c:if>
            <c:if test="${startNum+4 > lastNum}">
                <span onclick="alert('다음 페이지가 없습니다.');">다음</span>            
            </c:if>
        </div>
    
    </body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
public: 아무런 제약 없이 모든 접근이 허용된다.
protected: 같은 패키지의 객체와 상속 관계에 있는 객체까지만 접근이 허용된다.
default:  해당 패키지 내에서만 접근이 허용된다.
private: 해당 class 내에서만 접근이 허용된다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
public class AccessModifier {
    
    public static void main(String[] args) {
        
        Wallet myWallet = new Wallet(10000);
        
        myWallet.myMoney -= 2200;
        
        myWallet.checkMyMoney();
    }
}    
    
    class Wallet {
        int myMoney;
        
        public Wallet(int myMoney) {
            this.myMoney = myMoney;                    
        }
        
        public void pay(int payMoney) {
            this.myMoney -= (int)(payMoney *1.1);
        }
        
        public void  checkMyMoney() {
            System.out.println("남은 돈: " + this.myMoney);
        }
        
    }
 
 
 
 
cs

8라인을보면 pay메소드를 활용하지 않고 직접 myMoney에 접근해서 시스템에 의한 지불이 아닌 임의의 지불을 처리했다.
처리되는건 맞지만 시스템에 의한 지불처리가 아니기 때문에 myMoney의 정보를 신뢰할 수 없다. 

그렇기 때문에 pay메소드를 통해 처리되게 해야한다. 
Wallet의 멤버 변수 myMoney는 클래스 내부에서만 접근할 수 있어야한다. 그래서 접근 제어자로 'private'을 사용하여
해당 클래스 내에서만 접근할 수 있게 한다. 
생성자나 pay메소드, checkMyMoney메소드는 외부에서 접근할 수 있도록 public 으로 한다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
public class AccessModifier {
    
    public static void main(String[] args) {
        
        Wallet myWallet = new Wallet(10000);
        
        //myWallet.myMoney -= 2200;
        myWallet.pay(2200);
        
        myWallet.checkMyMoney();
    }
}    
    
    class Wallet {
        private int myMoney;
        
        public Wallet(int myMoney) {
            this.myMoney = myMoney;                    
        }
        
        public void pay(int payMoney) {
            this.myMoney -= (int)(payMoney *1.1);
        }
        
        public void  checkMyMoney() {
            System.out.println("남은 돈: " + this.myMoney);
        }        
    }
 
 
cs

 

남은 돈: 7580

                                                                          

반응형

재귀함수는 메소드 내에서 스스로를 반복적으로 호출하여 처리한다.
단, 무한으로 반복되는 형태가 아닌, 반복의 끝이 반드시 존재한다는 조건이 있어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package chap08.Sample03;
 
public class sample6 {
    static int sum;
 
    public static int sum(int a) {
        sum += a;
        if (a == 0) {
            return sum;
        } else {
            a--;
            return sum(a);
        }
    }
 
    public static void main(String[] args) {
        // 메서드의 인자값 보다 적은 모든 정수의 합
        System.out.println(sum(10));
    }
}
cs

소스코드에서는 10을 인자로 넘겼으며 10을 sum이라는 멤버 변수에 값을 담고 인자값이 0이면 종료시키고 0이 아니면 값을 하나씩 감소시켜서 현재 실행중인 메소드를 0이 될때 까지 계속해서 호출함.

+ Recent posts