2021-12-06(월) 5주차 1일

Jeongyun Heo·2021년 12월 6일
0

배열 : 같은 종류의 메모리를 여러 개 만드는 명령문

0부터 번호를 부여
배열 index 라고 한다.

메모리에 대해 이름표를 붙이듯
int[] age
대괄호가 반드시 붙여야 한다.
대괄호를 변수 뒤쪽에 붙이는 방식은 자바에서 잘 안 씀

배열이름[index] = 값;

두 개의 엔진
웹 브라우저로부터 요청을 받고 응답을 하는 Web Server라는 엔진과
여러분이 만든 자바 클래스를 실행하는 Servlet Container라는 엔진
스프링 부트는 이 두 개의 엔진으로
스프링 부트를 실행해야만 Exam1이 실행된다
웹 브라우저에게 전달할 수 있다
App class를 먼저 실행해야된다.

우리가 스프링 부트 사용법을 따라야 한다.

이름을 안 붙이면 class Exam1 이름 그대로 사용
같은 이름으로 만들었다면 기존 것과 충돌나지 않게 별도로 이름을 짓는다
RestController 이름을 부여

@RestController("lang.variable.exam1")
이름 부여
패키지 이름 사이에 점을 찍어서 찾기 쉽게 한 거
스프링 부트가 클래스를 관리할 때 클래스를 구분하기 위해서 붙이는 이름

@RequestMapping("/lang/variable/exam1")
이 메소드 실행해줘
이 메소드를 찾아가는 경로

http://localhost:8080/lang/variable/exam2/test1?name1=가가&name2=나나&name3=다다&name4=

빈 문자열이 나옴

  @GetMapping("/test2")
  public String test2(String[] name) {
    return "=> " + name[0] + ", " + name[1] + ", " + name[2] + ", " + name[3] + ", " + name[4] + ", " + name[5] + ", " + name[6];
  }

http://localhost:8080/lang/variable/exam2/test2?name=가가&name=나나&name=다다&name=

java.lang.ArrayIndexOutOfBoundsException 에러남

이 메모리가 기준점에 해당되는 시작 위치에서 몇 번째 떨어져 있는 바이트냐
200번째 떨어져 있는 바이트
offset 주소를 리턴
배열의 주소를 담는 변수 = 레퍼런스
레퍼런스명[index]

집을 주는 게 아니라 소유권을 주는 거

카톡으로 케이크 받을 권리를 줌

시작 주소를 담아라
주소를 레퍼런스에 담는다

int a = 10;
int b = a;
a = 11;
// a = 11, b = 10

실체를 가리키는 주소 ⟹ reference
배열의 실체 ⟹ instance

arr2 = arr1;
주소를 arr2에 담아라

arr2를 통해서 배열에 접근할 수 있다.

http://localhost:8080/lang/variable/exam2.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>배열</title>
</head>
<body>
<h1>배열</h1>
<script>
var arr1 = [];

function f1(a) {
	a[0] = 100;
	a[2] = 200;
}

function f2() {
	var arr2 = [11, 22, 23];
	return arr2
}

f1(arr1);
console.log(arr1[0], arr1[1], arr1[2]);

var a2 = f2();
console.log(a2[0], a2[1], a2[2]);

</script>
</body>
</html>

스프링 부트와 배열 파라미터

요청 파라미터 개수 만큼 배열을 준비한다. ← 스프링 부트가 만든다.
요청 파라미터가 7개 들어오면 7 길이의 배열을 만든다.
test2 메소드에 배열 주소를 넘긴다.
메소드는 배열 주소를 받을 reference가 필요하다.
test2(String[] name) ← 여기 이름이랑 파라미터명이랑 같아야 된다.

요청 파라미터명과 메소드의 파라미터명이 같아야 한다.
⟹ 이 룰만 지키면 스프링 부트가 만들어주는 배열 주소를 받을 수 있다.

com.eomcs.lang.ex04.Exam0610.java - java-lang/src/main/java

자바스크립트 : dynamic type binding ⟹ 특정 타입에 묶이지 않는다.
자바 : static type binding ⟹ 타입이 고정
개발자가 잘못 사용할 가능성을 줄임

예제 프로그램 실행

