SUM, MAX, MIN > 중복 제거하기

SELECT 
	COUNT(DISTINCT NAME)
FROM
	ANIMAL_INS
WHERE
	NAME IS NOT NULL;

oracle에서 중복 제거시에는 DISTINCT를 사용한다.

 

 

GROUP BY > 고양이와 개는 몇 마리 있을까?

SELECT
	ANIMAL_TYPE
    , COUNT(*) COUNT
FROM
	ANIMAL_INS
GROUP BY 
	ANIMAL_TYPE
ORDER BY
	ANIMAL_TYPE ASC
;

ANIMAL_TYPE 에 대해 COUNT를 해야되기 때문에 GROUP BY ANIMAL_TYPE 를 해준다.

CAT, DOG 순서로 배열해야되기 때문에 ORDER BY ANIMAL_TYPE 을 해준다.

ORDER BY의 기본 설정은 ASC이기 때문에 생략 가능하다.

 

 

GROUP BY > 동명 동물 수 찾기

SELECT
	NAME, COUNT(*)
FROM
	ANIMAL_INS
GROUP BY
	NAME
    HAVING COUNT(NAME) >= 2
ORDER BY
	NAME 
;    

GROUP BY 의 조건은 HAVING을 사용하여 두 번 이상 쓰인 이름을 검색한다.

 

 

GROUP BY > 입양 시각 구하기(1)

SELECT
	TO_CHAR(DATETIME, 'HH24'), COUNT(*)
FROM
	ANIMAL_OUTS
WHERE
	TO_CHAR(DATETIME, 'HH24') BETWEEN 9 AND 20
GROUP BY
	TO_CHAR(DATETIME, 'HH24')
ORDER BY
	TO_CHAR(DATETIME, 'HH24')
;

09:00 부터 19:59 까지의 시간대 별로 입양 건수를 조회하기 때문에 DATETIME 컬럼의 시간만 확인 가능하도록 TO_CHAR을 사용한다.

시간대가 정해져있으므로 BETWEEN을 사용하여 조건을 걸어준다.

쿼리문 작성시 유의사항

parameterType에 1개의 Type만 올 수 있다.

 

parameterType이 DTO인 경우 

 

DTO 만들기

com.meida.dto 패키지에 MemberDto 클래스 생성

package com.media.dto;

import lombok.Data;

@Data
public class MemberDto {
	private String m_id;
	private String m_pwd;
	private String m_name;
	private String m_birth;
	private String m_addr;
	private String m_phone;
	private int m_pointz;
	private String g_name;
}

sql query문에서 대소문자를 구분하는건 들어가있는 데이터에만 해당된다.

 

회원 처리용 서비스 만들기

1. root-context

xml 태그 사용 가능하게 만들어주는 역할

service 관련 패키지가 Bean으로 들어온 것을 확인할 수 있음.

즉, 자동으로 관리해주는 대상이 됨.

 

2. MemberServiece.java

package com.media.service;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.media.dao.MemberDao;
import com.media.dto.MemberDto;

@Service
public class MemberService {
	//로그인 처리에 필요한 요소들
	// DAO 객체, 세션 객체, ModelAndView 객체 
	@Autowired
	private MemberDao mDao;
	
	@Autowired
	private HttpSession session;
	
	private ModelAndView mv;
	
	// 로그인 처리용 메소드
	public ModelAndView loginProce(MemberDto member,
			RedirectAttributes rttr) {
		mv = new ModelAndView();//화면으로 데이터 전송.
		
		String view = null;//이동할 jsp 이름 저장 변수.
		
		//DB에서 해당 id의 password 가져오기.
		String get_pw = mDao.getPwd(member.getM_id());
		
		//로그인 처리
		if(get_pw != null) {
			// 아이디 있음.
			if(get_pw.equals(member.getM_pwd())) {
				// 패스워드 맞음. 로그인 성공.
				// 세션에 로그인 성공한 회원 정보 저장.
				// 로그인 한 회원의 정보를 가져오기.
				
				
			} else {
				// 패스워드 틀림.
			}
		} else {
			// 아이디 없음.
		}
		
		return mv;		
	}
}

로그인 기본 틀 잡아두기

 

3. MemberDao.java

로그인한 회원 정보 가져오는 메소드 추가

 

4. MemberDao.xml

MemberDao의 변수명과 동일하게 작성해야함.

 

5. MemberService.java

 

 

6. com.media.service 패키지 생성 후 MemberServiceTest 클래스 생성

 

HomeController 수정

MemberService와 ModelAndView Autowired 처리 해줌.

@RequestMapping의 get 방식만 처리해주면 되기 때문에 주석처리 후 @GetMapping을 사용해줌

 

 

 

'spring' 카테고리의 다른 글

0618 spring - 기본 설정  (0) 2020.06.18

1. web.xml에서의 변경사항

기존의 version 3.1로 변경해준다.

 

 

2. pom.xml에서의 변경사항

  1) 버전 변경

java-version 1.8
springframework-version 5.2.5.RELEASE
aspectj-version 1.9.2
slf4j-version 1.7.2

 

  2) ojdbc6 사설 저장소 등록

 

  3) logging의 slf4j 주석처리

3번째로 위치한 slf4j-log4j12를 주석처리(삭제)해준다.

 

  4) log4j 변경

groupId ch.qos.logback
artifactId logback-classic
version 1.2.3

 

  5) javax.servlet 변경

