반응형

React Component에서 다루는 데이터는 props와 state

 

props

자식 Component가 생성될 때 부모 Component에서 받아온 데이터로 변경이 불가능

자식 Component에서 this라는 키워드를 통해 부모 Component로부터 받은 props를 사용할 수 있음

 

src/Card.js

// Card.js
import React, { Component } from "react";
 
class Card extends Component {
  render() {
    return (
      <React.Fragment>
        <h3>
          이름 : <b>{this.props.name}</b>
        </h3>
        <h3>
          소속 : <b>{this.props.department}</b>
        </h3>
        <h3>
          연락처 : <b>{this.props.phone}</b>
        </h3>
        <h3>
          이메일 : <b>{this.props.email}</b>
        </h3>
      </React.Fragment>
    );
  }
}
 
export default Card;

scr/App.js 수정

// App.js
import React, { Component } from "react";
import Card from "./Card";
 
class App extends Component {
  render() {
    return (
      <Card
        name="jisu"
        department="Dev"
        phone="010-1234-5678"
        email="282532@naver.com"
      />
    );
  }
}
 
export default App;

Card가 App의 자식 Component가 되는 것
이 때, 부모Component(App.js) 에서 지정한 name, department, phone, email

-> 자식Component(Card.js)로 전달되어 

Card에서 this.props.name, this.props.department, this.props.phone, this.props.email이 사용

 

<defaultProps>

- 부모 Component 가 여러 개의 공통된 자식 Component 를 사용할 경우

 -> 하지만, 자식 Component에서 공통적으로 사용되는 props와 값이 다양한 props가 있을 수 있다

- 이 경우 , 자식 Component에서 defaultPorps를 이용하여 props의 기본값을 설정해 줄 수 있음

- 기본값 : 부모 Component에서 지정해 줄 경우 지정한 값으로 지정하지 않으면 기본값으로 props가 적용

 

//Card.js

import React, { Component } from "react";
 
class Card extends Component {
  static defaultProps = {
    department : "Dev"
  };

  render() {
    return (
      <React.Fragment>
        <h3>
          이름 : <b>{this.props.name}</b>
        </h3>
        <h3>
          소속 : <b>{this.props.department}</b>
        </h3>
        <h3>
          연락처 : <b>{this.props.phone}</b>
        </h3>
        <h3>
          이메일 : <b>{this.props.email}</b>
        </h3>
      </React.Fragment>
    );
  }
}
 
export default Card;

//App.js

// App.js
import React, { Component } from "react";
import Card from "./Card";
 
class App extends Component {
  render() {
    return (
      <React.Fragment>
        {/* department 생략 */}
        <Card name="jisu" phone="010-1234-5678" email="282532@naver.com" />
        <hr />
        {/* department 포함 */}
        <Card
          name="joby"
          department="Marketing"
          phone="010-5678-9123"
          email="bob@bob.com"
        />
      </React.Fragment>
    );
  }
}
 
export default App;

<Functional Component(함수형 컴포넌트)>

- 클래스형 컴포넌트 외 다른 방법으로 컴포넌트 생성

- 단순히 props 받아오는 컴포넌트의 경우 더 간단한 문법으로 사용 가능

- 함수형 컴포넌트는 컴포넌트가 함수이기 때문에 클래스의 특성에서 지닐수 있는 static이나 this 키워드를 사용할 수 없음

-  state나 Life Cycle과 관련된 함수를 사용할 수 없습니다.

 

//Card.js => 함수의 매개변수로 props의 인자들 직접 받음 

 

// Card.js
import React from "react";
 
const Card = ({ name, department, phone, email }) => {
  return (
    <React.Fragment>
      <h3>
        이름 : <b>{name}</b>
      </h3>
      <h3>
        소속 : <b>{department}</b>
      </h3>
      <h3>
        연락처 : <b>{phone}</b>
      </h3>
      <h3>
        이메일 : <b>{email}</b>
      </h3>
    </React.Fragment>
  );
};
 
// 기본 props 지정(함수형 컴포넌트 사용시 static을 사용불가)
Card.defaultProps = {
  department: "Dev"
};
 
export default Card;

state

-  Component 내부에서 생성된 데이터로 변경이 가능

- Component 내부에 state를 class field나 constructor(props) 내부에 정의해서 사용

 

Method Binding

- 이벤트 처리할 경우 , 임의의 메소드 생성

- 이 때, 해당 메소드에서 state를 변경하기 위해 this 키워드를 사용하려면 메소드에 this를 바인딩 시켜주어야

- constructor(props) 내부에 "this.메소드명 = this.메소드명.bind(this)"를 사용하여 메소드에 this를 바인딩

=> 이 작업이 없을 경우, 이벤트가 발생 시 해당 메소드가 이벤트로 전달되는 과정에서 this와 연결이 끊어져, undefined가 됨

      하지만, this 를 메소드로 화살표 함수 표현(Arrow Function Expression)으로 만들 경우,
      this 가 풀리는 것에 대해 걱정할 필요가 없기에 method binding 명시적으로 하지 않아도 됨

 

 

setState

- 선언된 state 값을 변경하기 위해서는 무조건 this.setState를 사용 /
   React 내부에서 setState를 호출하게 되면 자동으로 Component를 리렌더링하게 설계

- 객체로 전달되는 해당 값만 state에서 변경. 전달되지 않은 값은 기존값으로 유지.
   state 내부에 객체가 존재하고 그 객체의 특정 인자만 변경하고 싶다면
  "객체1: { ..., this.state.객체1, 변경요소: 변경요소 값 }"의 다음과 같은 구조로 작성

   =>  그렇지 않으면 객체 자체를 새로 덮어 써버림

 

 전개 연산자(Spread Operator, ...)을 사용하면 기존 내용을 해당 객체에 풀어줌.

 - 이 부분은 객체의 depth가 깊어지면 상당히 복잡해지므로 immutable.js나 immer.js를 이용해서 간단화 작업을 하는게 좋음

 - 기존의 값을 토대로 새로운 값으로 변경하고 싶을 땐 "값1: this.state.값1" 이런 식으로 처리.

     =>  this.state를 사용하고 싶지않다면 setState를 화살표 함수로 만들어서 매개변수로 state나 해당 값을 넣어주면 됨.

    이 때, 해당 값을 이용할 땐 비구조화 할당(Destructuring Assignment)이라는 문법을 사용합니다.

 - render() 함수 내부의 HTML 코드에서 이벤트를 설정할 땐, camelCase로 이벤트명을 적어야 함

  - 또한 이벤트 속성의 값으로는 "함수()" 형태가 아닌 "함수명"으로

     => 그렇지 않을 경우 함수 호출이 무한 루프에 빠질수 있습니다. (렌더링 -> 함수 호출 -> setState -> 리렌더링 -> 함수 호출 -> ...)

 