html은 스프링 부트에 있음
html을 실행시키려면 스프링 부트를 통해서 실행시켜야 됨
스프링 부트를 통해서 실행시키려면 웹 브라우저를 경유해서 실행해야 됨
html도 그냥 실행하는 게 아니라 스프링 부트로
스프링 부트가 static/lang/variable/exam3.html 읽어서 웹 브라우저에 리턴
웹 브라우저는 html을 실행해서 출력
자바 메소드는 읽어서 주는 게 아니라 메소드를 실행해서 그 결과를 리턴해주는 거
html은 결과를 리턴하는 게 아니라 html을 그대로 읽어서 그대로 리턴
웹 브라우저는 그대로 실행

http://localhost:8080/lang/variable/exam3.html

① 일반 자바 프로그램
java-lang에 있는 건 직접 실행
main() 호출

② 스프링 부트 프로그램
java-lang-boot에 있는 class를 실행할 때는 반드시 웹 브라우저를 통해서
메소드에 URL을 지정해서 실행
메소드의 리턴값을 Spring Boot가 받아서 브라우저에 던져준다.
그러면 브라우저에 화면에 출력한다.

③ HTML/CSS/JavaScript
웹 브라우저로 html을 요청한다.
스프링 부트는 웹 브라우저가 지정한 경로에서 html을 찾아서 읽어서 그 파일 내용을 그대로 가져와서 그대로 웹 브라우저에게 던져준다. 웹 브라우저는 그 파일을 실행을 한다.
스프링 부트에서 HTML/CSS/JavaScript 실행하는 거 아님.
스프링 부트에서 웹 브라우저에 던져주면 웹 브라우저가 그걸 읽어서 웹 브라우저에서 실행하는 거

상수 대문자로 적기
final

자바스크립트 상수

const b;
b = 200;

자바스크립트 상수는 선언과 동시에 값을 줘야 된다.

const b = 200;
console.log(b);

자바스크립트는 실행하기 전까지 오류가 있는지 알 수 없음
자바는 컴파일할 때 에러나서 알 수 있음

com.eomcs.lang.ex04.Exam0710.java - java-lang/src/main/java

자바에서는 변수가 3종류

로컬 변수
클래스 변수
인스턴스 변수

package com.eomcs.lang.ex04;

//# 변수의 종류 - 종류에 따른 변수의 사용 범위
//
class MyClass {
  int a = 11; // 인스턴스 변수
  static int b = 22; // 클래스 변수

  static void m1(int v1/*로컬변수=파라미터*/) {
    int v2; // 로컬 변수
    v2 = 200;
    System.out.println(v1);
    System.out.println(v2);
  }
}

public class Exam0720 {
  public static void main(String[] args/*로컬변수=파라미터*/) {

    // 1) 인스턴스 변수를 사용하는 방법
    MyClass obj1 = new MyClass(); // new 명령이 실행될 때 변수가 준비된다.
    System.out.println(obj1.a); // 인스턴스를 가리키는 레퍼런스를 통해 변수를 사용할 수 있다.

    // 2) 클래스 변수를 사용하는 방법
    System.out.println(MyClass.b); // 클래스를 사용(로딩)하는 시점에 준비된다.

    // 3) 로컬 변수를 사용하는 방법
    MyClass.m1(100); // 메서드를 실행할 때 변수가 준비된다.

    // 메서드 호출이 끝나면 그 메서드의 로컬 변수를 사용할 방법이 없다.
    // v1 = 300; // 오류!
    // 메서드를 실행하는 동안, 그 메서드 안에서만 사용할 수 있다.
  }
}

<script>
var a = 100;

{
    a = 200;
    var b = 300;
}

console.log(a);
console.log(b);

</script>

let은 블럭에 영향을 받는다.

<script>
var a = 100;

{
    a = 200;
    let b = 300;
}

console.log(a);
console.log(b);

</script>

com.eomcs.lang.ex04.Exam0910.java - java-lang/src/main/java
910번 중요

형 변환

같은 type일 경우만 계산 가능
int + int ← ok

값 저장
작은 크기의 메모리

부동소수점 메모리의 값을 정수 메모리에 저장할 수 없다.
float 타입을 int 타입으로 형 변환할 수 없다.
명시적 형변환
int i = (int)f; // 소수점 이하가 제거된다.
뒤에 소수점 이하가 잘린다.

Spring Boot의 자동 형변환

