# 딕셔너리 (연관배열)

# 배열을 사용할때 배열 = [1,2,3,4] 를 생각해보면
# 배열에서 2라는 값을 꺼내 사용하고 싶다면 배열[1] 이렇게 사용하는 것을 떠올린다
# 지금 이러한 예가 단편적이고 배열의 수가 한눈에 보여서 쉽게 원하는 값을 꺼내쓸 수 있는데 만약
배열 = [[1,2,3,[4,5]],[6,7,8,[9,10]],...]
# 이러한 구조의 배열이 엄청 많아진다면 어떻게 원하는 데이터를 편하게 들고올지 생각해보자

# 디비에서 데이터를 불러와보니 이러한 배열 구조라면 난감하다
# 0번 인덱스 데이터의 0번은 아이디를 1번은 닉네임을 2번은 이름을 3번 인덱스에는 유저의 사진들을 담았다고 상상해보자

배열 = [["id1", "우리동네여포", "홍길동", ["img1.jpg", "img2.jpg"]], ...]
# 단순하게 닉네임이 필요해서 가져온다고 가정하면
# 1. 배열 전체를 체크한다 (사람이 수동으로)
# 2. 해당데이터의 인덱스 번호를 세어본다
배열닉네임값 = 배열[0][1]

# 이러한 모습을 지니게된다 그렇다면 데이터를 불러올때마다 배열을 확인하고 거기에서 불러오는 데이터를 확인해서 몇번 인덱스가 우리가 원하는 데이터인지 외우고 있어야 한다. 이러한 불편함을 해소해주는게 딕셔너리다

# 딕셔너리 생성
딕셔너리 = { "아이디": "id1", "닉네임":"우리동네여포", "이름":"홍길동", "이미지":{"이미지1":"img1.jpg", "이미지2":"img2.jpg", "3차원": {"3차원이미지1":"img3.jpg","3차원이미지2":"img4.jpg"}} }

# 딕셔너리 값 출력 (두가지 방법중 전자는 키값이 없을때 오류가 발생하지만, 후자의 경우에는 none으로 돌려준다)
딕셔너리결과 = 딕셔너리["이미지"]["이미지1"]
# 딕셔너리결과 = 딕셔너리["이미지"]["3차원"]["3차원이미지1"]

딕셔너리결과2 = 딕셔너리.get("이미지").get("이미지1")
# 값이 없는 경우 디폴트 값도 지정이 가능하다
딕셔너리결과2 = 딕셔너리.get("이미지").get("없는키", "디폴트")


# 키들을 추출 해보자 (1차원 키값만 추출)
키값 = 딕셔너리.keys()
# n차원 키값은 이렇게
키값2 = 딕셔너리["이미지"].keys()

# 값들을 추출
= 딕셔너리.values()

# 키와 값 동시 추출
동시추출 = 딕셔너리.items()

# 해당키 확인 (1차원만 가능하다)
키확인 = "이미지" in 딕셔너리
# n차원은 이렇게
키확인 = "3차원" in 딕셔너리["이미지"]

'코딩 공부 > PYTHON' 카테고리의 다른 글

파이썬 - 변수사용  (0) 2022.04.18
파이썬 - 집합  (0) 2022.04.18
파이썬 - 배열  (0) 2022.04.14
파이썬 - 문자열  (0) 2022.04.11
파이썬 - 기본  (0) 2022.04.11
# 리스트

# 리스트의 슬라이싱은 문자열과 동일

배열0 = [1, 2, 3, 4, 5]
배열결과0 = 배열0[0:2]

배열1 = [6, 2, 3, ['a', 'b', 'c'], 4, 5]
배열결과1_1 = 배열1[2:5]
배열결과1_2 = 배열1[3][:2]

# 배열 더하기
배열더하기결과 = 배열0 + 배열1

# 배열 반복
배열반복 = 배열0 * 2

# 배열 길이
배열길이 = len(배열1)