src/StopWatch.js

// StopWatch.js
import React, { Component } from "react";
 
class StopWatch extends Component {
  // class fields
  state = {
    sec: 0,
    buttonFlag: true,
    intervalFunction: null
  };
 
  // stop watch 로직
  timer = () => {
    // 비구조화 할당 사용( { sec } 부분 )
    this.setState(({ sec }) => ({
      sec: sec + 1
    }));
  };
 
  // start 버튼 클릭
  start = () => {
    this.setState({
      sec: 0,
      buttonFlag: false,
      intervalFunction: setInterval(this.timer, 1000)
    });
  };
 
  // stop 버튼 클릭
  stop = () => {
    clearInterval(this.state.intervalFunction);
 
    this.setState({
      buttonFlag: true
    });
  };
 
  render() {
    return (
      <React.Fragment>
        <h1>Stop Watch</h1>
        <div>
          <b>{this.state.sec}</b>
          <span>초</span>
          {this.state.buttonFlag ? (
            <button onClick={this.start}>start</button>
          ) : (
            <button onClick={this.stop}>stop</button>
          )}
        </div>
      </React.Fragment>
    );
  }
}
 
export default StopWatch;

src/App.js

// App.js
import React, { Component } from "react";
import StopWatch from "./StopWatch";
 
class App extends Component {
  render() {
    return <StopWatch />;
  }
}
 
export default App;

 

반응형

'Language Study > React' 카테고리의 다른 글

4. Life Cycle API  (0) 2019.11.26
2. JSX  (0) 2019.11.26
1. 준비사항  (0) 2019.11.26
반응형

JavaScript xml

 

HTML 형태의 코드를 js 코드로 변환하기 위한 규칙 

- jsx에서는 태그를 닫지 않으면 오류가 발생 , 꼭 태그를 열었으면 닫아주어야 합니다.

 

- 두 개 이상의 엘리먼트는 반드시 하나의 엘리먼트로 감싸야 한다.
   div 태그로 감싸는 방법도 있지만, 스타일 중복이나 table 관련 태그가 번거롭기 때문에 React v16.2에 도입된 Fragment을 이용

   Fragement를 사용하게 되면 실제 DOM 자체는 생기지 않는다. (논리적 엘리먼트이기 때문에)

import React, { Component } from "react";
 
class App extends Component {
  render() {
    return (
      <React.Fragment>
        <h1>My name is</h1>
        <b>jisu</b>
      </React.Fragment>
    );
  }
}
 
export default App;

- jsx 내부에서 javascript의 변수나 함수를 사용하기 위해  {}를 사용

import React, { Component } from "react";
 
class App extends Component {
  render() {
    const color = "black";
 
    return <h1>Color is {color}</h1>;
  }
}
 
export default App;

-jsx 내부에서 조건문 사용시 , 삼항연산자(조건? 참 : 조건) 이나 AND 연산자(조건 &&참) 이용

 IF문은 기본적으로 사용할 수 없고, 사용하려면 IIFE(즉시 실행 함수 표현)을 사용

import React, { Component } from "react";
 
class App extends Component {
  render() {
    const lib = "react";
 
    return (
      <React.Fragment>
        {/* IIFE(즉시 실행 함수) 사용 */}
        {(() => {
          if (lib === "angular") return <h1>Angular</h1>;
          if (lib === "react") return <h1>React</h1>;
          if (lib === "vue") return <h1>Vue</h1>;
        })()}
      </React.Fragment>
    );
  }
}
 
export default App;

 

import React, { Component } from "react";
 
class App extends Component {
  render() {
    const color = "white";
    const lib = "react";
 
    return (
      <React.Fragment>
        {color === "black" ? <h1>검정색</h1> : <h1>다른색</h1>}
        {lib === "react" && <h2>리액트</h2>}
      </React.Fragment>
    );
  }
}
 
export default App;

- JSX에서 style과 className을 사용할 때 

  #styel변수로 사용할 경우 객체 형태로 생성

  #속성이름은 하이펀(-)형태로 camelcase로 바꾸어야한다
    (background-color ==> backgroundColor) 
  #또한 class 대신 className 을 사용

 

// App.css 수정
.App {
  background-color: black;
  color: magenta;
  font-size: 24px;
  font-weight: bold;
  padding: 15px;
}

import React, { Component } from "react";
import "./App.css";
 
class App extends Component {
  render() {
    const style = {
      backgroundColor: "cyan",
      color: "white",
      textDecoration: "underline"
    };
 
    return (
      <div className="App">
        <span>My Name is </span>
        <span style={style}>Kani</span>
      </div>
    );
  }
}
 
export default App;

반응형

'Language Study > React' 카테고리의 다른 글

4. Life Cycle API  (0) 2019.11.26
3. props와 state  (0) 2019.11.26
1. 준비사항  (0) 2019.11.26
반응형

정의 : 컴포넌트를 여러가지 파일로 분리하여 저장하고 JS가 아닌 JSX 라는 문법을 사용

 

- Webpack : 여러가지 분리된 파일 하나로 합쳐주는 라이브러리

- Babel : jsx를 비롯한 새로운 js 문법을 사용하기 위한 라이브러리

- Node.js : Webpack과 Babel 등 여러 라이브러리를 사용하기 위한 javascript 런타임

- Yarn : 캐싱 시스템 등 조금 더 개선된 npm(node package manager)

- Visual Studio Code : 실제 개발을 위해 필요한 에디터 (공짜)

 

 

컴포넌트 App.js 코드 분석

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

//파일에서 jsx문법 사용하려면 React 꼭 import
//Webpack을 사용하기에 logo.svg와 App.css를 이런식으로 불러옴

 

class App extends Component {
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            Edit <code>src/App.js</code> and save to reload.
          </p>
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn React
          </a>
        </header>
      </div>
    );
  }
}

//컴포넌트 만드는 방법 중 하나인 클래스 이용하는 방법
//클래스는 꼭 render()이 있어야하고 그 내부에서 jsx를 반환 
//return 뒤의 html 같은 코드 = jsx
	
export default App;
//작성된 컴포넌트를 다른 곳에서 불러 사용하게 할 수 있는 코드

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
//APP 컴포넌트 사용하기 위해 import
import * as serviceWorker from './serviceWorker';
 
ReactDOM.render(<App />, document.getElementById('root'));
//브라우저 상 React컴포넌트를 보여주기 위해 ReacDOM.render(렌더링 결과물, 그릴 DOM ) 함수 사용
//public/index.html 파일에 있는 id가 'root'인 DOM을 찾아 app컴포넌트를 렌더링
serviceWorker.unregister();
반응형

'Language Study > React' 카테고리의 다른 글

4. Life Cycle API  (0) 2019.11.26
3. props와 state  (0) 2019.11.26
2. JSX  (0) 2019.11.26
반응형

1.String 클래스

