223 쪽 [직접 해보는 손코딩: 범위 내부의 정수를 모두 더하는 함수] 실행 후 코드가 입력된 화면 및 실행결과 화면 인증샷





매개변수, 기본 매개변수, 가변 매개변수에 대해서 정리해보자 


def 함수(매개변수):

      변수 = 초깃값

...... 

return 변수


매개변수는 함수의 괄호 내부에 넣는 파라메터 값을 의미합니다. 

기본 매개변수는 매개변수 값에 아무것도 넣지않을때 들어가는 default 값을 말합니다. 


def sum_all(start=0, end=200, step=1):
# 변수를 선업합니다.
output = 0

# 반복문을 돌려 숫자를 더합니다.

for i in range(start, end + 1, step):
output += i

# 리턴 합니다.

return output


# 함수 호출

print("A", sum_all(0, 100, 10))
print("B", sum_all())




가변 매개변수 함수는 매개변수를 원하는 만큼 받을 수 있는 함수를 말합니다. 매개변수를 원하는 만큼 받을 수 있는 함수의 변수를 가변 매개 변수라고 합니다. 



def 함수이름 (매개변수, 매개변수, ....., *가변 매개변수):

      구문


가변 매개변수 뒤에는 일반매개변수가 올 수 없습니다. 가변 매개변수는 하나만 사용할 수 있습니다. 


def print_n_times(n, *values):
# n 번 반복합니다.
for i in range(n):
#values 는 리스트처럼 활용합니다.

for value in values:
print(value)

#단순한 줄바꿈
print()

# 함수를 호출합니다.

print_n_times(3, "안녕하세요", "즐거운", "파이썬 프로그램밍")




블로그 이미지

클라인STR

,

1. 리스트


파이썬에서 리스트

  • 여러가지 데이터를 저장할 수 있는 자료형 이다. 
  • 데이터의 추가 , 삭제 ,수정이 가능하다.
  • 인덱스로 데이터의 접근이 가능하다.

array = [273, 32, 103, "문자열", True, False]
print(array)



리스트의 인덱스는 0부터 시작합니다. 


print(array[0])

print(array[2])

print(array[4])

print(array[1:3])

print("=======================")

print(array[-1])

print(array[-2])

print(array[-3])


2. 리스트 연산


리스트는 인덱스를 이용하여 데이터에 접근가능합니다. 범위연산자를 사용하거나, 음수를 사용하여 요소를 뒤에서부터 선택할 수 있습니다.


리스트는 +,* 사용하여 연산이 가능합니다. 


array = [1,2,3]

array2 = [4,5,6]


print("# 리스트")

print("array = ", array)
print("array2 = ", array2)
print()

print("# 리스트 기본 연산자")
print("array + array2 =", array + array2)
print("array * 3", array * 3)
print()





len() 함수는 문자열의 인수로 올경우 글자수를 리턴하지만, 리스트 변수를 넣을경우 요소의 개수를 리턴합니다. 



3. 리스트 요소 추가 및제거하기 


리스트 요소를 추가할 때는 append(), insert() 함수를 사용합니다. 

append()함수는 리스트 뒤쪽에 항상 요소를 추가합니다. 반면에 insert()함수는 원하는 위치에 요소값을 추가할 수 있습니다. 


array = [1, 2, 3]

print("# 리스트 요소에 추가하기")
array.append(4)
array.append(5)
array.append(6)
print(array)
print()

print("# 리스트 중간에 요소 추가하기")
array.insert(3, 10)
print(array)


print("# 리스트 extend 함수")
lista = [1,2,3]
lista.extend([4,5,6])
print(lista)


print("# 리스트 제거하기")
del lista[0]
print(lista)

print("# 리스트 제거하기 POP")
lista.pop(3)
print(lista)


리스트에서 요소를 삭제할경우 인덱스를 이용해서 제거하거나, 값을 이용해서 제거할 수 있습니다. 