artifactId에서 servelet-api앞에 javax 추가

 

  6) junit 변경

version을 4.13으로 변경

 

  7) org.springframework 추가

groupId org.springframework
artifactId spring-test
version ${org.springframework-version}

 

  8) maven update

해당 프로젝트를 업데이트 해준 뒤 Maven Dependencies의 jar파일 확인

 

  9) 라이브러리 추가

https://mvnrepository.com/

 

Maven Repository: Search/Browse/Explore

comroid Interfaces Last Release on Jun 17, 2020

mvnrepository.com

라이브러리 추가시에는 Maven Repository를 참고한다.

 

- lombok 

< DB관련 라이브러리 >

- spring-jdbc

 

- dbcp : commons-dbcp2

 

- ojdbc6

 

< DB 로그용 라이브러리 >

- log4jdbc-remix

 

< Mybatis 관련 라이브러리 >

- Mybaits/Mybatis Spring 

 

3. logback.xml 파일 추가

level="off" 인 경우 데이터베이스 사용시 로그에 찍히지 않음

com.media.controller의 이름은 패키지명과 동일해야함

 

4. 한글 설정 - web.xml

 

5. root-context.xml

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName"
			value="net.sf.log4jdbc.DriverSpy"></property>
		<property name="url"
			value="jdbc:log4jdbc:oracle:thin:@127.0.0.1:1521:xe"></property>
		<property name="username" value="boarddev"></property>
		<property name="password" value="1234"></property>
	</bean>

	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<mybatis-spring:scan base-package="com.media.dao"/>
</beans>

DB 접속을 위한 Bean을 생성한다.

하나의 connection을 수립할 경우 server 구동시 DB server를 연결해서 수립하는 것을 session, 수립하는 길을 만드는 것을 connection이라고 한다.

자동 설정된 connection을 만들어주는게 sessiontFartory이며 DriverManager, url, userid, password를 필요로 한다.

 

 

6. DataBase 확인

  1)src/test/java >> DataSourceTest.class 생성

 src/test/java 위치에 com.media.dbtest 패키지 생성 후 DataSourceTest 클래스 만들어줌

package com.media.dbtest;

import static org.junit.Assert.fail;

import java.sql.Connection;

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.extern.java.Log;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log
public class DataSourceTest {
	@Autowired
	private DataSource dataSource;
	
	@Test
	public void testConnection() {
		try (Connection conn = dataSource.getConnection()){
			log.info(conn.toString());
		}catch (Exception e) {
			// TODO: handle exception
			fail(e.getMessage());
		}
	}
}

Autowired

: bean의 id와 클래스의 변수와 이름이 같으면 같은 이름에 해당하는 bean을 찾아서 자동으로 입력을 해주고 처리를 해주는 역할

 

  2) root-context.xml 에서 mybatis-spring 추가

 

  3) Interface 생성

  4) root-context.xml에 추가

 

  5) MemberDao.xml 수정

https://mybatis.org/mybatis-3/ko/index.html

 

MyBatis – 마이바티스 3 | 소개

마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 ��

mybatis.org

 

  6) com.media.dao 패키지에 DaoTest 클래스 생성

package com.media.dao;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.media.dbtest.DataSourceTest;

import lombok.extern.java.Log;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log
public class DaoTest {
	@Autowired
	private MemberDao mDao;
	
	@Test
	public void testGetPwd() {
		log.info(mDao.getPwd("TEST"));
	}
}

  7) DB 연동 결과 확인

console에서 해당 id(TEST)의 비밀번호 정보를 확인가능하다면 정상적으로 설정된 것임을 알 수 있다.

'spring' 카테고리의 다른 글

0619 spring -  (0) 2020.06.19

Bean(DTO) 객체의 활용

데이터를 담아서 전송하는 객체를 활용한 정보 입력 및 전달

 

예제)

com.baen>PersonInfo.java

package com.bean;

public class PersonInfo {
	private String name;
	private String gender;
	private int age;
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

 

com.controller>PersonController.java

package com.controller;

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

import javax.servlet.RequestDispatcher;
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.bean.PersonInfo;

@WebServlet({ "/pInput", "/update" })
public class PersonController extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}

	private void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String command = request.getServletPath();
		
		PersonInfo pInfo = null;
		
		if(command.equals("/pInput")) {
			pInfo = (PersonInfo)request.getAttribute("pInfo");
			System.out.println("이름 : " + pInfo.getName());
			pInfo = (PersonInfo)request.getAttribute("pInfo");
			System.out.println("성별 : " + pInfo.getGender());
			pInfo = (PersonInfo)request.getAttribute("pInfo");
			System.out.println("나이 : " + pInfo.getAge());
			
			PrintWriter out = response.getWriter();
			out.println("<html>");
			out.println("<head>");
			out.println("<title>입력결과</title>");
			out.println("</head>");
			out.println("<body>");
			out.println("<h2>입력 완료</h2>");
			out.println("<a href='index.jsp'>시작으로</a>");
			out.println("</body>");
			out.println("</html>");
			
		} else if(command.equals("/update")) {
			pInfo = new PersonInfo();
			pInfo.setName("홍길동");
			pInfo.setGender("남자");
			pInfo.setAge(25);
			
			request.setAttribute("uInfo", pInfo);
			
			RequestDispatcher dis = request.getRequestDispatcher("pUpdate.jsp");
			
			dis.forward(request,  response);
		}
	}

}