-대소문자 변환

  • toUpperCase 메소드 : 모든 글자를 대문자로
  • toLowerCase 메소드 : 모두 소문자로 변환
  • myString 자체를 바꾸는 것이 아니라 새로운 문자열로 리턴시켜주는 것 
String myString = "aBc";
System.out.println(myString.toUpperCase()) // 모두 대문자로
System.out.println(myString.toLowerCase()) // 모두 소문자로
System.out.println(myString)               // 그대로

ABC
abc
aBc

 

-문자열 비교

->참조형 비교 연산자(==)는 가리키는 인스턴스가 같은 인스턴스인지 확인하는 역할

 

두 문자열의 내용이 같은지 비교하려면 equals 메소드를 사용

String myString = "aBc";
System.out.println(myString.toLowerCase().equals("abc"));

true

 

2.숫자 도구

-Math 클래스

   -절대값

import java.lang.Math;

public class Driver {
    public static void main(String[] args) {
        System.out.println(Math.abs(-10));
        System.out.println(Math.abs(8));
    }
}

10
8

  -최소값, 최대값

import java.lang.Math;

public class Driver {
    public static void main(String[] args) {
        System.out.println(Math.min(4, 10));  // 최솟값
        System.out.println(Math.max(4, 10));  // 최댓값
    }
}

4
10

 

-Random 클래스

-> 인스턴스를 생성해서 사용해야함

import java.util.Random;

public class Driver {
    public static void main(String[] args) {
        Random rand = new Random();
        System.out.println(rand.nextInt(10));   // 0 이상 9 이하의 랜덤한 값
    }
}

 

-a ~ b 사이의 랜덤 값

import java.util.Random;

public class Driver {
    public static void main(String[] args) {
        Random rand = new Random();
        int min = 10;
        int max = 30;

        System.out.println(rand.nextInt((max - min) + 1) + min);   // 10 이상 30 이하의 랜덤한 값
    }
}

 

3.Wrapper Class

-> 기본 자료형을 객체 형식으로 감싸는 역할

->Integer 클래스는 int형을, Double 클래스는 double을, Long 클래스는 long을, Boolean 클래스는 boolean을 감쌈

-> ArrayList 같은 컬렉션을 사용할 때 꼭 참조형을 사용해야 함

-> 인스턴스는 생성자로 생성할 수도 있고, 리터럴로 생성할 수도 있음

Integer i = new Integer(123);
Integer i = 123;

 

-주의할 점

System.out.println(123 == 123);
System.out.println(new Integer(123) == new Integer(123));

true
false //참조형의 비교 연산자는 가리키는 객체가 같읕지 비교하기 때문입니다. 두 생성자를 통해 만든 다른 객체이기 때문에 

 

 

두 String 인스턴스를 비교할 때 처럼 equals 메소드를 쓰면 '값'이 같은지 확인

System.out.println(new Integer(123).equals(new Integer(123)));

true

 

4.ArrayList

import java.util.*
import java.util.ArrayList
  • 객체들을 삽입, 삭제, 검색 할 수 있는 컨테이너 클래스
  • 배열의 길이 제한 단점을 극복할 수 있다
  • 삽입되는 객체의 수가 많아지면 자동으로 크기가 조절된다
  • 아이템을 벡터의 맨 마지막이나 중간에 삽입할 수 있다
  • ArrayList 맨 뒤에 객체 추가 : 벡터 공간이 모자라면 자동 늘림
  • ArrayList 중간에 객체 삽입 : 뒤에 존재하던 객체는 한칸씩 뒤로 이동
  • 임의의 위치에 있는 개체 삭제 : 객체 삭제 후 한칸씩 앞으로 자동 이동

선언 방식

ArrayList<test> myList = new ArrayList<test>(); //선언방식

<> 안에 들어가는 것 : List 타입

 

<주요 메소드>

myList.add(Object elem)
     객체 매개변수(elem)를 목록에 추가

myList.remove(int index)
     index 매개변수로 지정한 위치에 있는 객체를 제거

myList.remove(Object elem)
     주어진 객체가 List에 있으면 그 객체를 제거

myList.contains(Object elem)
     객체 매개변수 elem에 매치되는 것이 있으면 '참'을 리턴

myList.isEmpty()
     목록에 아무 원소도 없으면 '참'을 리턴

myList.indexOf(Object elem)
     객체 매개변수(elem)의 인덱스 또는 -1을 리턴

myList.size()
      현재 목록에 들어있는 원소의 개수를 리턴

get(int index)
      주어진 index 매개변수 위치에 있는 객체를 리턴

 

5.HashMap

->  'value(원소)'와, 그 원소를 가리키는 'key' 값을 같이 저장

 

-사용

   ->HashMap의 키로는 String을 쓰는 것이 가장 일반적

 

-선언하기

HashMap<String, Pokemon> pokedex = new HashMap<>();

-key-Value 쌍 추가하기(put 메소드)

pokedex.put("피카츄", new Pokemon("피카츄"));
pokedex.put("파이리", new Pokemon("파이리"));
pokedex.put("이상해씨", new Pokemon("이상해씨"));
pokedex.put("이상해풀", new Pokemon("이상해풀"));
pokedex.put("이상해꽃", new Pokemon("이상해꽃"));

 

-값 꺼내기(get 메소드)

Pokemon pikachu = pokedex.get("피카츄");

-원소 덮어쓰기