Garbage : 주소를 잃어버려 사용할 수 없는 인스턴스

Garbage Collector

형변환

큰 값을 작은 메모리에 저장 ← 형변환 필요
=> 주의! 값이 잘린다.

정수 → 부동소수점 변수
=> 주의! 유효자릿수를 넘어가는 값을 저장할 때는 값이 잘린다.

int i = 100;
byte b = i; ← 컴파일 오류
명시적 형변환 필요
byte b = (byte) i;
byte 보다 크면 뒤에 값은 잘라라

float f = 31.419f;
int y = (int) f;

스프링 부트에서 형변환

스프링 부트는 클라이언트가 보낸 값을 파라미터 타입에 맞춰 자동 형변환을 수행한다.
웹 브라우저가 보내는 값은 무조건 "문자열"이다.
파일 업로드 할 때 파일만 바이너리 타입이고 나머지는 다 문자열

문자열을 primitive type으로 변환하는 방법

  // 1) "100" ==> byte
  // 테스트 URL :
  // http://localhost:8080/lang/variable/exam3/test1?value=100
  @GetMapping("/test1")
  public String test1(byte value) {
    return "클라이언트에서 받은 값 = " + value;
  }

스프링 부트가 자동 형변환 해줌
Byte.valueOf("100")
리턴값은 byte
클라이언트가 보내는 건 문자열이고 그 문자열을 byte 값으로 바꿔서 메소드를 호출할 때 넘겨준다.

웹 브라우저가 보내는 값은 항상 문자열이다.
파일 업로드의 경우 바이너리 데이터이다.

스프링 부트가 문자열을 바꿀
Byte.valueOf("문자열") → byte
Short.valueOf("문자열") → short
Integer.valueOf("문자열") → int
스프링 부트가 바꿔줌
단 못 바꿀 경우 에러 발생

  // 5) "3.14" ==> float
  // 테스트 URL :
  // http://localhost:8080/lang/variable/exam3/test4?value=3.14
  @GetMapping("/test5")
  public String test5(float value) {
    return "==> " + value;
  }

8자리 되는 게 있고 안 되는 게 있음
절반은 저장될 수 있는데

가능하면 7자리 써라

대소문자 섞어서 써도 되네..

  // 8) "2021-12-06" ==> char
  // 테스트 URL :
  // http://localhost:8080/lang/variable/exam3/test8?value=2021-12-06
  @GetMapping("/test9")
  public String test9(java.sql.Date value) {
    return "==> " + value;
  }

스프링 부트는 날짜까지는 기본으로 바꿔줌

실무에서는 문자형식의 데이터를 날짜형식으로 못 바꿔줌

primitive type    wrapper class
char            Character

문자열 → 문자로 변환 : charAt(0)을 사용한다.
"3".charAt(0) ⟹ '3' (0번째 문자)

package com.eomcs.lang.ex04;

//# 형변환 - 명시적 형변환이 불가능한 경우, 특별한 메서드를 사용하면 가능하다.
// 
public class Exam0951 {
  public static void main(String[] args) {

    byte b = Byte.valueOf("100");
    short s = Short.valueOf("32767");
    int i1 = Integer.valueOf("2122223333"); // 문자열 ==> int
    int i2 = Integer.parseInt("2122223333"); // 문자열 ==> int
    long l = Long.valueOf("9221111222233334444");
    float f1 = Float.valueOf("3.14f");
    float f2 = Float.parseFloat("3.14f");
    double d = Double.valueOf("9876.54321");
    boolean bool1 = Boolean.valueOf("TRUE");  // 문자열 ==> boolean
    boolean bool2 = Boolean.parseBoolean("TRUE");  // 문자열 ==> boolean
    char c = "가".charAt(0); // 문자열 ==> char



    System.out.println(b);
    System.out.println(s);
    System.out.println(i1);
    System.out.println(i2);
    System.out.println(l);
    System.out.println(f1);
    System.out.println(f2);
    System.out.println(d);
    System.out.println(bool1);
    System.out.println(bool2);
    System.out.println(c);
  }
}

변수 끝났다..

Ex04 나머지 예제들 보기

기존에 자바에서 제공하는 변환 기능 + 실전에서 유용한 변환 기능
=> 스프링 부트가 변환해준다.

이클립스와 스프링 부트