# 배열 삭제
# del 배열0[1]
# 값으로 검색해서 삭제
# 배열0.remove(4)
# 배열 비우기
# 배열0.clear()
# 슬라이스로 삭제가능
# del 배열0[:2]

# 배열 추가
배열0.append(1)

# 배열 정렬 (오름차순)
배열0.sort()

# 배열 정렬 (뒤집기 - 순서 반대)
배열0.reverse()

# 배열 위치 보기 (겹치는 수는 가장 처음 찾는 순)
배열위치 = 배열0.index(1)

# 배열 요소 카운트
배열카운트 = 배열0.count(1)

'코딩 공부 > PYTHON' 카테고리의 다른 글

파이썬 - 집합  (0) 2022.04.18
파이썬 - 딕셔너리  (0) 2022.04.15
파이썬 - 문자열  (0) 2022.04.11
파이썬 - 기본  (0) 2022.04.11
파이썬이란?  (0) 2022.04.10
# 문자열

# 한줄인 경우
# 큰 따옴표 " "
# 작은 따옴표 ' '

# 문자열이 여러줄인 경우
# """ """ 큰 따옴표 3개
# ''' ''' 작은 따옴표 3개

# \n    문자열 안에서 줄을 바꿀 때 사용
# \t    문자열 사이에 탭 간격을 줄 때 사용
# \\    문자 \를 그대로 표현할 때 사용
# \'    작은따옴표(')를 그대로 표현할 때 사용
# \"    큰따옴표(")를 그대로 표현할 때 사용
# \r    캐리지 리턴(줄 바꿈 문자, 현재 커서를 가장 앞으로 이동)
# \f    폼 피드(줄 바꿈 문자, 현재 커서를 다음 줄로 이동)
# \a    벨 소리(출력할 때 PC 스피커에서 '삑' 소리가 난다)
# \b    백 스페이스
# \000  널 문자

# 이중에서 활용빈도가 높은 것은 \n, \t, \\, \', \"

# 문자열 더하기 문자열을 변수에 넣어서 사용
더하기1 = "aaa"
더하기2 = "bbb"
더하기_결과 = 더하기1 + 더하기2

# 문자열 곱하기
곱하기 = "="
곱하기결과 = "=" * 5

# 문자열 길이
길이 = "12345"
길이결과 = len(길이)

# 문자열 인덱싱
문자열0 = "Life is too short, You need Python"
문자열0_1 = 문자열0[3]
문자열0_1_1 = 문자열0[13]

# 문자열 슬라이싱
문자열0_2 = 문자열0[0] + 문자열0[1] + 문자열0[2] + 문자열0[3]
문자열0_2_1 = 문자열0[0:4]    # 간단하게 하는 방법 0 <= 문자열0 < 3
문자열0_2_2 = 문자열0[:4]     # 앞에서 일정 길이만큼 자르기 (날짜 자르는데 사용가능)
문자열0_2_3 = 문자열0[8:]     # 앞에서부터 잘라서 뒤에 가져오기
문자열0_2_4 = 문자열0[-1:]    # 뒤에서 잘라서 가져오기

# 문자열 포맷
# %s    문자열(String)
# %c    문자 1개(character)
# %d    정수(Integer)
# %f    부동소수(floating-point)
# %o    8진수
# %x    16진수
#. %%   Literal %% (문자 % 자체)

숫자대입0 = 3
숫자대입결과 = "I eat %d apples." % 숫자대입0

숫자대입1 = 10
문자대입1 = "three"
문자열결과1 = "I ate %d apples. so I was sick for %s days." % (숫자대입1, 문자대입1)

# 90% 이렇게 쓰고 싶으면 %% 두번 사용하기
# "Error is %d%%." % 90

정렬공백 = "%10s아아" % "hi"
정렬공백반대 = "%-10s아아" % 'hi'

# 소문자를 대문자로 바꾸기(upper)
a = "hi"
aU = a.upper()

# 대문자를 소문자로 바꾸기(lower)
a = "HI"
aL = a.lower()

a = " hi "
aD = a.strip()