pokedex.put("피카츄", new Pokemon("라이츄");

 

 

-반복문을 통해 HashMap 탐색하기

  • HashMap의 keyset메소드는 모든 key를 담고 있는 Set을 리턴
  • Set은 List나 Map과 같이 원소를 담고 있는 자료형 중 하나이며 'for each'문으로 탐색이 가능
for (String key : pokedex.keySet()) {
    System.out.println(pokedex.get(key));
}

 

(심화) 동작원리

HashMap의 key는 'hashcode'라는 것으로 관리

hashcode는 모든 클래스의 인스턴스가 가진 고유한 값인데, 인스턴스마다 다르기 때문에 HashMap이 key를 구분하는 값으로 사용

(여러 인스턴스가 같은 hashcode를 가질 수 있으며, 이 경우 HashMap에선 key.equals(anotherKey) 메소드로 구분).

일반적인 클래스는 인스턴스 생성시 hashcode 값이 결정

즉, 같은 정보를 담고 있는 두 인스턴스가 서로 다른 hashcode를 가질 수 있다

 

그런데 String은 서로 다른 인스턴스라도 안의 내용이 같으면 같은 hashcode를 가짐.

그렇기 때문에 HashMap의 key로서 String이 매우 적합.

Key는 실제 인스턴스보다는 안에 담긴 의미, 내용으로 구분하는 것이 좋기 때문!!

반응형

'Language Study > Java' 카테고리의 다른 글

5. 자바, 더 정확하게  (0) 2019.09.08
제주에서 자바_Week4  (0) 2019.08.12
제주에서 자바_Week3_4  (0) 2019.08.11
##자바 헷갈리는 이론  (0) 2019.08.01
제주에서 자바_Week3_3  (0) 2019.07.31
반응형

1. 기본형 vs 참조형

 

-기본형 : int / boolean / char / double 

int a = 3;
int b = a;

System.out.println(a);  // 3 출력
System.out.println(b);  // 3 출력

a = 4;
System.out.println(a);  // 4 출력
System.out.println(b);  // 3 출력

b = 7;
System.out.println(a);  // 4 출력
System.out.println(b);  // 7 출력

 

-참조형 : Person, String , int[] 등 클래스 기반 자료형

Person p1, p2;
p1 = new Person("김신의", 28);

p2 = p1;
p2.setName("문종모");

System.out.println(p1.getName()); //문종모
System.out.println(p2.getName()); //문종모

p1은 '김신의'라는 이름을 가진 Person 인스턴스가 저장되어있음

p2 = p1 => p2에게 같은 영역을 가리키라

p2.setName("문종모") 를 하면 그 영역에 있는 인스턴스의 name -> 문종모  로 바뀜

p2, p1은 모두 같은 영역을 가리키고 있으니 두 출력 값은 모두 '문종모'

 

배열 또한 객체이기에 참조형

int[] a = new int[3];
int[] b = a;

a[0] = 1;
b[0] = 2;

System.out.println(a[0]); //2
System.out.println(b[0]); //2

 

 

2. null 

비어있음 -> null 로 표현

단, null은 참조형 변수(Reference Type)만 가질 수 있는 값

Person p1 = null;
System.out.println(p1); //null

//만약, null을 보관하고 있는 변수의 메소드를 호출하려고 하면 오류 발생
Person p1 = null;
p1.getName(); //Exception in thread "main" java.lang.NullPointerException

//대처법
Person[] people = new Person[5];
people[0] = new Person("김신의", 28);
people[2] = new Person("문종모", 26);
people[3] = new Person("서혜린", 21);

for (int i = 0; i < people.length; i++) {
    Person p = people[i];
    if (p != null) {
        System.out.println(p.getName());
    } else {
        System.out.println(i + "번 자리는 비었습니다.");
    }
}

/*김신의
1번 자리는 비었습니다.
문종모
서혜린
4번 자리는 비었습니다.*/

 

3. 숏서킷 연산(Short-Circuit Evaluation)

-> 실의 결과값이 이미 결정된 경우 미리 멈추는 것

 

-And (&&)

boolean newBoolean = m1() && m2() && m3();

-> newBoolean이 true가 되기 위해서는  m1()m2()m3()가 모두 true를 리턴해야함

 

-Or (||)

boolean newBoolean = m1() || m2() || m3();

-> newBoolean이 false이기 위해서는 m1()m2()m3()의 리턴값이 모두 false이어야 함

 

4. 변수 안전하게 만들기(final)

-변수 정의 시 final을 써주면, 그 변수는 상수가 됨 -> 한번 정의하면 다시 바꿀 수 없음

 

-참조형

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

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

    public String getName() {
        return this.name;
    }

    public static void main(String[] args) {
        final Person p1 = new Person("김신의");
        p1.setName("문종모");
        System.out.println(p1.getName());
    }
}
//문종모

->p1의 이름을 못 바꾸도록 만들고 싶으면 Person 클래스 내에서 name을 final로 정의해주면 됨.

 

5. 인스턴스 변수 vs 클래스 변수

 

-인스턴스 변수

public class Person {
    int count;
}

//새로운 Person 인스턴스를 생성할 때마다 각 인스턴스의 count변수를 계속 바꿔야함
public static void main(String[] args) {
    Person p1 = new Person();
    p1.count++;

    Person p2 = new Person();
    p1.count++;
    p2.count = p1.count;

    Person p3 = new Person();
    p1.count++;
    p2.count++;
    p3.count = p2.count;

    Person p4 = new Person();
    p1.count++;
    p2.count++;
    p3.count++;
    p4.count = p3.count;

    System.out.println(p1.count); //4
    System.out.println(p2.count); //4
    System.out.println(p3.count); //4
    System.out.println(p4.count); //4
}

 

-클래스 변수 버전

public class Person {
    static int count;
}

//count는 특정 인스턴스에 해당되는게 아니라, Person 클래스 전체에 해당되는 것
//count 부를 때 대문자로 쓴 클래스 이름을 사용해서 Person.count 써준다

public static void main(String[] args) {
    Person p1 = new Person();
    Person.count++;

    Person p2 = new Person();
    Person.count++;

    Person p3 = new Person();
    Person.count++;

    Person p4 = new Person();
    Person.count++;

    System.out.println(Person.count);
} //4

 

-> Person.count++ 매번해주는 것을 개선시켜주자 

public class Person {
    static int count;

    public Person() {
        count++;
    }
}

public static void main(String[] args) {
    Person p1 = new Person();
    Person p2 = new Person();
    Person p3 = new Person();
    Person p4 = new Person();

    System.out.println(Person.count);
}//4

 

-> 변수가 클래스 자체에 해당될 때는 static 써서 클래스 변수로 만들어주자!

 

-상수

상수는 인스턴스에 해당되는 것이 아니며, 여러 복사본 대신 한 값만 저장해둔다

public class CodeitConstants {
    public static final double PI = 3.141592653589793;
    public static final double EULERS_NUMBER = 2.718281828459045;
    public static final String THIS_IS_HOW_TO_NAME_CONSTANT_VARIABLE = "Hello";

    public static void main(String[] args) {
        System.out.println(CodeitConstants.PI + CodeitConstants.EULERS_NUMBER);
    }
}//5.859874482048838

 

6.인스턴스 메소드 vs 클래스 메소드 

-클래스 메소드 : 인스턴스가 아닌 클래스에 속한 메소드

-> 인스턴스를 생성하지 않고도 바로 실행할 수 있다

 

<클래스 메소드 예시>

-Math 클래스 

import java.lang.Math;

public class Driver {
    public static void main(String[] args) {
        System.out.println(Math.abs(-10));   // 절댓값
        System.out.println(Math.max(3, 7));  // 두 값 중 최댓값
        System.out.println(Math.random());   // 0.0과 1.0 사이의 랜덤값
    }
}

10
7
0.40910432549890663

Math 클래스에 있는 abs()max()random() 등의 메소드가 바로 '클래스 메소드'

 

-main 메소드

public static void main(String[] args) {
    ...
}

 

-클래스 변수를 다룰 때

public class Counter {
    static int count;

    public static void increment() {
        count++;
    }

    public static void main(String[] args) {
        System.out.println(Counter.count);

        Counter.increment();
        System.out.println(Counter.count);

        Counter.increment();
        System.out.println(Counter.count);

        Counter.increment();
        System.out.println(Counter.count);
    }
}
0
1
2
3

 