doProcess 메소드에서는 input(회원가입)으로 들어왔는지, update(수정)들어왔는지 구분해서 처리해야함.

request.getServletPath();를 통해 어떤 서블릿을 통해서 가야하는지를 구해야함.

 

입력받은 결과가 /pInput(회원가입)을 통해 들어왔다면 내용 확인을 위해 입력받은 내용을 콘솔에 출력해준다.

service → DAO → DB 순서로 DB에 입력처리한다.

입력받은 결과가 /update를 통해 들어왔다면 DB에서 해당 key로 검색한 정보를 가져와서 jsp 페이지로 전달.

여기서는 임의의 데이터를 전달함.

 

pInputFrm.jsp

<h2>회원 정보 입력</h2>
<form action="inProc.jsp" method="post">
<!-- 이름, 성별, 나이를 입력하도록 작성해 주세요. -->
<table>
	<tr>
		<th width="100px">이름</th>
		<td width="200px"><input type="text" name="name"></td>
	</tr>
	<tr>
		<th>성별</th>
		<td width="200px"><input type="text" name="gender"></td>
	</tr>
	<tr>
		<th>나이</th>
		<td width="200px"><input type="text" name="age"></td>
	</tr>
	<tr>
		<td colspan="2" style="text-align: center">
			<input type="submit" value="전송">
			<input type="reset" value="취소">
		</td>
	</tr>
</table>
</form>

회원 정보를 입력 받는 페이지 생성.

 

pUpdate.jsp

<h3>검색한 회원</h3>
<form action="inProc.jsp" method="post">
	<table>
		<tr>
			<th width="100px">이름 : </th>
			<td width="200px">
				<input type="text" name="name" value="${uInfo.name}">
			</td>
		</tr>
		<tr>
			<th>성별 : </th>
			<td width="200px">
				<input type="text" name="gender" value="${uInfo.gender}">
			</td>
		</tr>
		<tr>
			<th>나이 : </th>
			<td width="200px">
				<input type="text" name="age" value="${uInfo.age}">
			</td>
		</tr>
		<tr>
			<td colspan="2" style="text-align: center">
				<input type="submit" value="전송">
				<input type="reset" value="취소">
			</td>
		</tr>
	</table>
</form>
<a href="index.jsp">시작으로</a>

저장된 회원 정보를 확인하는 페이지 생성.

 

inProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="pInfo" class="com.bean.PersonInfo" scope="request"/>
<jsp:setProperty property="*" name="pInfo"/>
<jsp:forward page="/pInput"/>

PersonInfo DTO의 이름을 pInfo로 설정하고 DB 사용함.

 

 

이벤트 처리

  • 마우스/키보드의 입력에 대한 처리

 

이벤트의 종류

  • 마우스 : 클릭, 더블클릭, 이동, 좌/우버튼 등
  • 키보드 : 키 다운, 키 업 등
  • 기타 페이지가 열렸을 때, 입력 요소가 포커스를 가질 때 등

 

이벤트 처리 방식

  • 태그에 직접 등록 → <body onload="alert('출력')">
  • 태그의 이벤트 속성에 함수 이름 동록 → event01.html
  • addEventListener(event, function) → HTML 태그와 별개로 스크립트 영역으로만 처리하는 방식

 

event keyword

  • 포커스 : focusin/focusout
  • 키보드 : keydown/keyup
  • 마우스 : click, dblclick, mouseenter, mouseout, mousemove, mousedown, mouseup, mouseover

 

마우스 위치 event 예제)

<body>
<div id="over" onmouseover="mEvent('over')" 
                onmouseout="mEvent('out')"></div>
</body>
<script>
function mEvent(evt){
    if(evt == 'over'){
        document.getElementById('over').innerHTML='마우스 입장!';            }
    if(evt == 'out'){
        document.getElementById('over').innerHTML='마우스 퇴장!';
    }
}
</script>

마우스 위치에 따른 이벤트 확인 가능.

 

날짜 함수 활용한 이벤트 예제)

<body>
    <h3>오늘의 날짜 : <span id="demo"></span></h3>
    <button onclick="getDay()">날짜 출력</button>
</body>
<script>
	function getDay(){
    document.getElementById('demo').innerHTML=Date();
    }
</script>

 

키보드 이벤트 예제)

<body>
    <input id="keyon" type="text" onkeydown="going()">
    <h4 id="typing"></h4>
</body>
<script>
function going(){
        var msg = document.getElementById('keyon').value;
        document.getElementById('typing').innerHTML=msg;
    }
</script>

키보드가 눌리게되면 going 함수 호출.

going 함수는 입력 창에 있는 입력값을 가져와서 출력, value 속성에 있는 값을 가져감

키가 눌리는 시점에는 데이터가 없기 때문에 그 데이터는 넘어가지 못함.

 

onchange 예제)

<body>
<select id="mysel" onchange="myselect()">
    <option>현대</option>
    <option>기아</option>
    <option>쉐보레</option>
    <option>BMW</option>
</select>
<h4 id=selres></h4>
</body>
<script>
    function myselect(){
        var msg = document.getElementById('mysel').value;
        document.getElementById('selres').innerHTML=msg;
    }
</script>

선택한 옵션이 selres 부분에 출력됨.

 

자바 스크립트 예제 야구 게임

규칙