# 문자열 바꾸기(replace)
a = "Life is too short"
aRe = a.replace("Life", "Your leg")

'코딩 공부 > PYTHON' 카테고리의 다른 글

파이썬 - 집합  (0) 2022.04.18
파이썬 - 딕셔너리  (0) 2022.04.15
파이썬 - 배열  (0) 2022.04.14
파이썬 - 기본  (0) 2022.04.11
파이썬이란?  (0) 2022.04.10
# 파이썬 실행방법

# 파일 전체: 상단 화살표 클릭 실행하면 터미널에서 실행값 출력
a = 1 + 3
# print(a)

# 단일 또는 일정 코드만 실행해서 결과를 보고 싶을 때
# 해당코드를 드래그 후 시프트 + 엔터
b = 3 + 3
# print(b)

# 아니면 비주얼 스튜디오 확장 프로그램인 파이썬 프리뷰기능을 사용해서 확인가능

# if 문
if a > 1:
    print("현재 a는 1보다 큽니다.")

# for문 (배열을 순서대로 변수 a에 대입해라)
print("for문 예제")
for a in [1, 2, 3]:
    print(a)

print("while문 예제")
i = 0
while  i < 3:
    i=i+1
    print(i)

# 함수 사용

def plus(a, b):
    return a+b

c = plus(4,5)

# 곱하기    *
# 제곱      **

# 나누기    /
# 나머지    %
# 몫        //
# 파이썬 실행방법

# 파일 전체: 상단 화살표 클릭 실행하면 터미널에서 실행값 출력
a = 1 + 3
# print(a)

# 단일 또는 일정 코드만 실행해서 결과를 보고 싶을 때
# 해당코드를 드래그 후 시프트 + 엔터
b = 3 + 3
# print(b)

# 아니면 비주얼 스튜디오 확장 프로그램인 파이썬 프리뷰기능을 사용해서 확인가능

# if 문
if a > 1:
    print("현재 a는 1보다 큽니다.")

# for문 (배열을 순서대로 변수 a에 대입해라)
print("for문 예제")
for a in [1, 2, 3]:
    print(a)

print("while문 예제")
i = 0
while  i < 3:
    i=i+1
    print(i)

# 함수 사용

def plus(a, b):
    return a+b

c = plus(4,5)

# 곱하기    *
# 제곱      **

# 나누기    /
# 나머지    %
# 몫        //


'코딩 공부 > PYTHON' 카테고리의 다른 글

파이썬 - 집합  (0) 2022.04.18
파이썬 - 딕셔너리  (0) 2022.04.15
파이썬 - 배열  (0) 2022.04.14
파이썬 - 문자열  (0) 2022.04.11
파이썬이란?  (0) 2022.04.10

 

파이썬은 1990년 암스테르담의 귀도 반 로섬(Guido Van Rossum)이 개발한 인터프리터 언어이다. 귀도는 파이썬이라는 이름을 자신이 좋아하는 코미디 쇼인 "몬티 파이썬의 날아다니는 서커스(Monty Python’s Flying Circus)"에서 따왔다고 한다. 

+ 인터프리터 언어는 한줄씩 실행해서 결과를 알 수 있는 언어 (고급 프로그래밍언어중 대부분이 인터프리터 언어 EX 자바스크립트, SQL, 파이썬, 루비, 스크래치 등등 다양하다. )

 

파이썬의 특징

 

직관적이다

프로그래밍이란 사람이 생각하는 것을 컴퓨터에 지시하고 구조를 짜는 행위라고 볼 수 있다. 파이썬은 언어가 단순하며 부수적인 보조 지시가 빠지고 핵심 지시로만 프로그래밍이 가능한 구조를 보인다. 

 

문법이 쉬워서 빠르게 학습이 가능하다

언어마다 동작 방식이나 문법이 조금씩 다르다 하지만 프로그래밍을 하는 사람의 사고방식은 어느정도 일관적인데 파이썬의 특징중 하나인 직관적인 특징 덕분에 부수적인 문법을 신경쓰지 않아도되는 자유도 덕분에 빠르게 학습할 수 있다

 