del 키워드를 사용할경우 원하는 인덱스에 해당하는 값을 삭제할 수 있습니다. pop()함수를 이용할 경우 마찬가지로 인덱스를 줄 수 있습니다.

만약 인덱스를 주지 않을경우 마지막 요소의 리스트 값을 삭제합니다. 


값으로 제거하는 경우 remove() 함수를 사용합니다. 리스트내부에서 해당내부 값을 찾아 제거한다. 

remove()함수에 경우 삭제할 값이 여러개인경우 하나만 제거됩니다. 리스트에서 해당하는 값을 전부지울려면 반복문을 사용하면 됩니다. 



4.딕셔너리 


딕셔너리는 Key ,Value 형태의 값을 저장하는 자료형입니다. 


dictionary = {

"키A" : "값A",
"키B" : "값B",
"키C" : "값C",
}



딕셔녀리 반복문 출력하기 


dictionary = {

"키A" : "값A",
"키B" : "값B",
"키C" : "값C",
}


print("# 딕셔너리 items() 함수")
print("items():", dictionary.items)
print()


print("# 딕셔너리의 items() 함수와 반복문 조합하기")
for key, element in dictionary.items():
print("dictionary [{}] = {}".format(key, element))



print("# 리스트 내포하기")

array = []

for i in range(0,20, 2) :
array.append(i*i)

print(array)



딕셔너리 데이터 접근 및 변경 삭제 예시


dictionary = {
"name" : "건조 망고",
"type" : "당절임",
"ingredient" : ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
"origin" : "필리핀"
}

#값 출력
print("name : ", dictionary["name"])
print("type : ", dictionary["type"])
print("ingredient : ", dictionary["ingredient"])
print("origin : ", dictionary["origin"])
print()

#값 변경

dictionary["name"] = "8D 건조 망고"
print("name : ", dictionary["name"])


dictionary["price"] = 5000
print(dictionary)


del dictionary["ingredient"]
print(dictionary)



선택미션 




블로그 이미지

클라인STR

,

1. JSP캐쉬 , 프로그램 수행속도 체크, 배포실수 확인한 경우



2. 피들러 원격 사용테스트 



3. 모바일웹 안드로이드 세션 오류 




4. 마이포인트 연동기 - 




5. 네이버페이 연동후기 



6. encodeURIComponent 쓰는 이유 ?



7. a태그 target _blank 



8. 윈도우10에서 아이폰 테더링 하는 방법


https://thursday1101.tistory.com/497

https://gyeongsang.kr/329

https://cutekirin.tistory.com/197



9. Mybatis Type Ailas 오류 






10. Spring Resttemplate get, post, ssl 인증서없이 호출하는방법 




11. 인터넷 익스플로러 에서 버튼이 보이지 않네???








블로그 이미지

클라인STR

,

 3. 사용자에게 태어난 연도를 입력받아 띠를 출력하는 프로그램을 작성해 주세요. 작성 시 입력을 받은 연도를 12로 나눈 나머지를 사용합니다.

나머지가 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11일 때 각각 원숭이, 닭, 개, 돼지, 쥐, 소, 범, 토끼, 용, 뱀, 말, 양띠 입니다.


    

    가장 단순한 형태이지 않을까 싶네요. 단점으로 보면 if문 구문안에  계산로직이 각각 들어가 있는 형태입니다. 만약에 계산로직이 변경되는 경우라면 

 12개의 if구문을 바꿔줘야되는 경우가 생깁니다. 그래서 아래의 형태로 구문을 좀더 압축할 수  있습니다. 


    


실행결과는 아래와 같습니다. 



참고로 검증을 위해서 네이버에 검색해서 띠별년도에 해당하는 내역을 검색해보았습니다.  


해당조건을 만족하는 로직을 작성한경우 반듯이 실제값이 제대로 동작하는지 확인하는게 중요합니다. 특히 실무에서는요 ^^ 



파이썬의 if 구문 정리 