1.볼과 스트라이크를 선택 가능
2.볼이 4개이면 모두 초기화 된다.
3.스트라이크가 3개가 되면 1아웃이 된다.
4.아웃이 3개가 되면 게임 오버가 뜬다.
5.게임 오버가 되고 나서 재 시작 버튼을 누르면 모두 초기화가 된다.

<body>
    <button id="ball">ball</button>
    <button id="strike">strike</button>
    <button id="restart" style="display: none;">재시작</button>
    <br>
    <br>
    B : <b id="b">0</b><br>
    S : <b id="s">0</b><br>
    O : <b id="o">0</b><br>
    <script>
        // 1. 모든 요소를 변수화 합니다.
        var bntBall = document.getElementById('ball');
        var bntStrike = document.getElementById('strike');
        var bntRestart = document.getElementById('restart');

        var ball = document.getElementById('b');
        var strike = document.getElementById('s');
        var out = document.getElementById('o');

        // 2. 각 카운트용 변수 작성
        var cntBall = 0;
        var cntStrike = 0;
        var cntOut = 0;

        // 3. 버튼 클릭에 대한 이벤트리스너 작성
        bntBall.addEventListener('click', bclick);
        bntStrike.addEventListener('click', sclick);
        bntRestart.addEventListener('click', rclick);

        function bclick() {
            cntBall += 1;
            alert(cntBall + " ball!!");
            if (cntBall == 4) {
                cntBall = 0; cntStrike = 0;
            }
            document.getElementById('b').innerHTML = cntBall;
            document.getElementById('s').innerHTML = cntStrike;
        }

        function sclick() {
            cntStrike += 1;
            alert(cntStrike + " strike!!");
            if (cntStrike == 3) {
                cntBall = 0;
                cntStrike = 0;
                cntOut += 1;
                alert(cntOut + " Out!!");
                if (cntOut == 3) {
                    cntBall = 0; cntStrike = 0; cntOut = 0;
                    alert(cntOut + " Out GameOver!!");

                    document.getElementById('restart').style.display = 'inline';
                    bntBall.disabled = true;
                    bntStrike.disabled = true;
                }
            }
            document.getElementById('b').innerHTML = cntBall;
            document.getElementById('s').innerHTML = cntStrike;
            document.getElementById('o').innerHTML = cntOut;
        }

        function rclick() {
            bntRestart.style.display = 'none';
            bntBall.disabled = false;
            bntStrike.disabled = false;
        }
    </script>
</body>

 

객체(Object)

변수 + 메소드 = 객체

 

Date 객체

기본 형태 var 변수 = new Date();
입력한 밀리초를 날짜로 변환 var 변수 = new Date(밀리초);
날짜문자열 var 변수 = new Date(날짜문자열);
년, 월, 일, 시, 분, 초, 밀리초 var 변수 = new Date(년, 월, 일, 시, 분, 초, 밀리초)

 

예제)

    var d= new Date();
    document.write(d + "<br>");
    d.setFullYear(2019);
    //현재 연도 출력
    document.write("현재 연도 : " + d.getFullYear() + "<br>");
    //현재 월 출력 => 0월부터 시작해서 현재의 -1 월이 나옴
    document.write("현재 월 : " + (d.getMonth()+1) + "<br>");
    //현재 일 출력
    document.write("현재 일 : " + d.getDate() + "<br>");
    //현재 요일 출력(0~6 사이의 값 : 0-일요일, 6-토요일)
    document.write("현재 요일 : " + d.getDay() + "<br>");
    //현재 시간 출력
    document.write("현재 시간 : " + d.getHours() + "<br>");
    //현재 분 출력
    document.write("현재 분 : " + d.getMinutes() + "<br>");
    //현재 밀리초 출력
    document.write("현재 밀리초 : " + d.getMilliseconds() + "<br>");

다양한 출력 방식 예제)

    var today = d.toDateString();//날짜 정보만 출력
    document.write(today + "<br>");
    todate = d.toISOString();
    document.write(todate + "<br>");
    today = d.toJSON();//Json 객체로 변환하는 함수
    document.write(today + "<br>");
    today = d.toLocaleDateString();//지역(국가별)
    document.write(today + "<br>");
    today = d.toLocaleTimeString();//지역 시간(국가별)
    document.write(today + "<br>");
    today = d.toString();//기본값
    document.write(today + "<br>");
    today = d.toTimeString();//기본값에서 시간만 출력
    document.write(today + "<br>");   

 

문서 객체 모델(Document Object Mode, DOM)

  • 웹 문서를 메모리로 읽어 들여 트리구조로 변환
  • 문서의 각 요소(element 또는 tag)는 요소 노드(element node), 텍스트 노드(text node)로 변환하여 처리
  • 이 트리 구조를 사용하여 자바 스크립트로 문서를 제어

문서 객체 생성

요소 노드 생성 createElement()
텍스트 노드 생성 createTextNode()
body에 요소 노드 추가 appendChild()

 

요소 노드 생성 단계

1. 텍스트 노드 생성 → 요소 노드 생성

2. 요소 노드에 텍스트 노드 추가 → body에 요소 노드 추가

 

노드 생성 예제)

<button onclick="add()">추가</button>
<script>
function add(){
    //h3 요소 노드 생성
    var header3 = document.createElement('h3');
    //텍스트 노드 생성
    var textNode = document.createTextNode('추가된 요소');
    
    document.body.appendChild(header3);
    header3.appendChild(textNode);
}
</script>

요소가 있으면 나중에 요소에 textNode를 추가하는 건 상관없음.

 

 