파이썬이 느린언어라서 고민이 된다면 고민하지 않아도 좋다

먼저 파이썬은 느린언어가 맞다. 지금의 상황으로는 인정할 수 밖에 없는 사실이다. 나중에는 이게 틀릴가능성은 언제나 열려있다. 하지만 파이썬은 C와 호완이 아주 좋아서 전체적인 틀은 파이썬으로 만들고 속도가 아주 중요한 부분은 C언어로 짜서 속도에 제약을 해제 하는것이 가능하다. 그리고 파이썬 라이브러리 중에 C로 만든것도 많다. 물론 이러한 라이브러리들은 속도도 뒤쳐지지 않는다.  

 

 

마지막 편집일 22.04.10

'코딩 공부 > PYTHON' 카테고리의 다른 글

파이썬 - 집합  (0) 2022.04.18
파이썬 - 딕셔너리  (0) 2022.04.15
파이썬 - 배열  (0) 2022.04.14
파이썬 - 문자열  (0) 2022.04.11
파이썬 - 기본  (0) 2022.04.11
// 모달 오픈하는곳에 추가
$('body').css("overflow", "hidden");

 

// 모달 닫는곳에 추가 

$('body').css("overflow", "scroll");

 

 

간단하다

함수형 프로그래밍의 장점 

  1. 높은 수준의 추상화를 제공한다
  2. 함수 단위의 코드 재사용이 수월하다
  3. 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다

 

추상화?

컴퓨터 과학에서 추상화(abstraction)는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다. (위키백과)

 

추상화의 수준이 높다라는 점은 사용하기 편하다라는 장점을 지닌다

 

명령형과 선언형의 사고방식 차이

명령형 프로그래밍은 문제를 어떻게 해결하는지에 집중되어있고

선언형 프로그래밍은 무엇을 해결할지에 집중하고 있다 

 

 

Q. 배열을 돌며 빈 문자열 제거하고, 각 원소의 첫 글자를 대문자로 변경하자

 

명령형 프로그래밍

1. for 문을 돌며 배열에 접근

2. if 문으로 빈 문자열일때 for문에서 빠져나옴

3. if 문으로 빈 문자열이 아닐때 문자열 첫번째를 대문자로 변환해서 배열에 담기

 

선언형 프로그래밍

1. 문자열이 빈값이 아닐때 첫번째 문자열을 대문자로 변환하는 함수를 선언

2. for 문을 돌며 배열에 접근하며 배열의 값을 함수에 던져서 배열에 담기

 

두가지 예시만 봐도 앞으로 지향해야할 점이 선언형 프로그래밍이지만 선언형 프로그래밍의 기능이 너무 쪼개져있다면 기능적으로 비효율 적이다

 

1. 배열을 돌며 빈 값을 제외한 값을 새로운 배열에 담는 함수를 선언

2. 배열을 돌며 첫번째 문자열을 대문자로 변환하는 함수를 선언

3. 배열을 1번 함수를 사용하여 새로운 배열 생성

4. 1번을 통해 생성된 배열을 2번 함수를 사용하여 새로운 배열 생성

 

이처럼 기능을 너무 세분화한다면 전체 배열을 두번 돌면서 기능적으로 비효율적인 부분을 보인다. 만약 이러한 배열 데이터가 엄청 많아졌다고 한다면 시간적으로 차이가 분명하다

 

결론 

선언형 프로그래밍으로 코드를 짜는것을 지향하지만 상황에따라 적당하게 세분화해서 효율적으로 기능과 코드의 재활용을 챙기자

 

 

 

먼저 로직을 생각해보자

어떤 버튼을 누르면 조회한 데이터를 html 요소에 담아서 추가한다

 

좀 더 깊게 생각해보자

버튼을 누르면 ajax 통신으로 데이터 요청을 전송하고 들고오는데 성공하면 데이터를 그려주는 함수에 뿌린다

 

코드로 보자

 

1.