언제 클래스 메소드를 쓰나?

-> 생성된 인스턴스가 하나도 없더라도 메소드를 호출하고 싶다면 -> static메소드 사용

반응형

'Language Study > Java' 카테고리의 다른 글

6. 자바, 더 간편하게  (0) 2019.09.08
제주에서 자바_Week4  (0) 2019.08.12
제주에서 자바_Week3_4  (0) 2019.08.11
##자바 헷갈리는 이론  (0) 2019.08.01
제주에서 자바_Week3_3  (0) 2019.07.31
반응형

 

 

 

 

 

 

 

 

 

 

 

 

Log

 

httpClient는 아파치 재단에서 URL 클래스를 훨씬 좋게 만든 것 (HTTP 프로토콜로 요청/ 응답 수행 가능)

안드로이드 OS에도 표준탑재되어 서버에서 정보를 다운받는 용도로 사용한다.

 

public class Test127{
	public static void main(String[] args) throws IOException{
    	//CloseableHttpCilent : 실제로 요청 / 응답을 수행하는 핵심
        
         CloseableHttpClient httpClient = HttpClients.createDefault();
         
         String l = "http://192.168.2.11:8081/study3/Test126.jsp?pw=1234";
         HttpGet httpGet = new HttpGet(l); //get 방식요청
         httpGet.addHeader("User-Agent", "Mozila/5.0"); //헤더 조작 여지
         
         // execute 실제로 요청/응답을 수행한다. httpResponse가 응답이다
         CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
         
         int resCode = httpResponse.getStatusLine().getStatusCode();
         if(resCode == 200) {
        	 InputStream in = httpResponse.getEntity().getContent();
        	 BufferedReader bin = new BufferedReader(new InputStreamReader(in));
         // new InputStremReader(in, "utf-8") 한글 깨지면 이거 써라...
       
        	BufferedReader bin = new BufferedReader(new InputStreamReader(in));
          
        //  new InputStremReader(in, "utf-8") 한글 깨지면 이거 써라… **
       // why? => java default unicode / web default utf-8
 		String str = null;
 		while((str=bin.readLine())!=null){
 		System.out.println(str);
        }
      }
      
     }
     
   }
우리는 지금 Get 방식으로 사용하는 법을 배웠다. 많은 정보를 서버에서 다운받는 것에는 차이가 없다 GET이 든 POST든 Client에서 대량의 정보를 업로드 하려면 POST를 써야함 ** 위 코드와 많이 틀려지게 되니 이 점 유의할것 BufferedReader bin = new BufferedReader(new InputStreamReader(in)); ** new InputStremReader(in, "utf-8") 한글 깨지면 이거 써라… **

 

 

commons-logging.jar log4j-1.2.17.jar 은 lib 폴더에 넣는다.

Commons-logging.properties, log4j.properties는 src 폴더에 넣는다.

그러면 classes 폴더에 자동으로 복사된다. (실제 운영할 때는 classes 폴더에 넣으면 된다)

 

jar 파일이 버전이 다른 두개가 모이는 경우가 있는데 그럴 경우에는 안돌아가는 경우가 흔하다

 

Commons-logging.properties

# org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

> 원하는 것 고르고

 

 log4j.properties

log4j.appender.A2.File=./../0805/web/log.txt

>경로 고치고

 

<%@page import="org.apache.log4j.Logger"%>
<%! static Logger logger = Logger.getLogger("about"); %>
<% logger.info("HelloWorld"); %>

 

>실행시키고 하면 ! ==> log.txt <== HelloWorld 이런식으로 찍힌다!

 

1. Commons-logging 에 대한 설정이 commons-logging.properties에 있음

    Log4JLogger : log4j 를 내부적으로 사용하겠다는 설정

    Log4JLogger에 대한 설정이 log4j.properties가 된다

 

2. log4j.appender.A2.layout.ConversionPattern = [%d] %5p %d : %m%n

    %m%n 만 해도 됨ㅎㅎ [시간] INFO about : HelloWorld 이런 식으로 뜸

    로그 파일의 형식 지정 : 단순히 콘솔에 찍어보는 걸 넘어서 내부적인 동작을 고스란히 담아낼 수 있다.

    로그파일 분석 툴을 이용하면 사이트 전반의 분석을 가능하게 한다.

 

3. 실전에는 Util.L(…) 같은 거 만들어서 쓰는 경우가 많다.

 

 

pageNavigation

 

페이지 개수 = ((글 갯수 -1) / 페이지 크기 ) + 1
블럭 사이즈 (BS) : 10 단위로 하단에 보여짐
이전 페이지 : (BB!=1)
다음 페이지 : (BE != 총 페이지 수)
BB = ((CP -1)/ 10) * 10 +1 : 처음 보여줄 1 2 3 4 5 개 / CP 는 1 2 3 4 5 .. 들 중 하나

1. 정렬된 순서 보기

SELECT id, title FROM Temp10T ORDER BY id DESC;

 

2. rownum??

SELECT id, rownum FROM Temp10T;

SELECT id, rownum FROM Temp10T ORDER BY id DESC;

—row num은 order by 이전에 부여된다. 따라서 order by 이후에 rownum으로 쪼개는 건 무의미

 

— 그러면 orderby 시켜놓고 그 다음에 rownum 붙이겠다?

SELECT id, rownum FROM ( SELECT id FROM Temp10T ORDER BY id DESC );

 

3. rownum을 기준으로 페이지 나누기?

SELECT id, rownum FROM ( SELECT id FROM Temp10T ORDER BY id DESC ) WHERE rownum > 0 AND rownum <= 5;

SELECT id, rownum FROM ( SELECT id FROM Temp10T ORDER BY id DESC ) WHERE rownum > 5 AND rownum <= 10;

Rownum 이 10까지 없고 모자란다? 5개 가져오는 중에 5~10 사이가 없음 안됨

 

4. rownum을 field로 굳혀놓고 나누기!!

SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T ORDER BY id DESC );

SELECT id FROM ( SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T ORDER BY id DESC ) ) WHERE sq > 0 AND sq <= 5; SELECT id FROM ( SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T ORDER BY id DESC ) ) WHERE sq > 5 AND sq <= 10;

 

5. 서브쿼리로 정리해서 깔끔하게!!

SELECT * FROM Temp10T WHERE id IN ( SELECT id FROM ( SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T ORDER BY id DESC ) ) WHERE sq > 10 AND sq <= 20 ) ORDER BY id DESC;

 

select * from (select id, rownum as sq from (select id from temp10t where 0=0 order by id desc))

where sq>20 and sq<=30;

 

6. 나중의 검색을 위해서 0 = 0 은 그냥 끼워 넣어준다(검색을 어떻게 할지 생각해 보자)