객체 생성 방법 1(기본적인 방법)

<script>
    var car = {type: "Fiat", model: 500, color: "white"};
    console.log(car);
    document.write("이름 : " + car.type + "<br><br>");
    
    var person = {
                name: "홍길동", 
                age: 25, 
                phone: "01012345678",
                info: function() {
                    document.write("이름 : " + this.name + "<br>");
                    document.write("나이 : " + this.age + "<br>");
                }
            };
    document.write("이름 : " + person.name + "<br>");
    document.write("나이 : " + person.age + "<br>");
    document.write("연락처 : " + person.phone + "<br><br>");

    person.info();
</script>

객체 내부에 함수를 만들수 있음.

 

객체 생성 방법2

    //객체 생성 방법 2
    var Check = {};//빈 객체 생성. 계좌 정보 처리 객체

    //잔액 저장용 멤버 변수 추가.
    Check.balance = 0;
    console.log(Check);

    //예금 처리용 함수 추가.
    Check.deposit = function(amount){
        this.balance += amount;
    }

    //예금 후 잔액 출력
    Check.deposit(10000);
    document.write("잔액 : " + Check.balance + "원<br>");

    //출금 처리용 함수 추가
    Check.withdraw = function(amount){
        if(amount <= this.balance){
            this.balance -= amount;
        }
        if(amount > this.balance){
            document.write("잔액이 부족합니다." + "<br>");
        }
    }
    
    Check.withdraw(15000);
    document.write("잔액 : " + Check.balance + "원<br>");
    Check.withdraw(5000);
    document.write("잔액 : " + Check.balance + "원<br>")

 

전역변수와 지역변수

전역 코드(문서) 내 어느 위치에서든 선언하여 (문서) 전 영역에서 사용할 수 있는 변수.
지역 변수가 선언된 해당 블록(함수) 내에서만 사용할 수 있는 변수
<script>
	var gValue1; //전역변수 선언.
	gValue2;	 //전역변수 선언. var 생략

	function func(){
		var lValue1; //지역변수 선언.
		lValue2;	 //지역변수 선언. var 생략
		gValue1 = 5; //전역변수 사용.
		var gValue2; //전역과 이름이 같은 지역변수.
		gValue2 = 20; //지역변수 사용.
		lValue1 = 10; //지역변수 사용.
	}
	
	gValue2 = 100; //전역 변수 사용.
	lValue2 = 1000; //지역 변수 사용 - error!!!!
</script>

 

예제)

    function getGrede(){
        var kor = 95;
        return kor;
    }
    var kor = 100;
    document.write("점수 : " + kor + "<br>");

지역변수를 사용하고 난 뒤 결과값을 가지고와서 써야할 경우 return으로 결과값을 사용함.

 

    function getGrade2(){
        kor2 = 80;
    }
    var kor2 = 100;
    getGrade2();
    document.write("점수 : " + kor2 + "<br>");

전역변수는 함수안에서 함께 사용 가능

 

    function getGrade3(){
        var kor3 = 70;
    }
    getGrade3();
    document.write("점수 : " + kor3 + "<br>");

데이터가 들어있지않기때문에 undefined

값을 다른 곳에서 쓰면 return 사용

 

 

함수 인자의 처리

    function add(){
        var sum = 1;
        return sum;
    }
    function add(x){
        var sum = x + 1;
        return sum;
    }
    function add(x, y){
        var sum = x + y;
        return sum;
    }

    var r0 = add();
    var r1 = add(10);
    var r2 = add(10, 20);

    document.write("r0 : " + r0 + "<br>");
    document.write("r1 : " + r1 + "<br>");
    document.write("r2 : " + r2 + "<br>");

오버 로딩이 되지 않기 때문에 r0, r1은 NaN의 결과가 나옴

최종 결과값인 r2의 결과만 나옴

 

    function add2(x, y, z){
        var sum;
        if((x === undefined) && (y === undefined) && (z === undefined)){
                    sum = 1;
            }
        else if((y === undefined) && (z === undefined)) {
            sum = x + 1;
        }
        else if(z === undefined){
            sum = x + y;
        }
        else{
            sum = x + y + z;
        }

        return sum;
    }

    var a2r0 = add2();
    var a2r1 = add2(1);
    var a2r2 = add2(1, 2);
    var a2r3 = add2(1, 2, 3);

    document.write("a2r0 : " + a2r0 + "<br>");
    document.write("a2r1 : " + a2r1 + "<br>");
    document.write("a2r2 : " + a2r2 + "<br>");
    document.write("a2r3 : " + a2r3 + "<br>");

최대한 3개까지 받아서 처리할 수 있는 함수

=> 오버로딩 해결 방법. NaN이 뜨지 않는다.

 

    function add3(){
        var i, sum = 0;

        for(i = 0; i < arguments.length; i++){
        
        sum = sum + arguments[i];
        }

        return sum;
    }

    var a3r0 = add3();
    var a3r1 = add3(1);
    var a3r2 = add3(1, 2);
    var a3r3 = add3(1, 2, 3, 4, 5, 6);

    document.write("a3r0 : " + a3r0 + "<br>");
    document.write("a3r1 : " + a3r1 + "<br>");
    document.write("a3r2 : " + a3r2 + "<br>");
    document.write("a3r3 : " + a3r3 + "<br>");

arguments : 자동으로 생성되는 파라미터 변수

매개변수의 더 많은 값이 들어가더라도 arguments가 받아서 처리하기 때문에 오류가 나지 않음

 