$('body').on('click', '#버튼1', function(e) {

    ajax요청(ajax데이터요청주소, 요청할함수명);

});

클릭했을때 ajax 통신을 요청한다

 

2.

function ajax요청(데이터요청주소, 보낼함수명) {

    $.ajax({
        type: "POST",
        url: 데이터요청주소,
        data: "",
        dataType: "json",
        success: function (result) {
            보낼함수명(result);
        }
        , complete: function () {
          loadingEnd();
        }
        , error: function (xhr, status, error) {
            alert("error : " + error);
        }
    });
}
성공시에 성공한 값들을 함수명에 보낸다
데이터 요청 주소는 컨트롤러/함수?get을 사용해서 주소를 던지고 컨트롤러 내부에서 조회한 데이터를
json_encode 함수로 인코드 해서 리턴한다
 
3.
function 보낼함수명(result) {

    var htmlTag = "";
    let base_url = result['base_url'];

    $.each(result['데이터배열'], function (key, value) {

        htmlTag += `<태그 생성>${value['키값']}</태그 생성>`;
        htmlTag += `<태그 생성>${value['키값']}</태그 생성>`;
    });

    $('#추가할위치').append(htmlTag);
    $('#버튼1').attr("data-url", result['다음리스트URL']);
    $('#버튼1').attr('disabled', false);
}
each문을 돌면서 htmlTag에 배열의 길이만큼 반복해서 담고 append를 통해서 html에 추가한다

 

들어가기전에 

3가지의 대분류와 그안에 23가지의 패턴이 있다

생성 패턴 = [ 싱글톤 패턴(Singleton),  추상팩토리 패턴(Abstract Factory), 빌더 패턴(Builder), 팩토리 메서드 패턴(Factory Method), 원형 패턴(Prototype) ]

구조 패턴 = [ 적응자 패턴(Adapter or Wrapper), 브리지 패턴(Bridge), 데코레이터 패턴(Decorator), 퍼사드 패턴(Facade), 프록시 패턴(Proxy) ]

행위 패턴 = [ 옵저버 패턴(Observer), 상태 패턴(State), 스트레이트지 패턴(Strategy), 템플릿 패턴(Template), 비지터 패턴(Visitor), 역할 사슬 패턴(Chain of Responsibility), 커맨드 패턴(Command), 인터프리터 패턴(Interpreter), 이터레이터 패턴(Iterator), 미디에이터 패턴(Mediator) ]

 

디자인 패턴은 협업하거나 유지보수의 편의를 제공하기위해 의사소통의 일종으로 이러한 문제를 조금이나마 해소한다. 하지만 여기에 정리된 패턴이 만능이 아니고 상황에 따라 적절하게 사용하는 것이 중요하다. 

 

역사는 1987년에 Using Pattern Languages for Object-Oriented Programs 를 통해 알려졌다. 대중화된것은 GoF를 발표한 1995년이다 현재에는 수천개의 패턴이 발표되었다.

 


생성 패턴(Creational Patterns)
객체 생성에 관련된 패턴입니다. 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.

 


1. 싱글톤 패턴(Singleton) : 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글톤 패턴이라고 한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.

2. 추상팩토리 패턴(Abstract Factory) : 구체적인 리턴문을 정하지 않은 함수를 정의 해두고 해당 클래스를 상속받아서 클래스의 리턴문을 정의 해서 사용하는 방식이다

php 예제

<?php
interface Button
{
    public function paint();
}

class WinButton implements Button
{
    public function paint()
    {
        echo "Windows Button";
    }
}

class OSXButton implements Button
{
    public function paint()
    {
        echo "OSX Button";
    }
} ?>

 

3. 빌더 패턴(Builder) : 복합 객체의 생성과정과 표현과정을 분리시켜 동일한 생성과정에서 다양한 표현을 생성할 수 있는 패턴이다.

 

간단하게 매개 변수를 과도하게 많이 받아야할때 매개변수지정 실수를 방지하기 위함이다