파이썬의 공부하면서 느끼는건 자바랑 자바스크립트 기타 언어를 먼저 다뤄본 입장에서는 차이점이 다소 존재합니다. 


if 기본형 


if 조건 :

  조건이 참일때 실행됨

else :

조건이 거짓일때 실행됨 


if구문 괄호랑 ':' 쓰는부분이 좀다른데 아직까지는 좀 적응이 안되네요 ^^ 빨리 익숙해졌으면 좋겠습니다. 



elif 구문 



if 조건A :

   A조건이 참일때 실행됨

elif 조건B :

   B조건이 참일때 실행됨

elif 조건C:

   C조건이 참일때 실행됨 

...... 

else : 

     모든조건에 해당되지 않을때 실행됨


if elif 패턴으로 조건을 실행할경우 해당조건이 참인경우 해당조건 아래로는 조건구문을 검사하지 않고 구문수행이 끝나버립니다. 


3.번 출력 결과를 보면 2016년 을입력한경우 나머지가 0인경우이므로 원숭이띠를 출력하고 프로그램실행이 종료됩니다.  


해당예제를 아래와 같이 if구문을 변경해보고 실행을 하면 좀더 명확하게 알 수 있습니다. 



원숭이 조건을 if 구문으로 변경하여 5개정도 바꿔주고 실행후 2016년 을 입력해서 결과 값을  확인해봅니다. 



여기서 기존소스를 아래와 같이 변경해보고 다시 실행해보겠습니다. 구문 형태를 if elif 패턴으로 다시 바꾸고 같은조건으로 5개 동일하게 줍니다.

그리고 실행을 해봅니다. 





실행해보면 젤 첫번째 if조건이 수행되고 프로그램은 종료됨을 알 수 있습니다.  

실무에서 사용할때 종종 실수를 할 수 있는 부분이기도 해서 한번 내용을 추가해봤습니다. 

if elif 구문 패턴을 쓰는경우도 있지만 if구문을 연속적으로 걸어서 처리하는 경우도 많이쓰입니다.  

그럼 이상 과제를 마치겠습니다. ^^




#혼공단  #혼공파

블로그 이미지

클라인STR

,


과제를 하기전에 예전에 파이썬을 설치했던 터라 다음과같은 에러를 발견하였습니다. 




구글링을 해서 확인해보니 제가 설치한 파이썬 버전이 실행되지 않고 mac OS에 기본으로 설치된 파이썬 2.X때 버전이 실행되면서 해당에러메세지를 나타냅니다. 아래와 같이 python -> python3로 변경하면 정상적으로 프로그램이 실행됩니다. 



매번 python3 라고 입력하기 번거로우니 bash_profile 설정을 아래와같이 변경하면 편하게 사용할 수 있습니다.  변경한 내용이 적용되 지않는 경우  source~/.bash_profile   명령어를 입력해줍니다. 



 3. 다음 프로그램의 실행 결과를 예측해 보세요.


  print("# 연습문제")

  print("\\\\\\\\")

  print("-" * 8)



4. 다음 프로그램의 실행 결과를 예측해 보세요. 그런데 이 예제를 실행하면 오류가 발생합니다. 몇행에서 어떤 오류가 발생할까요? 그리고 그 이유는 무엇인지 말해보세요.


 print("안녕하세요"[1])

 print("안녕하세요"[2])

 print("안녕하세요"[3])   

 print("안녕하세요"[4])

 print("안녕하세요"[5])



인덱스는 0부터 시작합니다. 안녕하세요에 해당 문자열은 0~4번까지 인덱스가 존재하여 해달 오류 메세지가 출력됩니다.



5. 다음 프로그램의 실행결과를 예측해보세요.


print("안녕하세요"[1:3])

print("안녕하세요"[2:4])

print("안녕하세요"[1:])

print("안녕하세요"[:3])




참고 : Mac 파이썬 3.x 사용하기


#혼공단 #혼공파

블로그 이미지

클라인STR

,