undefined와 null의 차이점

undefined 자료형이 정해지지않은 상태
null 자료형이 정해진 상태

 

배열(array)

  • 여러개의 데이터(원소)를 저장하는 공간
  • 인덱스 : 0번부터 시작.
  • 자바스크립트의 배열은 다른 타입의 데이터도 함께 저장할 수 있음
  • 크기를 지정하지 않음
  • 공백 리터럴도 포함할 수 있음.
  • 배열의 길이 : 배열명.length
var 배열명 = [원소1, 원소2, ...];
var 배열명 = [];
배열명[0] = 원소1;
배열명[1] = 원소2;

 

예제)

var city = ['Seoul', 'Busan', 'Incheon'];

function printArray(){
    var i;
    for(i = 0; i < city.length; i++) {
        document.write("[" + i + "]"
                    + city[i] + "<br>");
    }
}
printArray();

var city2 = [];
city2[0] = '서울';
city2[1] = '인천';
city2[2] = '부산';

printArray2();

function printArray2(){
    var i;
    for(i = 0; i < city2.length; i++){
        document.write("[" + i + "]"
                    + city2[i] + "<br>");
    }
    document.write("<br>");
}

city2[3] = '대구';
printArray2();

배열의 새로운 데이터 입력 후 함수를 다시 호출하여 변경된 내용을 확인할 수 있다.

 

var city3 = ['서울', , '인천', , '부산'];
function printArray3(){
    var i;
    for(i = 0; i < city3.length; i++){
        document.write("[" + i + "]"
                    + city3[i] + "<br>");
    }
}


printArray3();

city3[1] = '대전';
printArray3();
var arr1 = [1, 2, "3"];
function printArray3() {
    var i;
    for (i = 0; i < city3.length; i++){
        document.write("[" + i + "]" + city3[i] + "<br>");
    }
}

공백도 데이터로 입력되기 때문에 undefined 처리된다.

function addAll(){
    var sum = 0, i;
    for(i = 0; i < arr1.length; i++){
        var r = typeof arr1[i];
            sum += arr1[i]
    }
    document.write("총합 : " + sum);
}

배열의 갯수를 구하는 잘못된 예제.

문자 + 숫자 => 형변환이 되어 문자열이 만들어지기때문에 원하는 결과를 얻지 못한다.

 

function addAll(){
    var sum = 0, i;
    for(i = 0; i < arr1.length; i++){
        var r = typeof arr1[i];
        if(r != "string"){
            sum += arr1[i]
        }
    }
    document.write("총합 : " + sum);
}

문자열 타입이 아닐 경우에만 계산해준다.

 

배열을 활용한 자료구조

push() 배열의 마지막 위치 다음에 원소 추가
pop() 배열의 마지막 위치의 값을 꺼내옴
마지막꺼를 꺼내와서 사용하는 용도, 두가지르 사용가능
unshift() 배열의 맨 앞에 원소를 추가
shift() 배열의 맨 앞의 원소를 꺼내옴

 

예제)

push()

    function arrPush(){
        arrNum.push(i);
        i++;
    }

pop()

    function arrPop(){
        var r = arrNum.pop();
        arrNum.pop();
        console.log(arrNum);
    }

 

unshift()

    function arrUnshift(){
        arrNum.unshift(i);
        i++;
        console.log(arrNum);
    }

 

shift()

    function arrShift(){
        var r = arrNum.shift();
        console.log(r);
        console.log(arrNum);
    }

 

배열용 함수들

병합 join()
제거 del()

 

예제)

    function join(){
        var arr = ["A", "B", "C", "D", "E"];
        var arrStr = arr.join("-");
        console.log(arrStr);    
        console.log(arr);
    }
    function del(){
        var arr = ["A", "B", "C", "D", "E"];
        delete arr[2];
        console.log(arr);
        arr[2] = "F";
        console.log(arr);

    }

arr.join을 통해 배열의 데이터 병합이 가능함. 사이에 원하는 문자를 넣어서 병합하는 것도 가능함

delete를 통해 배열을 아예 지울 수 있음. 함수가 아닌 명령어

삭제한 부분에 원하는 데이터 삽입이 가능함.

 

부분삭제 spliceDel()
위치지정추가 spliceAdd()
범위자르기 sliceEx()

 

예제)

    var arry = ['가', '나', '다', '라', '마'];
    function spliceDel(){
        arry.splice(1,3);
        console.log(arry);
    }       
    
    function spliceAdd(){
        var r = arry.splice(2, 0, "C", "D");
        console.log(arry);
    }

    function sliceEx(){
        sarry = [0, 1, 2, 3, 4, 5];
        var newArr = sarry.slice(1, 3);
        console.log(newArr);
        console.log(sarry);         
    }

splice는 꺼내오고, 지우는 역할.

slice는 복사해서 꺼내오기때문에 원본을 지우지 않음.

splice(2, 2) (시작할 인덱스 번호, 삭제할 인덱스 갯수)
splice(2, 0, "C", "D") (시작할 인덱스 번호, 변경할 인덱스 갯수, 추가할 원소1, 추가할 원소2, ...)

 

splice 시작지점 위치 정보, 갯수
slice 시작지점 위치, 끝나는 위치(지정된 번호의 앞 순번까지)
slice 함수 지정된 범위의 원소들을 복사하여 새로운 배열로 생성
배열명.slice(n, m)l n번 원소부터 m-1번 원소까지 복사.

 