(연관배열로 받아서 배열을 풀어서 키값을 찾아서 값을 변수에 넣어서 사용하는 방법도 있다)

 

자바 예제

 
class Something {

  private Something(int number, String name, double size) {
      //Something 클래스 초기화
  }

  public static class Builder {
      int number=0;
      String name=null;
      double size=0d;

      public Builder() {
          //Builder 초기화
      }

      public Builder setNumber(int number) {
          this.number = number;
          return this;
      }

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

      public Builder setSize(double size) {
          this.size = size;
          return this;
      }

      public Something build() {
          return new Something(number, name, size);
      }
  }
}
public void createSomething() {
  Something something = new Something.Builder().setNumber(number).setName(name).setSize(size).build();
}

 

 

4. 팩토리 메서드 패턴(Factory Method) : 객체를 생성하는 인터페이스를 정의하지만, 인스턴스를 만드는 클래스는 서브클래스에서 결정하도록 하는 패턴입니다. 팩토리 메서드에서는 인스턴스를 만드는 것을 서브 클래스에서 하게 됩니다.

 

간단하게 생성전용 클래스를 정의해서 객체 생성을 담당(PizzaFactory)한다

 

자바 스크립트

 
//Our pizzas
function HamAndMushroomPizza(){
   var price = 8.50;
   this.getPrice = function(){
     return price;
   }
 }

 function DeluxePizza(){
   var price = 10.50;
   this.getPrice = function(){
     return price;
   }
 }

 function SeafoodPizza(){
   var price = 11.50;
   this.getPrice = function(){
     return price;
   }
 }

 //Pizza Factory
 function PizzaFactory(){
   this.createPizza = function(type){
      switch(type){
       case "Ham and Mushroom":
         return new HamAndMushroomPizza();
       case "DeluxePizza":
         return new DeluxePizza();
       case "Seafood Pizza":
         return new SeafoodPizza();
       default:
           return new DeluxePizza();
      }
   }
 }

 //Usage
 var pizzaPrice = new PizzaFactory().createPizza("Ham and Mushroom").getPrice();
 alert(pizzaPrice);
 

5. 원형 패턴(Prototype) : 생성할 객체의 종류를 명시하는 데 원형이 되는 예시물을 이용하고 새로운 객체를 이 원형들을 복사함으로써 생성하는 패턴이다.

 

php 예제

<?php
abstract class BookPrototype {
    protected $title;
    protected $topic;
    abstract function __clone();
    function getTitle() {
        return $this->title;
    }
    function setTitle($titleIn) {
        $this->title = $titleIn;
    }
    function getTopic() {
        return $this->topic;
    }
}

class PHPBookPrototype extends BookPrototype {
    function __construct() {
        $this->topic = 'PHP';
    }
    function __clone() {
    }
}

class SQLBookPrototype extends BookPrototype {
    function __construct() {
        $this->topic = 'SQL';
    }
    function __clone() {
    }
}

  writeln('BEGIN TESTING PROTOTYPE PATTERN');
  writeln('');

  $phpProto = new PHPBookPrototype();
  $sqlProto = new SQLBookPrototype();

  $book1 = clone $sqlProto;
  $book1->setTitle('SQL For Cats');
  writeln('Book 1 topic: '.$book1->getTopic());
  writeln('Book 1 title: '.$book1->getTitle());
  writeln('');

  $book2 = clone $phpProto;
  $book2->setTitle('OReilly Learning PHP 5');
  writeln('Book 2 topic: '.$book2->getTopic());
  writeln('Book 2 title: '.$book2->getTitle());
  writeln('');

  $book3 = clone $sqlProto;
  $book3->setTitle('OReilly Learning SQL');
  writeln('Book 3 topic: '.$book3->getTopic());
  writeln('Book 3 title: '.$book3->getTitle());
  writeln('');

  writeln('END TESTING PROTOTYPE PATTERN');

  function writeln($line_in) {
    echo $line_in."<br/>";
  }
?>