퇴근후 한통의 문자를 받았습니다. 마침 택배를 기다리고 있는 중이어서 혹시 몰라서 저도 모르게 문자에 있는 URL을 눌러버렸네요.



안저하지 않는 ? 접근이라는 메시지가 뜨고 해당사이트가 나타나는데요. 전화번호를 입력하라는 화면문구가 뭔가 의심스러웠습니다. 

CJ대한통운 앱을 통해서 조회해본결과 배송중이거나 배송이 도착된 택배가 없다고 뜨네요. 저는 아이폰 사용자라서 딱히 큰 문제는 없을거같긴한데

혹시 문자를 통해 다음내용을 확인 하신 경우는 조심하시기 바랍니다. 

http://qw-fc.top 이라는 URL인경우인데 문자의 내용은 바뀔수 있을거같구 해당 URL 정보다 변경될수 있을거같에요 .



블로그 이미지

클라인STR

,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package naverpay;
 
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
 
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
 
 
public class HttpPost {
 
 public static void main(String[] args) {
     HttpPost obj = new HttpPost();
     obj.getHttpsConnection();
 }
 
 public JSONObject getMakeJsonData() {
     
   JSONObject object = new JSONObject();
   object.put("modelVersion""2");   
   object.put("merchantUserKey""");
   object.put("merchantPayKey""");
   object.put("productName""테스트상품");
   object.put("productCount"1);
   object.put("totalPayAmount"1000);   
   object.put("returnUrl""http://localhost:8080/naverpay/");
   object.put("taxScopeAmount"1000);
   object.put("taxExScopeAmount"0);
   object.put("purchaserName""구매자");   
  
   JSONArray list = new JSONArray();
   
   JSONObject productItem = new JSONObject();
   productItem.put("categoryType""INSURANCE");
   productItem.put("categoryId""TRAVELER");
   productItem.put("uid""005");
   productItem.put("name""테스트상품");
   productItem.put("payReferrer""ETC");
   productItem.put("count"1);
   
   list.add(productItem);
   object.put("productItems", list);
   
   return object;
 }
 
 public String UrlEncodeUTF8(String s) {
     try{
         return  URLEncoder.encode(s, "UTF-8");
     } catch(UnsupportedEncodingException ex) {
        throw new UnsupportedOperationException(ex); 
     }
 }
 
 public void getHttpsConnection() {
 
  HttpsURLConnection conn = null;
  try {
   URL url = new URL("https://dev.apis.naver.com/partner-id/naverpay/payments/v2/reserve");
   conn = (HttpsURLConnection) url.openConnection();
   conn.setRequestMethod("POST");
   conn.setRequestProperty("X-Naver-Client-Id""");
   conn.setRequestProperty("X-Naver-Client-Secret""");
   conn.setRequestProperty("Content-Type""application/json");
   conn.setRequestProperty("charset""UTF-8");
   conn.setDoOutput(true);
   conn.setUseCaches(false);
   conn.setConnectTimeout(10000);
   conn.setReadTimeout(10000);
   conn.setHostnameVerifier(new HostnameVerifier() {
 
    @Override
    public boolean verify(String hostname, SSLSession session) {
     return true;
    }
   });
   
   // SSL setting
   SSLContext context = SSLContext.getInstance("TLS");
   context.init(nullnew TrustManager[]{
     new javax.net.ssl.X509TrustManager() {
      
      @Override
      public X509Certificate[] getAcceptedIssuers() {
       return null;
      }
      
      @Override
      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
      }
      
      @Override
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
      }
     }
   }, null);
   conn.setSSLSocketFactory(context.getSocketFactory());
      
   // Connect to host 
   conn.connect(); 
   conn.setInstanceFollowRedirects(true); 
  
   String param = this.getMakeJsonData().toJSONString();
   
   OutputStream wr1 = conn.getOutputStream();
   DataOutputStream wr = new DataOutputStream(conn.getOutputStream());   
   