정렬 sortEx()
역순 reversEx()

예제)

    var sortArr = [6, 2, 1, 4, 3, 5];

    function sortEx(){
        sortArr.sort();
        console.log(sortArr);
    }
    function reverseEx(){
        sortArr.reverse();
        console.log(sortArr);
    }

sortEx()는 순서대로 정렬, reversEx()는 역순으로 정렬.

forEach forEachEx()
every everyEx()

예제)

var nums = [1, 2, 3, 4, 5];
    function forEachEx(){//익명 함수 작성법 적용 방식
            nums.forEach(function(num){
                var result = num * num;
                console.log(num, result);
            });
        }
    // function square(num){
    //     var result = num * num;
    //     consol.log(num, result);
    // }
    
    function everyEx(){
        var even = nums.every(isEven);
        console.log(even);
    }
    function isEven(num){
        return num % 2 == 0;
    }

배열에서 하나씩 꺼내와서 순서대로 넣어 곱해주었기 때문에 배열의 제곱 결과를 구할 수 있음.

모든 데이터가 짝수가 아니기때문에 false가 나옴.

자바스크립트 출력 방법

html 문서에 출력 document.write() <button onclick="document.write('출력')">출력</button>
html 요소에 출력 document.innerHTML <button onclick="document.getElementById('print').innerHTML='출력'">출력</button>
</p>
<div id="print" style="border: 1px solid red;">여기에 출력</div>
대화상자(경고창)에 출력 alert() <button onclick="alert('출력')">출력</button>
개발자 도구의 콘솔에 출력 console.log() <button onclick="console.log('출력')">출력</button>

예제 결과)

html 문서에 출력
html 요소에 출력
대화상자(경고창)에 출력
개발자 도구의 콘솔에 출력

자바스크립트 입력 방법

확인/취소 대화상자로 입력 confirm('메시지') <button onclick="func1()">입력</button>
입력(문자열) 대화상자로 입력 prompt('메시지') <button onclick="func2()">입력</button>
<script type="text/javascript">
/* 범위 주석 */
//자바스크립트 코딩 영역
function func1(){
	var r = confirm('메시지 출력');//r은 변수
	console.log(r);//변수 r에 저장된 값을 콘솔에 출력
	if(r == true){
		alert("확인을 누르셨습니다.");
	}
	else{
		alert("취소를 누르셨습니다.");
	}
}
function func2(){
	var r2 = prompt("이름을 입력하세요.");
	alert(r2 + "님 환영합니다.");
}
</script>

예제 결과)

확인/취소 대화상자로 입력
확인/취소 대화상자로 입력 - 확인 눌렀을 경우
확인/취소 대화상자로 입력 - 취소 눌렀을 경우

 

입력(문자열) 대화상자로 입력
입력한 내용에 대한 출력 결과

스크립트 작성 위치

자바스크립트 실행 순서는 작성 순(위에서 아래) 분할된 스크립트 영역은 한 문서이기 때문에 하나의 문서 영역으로 통합되어 사용.

 

예제)

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>스크립트 위치</title>
	<!-- 자바스크립트 실행 순서는 작성 순(위에서 아래)
		분할된 스크립트 영역은 한 문서이기 때문에
		하나의 문서 영역으로 통합되어 사용.
	 -->
	<script type="text/javascript">
		//head 영역 1
		var num = 0;
		document.write("head 태그 내 실행 : "+ num + "<br>");
	</script>
	<script type="text/javascript">
		//head 영역 2
		num = 1;
		document.write("head 태그 내 실행 : "+ num + "<br>");
	</script>
	
</head>
<body>
	<script type="text/javascript">
		//body 영역 1
		num = 2;
		document.write("body 태그 내 실행 : "+ num + "<br>");
	</script>
	
	<div></div>
	
	<script type="text/javascript">
		//body 영역 2
		num = 3;
		document.write("body 태그 내 실행 : "+ num + "<br>");
	</script>
</body>

	<script type="text/javascript">
	//제 3의 영역
	num = 4;
	document.write("/body 태그 내 실행 : "+ num + "<br>");
	</script>
	
</html>

 

외부 스크립트 불러오기

ex_js.html에서 외부 스크립트(myscript.js)를 사용한다면 외부 스크립트(myscript.js)에서 불러온 외부 스크립트(myscript2.js)를 사용 가능함.

 

예제)

ex_js.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>외부 스트립트 불러오기</title>
<style type="text/css">
div {
	border: 1px solid red;
}
</style>
</head>
<body>
<p>그냥 단락입니다.</p>
<script src="myscript.js"></script>
<!-- <script src="ejs/myscript2.js"></script> -->

<button onclick="ck01(100)">버튼</button>
</body>
</html>

myscript.js

document.write("<script src='ejs/myscript2.js'></script>");
document.write("<div style='color:red; font-size:24px;'>외부 자바스크립트 출력</div>");

myscript2.js

document.write("<div style='color:blue; font-size:24px;'>외부 자바스크립트 출력</div>");

function ck01(ival){
	alert(ival);
}

 

변수