eclipse.exe
얘 자체가 이클립스가 아니라 대행자
JVM을 실행시킴
메인 클래스를 실행시킴
메인 클래스가 이클립스 IDE를 실행시킴
이클립스를 실행하려면 JVM이 있어야 됨

나 대신 JVM을 실행
JVM이 App class 실행
App class를 실행했더니만 SpringApplication.run(App.class, args); ← 이게 스프링 부트
스프링 부트가 Tomcat 서버를 내부적으로 실행
Tomcat에는 내장된 미니 웹 서버와 Servlet Container가 있음

이클립스를 띄울 땐 이 VM을 쓰겠다

스프링 부트를 실행하는 건 21.3.0 버전

지금처럼 같을 수도 있고 다를 수도 있음

이클립스와 이클립스에서 실행하는

<form action="/lang/variable/exam4/test1"> 추가

http://localhost:8080/lang/variable/exam4.html

웹 브라우저가 요청

스프링 부트가 /static/lang/variable/exam4.html 읽어서 리턴

④ 응답

⑤ 웹 브라우저가 화면에 출력

⑥ 계산기에 숫자 입력하고 버튼 클릭

버튼 클릭
<form action="/lang/variable/exam4/test1">

⑦ 웹 브라우저는 다시 서버에 요청
버튼을 클릭하면 lang/variable/exam4/test1 이라는 경로로 보내라

⑧ 스프링 부트는 lang/variable/exam4에서 test1() 호출

⑨ 실행

⑩ 결과 리턴

⑪ 스프링 부트는 Exam4에서 리턴 받은 결과를 그대로 응답

⑫ 웹 브라우저는 결과를 출력

모든 요청은 웹 서버로 하는 거

ⓛ 웹 브라우저에서 exam4/test1 요청

② 웹 서버가 서블릿 컨테이너

③ Exam4 클래스에 test1() 메소드 호출

④ Spring web MVC 라는 중간 관리자가 있음
Spring web MVC가 Exam4 클래스에 test1() 메소드를 실행

⑤ 실행

⑥ Spring web MVC

퉁 쳐서 Spring Boot 라고 한다.
스프링 부트가 내부적으로 돌아가는 게 원래 이렇다.
html을 가져올 때는 스프링 부트 웹 서버가 다이렉트로 가져와서 주고
프로그램을 실행시키는 건 Servlet Container - Spring Web MVC

학원
매니저
모든 접점은 매니저
수료증은 매니저님이 발급해 줄 수 있음
강의자료는 강사가 가지고 있음
강의자료를 매니저에게 요청
매니저가 강사에게 강의 자료 요청
강사가 강의자료를 매니저에게 준다
수료증은 매니저가 직접 처리하고

html을 달라고 하면 다이렉트로 읽어서 주고
html이 아니라 프로그램을 실행시켜 달라고 하면 서블릿 컨테이너를 통해서 spring web MVC를 통해서 클래스의 메소드를 실행해서 그 결과를 받아서 받아서 받아서 리턴
전체를 퉁쳐서 보면 웹 브라우저는 스프링 부트에 html 달라고 하는 거고 웹 브라우저는 spring한테 Exam4 test1()을 실행해달라고 하는 거

URL 주소와 뒤에 확장자 html, css, js 확장자를
확장자를 보고 찾는다
html, css, js가 있으면 웹 서버에서 찾을 거고
html, css, js가 없으면 서블릿 컨테이너 - spring web MVC에서 찾을 거고

서버에 요청할 때 요청 파라미터

연산자는 안 감

http://localhost:8080/lang/variable/exam4/test1?v1=100&op=*&v2=200

// 변수 활용
package com.eomcs.study.lang.variable;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController("lang.variable.exam4") // 클래스 이름이 같은 경우 충돌 방지
@RequestMapping("/lang/variable/exam4")
public class Exam4 {

  @GetMapping("/test1")
  public String test1(int v1, int v2, String op) {
    int result = 0;
    switch (op) {
      case "+": result = v1 + v2; break;
      case "-": result = v1 - v2; break;
      case "*": result = v1 * v2; break;
      case "/": result = v1 / v2; break;
      case "%": result = v1 % v2; break;
      default: return "해당 연산을 수행할 수 없습니다.";
    }
    return "==> " + result;
  }

}

XHLHttpRequest()

0개의 댓글