사이트가 개편되면서 사용방법이 쉬워졌는데
이전에 설명 페이지를 보고 하려니 잘 안되서 작성함
1. https://developers.daum.net/
2. 상단 메뉴중 서비스를 클릭
3. 좌측의 메뉴 중 지도를 클릭
4. 그러면 새창이 열리고 확인하기를 누른뒤 좌측 메뉴에서
열쇠 모양 아이콘 클릭
5. 앱 만들기 클릭 - 앱 이름 입력
6. 하나의 앱이 만들어지고 하위 메뉴가 뜨는데
그중 api 키를 클릭
7. api 메뉴에서 REST/JS 및 Oauth 두가지 방식이 있는데 REST
선택후
8. 패키지명이나 혹은 웹에서 쓰면 주소 입력하고 엔터
9. api 키 확인
2015년 9월 24일 목요일
2015년 9월 22일 화요일
클래스 디자인 패턴 12. Compound Pattern (복습)
1. 스트리티지 패턴 적용(일부만)
처음 진행했던 duck 예제를 처음부터 작성합니다.
하나의 인터페이스를 두어 행동 active 에 대해서
다른 동작을 하고 이를 수정코저 할때 그 부분만
수정할 수 있도록 떼어 냈습니다.
다이어그램은 아래와 같습니다.
행동 quackable 를 4개 클래스가 implements 하고 있습니다.
1) Quackable interface 작성
package quackable_1;
public interface Quackable {
public void quack();
}
2. 어댑터 패턴
여기에 비슷한 기능을 하지만 엄연이 다른 메서드를
보유하고 있는 '거위' 라는 클래스를 생성합니다.
하지만 여기 실행에 포함하고 싶습니다.
구별없이 진행하려면 거위 클래스에 어댑터를 달아서
duck와 구별 없이 동작하도록 변경합니다.
1) 거위 클래스 작성 이는 interface를 참고하지 않는
duck 계열과는 다른 클래스 입니다.
package honkable_2;
public class Goose {
public void honk(){
System.out.println("----Honk im honk honk honk----");
}
}
이를 위해서 오리 생성자를 다른 객체로 감싸서
기존 기능을 + count 를 할 수 있는 기능을 추가합니다.
추가 내용에 대한 다이어그램은 아래와 같습니다.
1) QuackAble를 참고하는 QuackCount를 생성합니다.
여기서는 quack 를 구현할때 count를 체크하게끔하고
count는 static 선언하여 인스턴트와 상관없이
count가 쌓이게끔 합니다.
추가로 getQuacks에서 count를 반환하도록 작성합니다.
package quackCountDeco_4;
import quackable_1.Quackable;
public class QuackCount implements Quackable {
Quackable duck;
static int numberofQuacks;
public QuackCount(Quackable duck) {
this.duck = duck;
}
@Override
public void quack() {
duck.quack();
numberofQuacks++;
}
public static int getQuacks(){
return numberofQuacks;
}
}
2) 테스트 코드를 수정합니다. 여기서 각 duck 인스턴스 생성시
가자의 구현체를 QuackCount 객체에 넣어서 생성합니다.
new QuackCount(new MallardDuck());
package simulator;
import honkable_2.Goose;
import adapterQuack_3.GooseAdapter;
import quackCountDeco_4.QuackCount;
import quackable_1.DuckCall;
import quackable_1.MallardDuck;
import quackable_1.Quackable;
import quackable_1.RedheadDuck;
import quackable_1.RubberDuck;
public class DuckSimulator {
public static void main(String[] args) {
DuckSimulator simulator = new DuckSimulator();
simulator.simulate();
}
private void simulate() {
Quackable mallardDuck = new QuackCount(new MallardDuck());
Quackable redheadDuck = new QuackCount(new RedheadDuck());
Quackable duckCall = new QuackCount(new DuckCall());
Quackable rubberDuck = new QuackCount(new RubberDuck());
Quackable gooseDuck = new GooseAdapter(new Goose());
System.out.println("\n Duck Simulator");
simulate(mallardDuck);
simulate(redheadDuck);
simulate(duckCall);
simulate(rubberDuck);
simulate(gooseDuck);
System.out.println("The Duck quacked "+ QuackCount.getQuacks()+"times.");
}
private void simulate(Quackable duck) {
duck.quack();
}
}
이렇게 하면 다른 비슷한 클래스를 추가할때 공통 부분을
건들지 않고 팩토리만 수정하면 추가되며
사용 하는 부분은 test 부분에서 수정하도록 일부 떼어내기가 가능
해집니다.
구현하고자 하는 팩토리 패턴의 다이어그램입니다.
1) DuckFactory 작성을 위한 추상 클래스를 하나 작성합니다.
여기에 오리를 추가하면 구현부에 오류가 뜨기 때문에 쉽게
구현이 가능합니다.
package duckFactory_5;
import quackable_1.Quackable;
public abstract class AbstractDuckFactory {
public abstract Quackable createMallarDuck();
public abstract Quackable createRedheadDuck();
public abstract Quackable createDuckCall();
public abstract Quackable createRubberDuck();
}
2) DuckFacotry를 상속받아 구현체인 CountDuckFacory를
구현합니다. 이때 QuackCounter 도 포함하여 구현토록
작성합니다.
package duckFactory_5;
import quackCountDeco_4.QuackCount;
import quackable_1.DuckCall;
import quackable_1.MallardDuck;
import quackable_1.Quackable;
import quackable_1.RedheadDuck;
import quackable_1.RubberDuck;
public class CountingDuckFactory extends AbstractDuckFactory {
@Override
public Quackable createMallarDuck() {
// TODO Auto-generated method stub
return new QuackCount(new MallardDuck());
}
@Override
public Quackable createRedheadDuck() {
// TODO Auto-generated method stub
return new QuackCount(new RedheadDuck());
}
@Override
public Quackable createDuckCall() {
// TODO Auto-generated method stub
return new QuackCount(new DuckCall());
}
@Override
public Quackable createRubberDuck() {
// TODO Auto-generated method stub
return new QuackCount(new RubberDuck());
}
}
3) 여기에 맞춰 테스트 코드를 수정합니다.
package simulator;
import duckFactory_5.AbstractDuckFactory;
import duckFactory_5.CountingDuckFactory;
import honkable_2.Goose;
import adapterQuack_3.GooseAdapter;
import quackCountDeco_4.QuackCount;
import quackable_1.DuckCall;
import quackable_1.MallardDuck;
import quackable_1.Quackable;
import quackable_1.RedheadDuck;
import quackable_1.RubberDuck;
public class DuckSimulator {
public static void main(String[] args) {
DuckSimulator simulator = new DuckSimulator();
AbstractDuckFactory duckFactory = new CountingDuckFactory();
simulator.simulate(duckFactory);
}
private void simulate(AbstractDuckFactory duckFactory) {
Quackable mallardDuck = duckFactory.createMallarDuck();
Quackable redheadDuck = duckFactory.createRedheadDuck();
Quackable duckCall = duckFactory.createDuckCall();
Quackable rubberDuck = duckFactory.createRubberDuck();
Quackable gooseDuck = new GooseAdapter(new Goose());
System.out.println("\n Duck Simulator");
simulate(mallardDuck);
simulate(redheadDuck);
simulate(duckCall);
simulate(rubberDuck);
simulate(gooseDuck);
System.out.println("The Duck quacked "+ QuackCount.getQuacks()+"times.");
}
private void simulate(Quackable duck) {
duck.quack();
}
}
굳이 한 객체씩 관리해야 하는 점 때문입니다.
Iterator에 객체 생성부분을 통합시키고 array로만
해당 부분을 관리하면 simulator를 한번만
돌릴 수 있습니다.
그리고 오리나 거위나 상관없이 add 함수만으로 객체를
simulator 상에 추가할 수 있습니다.
구현하고자 하는 팩토리 패턴의 다이어그램입니다.
1) Iterator 를 생성합니다.
package iterator_6;
import java.util.ArrayList;
import java.util.Iterator;
import quackable_1.Quackable;
public class Flock implements Quackable{
ArrayList quackers = new ArrayList();
public void add(Quackable quacker){
quackers.add(quacker);
}
@Override
public void quack() {
Iterator iterator = quackers.iterator();
while(iterator.hasNext()){
Quackable quacker = (Quackable) iterator.next();
quacker.quack();
}
}
}
2) 테스트 코드를 수정합니다.
package simulator;
import iterator_6.Flock;
import duckFactory_5.AbstractDuckFactory;
import duckFactory_5.CountingDuckFactory;
import honkable_2.Goose;
import adapterQuack_3.GooseAdapter;
import quackCountDeco_4.QuackCount;
import quackable_1.Quackable;
public class DuckSimulator {
public static void main(String[] args) {
DuckSimulator simulator = new DuckSimulator();
AbstractDuckFactory duckFactory = new CountingDuckFactory();
simulator.simulate(duckFactory);
}
private void simulate(AbstractDuckFactory duckFactory) {
Quackable mallardDuck = duckFactory.createMallarDuck();
Quackable redheadDuck = duckFactory.createRedheadDuck();
Quackable duckCall = duckFactory.createDuckCall();
Quackable rubberDuck = duckFactory.createRubberDuck();
Quackable gooseDuck = new GooseAdapter(new Goose());
System.out.println("\n Duck Simulator");
Flock flockOfCucks = new Flock();
flockOfCucks.add(mallardDuck);
flockOfCucks.add(redheadDuck);
flockOfCucks.add(duckCall);
flockOfCucks.add(rubberDuck);
flockOfCucks.add(gooseDuck);
simulate(flockOfCucks);
System.out.println("The Duck quacked "+ QuackCount.getQuacks()+"times.");
}
private void simulate(Quackable duck) {
duck.quack();
}
}
5번까지 진행 결과 : 3,4번 결과와 동일합니다.
처음 진행했던 duck 예제를 처음부터 작성합니다.
하나의 인터페이스를 두어 행동 active 에 대해서
다른 동작을 하고 이를 수정코저 할때 그 부분만
수정할 수 있도록 떼어 냈습니다.
다이어그램은 아래와 같습니다.
행동 quackable 를 4개 클래스가 implements 하고 있습니다.
1) Quackable interface 작성
package quackable_1;
public interface Quackable {
public void quack();
}
2) Quackabel 기능을 상속받은 다른 구현체들을 작성
(1)
package quackable_1;
public class MallardDuck implements Quackable {
@Override
public void quack() {
System.out.println("Quack Quack * 3");
}
}
(2)
package quackable_1;
public class RedheadDuck implements Quackable {
@Override
public void quack() {
System.out.println("Quack * 2");
}
}
(3)
package quackable_1;
public class DuckCall implements Quackable {
@Override
public void quack() {
System.out.println("Kwak");
}
}
(4)
package quackable_1;
public class RubberDuck implements Quackable {
@Override
public void quack() {
System.out.println("Squeak");
}
}
3) test 구현체 작성
package simulator;
import quackable_1.DuckCall;
import quackable_1.MallardDuck;
import quackable_1.Quackable;
import quackable_1.RedheadDuck;
import quackable_1.RubberDuck;
public class DuckSimulator {
public static void main(String[] args) {
DuckSimulator simulator = new DuckSimulator();
simulator.simulate();
}
private void simulate() {
Quackable mallardDuck = new MallardDuck();
Quackable redheadDuck = new RedheadDuck();
Quackable duckCall = new DuckCall();
Quackable rubberDuck = new RubberDuck();
System.out.println("\n Duck Simulator");
simulate(mallardDuck);
simulate(redheadDuck);
simulate(duckCall);
simulate(rubberDuck);
}
private void simulate(Quackable duck) {
duck.quack();
}
}
1차 실행 결과 :
2. 어댑터 패턴
여기에 비슷한 기능을 하지만 엄연이 다른 메서드를
보유하고 있는 '거위' 라는 클래스를 생성합니다.
하지만 여기 실행에 포함하고 싶습니다.
구별없이 진행하려면 거위 클래스에 어댑터를 달아서
duck와 구별 없이 동작하도록 변경합니다.
1) 거위 클래스 작성 이는 interface를 참고하지 않는
duck 계열과는 다른 클래스 입니다.
package honkable_2;
public class Goose {
public void honk(){
System.out.println("----Honk im honk honk honk----");
}
}
2) Goose를 duck처럼 동작하기 위해서 adapter를 생성합니다.
package adapterQuack_3;
import honkable_2.Goose;
import quackable_1.Quackable;
public class GooseAdapter implements Quackable{
Goose goose ;
public GooseAdapter(Goose goose){
this.goose=goose;
}
@Override
public void quack() {
goose.honk();
}
}
3) 정상적으로 동작하는지 보기 위해 test 소스를 수정합니다.
중요한 부분은 인스턴스 생성시 어댑터를 통해서 goose를
생성하였다는 점이며 이후 동일한 메서드를 통해서
goose의 honk() 메서드를 실행할 수 있었습니다.
Quackable gooseDuck = new GooseAdapter(new Goose());
simulate(gooseDuck);
package simulator;
import honkable_2.Goose;
import adapterQuack_3.GooseAdapter;
import quackable_1.DuckCall;
import quackable_1.MallardDuck;
import quackable_1.Quackable;
import quackable_1.RedheadDuck;
import quackable_1.RubberDuck;
public class DuckSimulator {
public static void main(String[] args) {
DuckSimulator simulator = new DuckSimulator();
simulator.simulate();
}
private void simulate() {
Quackable mallardDuck =new MallardDuck();
Quackable redheadDuck = new RedheadDuck();
Quackable duckCall = new DuckCall();
Quackable rubberDuck = new RubberDuck();
Quackable gooseDuck = new GooseAdapter(new Goose());
System.out.println("\n Duck Simulator");
simulate(mallardDuck);
simulate(redheadDuck);
simulate(duckCall);
simulate(rubberDuck);
simulate(gooseDuck);
}
private void simulate(Quackable duck) {
duck.quack();
}
}
package adapterQuack_3;
import honkable_2.Goose;
import quackable_1.Quackable;
public class GooseAdapter implements Quackable{
Goose goose ;
public GooseAdapter(Goose goose){
this.goose=goose;
}
@Override
public void quack() {
goose.honk();
}
}
3) 정상적으로 동작하는지 보기 위해 test 소스를 수정합니다.
중요한 부분은 인스턴스 생성시 어댑터를 통해서 goose를
생성하였다는 점이며 이후 동일한 메서드를 통해서
goose의 honk() 메서드를 실행할 수 있었습니다.
Quackable gooseDuck = new GooseAdapter(new Goose());
simulate(gooseDuck);
package simulator;
import honkable_2.Goose;
import adapterQuack_3.GooseAdapter;
import quackable_1.DuckCall;
import quackable_1.MallardDuck;
import quackable_1.Quackable;
import quackable_1.RedheadDuck;
import quackable_1.RubberDuck;
public class DuckSimulator {
public static void main(String[] args) {
DuckSimulator simulator = new DuckSimulator();
simulator.simulate();
}
private void simulate() {
Quackable mallardDuck =new MallardDuck();
Quackable redheadDuck = new RedheadDuck();
Quackable duckCall = new DuckCall();
Quackable rubberDuck = new RubberDuck();
Quackable gooseDuck = new GooseAdapter(new Goose());
System.out.println("\n Duck Simulator");
simulate(mallardDuck);
simulate(redheadDuck);
simulate(duckCall);
simulate(rubberDuck);
simulate(gooseDuck);
}
private void simulate(Quackable duck) {
duck.quack();
}
}
3. 데코레이터 패턴
오리울음 횟수를 체크하는 counter 를 추가하고자 합니다.이를 위해서 오리 생성자를 다른 객체로 감싸서
기존 기능을 + count 를 할 수 있는 기능을 추가합니다.
추가 내용에 대한 다이어그램은 아래와 같습니다.
1) QuackAble를 참고하는 QuackCount를 생성합니다.
여기서는 quack 를 구현할때 count를 체크하게끔하고
count는 static 선언하여 인스턴트와 상관없이
count가 쌓이게끔 합니다.
추가로 getQuacks에서 count를 반환하도록 작성합니다.
package quackCountDeco_4;
import quackable_1.Quackable;
public class QuackCount implements Quackable {
Quackable duck;
static int numberofQuacks;
public QuackCount(Quackable duck) {
this.duck = duck;
}
@Override
public void quack() {
duck.quack();
numberofQuacks++;
}
public static int getQuacks(){
return numberofQuacks;
}
}
2) 테스트 코드를 수정합니다. 여기서 각 duck 인스턴스 생성시
가자의 구현체를 QuackCount 객체에 넣어서 생성합니다.
new QuackCount(new MallardDuck());
package simulator;
import honkable_2.Goose;
import adapterQuack_3.GooseAdapter;
import quackCountDeco_4.QuackCount;
import quackable_1.DuckCall;
import quackable_1.MallardDuck;
import quackable_1.Quackable;
import quackable_1.RedheadDuck;
import quackable_1.RubberDuck;
public class DuckSimulator {
public static void main(String[] args) {
DuckSimulator simulator = new DuckSimulator();
simulator.simulate();
}
private void simulate() {
Quackable mallardDuck = new QuackCount(new MallardDuck());
Quackable redheadDuck = new QuackCount(new RedheadDuck());
Quackable duckCall = new QuackCount(new DuckCall());
Quackable rubberDuck = new QuackCount(new RubberDuck());
Quackable gooseDuck = new GooseAdapter(new Goose());
System.out.println("\n Duck Simulator");
simulate(mallardDuck);
simulate(redheadDuck);
simulate(duckCall);
simulate(rubberDuck);
simulate(gooseDuck);
System.out.println("The Duck quacked "+ QuackCount.getQuacks()+"times.");
}
private void simulate(Quackable duck) {
duck.quack();
}
}
3번까지 진행 결과 :
4. 팩토리 패턴
오리 생성하는 부분을 따로 떼어서 팩토리로 감싸는걸 생각해봅니다.이렇게 하면 다른 비슷한 클래스를 추가할때 공통 부분을
건들지 않고 팩토리만 수정하면 추가되며
사용 하는 부분은 test 부분에서 수정하도록 일부 떼어내기가 가능
해집니다.
구현하고자 하는 팩토리 패턴의 다이어그램입니다.
1) DuckFactory 작성을 위한 추상 클래스를 하나 작성합니다.
여기에 오리를 추가하면 구현부에 오류가 뜨기 때문에 쉽게
구현이 가능합니다.
package duckFactory_5;
import quackable_1.Quackable;
public abstract class AbstractDuckFactory {
public abstract Quackable createMallarDuck();
public abstract Quackable createRedheadDuck();
public abstract Quackable createDuckCall();
public abstract Quackable createRubberDuck();
}
2) DuckFacotry를 상속받아 구현체인 CountDuckFacory를
구현합니다. 이때 QuackCounter 도 포함하여 구현토록
작성합니다.
package duckFactory_5;
import quackCountDeco_4.QuackCount;
import quackable_1.DuckCall;
import quackable_1.MallardDuck;
import quackable_1.Quackable;
import quackable_1.RedheadDuck;
import quackable_1.RubberDuck;
public class CountingDuckFactory extends AbstractDuckFactory {
@Override
public Quackable createMallarDuck() {
// TODO Auto-generated method stub
return new QuackCount(new MallardDuck());
}
@Override
public Quackable createRedheadDuck() {
// TODO Auto-generated method stub
return new QuackCount(new RedheadDuck());
}
@Override
public Quackable createDuckCall() {
// TODO Auto-generated method stub
return new QuackCount(new DuckCall());
}
@Override
public Quackable createRubberDuck() {
// TODO Auto-generated method stub
return new QuackCount(new RubberDuck());
}
}
3) 여기에 맞춰 테스트 코드를 수정합니다.
package simulator;
import duckFactory_5.AbstractDuckFactory;
import duckFactory_5.CountingDuckFactory;
import honkable_2.Goose;
import adapterQuack_3.GooseAdapter;
import quackCountDeco_4.QuackCount;
import quackable_1.DuckCall;
import quackable_1.MallardDuck;
import quackable_1.Quackable;
import quackable_1.RedheadDuck;
import quackable_1.RubberDuck;
public class DuckSimulator {
public static void main(String[] args) {
DuckSimulator simulator = new DuckSimulator();
AbstractDuckFactory duckFactory = new CountingDuckFactory();
simulator.simulate(duckFactory);
}
private void simulate(AbstractDuckFactory duckFactory) {
Quackable mallardDuck = duckFactory.createMallarDuck();
Quackable redheadDuck = duckFactory.createRedheadDuck();
Quackable duckCall = duckFactory.createDuckCall();
Quackable rubberDuck = duckFactory.createRubberDuck();
Quackable gooseDuck = new GooseAdapter(new Goose());
System.out.println("\n Duck Simulator");
simulate(mallardDuck);
simulate(redheadDuck);
simulate(duckCall);
simulate(rubberDuck);
simulate(gooseDuck);
System.out.println("The Duck quacked "+ QuackCount.getQuacks()+"times.");
}
private void simulate(Quackable duck) {
duck.quack();
}
}
4번까지 진행 결과 : 3번 항목과 일치합니다.
5. 컴포지트 패턴+이터레이터 패턴
오리를 하나씩 생성하는데 그부분이 눈에 거슬립니다.굳이 한 객체씩 관리해야 하는 점 때문입니다.
Iterator에 객체 생성부분을 통합시키고 array로만
해당 부분을 관리하면 simulator를 한번만
돌릴 수 있습니다.
그리고 오리나 거위나 상관없이 add 함수만으로 객체를
simulator 상에 추가할 수 있습니다.
구현하고자 하는 팩토리 패턴의 다이어그램입니다.
1) Iterator 를 생성합니다.
package iterator_6;
import java.util.ArrayList;
import java.util.Iterator;
import quackable_1.Quackable;
public class Flock implements Quackable{
ArrayList quackers = new ArrayList();
public void add(Quackable quacker){
quackers.add(quacker);
}
@Override
public void quack() {
Iterator iterator = quackers.iterator();
while(iterator.hasNext()){
Quackable quacker = (Quackable) iterator.next();
quacker.quack();
}
}
}
package simulator;
import iterator_6.Flock;
import duckFactory_5.AbstractDuckFactory;
import duckFactory_5.CountingDuckFactory;
import honkable_2.Goose;
import adapterQuack_3.GooseAdapter;
import quackCountDeco_4.QuackCount;
import quackable_1.Quackable;
public class DuckSimulator {
public static void main(String[] args) {
DuckSimulator simulator = new DuckSimulator();
AbstractDuckFactory duckFactory = new CountingDuckFactory();
simulator.simulate(duckFactory);
}
private void simulate(AbstractDuckFactory duckFactory) {
Quackable mallardDuck = duckFactory.createMallarDuck();
Quackable redheadDuck = duckFactory.createRedheadDuck();
Quackable duckCall = duckFactory.createDuckCall();
Quackable rubberDuck = duckFactory.createRubberDuck();
Quackable gooseDuck = new GooseAdapter(new Goose());
System.out.println("\n Duck Simulator");
Flock flockOfCucks = new Flock();
flockOfCucks.add(mallardDuck);
flockOfCucks.add(redheadDuck);
flockOfCucks.add(duckCall);
flockOfCucks.add(rubberDuck);
flockOfCucks.add(gooseDuck);
simulate(flockOfCucks);
System.out.println("The Duck quacked "+ QuackCount.getQuacks()+"times.");
}
private void simulate(Quackable duck) {
duck.quack();
}
}
5번까지 진행 결과 : 3,4번 결과와 동일합니다.
2015년 9월 21일 월요일
클래스 디자인 패턴 11. proxy pattern_
1. 개념잡기
1) 의미 및 구현방법
현재 상태를 다른 프로그램에서 요청하여 볼 수 있도록
하는 기능입니다.
다른 프로그램을 엿보기 위해서 클라이언트(요청하는곳) 과
서비스(요청에 대한 응답) 기능을 두고 그 사이에 통신 기능을
넣어서 서로 정보를 주고 받을 수 있도록 해야 합니다.
이를 위해서 통신 기능을 넣어야 하지만
java의 RMI 클래스를 통해서
이를 쉽게 프록시로 생성하여 관리 가능합니다.
관련 클래스
java.rmi.Remote : interface
import java.rmi.RemoteException : class 오류 관리
2) 참고자료
RMI 클래스는
http://www.javadom.com/tutorial/rmi-idl/
http://java.ihoney.pe.kr/54
2. 소스
소스는 기본적으로 디자인 패턴 10번을 가지고 진행합니다.
1) rmi.Remote를 상속받아서 interface를 구현
3) 다이어그램
역시 하단 링크를 참고바랍니다.
하단 링크에서도 자세하게 설명하고 있습니다.
state 및 이를 implements 한 구현체 클래스는 스트리티지
패턴과 비슷하나 이를 밖에서 조합하여
쓰는 과정에서 약간 차이가 있음.
http://secretroute.tistory.com/entry/Head-First-Design-Patterns-%EC%A0%9C11%EC%9E%A5-Proxy-%ED%8C%A8%ED%84%B4-1
1) 의미 및 구현방법
현재 상태를 다른 프로그램에서 요청하여 볼 수 있도록
하는 기능입니다.
다른 프로그램을 엿보기 위해서 클라이언트(요청하는곳) 과
서비스(요청에 대한 응답) 기능을 두고 그 사이에 통신 기능을
넣어서 서로 정보를 주고 받을 수 있도록 해야 합니다.
이를 위해서 통신 기능을 넣어야 하지만
java의 RMI 클래스를 통해서
이를 쉽게 프록시로 생성하여 관리 가능합니다.
관련 클래스
java.rmi.Remote : interface
import java.rmi.RemoteException : class 오류 관리
2) 참고자료
RMI 클래스는
http://www.javadom.com/tutorial/rmi-idl/
http://java.ihoney.pe.kr/54
2. 소스
소스는 기본적으로 디자인 패턴 10번을 가지고 진행합니다.
1) rmi.Remote를 상속받아서 interface를 구현
package instances; import java.rmi.Remote; import java.rmi.RemoteException; import stateI.State; public interface GumballMachineRemote extends Remote { public int getCount() throws RemoteException; public String getLocation() throws RemoteException; public State getState() throws RemoteException; }
2) GumballMachine 은 rmi.server 의 UnicastRemoteObject를
상속받도록 수정한다.
3) State 객체는 직렬화가 가능토록 직렬화 상속을 받아서
진행한다.
4) 기존 testDrive 는 아래와 같이 처리한다.
5) GumballMonitor에 예외처리를 해준다.
6) GumballMonitorTestDrive 를 구현하여 요청하는 client 단의
내용을 test 할 수 있도록 한다.
package instances;
import java.rmi.Naming;
public class GumballMonitorTestDrive {
public static void main(String[] args) {
String[] location = {"rmi://santafe.mightygumball.com/gumballmachine","rmi://boulder.mightygumball.com/gumballmachine","rmi://seattle.mightygumball.com/gumballmachine"};
GumballMonitor[] monitor = new GumballMonitor[location.length];
for(int i=0; i<location.length;i++){
GumballMachineRemote machine;
try {
machine = (GumballMachineRemote) Naming.lookup(location[i]);
monitor[i] = new GumballMonitor(machine);
System.out.println(monitor[i]);
} catch (Exception e) {
e.printStackTrace();
}
}
for(int i=0; i<monitor.length;i++){
}
}
}
결과 :
실행순서 :
(1) rmiRegistry
.....
(2) GumballMachineTestDrive
이걸 실행시 인자 값을 줘야함 String int
java GumballMachineTestDrive seattle.mightygumball.com 100
java GumballMachineTestDrive boulder.mightygumball.com 100
run - configration 에서 Argument 부분에서 인자값을 넣어줘야 함.
.....
(3) GumballMonitorTestDrive
상속받도록 수정한다.
public class GumballMachine extends UnicastRemoteObject implements GumballMachineRemote { State soldOutState; State noQuarterState; State hasQuarterState; State soldState; State state = soldOutState; int count =0; public GumballMachine(String locatrion, int numberGumballs) throws RemoteException { soldOutState = new SoldOutState(this); noQuarterState = new NoQuarterState(this); hasQuarterState = new HasQuarterState(this); soldState = new SoldState(this); this.count =numberGumballs; if(numberGumballs>0){ state = noQuarterState; } }
3) State 객체는 직렬화가 가능토록 직렬화 상속을 받아서
진행한다.
package stateI; import java.io.Serializable; public interface State extends Serializable { public void insertQuarter(); public void ejectQuarter(); public void turnCrank(); public void dispense(); }
4) 기존 testDrive 는 아래와 같이 처리한다.
package tsstmain; import java.rmi.Naming; import instances.GumballMachine; import instances.GumballMachineRemote; public class GumballMachineTestDrive { public static void main(String[] args) { GumballMachineRemote gumballMachine = null; int count; if (args.length < 2) { System.out.println("GumballMachine"); System.exit(1); } try { count = Integer.parseInt(args[1]); gumballMachine = new GumballMachine(args[0], count); Naming.rebind("//" + args[0] + "/gumballmachine", gumballMachine); } catch (Exception e) { e.printStackTrace(); } } }
5) GumballMonitor에 예외처리를 해준다.
package instances; import java.rmi.*; public class GumballMonitor { GumballMachineRemote machine; public GumballMonitor(GumballMachineRemote machine) { this.machine = machine; } public void report() { try{ System.out.println("뽑기 기계위치:"+machine.getLocation()); System.out.println("현재 재고:"+machine.getCount()+" 개"); System.out.println("현재 상태:"+machine.getState()); } catch(RemoteException e){ e.printStackTrace(); } } }
6) GumballMonitorTestDrive 를 구현하여 요청하는 client 단의
내용을 test 할 수 있도록 한다.
package instances;
import java.rmi.Naming;
public class GumballMonitorTestDrive {
public static void main(String[] args) {
String[] location = {"rmi://santafe.mightygumball.com/gumballmachine","rmi://boulder.mightygumball.com/gumballmachine","rmi://seattle.mightygumball.com/gumballmachine"};
GumballMonitor[] monitor = new GumballMonitor[location.length];
for(int i=0; i<location.length;i++){
GumballMachineRemote machine;
try {
machine = (GumballMachineRemote) Naming.lookup(location[i]);
monitor[i] = new GumballMonitor(machine);
System.out.println(monitor[i]);
} catch (Exception e) {
e.printStackTrace();
}
}
for(int i=0; i<monitor.length;i++){
}
}
}
7) 이를 테스트 하려면 rmi Registry 플러그인이 필요하다.
하단 링크 참고
http://blog.bagesoft.com/646
%java GumballMonitorTestDrive
뽑기 기계 위치 : seattle.mightygumball.com
현재 재고 : 100 개
현재 상태 : 동전 투입 대기중
뽑기 기계 위치 : seattle.mightygumball.com
현재 재고 : 100 개
현재 상태 : 동전 투입 대기중
2. 다이어그램
3) 다이어그램
역시 하단 링크를 참고바랍니다.
하단 링크에서도 자세하게 설명하고 있습니다.
state 및 이를 implements 한 구현체 클래스는 스트리티지
패턴과 비슷하나 이를 밖에서 조합하여
쓰는 과정에서 약간 차이가 있음.
http://secretroute.tistory.com/entry/Head-First-Design-Patterns-%EC%A0%9C11%EC%9E%A5-Proxy-%ED%8C%A8%ED%84%B4-1
2015년 9월 20일 일요일
클래스 디자인 패턴 10. state pattern_
1. 개념잡기
1) 의미 및 구현방법
현재 상태에 따라 다른 동작을 보일때 if 구문으로 처리하면
됩니다.
그 if 구문의 원인이 되는 상태값이나 상태 기준이 계속 바뀐다면
그땐 if 구문이 계속 뜯어고쳐지는 상태가 반복됩니다.
이때 state 패턴으로 해당 if 구문을 치환 가능합니다.
의미상 이렇지만 실제 생김새를 보면 스트레이트 패턴과 거의
일치합니다.
2) 참고자료
http://hongjinhyeon.tistory.com/50
2. 소스
1) state 인터페이스 작성
해당 인터페이스가 각 상태를 정의함
2) state를 implements 한 각 상태 관련 객체들
3) 다이어그램
역시 하단 링크를 참고바랍니다.
하단 링크에서도 자세하게 설명하고 있습니다.
state 및 이를 implements 한 구현체 클래스는 스트리티지
패턴과 비슷하나 이를 밖에서 조합하여
쓰는 과정에서 약간 차이가 있음.
http://hongjinhyeon.tistory.com/50
1) 의미 및 구현방법
현재 상태에 따라 다른 동작을 보일때 if 구문으로 처리하면
됩니다.
그 if 구문의 원인이 되는 상태값이나 상태 기준이 계속 바뀐다면
그땐 if 구문이 계속 뜯어고쳐지는 상태가 반복됩니다.
이때 state 패턴으로 해당 if 구문을 치환 가능합니다.
의미상 이렇지만 실제 생김새를 보면 스트레이트 패턴과 거의
일치합니다.
2) 참고자료
http://hongjinhyeon.tistory.com/50
2. 소스
1) state 인터페이스 작성
해당 인터페이스가 각 상태를 정의함
package stateI; public interface State { public void insertQuarter(); public void ejectQuarter(); public void turnCrank(); public void dispense(); }
2) state를 implements 한 각 상태 관련 객체들
package stats; import instances.GumballMachine; import stateI.State; public class HasQuarterState implements State { transient GumballMachine gumballMachine; public HasQuarterState(GumballMachine gumballMachine){ this.gumballMachine=gumballMachine; } @Override public void insertQuarter() { System.out.println("You can't insert another quarter"); } @Override public void ejectQuarter() { System.out.println("Quarter returned"); gumballMachine.setState(gumballMachine.getNoQuarterState()); } @Override public void turnCrank() { System.out.println("You turned..."); gumballMachine.setState(gumballMachine.getSoldState()); } @Override public void dispense() { // TODO Auto-generated method stub System.out.println("No gumball dispensed"); } }
package stats; import instances.GumballMachine; import stateI.State; public class NoQuarterState implements State { GumballMachine gumballMachine; public NoQuarterState(GumballMachine gumballMachine){ this.gumballMachine=gumballMachine; } @Override public void insertQuarter() { System.out.println("you are insert coin"); gumballMachine.setState(gumballMachine.getHasQuarterState()); } @Override public void ejectQuarter() { System.out.println("please insert coin"); } @Override public void turnCrank() { System.out.println("please insert coin"); } @Override public void dispense() { System.out.println("please insert coin"); } }
package stats; import instances.GumballMachine; import stateI.State; public class SoldOutState implements State { transient GumballMachine gumballMachine; public SoldOutState(GumballMachine gumballMachine) { this.gumballMachine = gumballMachine; } @Override public void insertQuarter() { // TODO Auto-generated method stub System.out.println("You can't insert a quarter, the machine is sold out"); } @Override public void ejectQuarter() { // TODO Auto-generated method stub System.out.println("You can't eject, you haven't inserted a quarter yet"); } @Override public void turnCrank() { // TODO Auto-generated method stub System.out.println("You turned, but there are no gumballs"); } @Override public void dispense() { // TODO Auto-generated method stub System.out.println("No gumball dispensed"); } }
package stats; import instances.GumballMachine; import stateI.State; public class SoldState implements State{ transient GumballMachine gumballMachine; public SoldState(GumballMachine gumballMachine) { this.gumballMachine = gumballMachine; } @Override public void insertQuarter() { // TODO Auto-generated method stub System.out.println("this give you egg ....ing"); } @Override public void ejectQuarter() { // TODO Auto-generated method stub System.out.println("you alrealy take it"); } @Override public void turnCrank() { // TODO Auto-generated method stub System.out.println("try only one!"); } @Override public void dispense() { gumballMachine.releaseBall(); if(gumballMachine.getCount()>0){ gumballMachine.setState(gumballMachine.getNoQuarterState()); }else{ System.out.println("Opps , out of gumballs"); gumballMachine.setState(gumballMachine.getSoldState()); } } }
3) state를 이용해 이를 구현한 구현체
package instances; import stateI.State; import stats.HasQuarterState; import stats.NoQuarterState; import stats.SoldOutState; import stats.SoldState; public class GumballMachine { State soldOutState; State noQuarterState; State hasQuarterState; State soldState; State state = soldOutState; int count =0; public GumballMachine(int numberGumballs){ soldOutState = new SoldOutState(this); noQuarterState = new NoQuarterState(this); hasQuarterState = new HasQuarterState(this); soldState = new SoldState(this); this.count =numberGumballs; if(numberGumballs>0){ state = noQuarterState; } } public void insertQuarter(){ state.insertQuarter(); } public void ejectQuarter(){ state.ejectQuarter(); } public void turnCrank(){ state.turnCrank(); state.dispense(); } public void setState(State state) { this.state=state; } public void releaseBall(){ System.out.println("A gumball comes rolling out the slot..."); if(count!=0){ count=count -1; } } public void refill(int count) { this.count = count; state = noQuarterState; } public int getCount() { return count; } public State getState(){ return state; } public State getSoldOutState(){ return getSoldOutState(); } public State getNoQuarterState() { return noQuarterState; } public State getHasQuarterState() { return hasQuarterState; } public State getSoldState() { return soldState; } public String toString() { StringBuffer result = new StringBuffer(); result.append("\nMighty Gumball, Inc."); result.append("\nJava-enabled Standing Gumball Model #2004"); result.append("\nInventory: " + count + " gumball"); if (count != 1) { result.append("s"); } result.append("\n"); result.append("Machine is " + state + "\n"); return result.toString(); } }
4) 이를 테스트 하기 위한 코드
package tsstmain; import instances.GumballMachine; public class GumballMachineTestDrive { public static void main(String[] args) { GumballMachine gumballMachine = new GumballMachine(5); System.out.println(gumballMachine); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); System.out.println(gumballMachine); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); System.out.println(gumballMachine); } }
결과 :
Mighty Gumball, Inc.
Java-enabled Standing Gumball Model #2004
Inventory: 5 gumballs
Machine is stats.NoQuarterState@2d11f5f1
you are insert coin
You turned...
A gumball comes rolling out the slot...
Mighty Gumball, Inc.
Java-enabled Standing Gumball Model #2004
Inventory: 4 gumballs
Machine is stats.NoQuarterState@2d11f5f1
you are insert coin
You turned...
A gumball comes rolling out the slot...
you are insert coin
You turned...
A gumball comes rolling out the slot...
Mighty Gumball, Inc.
Java-enabled Standing Gumball Model #2004
Inventory: 2 gumballs
Machine is stats.NoQuarterState@2d11f5f1
2. 다이어그램
3) 다이어그램
역시 하단 링크를 참고바랍니다.
하단 링크에서도 자세하게 설명하고 있습니다.
state 및 이를 implements 한 구현체 클래스는 스트리티지
패턴과 비슷하나 이를 밖에서 조합하여
쓰는 과정에서 약간 차이가 있음.
http://hongjinhyeon.tistory.com/50
2015년 9월 11일 금요일
전자정부프레임워크1. 개발환경(1/4)
1. 개요
최초에 기술을 오픈소스로 통합하고, 서비스나 웹어플리케이션
작성시 기술장벽을 낮추고자 만들어졌었는데
처음엔 손을 대지 않으면 도저히 쓸수 없는 물건이었다가
계속 버전업이 되면서 UI는 꼭 손대야 되지만 안에 있는
개발도구들이 쓸만한 상태까지 발전하고 있습니다.
중심에는 Spring 프레임워크가 있는데 현재는
OS가 설치된 환경에서 서버, DB, 테스트, 배포, 형상관리
기능이 포함된 환경을 제공합니다.
그리고 기본적인 예제? UI도 포함하여 있어서
프로토타입 만드는데에 유리하게 보입니다.
아무래도 좋은점은 자바 설정만 1.7 로 맞춰두면
따로 설치하거나 하는거 없이 사용 가능하다는 점.
하지만 프로젝트에 맞추기위한 셋팅( 회사가 상용 프로그램이
있을테고 더러는 목적상 이용해야 하는게 있으므로)
을 꽤 해야되기 때문에 간단한 프로젝트에는 맞지 않습니다.
1) 분류
해당 강의 노트에서는 개발, 실행, 운영, 관리 환경 이라는
4개 주제를 가지고 분리하는데 이렇게 보면 좀 헷갈리고
도구(eclipse 및 등등) 와 프로그램(apache-tomcat, mysqldb,,,)
프레임워크(Spring,...)정도로 구분하는게 이해하기 쉬워
보입니다.
2) 사용할 수 있는 프로그램
(1) Eclipse
여기에 eGovFrame 이라는 메뉴가 추가됨
(2) AmaterasUML, AmaterasERD
Eclipse 상에 플러그인으로 포함되며, 프로젝트 생성시
UML 관련 몇가지 프로젝트를 생성할 수 있습니다.
Eclispe Java 파일을 드래그 하면 그려지는 장점을 보유
(직접 다운로드 설치 방법
: 여기서는 플러그인이 벌서 들어가있음)
http://keyles.tistory.com/43
http://www.hyoyoung.net/60
(UML사용방법)
http://angmang.tistory.com/609
(ERD 사용방법)
http://joke00.tistory.com/95
(3) Spring Web Flow
페이지 흐름을 관리하는 도구.
관련 설명은 하단 프레임워크 안내를 참고
예제 구성이 잘되어 있음 이것도 플러그인임
http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:bsl:spring_web_flow
http://ldg.pe.kr/Wiki.jsp?page=SpringWebFlowIntroduction
(4) PMD
프로그램 코드 분석 도구 의존성 찾는거에 대한 강점이 있는
도구임
Eclipse 에서 프로그램을 선택하여 메뉴에서 체크를
누르면 됨
http://www.hanbit.co.kr/network/view.html?bi_id=623
(5) FindBugs
프로그램 분석 도구 2 이름이 분석도구같아 보임
http://ggaman.tistory.com/924
(6) Spring Batch
일정 시간에 실행되는 batch를 Spring에서도 관리하는한데
이를 위한 도구를 제공함.
http://bcho.tistory.com/763
(7) Junit
테스트를 위한 도구 이건 유명하므로 생략
(8) EasyMock
테스트를 위한 객체 프레임워크 Junit 과 함게 사용됨
http://bcho.tistory.com/228
http://egloos.zum.com/kwon37xi/v/4126439
http://ecogeo.tistory.com/18
(9) DbUnit
DB 관련 테스트를 지원해주는 도구
http://bcho.tistory.com/37
(10) Ant
빌드를 관리해주는 Java 툴 아직까지는 사용해보지 않아서
아래 링크로 대체
아파치 앤트에 대한 위키
http://srand.tistory.com/39
http://daddycat.blogspot.kr/2011/06/apache-ant-1.html
(11) Maven
의존성 관리 및 프로젝트를 관리한다. 이후 자주 접근해야 하므로
생략, 그리고 전자정부프레임워크는 모든 테스트에
사용하는 정보를 Maven 라이브러리에 넣어두고
Maven url를 내부로 잡아둠(인터넷 없는 환경에서도 사용하게끔)
(12) Hudson
작업자들이 업데이트한 소스를 받아서 한곳이나 정해진
곳에서 자동으로 빌드되도록 지원하는 도구
Hudson, jenkins 둘다 같은 사람이 제작.
http://bcho.tistory.com/172
(13) EMMA
테스트 코드가 구현 코드의 어느정도까지 커버하여
테스트가 되는지 체크하는 도구
프레임워크에 포함됨
http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev:tst:test_coverage
(14) Nexus
http://bcho.tistory.com/m/post/775
(15) Subversion
유명한 형상관리도구 svn
(16) jTrac
사용해본적 없음. 설명에는 변경점 관리도구 라고 되어있는데
다른 설명 블로그에서도 하단 서비스 제공 페이지만
제공되어 있음
http://www.jtrac.info/
최초에 기술을 오픈소스로 통합하고, 서비스나 웹어플리케이션
작성시 기술장벽을 낮추고자 만들어졌었는데
처음엔 손을 대지 않으면 도저히 쓸수 없는 물건이었다가
계속 버전업이 되면서 UI는 꼭 손대야 되지만 안에 있는
개발도구들이 쓸만한 상태까지 발전하고 있습니다.
중심에는 Spring 프레임워크가 있는데 현재는
OS가 설치된 환경에서 서버, DB, 테스트, 배포, 형상관리
기능이 포함된 환경을 제공합니다.
그리고 기본적인 예제? UI도 포함하여 있어서
프로토타입 만드는데에 유리하게 보입니다.
아무래도 좋은점은 자바 설정만 1.7 로 맞춰두면
따로 설치하거나 하는거 없이 사용 가능하다는 점.
하지만 프로젝트에 맞추기위한 셋팅( 회사가 상용 프로그램이
있을테고 더러는 목적상 이용해야 하는게 있으므로)
을 꽤 해야되기 때문에 간단한 프로젝트에는 맞지 않습니다.
1) 분류
해당 강의 노트에서는 개발, 실행, 운영, 관리 환경 이라는
4개 주제를 가지고 분리하는데 이렇게 보면 좀 헷갈리고
도구(eclipse 및 등등) 와 프로그램(apache-tomcat, mysqldb,,,)
프레임워크(Spring,...)정도로 구분하는게 이해하기 쉬워
보입니다.
2) 사용할 수 있는 프로그램
(1) Eclipse
여기에 eGovFrame 이라는 메뉴가 추가됨
(2) AmaterasUML, AmaterasERD
Eclipse 상에 플러그인으로 포함되며, 프로젝트 생성시
UML 관련 몇가지 프로젝트를 생성할 수 있습니다.
Eclispe Java 파일을 드래그 하면 그려지는 장점을 보유
(직접 다운로드 설치 방법
: 여기서는 플러그인이 벌서 들어가있음)
http://keyles.tistory.com/43
http://www.hyoyoung.net/60
(UML사용방법)
http://angmang.tistory.com/609
(ERD 사용방법)
http://joke00.tistory.com/95
(3) Spring Web Flow
페이지 흐름을 관리하는 도구.
관련 설명은 하단 프레임워크 안내를 참고
예제 구성이 잘되어 있음 이것도 플러그인임
http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:bsl:spring_web_flow
http://ldg.pe.kr/Wiki.jsp?page=SpringWebFlowIntroduction
(4) PMD
프로그램 코드 분석 도구 의존성 찾는거에 대한 강점이 있는
도구임
Eclipse 에서 프로그램을 선택하여 메뉴에서 체크를
누르면 됨
http://www.hanbit.co.kr/network/view.html?bi_id=623
(5) FindBugs
프로그램 분석 도구 2 이름이 분석도구같아 보임
http://ggaman.tistory.com/924
(6) Spring Batch
일정 시간에 실행되는 batch를 Spring에서도 관리하는한데
이를 위한 도구를 제공함.
http://bcho.tistory.com/763
(7) Junit
테스트를 위한 도구 이건 유명하므로 생략
(8) EasyMock
테스트를 위한 객체 프레임워크 Junit 과 함게 사용됨
http://bcho.tistory.com/228
http://egloos.zum.com/kwon37xi/v/4126439
http://ecogeo.tistory.com/18
(9) DbUnit
DB 관련 테스트를 지원해주는 도구
http://bcho.tistory.com/37
(10) Ant
빌드를 관리해주는 Java 툴 아직까지는 사용해보지 않아서
아래 링크로 대체
아파치 앤트에 대한 위키
http://srand.tistory.com/39
http://daddycat.blogspot.kr/2011/06/apache-ant-1.html
(11) Maven
의존성 관리 및 프로젝트를 관리한다. 이후 자주 접근해야 하므로
생략, 그리고 전자정부프레임워크는 모든 테스트에
사용하는 정보를 Maven 라이브러리에 넣어두고
Maven url를 내부로 잡아둠(인터넷 없는 환경에서도 사용하게끔)
(12) Hudson
작업자들이 업데이트한 소스를 받아서 한곳이나 정해진
곳에서 자동으로 빌드되도록 지원하는 도구
Hudson, jenkins 둘다 같은 사람이 제작.
http://bcho.tistory.com/172
(13) EMMA
테스트 코드가 구현 코드의 어느정도까지 커버하여
테스트가 되는지 체크하는 도구
프레임워크에 포함됨
http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev:tst:test_coverage
(14) Nexus
http://bcho.tistory.com/m/post/775
(15) Subversion
유명한 형상관리도구 svn
(16) jTrac
사용해본적 없음. 설명에는 변경점 관리도구 라고 되어있는데
다른 설명 블로그에서도 하단 서비스 제공 페이지만
제공되어 있음
http://www.jtrac.info/
2.
JavaScript 날자 Data <->String 변환 함수
1. 첫번재 날자 함수 사용 관련
1) 요구사항
현재 날자정보는 String 으로 yyyymmdd 형식으로 저장되어 있음
사용자 입력에 따라서 날자 앞, 뒤로 이동하거나 특정 날자 정보를
조회 할 수 있음
2) 진행시 문제점
JavaScript 에 php 연계시에는 Script 분기문과 관계없이
php를 타버림
JavaScirpt 날자 계산 함수가 좀 꾸짐(날자 형태 변환이 힘듬, 물론
j-query나 다른걸 쓰면 되겠지만 굳이 뭐)
3) 결론 : 그냥 변환해서 계산후 다시 합치기로 함
4) 소스 (현재 날자 앞, 뒤만 이동 가능)
<script type="text/javascript">
//we have item data(String) -> data(Data)
//data change -> data(Data)->data(String)
//function changeDay
function changeDay(change){
//(1) String를 날자 타입으로 변환
var checkDate = new String(<?=$phpStringData?>);
var valueDate =
checkDate.substr(0,4)+
'-'+
checkDate.substr(4,2)+
'-'
+checkDate.substr(6,2)
+'';
var dt = new Date(valueDate);
//(2) 분기문+날자 조건을 변경
if(change=='next'){
dt.setDate(Number(checkDate.substr(6,2))+1);
}else if(change=='before'){
dt.setDate(Number(checkDate.substr(6,2))-1);
}
//(3) 결과를 다시 문자열 변수로 변환해 해당 조건으로
// 재조회
var dtToSyear= ""+dt.getFullYear();
var dtToSmonth = ""+(dt.getMonth()+1);
var dtToSday = ""+dt.getDate();
if(dtToSmonth.length==1){
dtToSmonth=String("0"+String(dtToSmonth));
}
if(dtToSday.length==1){
dtToSday=String("0"+String(dtToSday));
}
var resetTodate= dtToSyear+dtToSmonth+dtToSday;
alert(resetTodate);
location.replace("listreserve.php?view_date="+resetTodate);
}
</script>
1) 요구사항
현재 날자정보는 String 으로 yyyymmdd 형식으로 저장되어 있음
사용자 입력에 따라서 날자 앞, 뒤로 이동하거나 특정 날자 정보를
조회 할 수 있음
2) 진행시 문제점
JavaScript 에 php 연계시에는 Script 분기문과 관계없이
php를 타버림
JavaScirpt 날자 계산 함수가 좀 꾸짐(날자 형태 변환이 힘듬, 물론
j-query나 다른걸 쓰면 되겠지만 굳이 뭐)
3) 결론 : 그냥 변환해서 계산후 다시 합치기로 함
4) 소스 (현재 날자 앞, 뒤만 이동 가능)
<script type="text/javascript">
//we have item data(String) -> data(Data)
//data change -> data(Data)->data(String)
//function changeDay
function changeDay(change){
//(1) String를 날자 타입으로 변환
var checkDate = new String(<?=$phpStringData?>);
var valueDate =
checkDate.substr(0,4)+
'-'+
checkDate.substr(4,2)+
'-'
+checkDate.substr(6,2)
+'';
var dt = new Date(valueDate);
//(2) 분기문+날자 조건을 변경
if(change=='next'){
dt.setDate(Number(checkDate.substr(6,2))+1);
}else if(change=='before'){
dt.setDate(Number(checkDate.substr(6,2))-1);
}
//(3) 결과를 다시 문자열 변수로 변환해 해당 조건으로
// 재조회
var dtToSyear= ""+dt.getFullYear();
var dtToSmonth = ""+(dt.getMonth()+1);
var dtToSday = ""+dt.getDate();
if(dtToSmonth.length==1){
dtToSmonth=String("0"+String(dtToSmonth));
}
if(dtToSday.length==1){
dtToSday=String("0"+String(dtToSday));
}
var resetTodate= dtToSyear+dtToSmonth+dtToSday;
alert(resetTodate);
location.replace("listreserve.php?view_date="+resetTodate);
}
</script>
2015년 9월 10일 목요일
클래스 디자인 패턴 9. iterator pattern_
1. 개념잡기
1) 의미 및 구현방법
for 문이나 기타 반복문을 클래스단위로 쪼갤수 있습니다.
장점은 for문 도배를 피할수 있다는거고(복잡도를 나눈다)
단점은 클래스가 많아지는점?
요건 다른것과 틀리게 패턴으로 한번 봐둬야 일할때
헷갈림 방지가 가능합니다.
for 문의 i 의 기능을 추상화해서 일반화 하는걸 Iterator pattern
이라고도 표현하기도 합니다.
2. 소스
1) 이터레이터 interface와 그 구현체를 작성한다.
반복역할을 직접 담당하는 이터레이터는 hasNext(체크)
next(객체 선택) 메서드를 구현하도록 강요하여
배열로 집어넣은 객체를 처음부터 끝까지 뒤져볼 수 있도록
합니다.
2) aggregate 는 집합체 구성원을 추가하거나 정보를 관리하는
역할을 담당합니다. interface를 통해서 Iterator를 반환하는
메서드를 강제하도록 작성하고
각 구현체에서 여기에 집합객체를 넣도록 구현합니다.
여기까지 진행된다면 각 구현체가 Iterator 객체의
어떤 구현체를 사용할 건지 정할 수 있습니다.
3) 다이어그램
역시 하단 링크를 참고바랍니다.
하단 링크에서도 자세하게 설명하고 있습니다.
http://secretroute.tistory.com/entry/Head-First-Design-Patterns-%EC%A0%9C9%EC%9E%A5-Iterator-%EC%99%80-Composite-%ED%8C%A8%ED%84%B4
4. 연관 있는 패턴들
1) Visitor 패턴
Iterator가 집합체 숫자를 세는 패턴이라면
Visitor는 숫자를 셀때 뭔가 작업을 추가하여
여러 모여있는 instance에 공통 작업을 부여 할 수 있습니다.
2) Composite 패턴
Iterator와 비슷하지만 Composite는 재귀적인 구조로
작성되므로 비슷한 기능을 하는 다른 패턴입니다.
3) Factory Method 패턴
iterator 매서드가 Iterator 인스턴스를 작성시 해당 패턴이
사용될 수 있습니다.
1) 의미 및 구현방법
for 문이나 기타 반복문을 클래스단위로 쪼갤수 있습니다.
장점은 for문 도배를 피할수 있다는거고(복잡도를 나눈다)
단점은 클래스가 많아지는점?
요건 다른것과 틀리게 패턴으로 한번 봐둬야 일할때
헷갈림 방지가 가능합니다.
for 문의 i 의 기능을 추상화해서 일반화 하는걸 Iterator pattern
이라고도 표현하기도 합니다.
2) 참고자료
2. 소스
1) 이터레이터 interface와 그 구현체를 작성한다.
반복역할을 직접 담당하는 이터레이터는 hasNext(체크)
next(객체 선택) 메서드를 구현하도록 강요하여
배열로 집어넣은 객체를 처음부터 끝까지 뒤져볼 수 있도록
합니다.
package iterator; public interface Iterator { boolean hasNext(); Object next(); }
package iterator; import serviceMenu.MenuItem; public class DinerMenuIterator implements Iterator{ MenuItem[] items; int position=0; public DinerMenuIterator(MenuItem[] items){ this.items=items; } @Override public boolean hasNext() { if(position >= items.length || items[position] == null){ return false; }else { return true; } } @Override public Object next() { MenuItem menuItem = items[position]; position = position +1; return menuItem; } }
package iterator; import serviceMenu.MenuItem; public class PancakeHouseMenuIterator implements Iterator{ MenuItem[] items; int position=0; public PancakeHouseMenuIterator(MenuItem[] items){ this.items=items; } @Override public boolean hasNext() { if(position >= items.length || items[position] == null){ return false; }else { return true; } } @Override public Object next() { MenuItem menuItem = items[position]; position = position +1; return menuItem; } }
2) aggregate 는 집합체 구성원을 추가하거나 정보를 관리하는
역할을 담당합니다. interface를 통해서 Iterator를 반환하는
메서드를 강제하도록 작성하고
각 구현체에서 여기에 집합객체를 넣도록 구현합니다.
여기까지 진행된다면 각 구현체가 Iterator 객체의
어떤 구현체를 사용할 건지 정할 수 있습니다.
package menu; import iterator.Iterator; import serviceMenu.MenuItem; public interface MenuAggr { public Iterator createIterator(); }
package menu; import serviceMenu.MenuItem; import iterator.DinerMenuIterator; import iterator.Iterator; public class DinerMenu implements MenuAggr{ static final int MAX_ITEMS =6; int numberOfItems = 0; MenuItem[] menuItems; public DinerMenu(){ menuItems = new MenuItem[MAX_ITEMS]; addItem("diner1","dier1des",true,2.99); addItem("diner2","dier2des",false,3.99); addItem("diner3","dier3des",true,2.49); addItem("diner4","dier4des",true,3.97); } public void addItem(String name, String description, boolean vegetarian, double price){ MenuItem menuItem = new MenuItem(name, description, vegetarian, price); if(numberOfItems >= MAX_ITEMS){ System.out.println("더이상 메뉴를 추가할 수 없음"); }else{ menuItems[numberOfItems] = menuItem; numberOfItems = numberOfItems +1; } } public MenuItem[] getMenuItems(){ return menuItems; } public Iterator createIterator(){ return new DinerMenuIterator(menuItems); } }
package menu; import iterator.DinerMenuIterator; import iterator.Iterator; import java.util.ArrayList; import serviceMenu.MenuItem; public class PancakeHouseMenu implements MenuAggr{ static final int MAX_ITEMS =6; int numberOfItems = 0; MenuItem[] menuItems; public PancakeHouseMenu(){ menuItems = new MenuItem[MAX_ITEMS]; addItem("cake1","cake1des",true,2.99); addItem("cake2","cake2des",false,3.99); addItem("cake3","cake3des",true,2.49); addItem("cake4","cake4des",true,3.97); } public void addItem(String name, String description, boolean vegetarian, double price){ MenuItem menuItem = new MenuItem(name, description, vegetarian, price); if(numberOfItems >= MAX_ITEMS){ System.out.println("더이상 메뉴를 추가할 수 없음"); }else{ menuItems[numberOfItems] = menuItem; numberOfItems = numberOfItems +1; } } public MenuItem[] getMenuItems(){ return menuItems; } public Iterator createIterator(){ return new DinerMenuIterator(menuItems); } }
3) 객체 하나에 대한 정보를 관리하는 대상객체를 작성합니다.
여기에는 get 함수만 활용하도록 강제합니다.
set은 따로 관리하지 않고 생성자에서 생성시 들어가도록
관리합니다.
4) 이들을 묶어서 실제 객체만큼 출력이나 행동을 담당할
웨이트레스 클래스를 작성합니다.
5) 이를 테스트 해보기 위한 소스
여기에는 get 함수만 활용하도록 강제합니다.
set은 따로 관리하지 않고 생성자에서 생성시 들어가도록
관리합니다.
package serviceMenu; public class MenuItem { String name; String description; boolean vegetarian; double price; public MenuItem(String name, String description, boolean vegetarian, double price){ this.name = name; this.description=description; this.vegetarian=vegetarian; this.price=price; } public String getName() { return name; } public String getDescription() { return description; } public boolean isVegetarian() { return vegetarian; } public double getPrice() { return price; } }
4) 이들을 묶어서 실제 객체만큼 출력이나 행동을 담당할
웨이트레스 클래스를 작성합니다.
package testWoker; import serviceMenu.MenuItem; import menu.DinerMenu; import menu.PancakeHouseMenu; import iterator.Iterator; public class Waitress { PancakeHouseMenu pancakeHouseMenu; DinerMenu dinerMenu; public Waitress(PancakeHouseMenu pancakeHouseMenu, DinerMenu dinerMenu){ this.pancakeHouseMenu=pancakeHouseMenu; this.dinerMenu=dinerMenu; } public void printMenu(){ Iterator pancakeIterator = pancakeHouseMenu.createIterator(); Iterator dinerIterator = dinerMenu.createIterator(); System.out.println("아침"); printMenu(pancakeIterator); System.out.println("점심"); printMenu(dinerIterator); } private void printMenu(Iterator iterator){ while(iterator.hasNext()){ MenuItem menuItem = (MenuItem) iterator.next(); System.out.print(menuItem.getName()+","); System.out.print(menuItem.getPrice()+"--"); System.out.println(menuItem.getDescription()); } } }
5) 이를 테스트 해보기 위한 소스
package testWoker; import menu.DinerMenu; import menu.PancakeHouseMenu; public class SampleMenu { public static void main(String[] args) { PancakeHouseMenu cake = new PancakeHouseMenu(); DinerMenu diner = new DinerMenu(); Waitress wait = new Waitress(cake, diner); wait.printMenu(); } }
결과 : 아침
cake1,2.99--cake1des
cake2,3.99--cake2des
cake3,2.49--cake3des
cake4,3.97--cake4des
점심
diner1,2.99--dier1des
diner2,3.99--dier2des
diner3,2.49--dier3des
diner4,3.97--dier4des
cake1,2.99--cake1des
cake2,3.99--cake2des
cake3,2.49--cake3des
cake4,3.97--cake4des
점심
diner1,2.99--dier1des
diner2,3.99--dier2des
diner3,2.49--dier3des
diner4,3.97--dier4des
3. 다이어그램
3) 다이어그램
역시 하단 링크를 참고바랍니다.
하단 링크에서도 자세하게 설명하고 있습니다.
http://secretroute.tistory.com/entry/Head-First-Design-Patterns-%EC%A0%9C9%EC%9E%A5-Iterator-%EC%99%80-Composite-%ED%8C%A8%ED%84%B4
4. 연관 있는 패턴들
1) Visitor 패턴
Iterator가 집합체 숫자를 세는 패턴이라면
Visitor는 숫자를 셀때 뭔가 작업을 추가하여
여러 모여있는 instance에 공통 작업을 부여 할 수 있습니다.
2) Composite 패턴
Iterator와 비슷하지만 Composite는 재귀적인 구조로
작성되므로 비슷한 기능을 하는 다른 패턴입니다.
3) Factory Method 패턴
iterator 매서드가 Iterator 인스턴스를 작성시 해당 패턴이
사용될 수 있습니다.
클래스 디자인 패턴 8. Template Method Pattern_
1. 개념잡기
1) 의미 및 구현방법
구체적인 내용을 작성하는 클래스단 에서 공통적인 부분을
위로 올리고(중복을 줄임), 특징있는 업무는 상속으로
내려서 작성하는 방법.
상속을 가르칠때 예제로 보여지는게 바로
템플릿 메서드 패턴이다.
보통 2개 이상 클래스에서 공통점이 발견되면 상위
클래스로 올리고, 약간 다른점은 오버라이드로
구현하는 선에서 작업이 이루어진다.
http://choipattern.blogspot.kr/2013/08/template-method.html
팩토리 메서드 패턴 (위키)
2. 소스
1> 마실거 예제
1) 먼저 커피와 녹차 클래스를 준비하고 테스트 코드를 준비한다.
2) 물 끓이는 거랑 컵에 따르는건 같은일이므로
하나의 클래스를 만들어서(SomethingDrink)
직접구현하고 나머지2개
메서드는 명시만 해놓습니다 (abstract)
실행 preparerecipe() 메서드는 새로 만든 클래스에만 넣고
이제 커피와 차에서는 새로 만든 SomethingDrink 클래스를
상속받아 각각 2개의 메서드만 상속합니다.
preparerecipe() 메서드는 템플릿 메서드로서 하위 클래스가
같은 순서로 작업을 진행하도록
강제하는 역할을 담당합니다.
해당 메서드로만 외부에서 접근하게끔 함으로서 순서가
바뀌는 일이 없도록 강제합니다.
필터를 통해서 커피를 우려내는 중
컵에 따릅니다.
설탕과 우유를 추가합니다.
-------------
물을 끓입니다.
레몬을 추가합니다.
컵에 따릅니다.
차를 우려내는중
2> Java Design 예제
1) 공통 구현부를 위로 올릴 Abstract 클래스를 생성
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public final void dispay(){
open();
for(int i=0; i<5; i++){
print();
}
close();
}
}
2) 이를 상속받아 abstract 메서드를 구현한 클래스들을 추가
3) 다이어그램
역시 하단 링크를 참고바랍니다.
http://asuraiv.blogspot.kr/2014/07/template-method-pattern-1_9.html
4. 관련 패턴
1) Factory Method
같은 방향으로 instance를 생성에 응용한 예가
Factory Method 패턴입니다.
2) Stratege 패턴
Template 를 구현후 구현 좀더 유연한 설계를 진행한게 바로
비슷한 필요에서 시작한게 Stratege 패턴입니다. 여기서는
다른 방법, 다른 방향으로 같은 기능을 구현합니다.
좀더 잘게 쪼개서 확장성을 염두해둔 설계를 지향합니다.
1) 의미 및 구현방법
구체적인 내용을 작성하는 클래스단 에서 공통적인 부분을
위로 올리고(중복을 줄임), 특징있는 업무는 상속으로
내려서 작성하는 방법.
상속을 가르칠때 예제로 보여지는게 바로
템플릿 메서드 패턴이다.
보통 2개 이상 클래스에서 공통점이 발견되면 상위
클래스로 올리고, 약간 다른점은 오버라이드로
구현하는 선에서 작업이 이루어진다.
2) 참고자료
http://choipattern.blogspot.kr/2013/08/template-method.html
팩토리 메서드 패턴 (위키)
2. 소스
1> 마실거 예제
1) 먼저 커피와 녹차 클래스를 준비하고 테스트 코드를 준비한다.
package products; public class CoffeeOfNeck { public void preparerecipe(){ boilWater(); brewCoffeeGrinds(); pourInCup(); addSugarAndMilk(); } private void addSugarAndMilk() { System.out.println("설탕과 우유를 추가합니다."); } private void pourInCup() { System.out.println("컵에 따릅니다."); } private void brewCoffeeGrinds() { System.out.println("필터를 통해서 커피를 우려내는 중"); } private void boilWater() { System.out.println("물을 끓입니다."); } }
package products; public class GreenTeaOfNeck { public void preparerecipe(){ boilWater(); steepteaBag(); pourInCup(); addLemon(); } private void steepteaBag() { System.out.println("차를 우려내는중"); } private void pourInCup() { System.out.println("컵에 따릅니다."); } private void addLemon() { System.out.println("레몬을 추가합니다."); } private void boilWater() { System.out.println("물을 끓입니다."); } }
package testTemplate; import products.CoffeeOfNeck; import products.GreenTeaOfNeck; public class TestUnit { public static void main(String[] args) { CoffeeOfNeck cof = new CoffeeOfNeck(); GreenTeaOfNeck green = new GreenTeaOfNeck(); cof.preparerecipe(); System.out.println("-------------"); green.preparerecipe(); } }
1차 결과 :
물을 끓입니다.
필터를 통해서 커피를 우려내는 중
컵에 따릅니다.
설탕과 우유를 추가합니다.
-------------
물을 끓입니다.
차를 우려내는중
컵에 따릅니다.
레몬을 추가합니다.
2) 물 끓이는 거랑 컵에 따르는건 같은일이므로
하나의 클래스를 만들어서(SomethingDrink)
직접구현하고 나머지2개
메서드는 명시만 해놓습니다 (abstract)
실행 preparerecipe() 메서드는 새로 만든 클래스에만 넣고
이제 커피와 차에서는 새로 만든 SomethingDrink 클래스를
상속받아 각각 2개의 메서드만 상속합니다.
preparerecipe() 메서드는 템플릿 메서드로서 하위 클래스가
같은 순서로 작업을 진행하도록
강제하는 역할을 담당합니다.
해당 메서드로만 외부에서 접근하게끔 함으로서 순서가
바뀌는 일이 없도록 강제합니다.
package template; public abstract class SomethingDrink { public void preparerecipe(){ boilWater(); brew(); pourInCup(); addCondiments(); } protected abstract void addCondiments(); protected abstract void brew(); protected void pourInCup() { System.out.println("컵에 따릅니다."); } protected void boilWater() { System.out.println("물을 끓입니다."); } }
package products; import template.SomethingDrink; public class CoffeeOfNeck extends SomethingDrink{ @Override protected void addCondiments() { System.out.println("설탕과 우유를 추가합니다."); } @Override protected void brew() { System.out.println("필터를 통해서 커피를 우려내는 중"); } }
package products; import template.SomethingDrink; public class GreenTeaOfNeck extends SomethingDrink{ @Override protected void addCondiments() { System.out.println("레몬을 추가합니다."); } @Override protected void brew() { System.out.println("차를 우려내는중"); } }
결과 : 1) 항목과 결과가 같음.
물을 끓입니다.필터를 통해서 커피를 우려내는 중
컵에 따릅니다.
설탕과 우유를 추가합니다.
-------------
물을 끓입니다.
레몬을 추가합니다.
컵에 따릅니다.
차를 우려내는중
2> Java Design 예제
1) 공통 구현부를 위로 올릴 Abstract 클래스를 생성
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public final void dispay(){
open();
for(int i=0; i<5; i++){
print();
}
close();
}
}
2) 이를 상속받아 abstract 메서드를 구현한 클래스들을 추가
public class CharDisplay extends AbstractDisplay { private char ch; public CharDisplay(char ch) { this.ch = ch; } @Override public void open() { System.out.print("<<"); } @Override public void print() { System.out.print(ch); } @Override public void close() { System.out.println(">>"); } }
public class StringDisplay extends AbstractDisplay {
private String string;
private int width;
public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|"+string + "|");
}
@Override
public void close() {
printLine();
}
private void printLine() {
System.out.print("+");
for(int i=0; i<width; i++){
System.out.print("-");
}
System.out.println("+");
}
}
3) 이를 테스트 하는 테스트 코드 작성
public class MainTest { public static void main(String[] args) { AbstractDisplay d1 = new CharDisplay('H'); AbstractDisplay d2 = new StringDisplay("Hello, world."); AbstractDisplay d3 = new StringDisplay("How are you"); d1.dispay(); d2.dispay(); d3.dispay(); } }
결과 :
<<HHHHH>>
+-------------+
|Hello, world.|
|Hello, world.|
|Hello, world.|
|Hello, world.|
|Hello, world.|
+-------------+
+-----------+
|How are you|
|How are you|
|How are you|
|How are you|
|How are you|
+-----------+
3. 다이어그램
3) 다이어그램
역시 하단 링크를 참고바랍니다.
http://asuraiv.blogspot.kr/2014/07/template-method-pattern-1_9.html
4. 관련 패턴
1) Factory Method
같은 방향으로 instance를 생성에 응용한 예가
Factory Method 패턴입니다.
2) Stratege 패턴
Template 를 구현후 구현 좀더 유연한 설계를 진행한게 바로
비슷한 필요에서 시작한게 Stratege 패턴입니다. 여기서는
다른 방법, 다른 방향으로 같은 기능을 구현합니다.
좀더 잘게 쪼개서 확장성을 염두해둔 설계를 지향합니다.
2015년 9월 5일 토요일
JavaScript 01.기초문법or 시작하기 or 문법 or 등등
ps. 작성시 참고한 블로그 및 사이트
깔끔하게 정리된 pt (블로그 구문은 해당 글을 뼈대로 작성)
http://www.slideshare.net/deview/d2campusjavascript
자바 스크립트에서 변수 타입에 대해서 설명한 블로그 글
http://insanehong.kr/post/javascript-datatype/
자바스크립트 재입문 이라는 설명페이지 쉽고 깔끔함
(나도 이래야 되는데...되는데..)
https://developer.mozilla.org/ko/docs/A_re-introduction_to_JavaScript
자바스크립트 Array 내장함수에 대한 설명 블로그
http://www.cnblogs.com/jweb/p/4611455.html
http://kssong.tistory.com/26
ps2. 서두
javaScript는 원리만 알면 쓸수 있다 라고 생각하지만
공부를 하자니 좀 시간 들이기 아깝긴 아까운데
그렇다고 그냥 바로 일하기엔 부족한 점이 있을거란
(홈페이지의 덕지덕지 바른 스크립트들 ㄷㄷㄷ)
생각이 든다. 할까 말까 고민하면 하는게 좋다 라고
판단되어 시작.
1. 특징
1) Event Driven
2) Async Job
3) 객체지향(클래스 없음, 상속, 다형성보유)
(1) 클래스가 없음
(2) 상속 가능
(3) 다형성 가능
2. 변수 다루기
1) 타입 과 선언 방법
Number : var a=1;
String : var a="ABC";
Boolean : var a = true;
Object : var a = {};
Array : var a = [1,2,3];
Function : var a = function(){~~~~}
undefine : var a; //정의안됨
null : var a = null; //저의됨 다만 값이 없음
NaN : //애는 숫자가 아니다 라는 상태값
결론 : var Xxx; //이거 하나로 모든 타입을 커버.
이 변수가 뭔지 잘 살펴보는 일이
새로 생겼습니다. 다만 내가 구현할때는 편합니다.
에지간해서 에러가 안나요
2) number 의 경우 0.1+0.2 = 0.30000001 같은 에러가 나는
경우가 더러 있음 관련 정보는 하단 링크 참고
http://insanehong.kr/post/javascript-datatype/
3) 이중 Array 의 경우 중요한 특징이 있음
우선 위에처럼 배열 선언은 3개로 했더라도
이후에 얼마든지 추가가능하다.
a[10]=3;
// 0,1,2 번재 주소에 알아서 들어가고,
// 3~10번째는 null, 11번째는 3이 들어감
또한 여러 내장함수가 지원되고
자바 스크립트에서 중요한 부분을 차지한다.
Array에 대해서는 하단 두 블로그 링크를 활용하면
충분한 학습이 될 것 같다.
http://www.cnblogs.com/jweb/p/4611455.html
http://kssong.tistory.com/26
4) Object
key, Value 로 구성된 집합체? 정도의 형태
언제든 구성요소를 수정, 추가 가능
끝에 ; 꼭 해야함.
var team={
name: "teamidLife",
title: "ogleogle",
member1:"kim"};
5) function #
특성으로
(1) 리턴값, 인자값 보유함 근데 type 명시를 하지 않음
(2) 함수는 변수에 넣기, 리턴, 인자값 으로 사용이 가능함
(3) 함수 = 객체 = 퍼스트 클래스 오브젝트
(4) 변수 범위는 함수
관련 설명은 넥스트리 함수에 관한 블로그 게시물을 확인바람
함수 선언시 이름을 부여하는가 혹은 바로 실행하는가?
에 따라서 좀 다른 성질을 지니는 함수가 된다.
http://www.nextree.co.kr/p4150/
(5) this 키워드 : 현재 가르키는 변수 혹은 값 정도
함수 사용중에 값이 바뀌는 경우 최종값을 가르킴
다만 예외적으로 함수.call, apply, bind
3가지 키워드와 쓰이는 경우엔 해당 함수내에 지정한
값으로 리셋됨
(6) new 키워드 : 클래스와 같은 형태로 쓰이는 new 키워드를
함수를 보유한 하나의 인스턴트를 생성한다.
인스턴스로 만들면 자원 공유없이 하나의 함수를 여러번
사용할 수 있다. 그런 목적으로 사용
(7) inner function 선언도 가능. 그리고 javascript에서는
희한하게 inner function을 외부 함수를 닫고 나서
차후 다른 함수에서도 접근 가능하다. (뭐 이런)
다만 이때 선언된 변수는 갱신된 최종값이 아닌
inner function을 감싸고 있는 외부 function에서
지정한 값으로 설정된다.
또 이상한점은 inner로 안하고 지정값을 출력할 경우엔
최종 갱신된 값이 나온다는 점.
이건 좀 희한해서 pt 예제를 인용하여 아래와 같이
작성함.
var innerf;
function myPorket() {
var meterial = "candy";
innerf = function(){
console.log(meterial);
}
}
function yourPorket(){
var meterial = "cookie";
console.log(meterial);
innerf();
console.log(meterial);
}
myPorket();
yourPorket();
결과
cookie
candy
cookie
(8) == 연산자와 === 연산자
==의 경우 타입을 [어느정도](거의다) 바꿔서 비교한다.
(이 편리한 기능때문에 0인지 "0"인지 헷갈릴때가 있다)
=== 은 타입까지 따진다.
예제는 ===를 설명하기 위해서 작성했으나
==의 결과가 흥미롭다.
ex)
0 == '0' //true
0 === '0' //false
false == 0 //true
fasle === 0 // false
null == undefined //true
'/n' == 0 //true
3. 제어문(if, for, while)
(1) 기본적인 동작은 C, Java랑 대동소이함
다만 블록안에 선언한 i 범위가 제어문 밖에서도
끌고가기 때문에 이점만 주의하면 됨.
4. 참고 문헌
1) 스크립트 관련 소스
http://photothru.com/
http://www.dynamicdrive.com/
http://www.javascriptkit.com/
http://www.dhtmlgoodies.com/
2) 화면 나누는(div) 가이드
http://www.thenoodleincident.com/tutorials/box_lesson/boxes.html
깔끔하게 정리된 pt (블로그 구문은 해당 글을 뼈대로 작성)
http://www.slideshare.net/deview/d2campusjavascript
자바 스크립트에서 변수 타입에 대해서 설명한 블로그 글
http://insanehong.kr/post/javascript-datatype/
자바스크립트 재입문 이라는 설명페이지 쉽고 깔끔함
(나도 이래야 되는데...되는데..)
https://developer.mozilla.org/ko/docs/A_re-introduction_to_JavaScript
자바스크립트 Array 내장함수에 대한 설명 블로그
http://www.cnblogs.com/jweb/p/4611455.html
http://kssong.tistory.com/26
ps2. 서두
javaScript는 원리만 알면 쓸수 있다 라고 생각하지만
공부를 하자니 좀 시간 들이기 아깝긴 아까운데
그렇다고 그냥 바로 일하기엔 부족한 점이 있을거란
(홈페이지의 덕지덕지 바른 스크립트들 ㄷㄷㄷ)
생각이 든다. 할까 말까 고민하면 하는게 좋다 라고
판단되어 시작.
1. 특징
1) Event Driven
2) Async Job
3) 객체지향(클래스 없음, 상속, 다형성보유)
(1) 클래스가 없음
(2) 상속 가능
(3) 다형성 가능
2. 변수 다루기
1) 타입 과 선언 방법
Number : var a=1;
String : var a="ABC";
Boolean : var a = true;
Object : var a = {};
Array : var a = [1,2,3];
Function : var a = function(){~~~~}
undefine : var a; //정의안됨
null : var a = null; //저의됨 다만 값이 없음
NaN : //애는 숫자가 아니다 라는 상태값
결론 : var Xxx; //이거 하나로 모든 타입을 커버.
이 변수가 뭔지 잘 살펴보는 일이
새로 생겼습니다. 다만 내가 구현할때는 편합니다.
에지간해서 에러가 안나요
2) number 의 경우 0.1+0.2 = 0.30000001 같은 에러가 나는
경우가 더러 있음 관련 정보는 하단 링크 참고
http://insanehong.kr/post/javascript-datatype/
3) 이중 Array 의 경우 중요한 특징이 있음
우선 위에처럼 배열 선언은 3개로 했더라도
이후에 얼마든지 추가가능하다.
a[10]=3;
// 0,1,2 번재 주소에 알아서 들어가고,
// 3~10번째는 null, 11번째는 3이 들어감
또한 여러 내장함수가 지원되고
자바 스크립트에서 중요한 부분을 차지한다.
Array에 대해서는 하단 두 블로그 링크를 활용하면
충분한 학습이 될 것 같다.
http://www.cnblogs.com/jweb/p/4611455.html
http://kssong.tistory.com/26
4) Object
key, Value 로 구성된 집합체? 정도의 형태
언제든 구성요소를 수정, 추가 가능
끝에 ; 꼭 해야함.
var team={
name: "teamidLife",
title: "ogleogle",
member1:"kim"};
5) function #
특성으로
(1) 리턴값, 인자값 보유함 근데 type 명시를 하지 않음
(2) 함수는 변수에 넣기, 리턴, 인자값 으로 사용이 가능함
(3) 함수 = 객체 = 퍼스트 클래스 오브젝트
(4) 변수 범위는 함수
관련 설명은 넥스트리 함수에 관한 블로그 게시물을 확인바람
함수 선언시 이름을 부여하는가 혹은 바로 실행하는가?
에 따라서 좀 다른 성질을 지니는 함수가 된다.
http://www.nextree.co.kr/p4150/
(5) this 키워드 : 현재 가르키는 변수 혹은 값 정도
함수 사용중에 값이 바뀌는 경우 최종값을 가르킴
다만 예외적으로 함수.call, apply, bind
3가지 키워드와 쓰이는 경우엔 해당 함수내에 지정한
값으로 리셋됨
(6) new 키워드 : 클래스와 같은 형태로 쓰이는 new 키워드를
함수를 보유한 하나의 인스턴트를 생성한다.
인스턴스로 만들면 자원 공유없이 하나의 함수를 여러번
사용할 수 있다. 그런 목적으로 사용
(7) inner function 선언도 가능. 그리고 javascript에서는
희한하게 inner function을 외부 함수를 닫고 나서
차후 다른 함수에서도 접근 가능하다. (뭐 이런)
다만 이때 선언된 변수는 갱신된 최종값이 아닌
inner function을 감싸고 있는 외부 function에서
지정한 값으로 설정된다.
또 이상한점은 inner로 안하고 지정값을 출력할 경우엔
최종 갱신된 값이 나온다는 점.
이건 좀 희한해서 pt 예제를 인용하여 아래와 같이
작성함.
var innerf;
function myPorket() {
var meterial = "candy";
innerf = function(){
console.log(meterial);
}
}
function yourPorket(){
var meterial = "cookie";
console.log(meterial);
innerf();
console.log(meterial);
}
myPorket();
yourPorket();
결과
cookie
candy
cookie
(8) == 연산자와 === 연산자
==의 경우 타입을 [어느정도](거의다) 바꿔서 비교한다.
(이 편리한 기능때문에 0인지 "0"인지 헷갈릴때가 있다)
=== 은 타입까지 따진다.
예제는 ===를 설명하기 위해서 작성했으나
==의 결과가 흥미롭다.
ex)
0 == '0' //true
0 === '0' //false
false == 0 //true
fasle === 0 // false
null == undefined //true
'/n' == 0 //true
(1) 기본적인 동작은 C, Java랑 대동소이함
다만 블록안에 선언한 i 범위가 제어문 밖에서도
끌고가기 때문에 이점만 주의하면 됨.
4. 참고 문헌
1) 스크립트 관련 소스
http://photothru.com/
http://www.dynamicdrive.com/
http://www.javascriptkit.com/
http://www.dhtmlgoodies.com/
2) 화면 나누는(div) 가이드
http://www.thenoodleincident.com/tutorials/box_lesson/boxes.html
2015년 9월 4일 금요일
협업도구?팀프로젝트관리?2.콜라비 살펴보기
1. 콜라비?
1) 의미
양배추에서 분화된 채소인데 잎은 쌈먹고
, 과일같은 줄기는 셀러드로 쓰인다고 함
1) 의미
양배추에서 분화된 채소인데 잎은 쌈먹고
, 과일같은 줄기는 셀러드로 쓰인다고 함
근데 협업 도구 라는 검색으로 보니 광고를 실었는지 구글하고
네이버에 첫번재 검색이 된다.
궁금해서 보는데 기능이 괜찮은것 같아 소개하려고 함.
여기도 프로그램을 설치하는게 아니고 사이트 접속해서
뭔가 사용하면 됨
2) 특징
(1) 약간 생소하고 과하게 화려하지 않는가? 라는 느낌의 UI이나
생각외로 적응하기 괜찮았다. 기능제한적이긴 하지만
다른데처럼 못쓸 무료버전을 제공하는건 아니고 프로젝트3개,
5기가 이하 메모리 공간 정도를 제공하는데 익숙해져서
꼭 유료결제 해야겠다는 상황까지 쓸 수 있어보인다.
(2) 학습 시간은 필요하다 트렐로보다는 복잡하지만 이정도
기능에 이정도 시간은 투자해도 된다고 봄.
(3) 내가 처리해야할 업무를 확인하고, 다른 구성원들에게도
일이나 결정을 할당할 수 있는 기능이 좋아보인다.
3) 이용방법
여기도 프로그램을 설치하는게 아니고 사이트 접속해서
뭔가 사용하면 됨 런칭한지 얼마 안되서인지 아직은
기능이 부족하다. 그래도 제공되는 기능만으로도
일이나 결정을 할당할 수 있는 기능이 좋아보인다.
3) 이용방법
여기도 프로그램을 설치하는게 아니고 사이트 접속해서
뭔가 사용하면 됨 런칭한지 얼마 안되서인지 아직은
기능이 부족하다. 그래도 제공되는 기능만으로도
간단한 프로젝트 관리는 가능하다.
https://www.collabee.co.kr
2. 사용해보기(이용하는 방법)
우선 가입은 알아서 하자 간단하다.
1) 프로젝트 만들기
(1) 상단 좌측 메뉴를 누르고 프로젝트+를 누른뒤
제목을 입력하면 끝
2. 사용해보기(이용하는 방법)
우선 가입은 알아서 하자 간단하다.
1) 프로젝트 만들기
(1) 상단 좌측 메뉴를 누르고 프로젝트+를 누른뒤
제목을 입력하면 끝
2) 구성원 추가
(1) 1)-(1)에서 내공간 누르고 새로만든 프로젝ㅌ 협업도구2를
클릭하면 해당 프로젝트로 들어가진다. 여기서 우측 상단의
파트너 클릭 -> 초대하기 클릭 -> 메일 입력 까지 하면
해당 메일로 초대 메일이 감, 그렇게 해서 알 김경철씨가
들어왔음
(1) 1)-(1)에서 내공간 누르고 새로만든 프로젝ㅌ 협업도구2를
클릭하면 해당 프로젝트로 들어가진다. 여기서 우측 상단의
파트너 클릭 -> 초대하기 클릭 -> 메일 입력 까지 하면
해당 메일로 초대 메일이 감, 그렇게 해서 알 김경철씨가
들어왔음
(2) 프로젝트에 타임라인이 3개가 있는데 모든게 뜨는 뉴스피드,
뉴스피드에서 체크완료한 확인한피드(확인한 피드틑 뉴스피드에서
제외됨), 시계 표시를 누르면 나중에 확인할 피드 로 나누어진다.
다른분류로 카테고리를 만들어서 거기로 넣을 수 있다. 카테고리
는 타임라인과 별도 관리됨.
내가 쓴글도 또 별도로 관리됨.
현재는 프로그램 내에서 일을 만들고 공유하고 주거니 받거니
하는 형태인데 나중에 메일하고 드라이브 컨텐츠를 업데이트 할
모양인가 보다 이게 중요한데 쩝... 금방 업데이트 될듯
(3) 뉴스피드 우측에는 나에 관련된 정보가 보여지고 여기에는 할일,
결정할일 정도를 볼 수 있다. 이중 체크 버튼을 체크하면
완료된 일은 감추거나 보여지거나 할 수 있다.
팀 구성원에게서 할당받은 일을 완료하면 이런 로고가 뜨는데
책상에 앉아있을때 누군가의 요청 메일이 안오면 f5를 누르듯이
커피 그림 보면서 뭔가 일이 생길때까지 계속 f5를 누르거나
메뉴를 광클릭 하지 않을까 하는 생각이 든다.
(4) 타임라인에 연필 버튼을 눌러서 이슈? 일? 주제? 를 일컫는
큰 덩어리를 등록할 수 있으며 해당 컨텐츠를 클릭해서
일이나 결정을 다른 구성원에게 할당할 수도 있다.
(각각 +버튼으로 추가, 해당 내용을 클릭함으로서 수정)
(5) 내 리스트에서는 나한테 할당된거, 내가 할당한거를
나눠 볼 수 있고 상대방의 피드백을 확인할 수도 있다.
완료는 해당 일의 체크 버튼을
누르거나 결정의 경우 하단 결정을 적어주면 됨.
3. 결론
확실히 편해보임. 다른 컨텐츠(구글독스, 각종 드라이브 등)와
누르거나 결정의 경우 하단 결정을 적어주면 됨.
3. 결론
확실히 편해보임. 다른 컨텐츠(구글독스, 각종 드라이브 등)와
연동이 잘된다면 간단한 프로젝트에서는 트렐로와 같이
뭘로 할지 고민될 것 같다.
피드 구독하기:
글 (Atom)