   wr1.write(param.getBytes("UTF-8"));
   wr1.flush();
   wr1.close();
 
 
   final int responseCode = conn.getResponseCode(); 
   InputStream in = conn.getInputStream(); 
   BufferedReader reader = new BufferedReader(new InputStreamReader(in));
   final StringBuffer buffer = new StringBuffer();
   String line = null
   while ((line = reader.readLine()) != null) { 
 
       buffer.append(line);
   } 
 
   reader.close();
   System.out.println("##########");
   System.out.println("##########");
   System.out.println("##########");
   System.out.println("##########");
   System.out.println("##########");
   System.out.println("result ::: "+buffer.toString());
 
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if(conn != null) {
    conn.disconnect();
   }
  }
 
 }
 
}
 
 
cs


네이버페이 결제예약호출 예제시 400에러가 발생하여 해당코드를 위와같이 수정하였다. 

json post 전송시 DataOutputStream 을 통해 전송하였으며 21라인에 UTF-8로 반드시 인코딩해서 데이터를 넘겨준다. 

블로그 이미지

클라인STR

,

이번에 회사에서 업무를 하면서 네이버페이 결제 연동을 하면서 우선적으로 알아야되는 내용을 단계적으로 작성해보았습니다.


1. 별도의 문서없이 네이버페이는  https://developer.pay.naver.com/ 개발자 센터를 통해서 연동내용을 참고 할 수 있습니다.


2. 방화벽 설정에 경우  아웃바운드 포트: 443 포트 허용 해야 합니다. 해당부분이 오픈되지 않는 경우 API 호출이 되지 않습니다. 

 - 개발 : dev.apis.naver.com

 - 운영 : apis.naver.com



https://developer.pay.naver.com/docs/v2/api#getstarted

결제팝업창 호출은 Javascript SDK를 이용할수 있지만 SDK를 사용하지않고 직접 팝업창을 호출하는 방식으로도 가능합니다. 

저는 이번 프로젝트떼 Javascript SDK를 이용하지 않고 직접 결제 팝업창을 호출하는 방식으로 개발을 진행하였습니다. 




3. 네이버페이는 카카오페이 결제랑 다르게 개발검수 과정을 거치고 나서 오픈을 진행할 수 있습니다. 이 검수기간은 최소15일정도 걸리며 진행상황에 따라서 짧아지거나 길어질수 있습니다. 즉 오픈하기위한 일정을 수립할경우 개발완료후 반드시 검수일정까지 추산해서 스케쥴을 산정해야 됩니다. 



직접결제 팝업창을 호출하는 방식 

https://developer.pay.naver.com/docs/v2/api#etc-etc_pay_reserve 해당링크를 참조하여 개발을 하였습니다. 

직접결제 팝업창을 호출하는 방식으로 개발을 한 이유는 제가 작업을 진행하는 개발환경이 패쇄망으로  외부인터넷을 사용할수 없는환경이었습니다. 내부 환경에서 https://nsp.pay.naver.com/sdk/js/naverpay.min.js SDK를 로딩하는 적절한 방법을 찾지 못하였기때문입니다. 현재 이 부분은 얼마전에 js코드르 동적으로 불러오는 코드를 작성하여 테스트 하여 해결하였습니다만, 2개월당시 일정이 빡빡하여 적용하지 못한부분은 아쉬움이 남네요. 


팝업호출방식으로 변경한이유는 간단합니다. 내부에서 웹사이트로 결제전 프로세스를 태우고  팝업이 호출된이후에는 LTE모드로 휴대폰모드를 변경하여 팝업창을 새로고침하여 불러옵니다. 이후에 네이버페이 팝업모듈에서 return URI에 지정된 정보로 리다이렉션 됩니다.

이때 LTE모드에서 WIFI를 켜서 내부망으로 변경하고 새로고침을 하면 정상적으로 진행할 수 있습니다.  이런 방식으로 테스트할 수 있다는걸 찾기가 까지가 오래걸렸던거 같네요.










블로그 이미지

클라인STR

,