간단하게 복제 패턴이라고 생각하자 처음 객체를 생성하고 그 객체를 계속해서 생성해야한다면 복제해서 사용하는 방식이다.

 

 



구조 패턴(Structural Patterns)
클래스나 객체를 조합해 더 큰 구조를 만드는 패턴입니다. 예를 들어 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 서로 다른 객체들을 묶어 새로운 기능을 제공하는 패턴이다.

 


1. 적응자 패턴(Adapter or Wrapper) : 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해주는 패턴이다.

2. 브리지 패턴(Bridge) : 구현부에 추상층을 분리하여 각자 독립적으로 변형할 수 있도록 하는 패턴이다.


3. 데코레이터 패턴(Decorator) : 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능확장이 필요할 때 서브클래스 대신 쓸 수 있는 대안이 될 수 있다.

4. 퍼사드 패턴(Facade) : 서브시스템에 있는 인터페이스 집합에 통합된 하나의 인터페이스를 제공한다. 서브시스템을 좀 더 쉽게 사용하기 위해 고수준의 인터페이스를 정의한다.

5. 프록시 패턴(Proxy) : 어떤 다른 객체로 접근하는 것을 통제하기 위해 그 객체의 매니저 또는 자리 채움자를 제공하는 패턴이다.


6. 컴포지트 패턴(Composite) : 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 / 복합객체 모두 동일하게 다루도록 하는 패턴이다.


행위 패턴(Behavioral Patterns)
객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴이다. 한 객체가 혼자 수행할 수 없는 작업을 여러개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는것에 중점을 두는 방식이다.

종류
1. 옵저버 패턴(Observer) : 객체들 사이에 1 : N 의 의존관계를 정의하여 어떤 객체의 상태가 변할 때, 의존관계에 있는 모든 객체들이 통지받고 자동으로 갱신될 수 있게 만드는 패턴이다.

2. 상태 패턴(State) : 객체의 내부 상태가 변경될 때 행동을 변경하도록 허락합니다. 객체는 자신의 클래스가 변경되는 것처럼 보이게 된다.

3. 스트레이트지 패턴(Strategy) : 동일 계열의 알고리즘들을 정의하고, 각각 캡슐화하며 이들을 상호교환 가능하도록 만드는 것이다. 알고리즘을 사용하는 사용자로부터 독립적으로 알고리즘이 변경될 수 있도록 하는 패턴이다.

4. 템플릿 패턴(Template) : 객체의 연산에서 알고리즘의 뼈대만 정의하고, 나머지는 서브클래스에서 이루어지게 하는 패턴이다. 템플릿패턴은 알고리즘의 구조는 변경하지 않고 알고리즘의 각 단계를 서브클래스에서 재정의하게 된다.

5. 비지터 패턴(Visitor) : 객체구조를 이루는 원소에 대해 수행할 연산을 표현한다. 방문자는 연산에 적용할 원소의 클래스를 변경하지 않고 새로운 연산을 재정의 할 수 있다.

6. 역할 사슬 패턴(Chain of Responsibility) : 요청을 처리하는 기회를 하나 이상의 객체에 부여하여 요청을 보내는 쪽과 받는 쪽의 결합을 피하는 패턴이다. 요청을 받는 객체를 연쇄적으로 묶고 객체를 처리할 수 있을 때까지 요청을 전달한다.

7. 커맨드 패턴(Command) : 요청을 객체로 캡슐화하여 서로 다른 사용자의 매개변수화, 요청 저장 또는 로깅, 연산의 취소를 지원하게 만드는 패턴입니다.

8. 인터프리터 패턴(Interpreter) : 주어진 언어에 대해서 문법을 위한 표현수단을 정의하고, 해당 언어로 된 문장을 해석하는 해석기를 사용하는 패턴입니다.

9. 이터레이터 패턴(Iterator) : 내부 표현부를 노출하지 않고 어떤 객체 집합의 원소들을 순차적으로 접근할 수 있는 방법을 제공하는 패턴이다.