SELECT * FROM Temp10T WHERE id IN ( SELECT id FROM ( SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T WHERE 0 = 0 ORDER BY id DESC ) ) WHERE sq > 5 AND sq <= 10 ) ORDER BY id DESC;

 

여기에서 0 = 0 을 응용하여 검색기능에서의 나누기 시도한다.

 

StringBuffer find = new StringBuffer(" WHERE 0 = 0"); if( title != null ){ find.append(" AND title LIKE '%"); find.append( title ); find.append("%'"); } if( user != null ){ find.append(" AND user ='"); find.append( title ); find.append("'"); } if( content != null ){ find.append(" AND content LIKE '%"); find.append( content ); find.append("%'"); }

 

String subSql = "SELECT id FROM " + "( SELECT id, rownum as sq FROM " + "( SELECT id FROM Temp10T "+ find.toString() + " ORDER BY id DESC ) )" + "WHERE sq > 5 AND sq <= 10";

 

String countSql = "SELECT COUNT(*) FROM Temp10T " + find.toString(); String sql = "SELECT * FROM ("+ subSql +") ORDER BY id DESC";

 

그러면 아래와 같은 형태의 결과를 보게 될 것이다.

 

SELECT COUNT(*) FROM Temp10T WHERE 0 = 0 AND user = 'root' AND content LIKE '%ab%'

....

SELECT * FROM Temp10T WHERE id IN ( SELECT id FROM ( SELECT id, rownum as sq FROM ( SELECT id FROM Temp10T WHERE 0 = 0 AND user = 'root' AND content LIKE '%ab%' ORDER BY id DESC ) ) WHERE sq > 0 AND sq <= 3 ) ORDER BY id DESC;

 

0=0 위치가 검색 조건이 들어갈 위치

select * from temp10t where id in(select id from (select id, rownum sq from (select id from temp10t where title like '%bc%' order by id desc))where sq>0 and sq<=10) order by id desc;

 

Mysql

create table Temp10t(

-> id integer(3),

-> title varchar(7));

~insert로 입력

 

select * from temp10t order by id desc limit 0, 10;

10 씩 쪼개줌

select * from temp10t order by id desc limit 10, 10;

10개 세고 또 10개

 

> form-group으로 지정된 div를 이용하여 label과 input을 한쌍으로 묶어서 보여준다

<form role="form">
 <div class="form-group">
 <label for="email">이메일</label>
 <input type="text" id="email" class="form-control"/>
 </div>
</form>

 

>그리드 이용하여 모바일용 화면과 pc용 화면을 하나의 페이지에서 구현한 사례

<div class="row">
   <div class="col-xs12 col-sm-4">
     <form role="form">
       <div class="form-group">
         <label for="email">이메일</label>
         <input type="text" id="email" class="form-control temp"/>
         </div>
       <div>
         <label>암호</label>
         <input type="password" id="password" class="form-control" />
       </div>
     </form>
   </div>
</div>

 

>> form에 추가 

class = "form-inline"
sm 크기 이상인 경우 class="form-inline"이 지정되면 라벨과 컨트롤은 좌우로 배치된다.
input 크기가 가지런하지 않아 이 부분 개선 class="form-hoizontal"로 지정된 경우에 라벨과 인풋이 가지런하게 배치되도록 할 수 있다

input은 div에 넣어 크기를 지정하고
label의 class에 크기를 지정한다

 

JavaScript

<a href = "javascripts:alter('<%=1%>');"> Click </a>

브라우저가 요청하면 서버가 요청을 받고, 요청에 해당하는 servlet/jsp가 동작한다

보여지는 브라우저 상 에서 javascript는 동작한다

 

jsp 에서 javascript 코드를 생성하는 일은 가능하다.

하지만 javascript에서 jsp쪽이 코드를 생성하는 일은 불가능하다.

왜? jsp가 먼저 동작하기 때문에

 

함수의 매개변수의 갯수가 틀려도 호출된다.
만일 갯수가 틀리면 앞의 변수부터 대입이 된다.
변수 선언시에는 var라는 키워드를 사용한다.
변수는 모든 값이 대입 가능 (정수, 문자열, 실수, 함수, 객체...)
두번 선언해도 에러 안나고, var없이 선언해도 에러 안난다
script 태그 안에 있는 코드는 페이지가 모두 로딩 되지 않은 상태에서
호출 변수를 선언하지 않고 사용하면 초기값은 undefined이고 여난이 불가능하다.
var total=0; 코드가 빠졌을 때 에러가 나는 이유를 점검하자.
java는 블럭 안에서 선언한 변수는 블럭에서만 쓸 수 있는 개념인데
javascript는 선언만 되어 있으면 쓸 수 있고, 선언 안해도 쓴다


모든 html 요소는 id 속성을 가질 수 있다 

속성 값은 pk처럼 겹치면 안된다

 

Document.getElementById("abcd") : id 값으로 객체의 포인터를 찾는다

 

window.onload = function(){
 var op = document.getElementById("abcd");
 op.onclick = function () {
 alert();
 }
}

/*op라는 포인터 변수로 해당 객체를 가리킨다
  포인터를 통해 객체가 가진 속성을 읽고, 조작할 수 있다
  op.onclick은 op 포인터가 가리키는 객체의 onclick 이라는 변수(프로퍼티)
  javascript 변수는 다 가리킬 수 있다.
  onclick은 이름없는 함수와 다름 없다.
  가리키는 것과 호출하는 것은 다르다(여기서는 가리키기만 한다.)
  
  호출되는 시점? 
  op 가리키는 객체에 click 상황이 벌어지면 onclick 이 가리키는 함수가 호출된다.
	
  이벤트 처리의 두가지 방법
	1. onXXX 속성을 이용하는 방법 : onclick="alert();"
	2. onXXX 속성을 함수포인터로 쓰는 방법 : 위 코드의 방법.(이 방법이 더 많이 스임).*/

 

 

window.onload = function(){
 var is = document.getElementsByTagName("img");
 for(var i=0;i<is.length;i++){
 alert(is[i].src);
 }
}

/*ls[0] = function(){alter(i)} 가리키는 시점에서는 i가 0인데, 호출하는 시점에서는 4가 된다

가리키는 시점의 값과 호출하는 시점의 값이 같아야 한다

=> 함수의 매개변수를 활용한 로컬변수를 사용해야한다*/
반응형

'Language Study > Java' 카테고리의 다른 글

6. 자바, 더 간편하게  (0) 2019.09.08
5. 자바, 더 정확하게  (0) 2019.09.08
제주에서 자바_Week3_4  (0) 2019.08.11
##자바 헷갈리는 이론  (0) 2019.08.01
제주에서 자바_Week3_3  (0) 2019.07.31
반응형

 

 

 

 

 

 

 

 

 

<MVC 아키텍쳐>