명명 규칙 문자(알파벳), 밑줄('_'), 달러기호('$')로 시작
대소문자 구분
한글도 사용 가능(하지만 영문자 권장)
<script type="text/javascript">
	document.write("변수에 대한 문법적 오류");
	//var 7num = 100; - 숫자로 시작하는 변수
	//var &num = 1000; - $가 아닌 특수 문자로 시작
	//var true = 0; - 예약어 사용 금지
	//var a+b = 10; - 좌변에 연산식 사용 금지
	
	//사용 가능한 코드
	var 홍길동 = 'name';//한글 사용은 가능
	console.log(홍길동);
	var x, y, z = 10;//z에만 10이 들어감.
					 //나머지 x, y는 undefined
	console.log(x, y, z);
	var a = b = c = 10;//a, b, c에 같은 값 입력.
	console.log(a, b, c);
</script>

 

데이터 유형 기본형 number(숫자), string(문자열), boolean(진리값), array(배열), object(객체), null(값이없음), undefined(정해지지 않음)
객체형  

변수의 타입을 확인하는 키워드 : typeof

array와 object는 모두 object 타입임.

 

변수 선언 키워드 var는 생략 가능.

단, 지역 변수와 전역 변수를 구분지을 경우에는 사용하는 것이 좋다. 

<script type="text/javascript">
	var num = '10';
	document.write(typeof num + '<br>');
	num = true;
	document.write(typeof num + '<br>');
	num = [1, 2, 3];
	document.write(typeof num + '<br>');
	num = {name:'홍길동', age:25};
	document.write(typeof num + '<br>');
</script>

 

연산자

문자열 병합 연산자 +
산술연산자 +, -, *, /, %(나머지), ++, --
비교연산자 <, <=, >, >=, ==, !=,
자바스크립에만 있는 비교연산자 

=== : 값과 타입이 같으면 true
!== : 값 또는 타입이 다르면 true
논리연산자 &&, ||, !
조건연산자 (조건식) ? A : B;
거짓이면 참(true)이면 A 실행, 거짓이면 B 실행
<script type="text/javascript">
	var x = 5;
	var y = "5";
	var result = (x == y);
	document.write(result + "<br>");
	result = (x === y);
	document.write(result + "<br>");
	result = (x !== y)
	document.write(result + "<br>");
	result = (x != y)
	document.write(result + "<br>");
</script>

x는 숫자형 타입의 5이고, y는 문자열 타입의 5이기 때문에 값은 같지만 타입이 다르기 때문에 위와 같은 결과가 나온다.

 

제어문

조건 제어문 if, switch
반복 제어문 for(for_each는 없음), while(do~while)
for(초기식;조건식;증감식) - 일반 for문
for(변수 : 배열구조체) - for_each문
기타 제어문 break, continue

 

구구단 예제)

<style>
	div {
		width : 120px; height : 200px;
		border : 1px dashed purple;
		float : left;
		margin : 3px;
	}
	div:nth-child(2n){
		background-color : violet;
		color : white;
	}
	
</style>
</head>
<body>
<script>
	for(var i = 2; i <= 9; i++ ){
		document.write("<div>")
		for(var j = 1; j <= 9; j++){
			document.write(i + " * " + j + " = " + i*j + "<br>");
		}
		document.write("</div>" )
	}
</script>

 

함수 선언과 호출

선언 형식 :

function 함수명([매개변수1, 매개변수2, ...]){
	실행문장1;
    실행문장2;
    ...
    [return 반환값(변수, 연산식);]
}
호출 함수명([값1, 값2, ...]);
반환이 있는 함수 호출 변수 = 함수명([값1, 값2, ...]);

 

함수 선언 전/후 호출 예제)

<button onclick="printMsg('버튼으로 출력')">출력</button>
<script type="text/javascript">
	var text1 = "함수 선언 전 호출";
	var text2 = "함수 선언 후 호출";
	
	printMsg(text1);
	
	function printMsg(msg){
		document.write("메시지: " + msg + "<br>");
	}
	
	printMsg(text2);
</script>

익명 함수 사용 예제)

<script type="text/javascript">
var text1 = "선언 전 호출";
var text2 = "선언 후 호출";

//pm(text1);

//익명 함수 선언
var pm = function(msg){
	document.write("메시지: " + msg + "<br>");
}

pm(text2);

var s = "100";
document.write(typeof s + "<br>");
var n = Number(s);
document.write(typeof n);
</script>

 

Hoisting(호이스팅)

함수(변수)의 선언 위치와 관계없이 호출하여 사용하도록 함.

소스 코드의 가독성 떨어뜨려서 유지/보수에 영향을 줌.

 

호이스팅을 배제하는 함수 작성 방법(익명 함수 작성법)

var 변수명 = function([매개변수1, 매개변수2, ...]){
	실행문장1;
	실행문장2;
	...
	[return 값(변수/연산식);]
}
사용(호출) 변수명([매개변수1, 매개변수2, ...]);

 

실습 문제)

입력 대화상자를 사용하여 점수를 입력받아서 학점을 출력하는 스크립트 작성하기

90점 이상 A, 80점 이상 B, 70점 이상 C, 60점 이상 D, 그외 F
<body>
<button onclick="func1()">점수 입력</button>
<script>
function func1(){
	var inScore = prompt("점수를 입력하세요.");
	var score = Number(inScore);//입력받은 문자열 점수를 숫자로 변환
	console.log(score);//consol에서 변환된 점수 확인
	
	if (score >= 90){
		alert('A');
		}
	else if(score >=80){
		alert('B');
		}
	else if(score >= 70){
		alert('C');
		}
	else if(score >= 60){
		alert('D');
		}
	else{
		alert('F');
		}
	
}
</script>

 

+ Recent posts