10. 미디에이터 패턴(Mediator) : 한 집합에 속해있는 객체들의 상호 작용을 캡슐화하는 객체를 정의하는 패턴이다. 중재자는 객체들이 직접 서로 참조하지 않도록함으로써 객체들간의 느슨한 연결을 촉진시키며 객체들의 상호작용을 독립적으로 다양화 시킬 수 있도록 해준다.

 

 

 

리액트를 배우고 있어서 아주아주 깔끔하지 않지만 숫자만 받는데 

type="number" 로만 처리하는데 신경쓰여서 한번 만들어 보자 하고 만들어 보았다

 


    const OnlyNumber = (e, predata) => {
        const curType = e.nativeEvent.inputType;
        const curValue = e.nativeEvent.data;

        if (curValue !== "" && curValue !== null) {
            const newValue = curValue.replace(/[^0-9]/g, '');
            setMovieYear(predata + newValue)
        } else if (curType === "deleteContentBackward") {
            const delData = predata.slice(0,-1);
            setMovieYear(delData)
        }
    };

해당함수를 선언해두고 


     <input type="text" value={movieYear} placeholder= "숫자만 입력해주세요" onChange={e => OnlyNumber(e, movieYear)}>

return 문의 html 코드는 이렇게 사용한다 

 

 


개발 스토리

코드를 쓰다보면 함수가 아무리 복잡하고 어려워도 함수를 작동하는 방식은

간결하고 깔끔해야만 한다는 생각으로 개발중이다 

 

코드를 보면 알겠지만 깔끔하지 않다 nativeEvent안에 값을 받아서 replace 돌리고

값을 세팅해주는 방식인데 이전의 값을 더해주지 않으니 초기화 되어

1자리 이상값세팅이 안되어서 이전의 값도 불러와서 이전의 문자열에 더해주는 방식이다

 

그랬더니 끝난줄알았는데 지우기 키를 입력하니 콘솔이 터졌다 가져온 값이 null 이라서

replace 함수가 터져버렸다

 

콘솔로 e를 찍어서 지우기 키입력의 고유값을 찾아봤다 그중에 

inputType: "deleteContentBackward" 이게 눈에 띄었다 다른 키를 입력하면서 다른 키는 어떻게 받나 확인했다

inputType: "insertText" 다른 키들은 다 이런식이었다

 

그럼 이값으로 if문을 마저 짜자

e.nativeEvent.inputType; 를 가져오고 else if 로 구분까지는 했다
 
그런데 문자열 뒤에 하나를 잘라서 다시 set 하고 이게 맞는건지 의문이 들었지만 지금은 REACT를 배우고있고 js함수 방식으로 적용하는 방식을 잘모른다..
그러니 그냥 이가 없으면 잇몸으로라도 악으로 깡으로 만들어보자
slice(0,-1);
함수를 사용해서 일단 뒤에 문자열을 지우는데는 성공했다
 

느낀점

html5 매뉴얼 만들어주는 분들이 조금은 원망스럽다 e를 사용할수있는
number와 오로지 숫자만 입력되는 OnlyNumber를 지원해줬더라면 이런 고생은 하지 않았을것이다
그래도 삽질을 하면서 생각하는대로 잘풀려서 함수를 만드는데 성공했다.

 

preg_replace("/([0-9]{2,3})([0-9]{3,4})([0-9]{4})$/","\\1-\\2-\\3" ,$phone);
 
이렇게 사용하면 02로 시작하는 두글자와 010으로 시작하는 세글자까지 하이픈을 넣을 수 있다

 

1. 현재페이지에 부를때

<button onclick="location.href='address'">button</button>

2. 새 창에 열때

<button onclick="window.open('address')">button</button>

3. 팝업으로 열기 (주소,팝업창이름,옵션)

<button onclick="window.open('address','window_name','width=430,height=500,location=no,status=no,scrollbars=yes');">button</button>

4. 상위 프레임에 부를때

<button onclick="parent.location.href='address'">button</button>

5. 프레임 지정 링크

<button onclick="타켓명.location.href='address'">button</button>

+ Recent posts