MVC 이전
Model DAO
View HTML 영역
Controller java영역(서블릿)

 

MODEL(DAO)

package study;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class BangMyungDAO_OracleImpl implements BangMyungDAO
{
     @Override
     public void add(BangMyungVO vo) throws Exception
     {
         Connection conn = null;
         Statement stmt = null;
         try {
                 Class.forName("oracle.jdbc.driver.OracleDriver");
                 conn =
            DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:32771/xe",
             "system", "1234");
                stmt = conn.createStatement();
             String sql = "insert into bangmyung_t values (
            seq_bangmyung.nextval, '"+
             vo.getGul() + "', sysdate )";
             stmt.executeUpdate( sql );
             }
                catch( Exception e ){ throw e; }
                finally {
                 if( stmt != null ) stmt.close();
                 if( conn != null ) conn.close();
                }
         }
         @Override
         public List<BangMyungVO> findAll() throws Exception {
             List<BangMyungVO> ls = new ArrayList<BangMyungVO>();
             Connection conn = null;
             Statement stmt = null;
             ResultSet rs = null;
         try {
             Class.forName("oracle.jdbc.driver.OracleDriver");
             conn =
        DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:32771/xe",
         "system", "1234");
             stmt = conn.createStatement();
             String sql = "SELECT no, gul, the_time FROM bangmyung_t order by
        no desc";
             rs = stmt.executeQuery( sql );
         while( rs.next() ) {
              BangMyungVO vo = new BangMyungVO();
             vo.setNo( rs.getInt("no") );
             vo.setGul( rs.getString("gul") );
             vo.setTheTime( rs.getString("the_time") );
             ls.add( vo );
         }
         }
         catch( Exception e ){}
         finally {
             if( rs != null ) rs.close();
             if( stmt != null ) stmt.close();
             if( conn != null ) conn.close();
         }
     return ls;
     }
}

VIEW(HTML)

<%@ page language="java" contentType="text/html; charset=EUC-KR"
 pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="sso" %>
<!DOCTYPE>
<html>
    <body>
        <table border='1'>
             <tr>
             <td>No</td>
             <td>글</td>
             <td>작성시간</td>
             </tr>
             <sso:forEach varStatus="vs" var="vo" items="${ lst }">
             <tr bgColor="${ (vs.count % 2 != 0)?'#aabbcc':'#bbccdd' }">
                 <td>${ vs.count }</td>
                 <td>${ vo.no }</td>
                 <td>${ vo.gul }</td>
                 <td>${ vo.theTime }</td>
             </tr>
             </sso:forEach>
        </table>
        <form method="POST" action="bangmyung_add.jsp">
         <input type="text" name="gul" size="50"/>
         <input type="submit"/>
        </form>
    </body>
</html>

 

CONTROLLER(JAVA)

<%@ page language="java" contentType="text/html; charset=utf-8"
 pageEncoding="utf-8" import="java.util.List, study.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="sso" %>
<%!
 public void submit() {
 System.out.println("submit");
 }
%>
<%
     // 1. 변수선언
     List<BangMyungVO> rl = null;
     Exception err = null;
     // 2. DB 연동
     BangMyungDAO dao = new BangMyungDAO_OracleImpl();
     try {
     rl = dao.findAll();
     } catch (Exception e) {
     err = e;
     }
     // 3. 흐름 만들기
     if ( rl == null || err != null ) {
     response.setCharacterEncoding("utf-8");
     response.sendRedirect("/study3/error.jsp");
     } else {
     request.setAttribute("lst", rl);
     RequestDispatcher rd = request.getRequestDispatcher("/Test125_1.jsp");
     rd.forward(request, response);
    %>
<!DOCTYPE>
<html>
    <body>
        <table border='1'>
         <tr>
             <td>No</td>
             <td>글</td>
             <td>작성시간</td>
         </tr>
         <sso:forEach varStatus="vs" var="vo" items="${ lst }">
         <tr bgColor="${ (vs.count % 2 != 0)?'#aabbcc':'#bbccdd' }">
             <td>${ vs.count }</td>
             <td>${ vo.no }</td>
             <td>${ vo.gul }</td>
             <td>${ vo.theTime }</td>
         </tr>
         </sso:forEach>
        </table>
    <form method="POST" action="bangmyung_add.jsp">
     <input type="text" name="gul" size="50"/>
     <input type="submit"/>
    </form>
    <% } %>
    </body>
</html>

 

MVC 만들기

package mvc;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public interface Controller {
         public String handleRequest(HttpServletRequest request,
        HttpServletResponse response) throws Exception;
}
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
    public @interface RequestMapping {
     public String value();
}
package mvc;
//import 생략~
    public class DispatcherServlet extends HttpServlet {
     private Map<String, Controller> map = null;

     @Override
     public void init(ServletConfig config) throws ServletException{
         map = new Hashtable<String, Controller>();

         String cs = "mvc.CtrlList,mvc.CtrlAdd2";
         for(String str : cs.split(",")){
         try{
             //해당 클래스 가져오고
             Class<?> cls = Class.forName(str);
             //RequestMapping에서 지정된 url 패턴 따오고
             RequestMapping an = cls.getAnnotation(RequestMapping.class);
            //얘 때문에 Controller에너는 Annotation!
             System.out.println("this is an : " + an);
             //해당 controller instance 받아오고
             Controller value = (Controller) cls.newInstance(); 
             // 이름이 str인 Controller 클래스 찾기
             // url 따기
             String key = an.value();
             //url-pattern과 controller 매핑
                 map.put(key, value);
                 }catch (Exception e) {}
                 } //String[] cs2 = cs.split(","); for(int i=0;i<cs2.length;i++)
                 System.out.println(map.toString());
         }
     @Override
     protected void service(HttpServletRequest request, HttpServletResponse
    response)
     throws IOException, ServletException {
     }
 }
package mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

    @RequestMapping("/apple_list.do")
    public class CtrlList implements Controller {

     @Override
         public String handleRequest(HttpServletRequest request,
    HttpServletResponse response) throws Exception {
         return null;
 }
package mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RequestMapping("/apple_add2.do")
public class CtrlAdd2 implements Controller{

     @Override
     public String handleRequest(HttpServletRequest request,
    HttpServletResponse response) throws Exception {
     return null;
     }
 }

JSP MODEL1 / MVC MODEL2

 

 

model1 VS model2

<model1>

가장먼저 들어오는 곳이 JSP이다.

JSP에서 비즈니스 로직, VIEW모든 것을 처리한다.

 

<model2>

가장먼저 요청하는 곳이 서브릿단이다.

비즈니스 로직을 처리하는 서블릿을 완전히 분리시켜서 VIEW단과 로직을 처리하는 단을 분리시킨다.




 

 

Controller 추가해야할 때

<servlet>
 <servlet-name>abcd2</servlet-name>
 <servlet-class>mvc.DispatcherServlet</servlet-class>
     <init-param>
         <param-name>controllers</param-name>
         <param-value>
         mvc.CtrlList,
         mvc.CtrlAdd2
         </param-value>
     </init-param>
</servlet>

<!-- 여기 이렇게 controller를 추가하면 되지 않을까! -->

public void init(ServletConfig config) throws ServletException{
 map = new Hashtable<String, Controller>();
 String cs = config.getInitParameter("controllers");

 

HTML 소스 긁어오는애

package main;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
public class Test126 {
     public static void main(String[] args) throws Exception{
         URL rl = new URL("http://localhost:8081/0802/apple_list.do");
         URLConnection ucon = rl.openConnection();
         InputStream in = ucon.getInputStream();

     BufferedReader bin = new BufferedReader(new InputStreamReader(in,
    "UTF-8")); //>> char 단위로 읽게해주는 adapter
     //사실 UTF-8 빼도 되더라 얜 응답 내용
            String l = null;
         while((l = bin.readLine()) !=null){

         System.out.println(l);
         }
     in.close();
    }
}

java.net.URL은 이것 자체가 작은 웹브라우저의 역할을 한다. 요청을 날리고 그에 해당하는 응답을 받아들인
다 안드로이드 앱에서 버튼을 누르면 오늘의 배송정보가 넘어오는 ? 배송정보는 서버에 올라와 있는 상태! => 이
다운 받는 역할, 서버에 존재하는 배송정보를 다운받는 역할을 수행한다. 소켓으로 다 짜는 것이 아니라 http 프
로토콜로 서버와 통신할 때는 이 클래스를 주로 이용한다.
소켓으로 다 짜는 것이 아니라 http 프로토콜로 서버와 통신할 때는 이 클래스를 주로 이용한다.
앱 같은 경우에서 서버로부터 많은 데이터를 다운 받아야 할 경우에 URL 클래스를 이용하여 jsp 파일로부터 정
보를 다운받는다
이게 워낙 많이 쓰이다 보니 이를 강화한 오픈 소스 라이브러리가 등장 = apache http client 프로젝트 = 안
드로이드의 http 기반 표준 통신 수단

 

암호가 맞으면 다운, 아니면 안됨

    <%@ page contentType="text/plain; charset=UTF-8" pageEncoding="EUC-KR" %><%
     String pw = request.getParameter("pw");
     if(pw.equals("1234")){
         String[] l = {"사과", "귤", "배", "토마토"};
         String nl = "\r\n"; //줄 바꿈 표시

     for (int i = 0; i < l.length; i++) {%>
         <%=l[i]%><%=nl%>
         <%}}else{%>
         암호틀림
 <%}%>
public static void main(String[] args) throws Exception{
     URL rl = new URL("http://localhost:8081/0802/Test126.jsp?pw=1230");
     URLConnection ucon = rl.openConnection();
     InputStream in = ucon.getInputStream();

     BufferedReader bin = new BufferedReader(new InputStreamReader(in, "UTF8")); //>> char 단위로 읽게해주는 adapter
     //사실 UTF-8 빼도 되더라 얜 응답 내용

     String l = null;
     while((l = bin.readLine()) !=null){
         System.out.println(l);
         }
         in.close();
}
반응형

'Language Study > Java' 카테고리의 다른 글

5. 자바, 더 정확하게  (0) 2019.09.08
제주에서 자바_Week4  (0) 2019.08.12
##자바 헷갈리는 이론  (0) 2019.08.01
제주에서 자바_Week3_3  (0) 2019.07.31
제주에서 자바_Week3_2  (0) 2019.07.30
반응형

1. StringBuffer vs StringBuilder

StringBuilder

StringBuffer

  • 문자열 저장 및 변경을 위한 메모리 공간을 지닌 클래스

  • 문자열 데이터의 추가를 위해 append , insert 메소드를 지니고 있다

  • String 클래스는 문자열 상수를 지니는 메모리 공간 지님

    -> StringBuffer, StringBuilder 안의 메모리 공간 : 값이 변경 가능한 변수의 성격 지님

동시에 처리하는 것(Synchroziation) 허용 X

동시에 처리하는 것 (Synchroziation) 허용 O

단일 스레드 환경

멀티 쓰레드 프로그래밍

2. 객체란?

-데이터 행위, 아이덴티티를 가지고 있는 것

 

3.클래스 

-객체를 생성하는 템플릿

-동일한 속성과 메소드를 가진 객체를 생성하기 위한 템플릿

-객체를 메모리상(Heap)에 올려놓고 데이터를 처리하기 위해서 미리 작성된 객체의 정의(데이터 구조 + 처리과정)

-메모리 상 올라가기전(class) / 올라와서 사용( 객체)

-클래스에서 데이터 구조를 정의하는 것 : 속성(Attribute) or 멤버변수

-클래스에서 처리 과정을 위한 함수 : 메서드

 

4.캡슐화

-행위, 상태 포장 -> 외부에 노출할 것(interface), 감출 것 결정

 

5.상속

-계층구조를 표현하는 것

 

6.다형성

-캡슐화, 상속과 함께 동작하며 , 객체-지향 프로그램의 흐름 제어를 단순화

 

7.JSP & Servlet

-웹 어플리케이션

-JSP (HTML 문서 안에 JAVA 코드 포함)

-서블릿(자바 코드 안에 HTML 포함)

 

-사용자 요청이 Servlet 일 경우 

  • 클라이언트가 웹 브라우저에 URL 을 입력하면 해당하는 HTTP Request를 해당하는 서버의 Servlet Container 에 보낸다

  • Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체 생성

  • 클라이언트가 요청한 URL-> WebContent/WEB-INF/web.xml 파일에 작성

  • Servlet Container 는 service() 메소드를 호출하여 POST, GET 여부 따라 doGet() 또는 doPost() 가 호출

  • doGet() 또는 doPost() 메소드는 동적인 페이지 생성 후 -> HttpServletResponse 객체에 응답 보냄

  • 응답 완료 시 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다

-사용자 요청이 JSP 일 경우 흐름

  • 사용자로부터 요청을 받은 웹서버는 요청에 포함된 URL (http://localhost/*.jsp?*) 속의 .jsp확장자들 발견하고 요청이 JSP 페이지인 것 확인

  • JSP를 WAS(웹 컨테이너)로 전송

  • WAS(웹 컨테이너)는 JSP페이지 전체를 Servlet class의 소스코드 변환

 

 

반응형

'Language Study > Java' 카테고리의 다른 글

제주에서 자바_Week4  (0) 2019.08.12
제주에서 자바_Week3_4  (0) 2019.08.11
제주에서 자바_Week3_3  (0) 2019.07.31
제주에서 자바_Week3_2  (0) 2019.07.30
제주에서 자바_Week3_1  (0) 2019.07.29

+ Recent posts