이름 : 홍길동
전화 : 02-1234-5678
주소 : 서울시 양천구 목동아파트 13단지
======포인터 구조체 적용====
이름 : 홍길2
전화 : 02-1234-5672
주소 : 서울시 양천구 목동아파트 2단지
3. 구조체 안에 포인터 변수가 있는 형태
구조체 안에 포인터 변수를 알아보자
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
struct tagAddress
{
char name[30]; // 이름
int phone; // 전화
char address[100]; // 주소
char *email[100]; // 이메일 //구조체안에 변수는 포인터변수던 그냥이던 똑같이 변수를 넣고 반환할 수 있다.
int *byear; //생년월일 //구조체안에 변수는 포인터변수던 그냥이던 똑같이 변수를 넣고 반환할 수 있다.
};
void main(void)
{
struct tagAddress ad; //일반 구조체변수 선언
struct tagAddress *pad; //포인터 구조체변수 선언
//포인터 구조체를 선언하면 일반 구조체변수를 포인터 구조체에 저장 해야한다.
pad = &ad;
//값 입력
strcpy(ad.name, "홍길동");
//strcpy(ad.phone, "0212345678"); XX 사용안됨 int 형이므로 =이용
ad.phone = 101234; //값 처음에 0이 들어가면 안된다.
strcpy(ad.address, "서울시 양천구 목동아파트 13단지");
strcpy(ad.email, "dream1@nate.com");
ad.byear = 97090911; //값 처음에 0이 들어가면 안된다.
//출력
printf("이름 : %s \n", ad.name);
printf("전화 : %d \n", ad.phone);
printf("주소 : %s \n", ad.address);
printf("이메일 : %s \n", ad.email);
printf("생년월일 : %d \n", ad.byear);
printf("\n======포인터 구조체 적용====\n\n");
//값 입력
strcpy((*pad).name, "홍길2");
ad.phone = 201234; //값 처음에 0이 들어가면 안된다.
strcpy((*pad).address, "서울시 양천구 목동아파트 2단지");
strcpy((*pad).email, "dream1@nate.com2");
ad.byear = 97090912; //값 처음에 0이 들어가면 안된다.
//출력
printf("이름 : %s \n", pad->name);
printf("전화 : %d \n", pad->phone);
printf("주소 : %s \n", pad->address);
printf("이메일 : %s \n", pad->email);
printf("생년월일 : %d \n", pad->byear);
}
결과값
이름 : 홍길동
전화 : 101234
주소 : 서울시 양천구 목동아파트 13단지
이메일 : dream1@nate.com
생년월일 : 97090911
======포인터 구조체 적용====
이름 : 홍길2
전화 : 201234
주소 : 서울시 양천구 목동아파트 2단지
이메일 : dream1@nate.com2
생년월일 : 97090912
4. 구조체안에 포인터멤버가 있고 메모리를 할당하는 형태
코드를 보기전에 설명을 하면은
* 일반 선언된 구조체안에 멤버에 값을 넣어줄 때는
d1.numPtr = &num, d1.c = 'x'형태로 쓴다. (포인터 멤버(*)든 일반 멤버든 상관 없음)
* 포인터로 선언된 구조체안의 멤버에 값을 넣어줄 때는
d2->numPtr = &num, d2->c = 'y' 형태로 쓴다. (포인터 멤버(*)든 일반 멤버든 상관 없음)
또는 (*d2).numPtr, (*d2).c 형태로 써도 된다.
화살표 꺽쇠모양은 -> 이 포인터의 값(*d2)을 불러와서 그 값안의 멤버(numPtr)를 호출하는 기능이다.
따라서 꺽쇠는 포인터로 선언된 구조체에만 써야한다.
(*d2).numPtr을 쉽게 설명하면 dr이라는 구조체를 호출하여 자물쇠*를 푼다. 그뒤 푼값의 numPtr을 가르킨다.
package com.test.httpConnection01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class HttpConnectionTest01 {
private static final String USER_AGENT = "Mozila/5.0";
private static final String GET_URL = "http://www.google.com";
public static void sendGet() throws ClientProtocolException, IOException {
//http client 생성
CloseableHttpClient httpClient = HttpClients.createDefault();
//get 메서드와 URL 설정
HttpGet httpGet = new HttpGet(GET_URL);
//agent 정보 설정
httpGet.addHeader("User-Agent", USER_AGENT);
//get 요청
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
System.out.println("::GET Response Status::");
//response의 status 코드 출력
System.out.println("status code: "+httpResponse.getStatusLine().getStatusCode());
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpResponse.getEntity().getContent()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = reader.readLine()) != null) {
response.append(inputLine);
}
reader.close();
//Print result
System.out.println(response.toString());
httpClient.close();
}
}
그리고 위 메소드를 실행할 파일을 하나 만든다.
파일명: HttpConnectionTextExec.java
package com.test.httpConnection01;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
public class HttpConnectionTextExec {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//예제1 connection 테스트
HttpConnectionTest01.sendGet();
//System.out.println("==============비트코인 가격 json 시작=================");
//예제2 비트코인가격 Json
//HttpConnectionTest02.sendGet();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
코드를 완성 한 후 실행하면 아래와 같은 결과를 얻는다.
::GET Response Status:: status code: 200 <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"
그런데 json을 받아오는 경우가 많으므로 json 예제파일을 하나 더 만들어보자.
파일명: HttpConnectionTest02
package com.test.httpConnection01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpConnectionTest02 {
private static final String USER_AGENT = "Mozila/5.0";
//비트코인 가격 json API 주소
private static final String GET_URL = "https://api.blockchain.com/v3/exchange/tickers/"+
"BTC-USD";
public static void sendGet() throws ClientProtocolException, IOException {
//http client 생성
CloseableHttpClient httpClient = HttpClients.createDefault();
//get 메서드와 URL 설정
HttpGet httpGet = new HttpGet(GET_URL);
//agent 정보 설정
httpGet.addHeader("User-Agent", USER_AGENT);
httpGet.addHeader("Content-type", "application/json");
//get 요청
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
System.out.println("status code: "+httpResponse.getStatusLine().getStatusCode());
String json = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
System.out.println(json);
httpClient.close();
}
}
그리고 실행 파일에서 예제1에 주석을 걸고, 예제2 비트코인 가격 부분 주석을 푼다.
package com.test.httpConnection01;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
public class HttpConnectionTextExec {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//예제1 connection 테스트
//HttpConnectionTest01.sendGet();
System.out.println("==============비트코인 가격 json 시작=================");
//예제2 비트코인 가격
HttpConnectionTest02.sendGet();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
그러면 결과값은 아래와 같다.
==============비트코인 가격 json 시작================= status code: 200 {"symbol":"BTC-USD","price_24h":35775.7,"volume_24h":63.66743294,"last_trade_price":35717.4}
더나아가서 비트코인 가격만 나타나려고 하면 json으로 그 값을 저장하는 변수를 추가해줘야한다.
pom.xml에 아래와 같이 GSON 메이븐을 추가해준다. (json-simple이 아닌 gson이다.)
Apple은 SKAdNetwork를 크게 아래 3 Part로 정의하고 있으며, SKAdNetwork framework 참여를 위한 Responsibility를 명시하고 있습니다. (2.0 Responsibility for taking part in SKAdNetwork 참조)
-명령어에서 companyname_skadnetwork_private_key.pem 부분은 개인키 코드로 바꿉니다. 명령어에서 companyname 부분을 회사 이름으로 바꿉니다. 예로, advantage 회사의 개인 키 파일 이름은 다음과 같습니다. : advantage_skadnetwork_public_key.pem
-SKAdnetwork 등록 시에는 공개키를 보냅니다. 참고로, Apple의 공개키는 아래와 같습니다.
Advertised app은 광고 네트워크가 설치를 어트리뷰션하거나 선택적으로 SKAdNetwork를 사용하여 전환을 추적하기 위해 실행해야하는 책임이 있습니다.
설정 부분은 제휴 MMP에 따라 상이할 수 있습니다.
Advertised app은 기기에서 registerAppForAdNetworkAttribution () 또는 updateConversionValue () 메소드를 호출하여 설치 알림을 생성하고 광고 네트워크의 포스트 백 URL을 호출해야합니다.
▶ registerAppForAdNetworkAttribution () 메소드
registerAppForAdNetworkAttribution() 메소드는 사용자가 광고 된 앱을 시작할 때 호출되어야 합니다.
이 메소드를 호출하면 광고 네트워크에서 로드한 어트리뷰션 데이터와 광고 네트워크에서 제공하는 포스트 백 URL로 전송되는 소스 앱을 사용하여 설치 알림이 생성됩니다.
이 메서드가 호출 되자마자 24시간 타이머가 시작되고 초기 24 시간 타이머가 만료 된 후 0-24 시간 후에 포스트 백이 전송되므로 사용자가 광고 된 앱을 설치하고 실행 한 후 24-48 시간이 걸립니다.
▶ updateConversionValue (_:) 메소드
이 메소드는 포스트 백에서 전송된 conversion value를 업데이트하기 위해 광고 앱에서 호출됩니다. 6 비트 값이므로 64 개의 가능한 변환 값이 있습니다. 이러한 64개 값 각각은 하나 또는 여러 의미로 해석 될 수 있습니다.
예를 들어, 전환 가치는 계정에 가입 한 사용자에게 할당 될 수 있고, 다른 가치는 그들이 앱에서 항목을 구매했음을 나타내기 위해 사용될 수 있거나 다른 가치는 여러 행동의 조합을 나타낼 수 있습니다.
Apple은 포스트 백에서 단일 전환 가치 만 허용하므로 광고 네트워크가 단일 사용자의 여러 전환 액션을 추적하려면 단일 가치를 여러 전환 액션으로 해석해야 할 것입니다.
registerAppForAdNetworkAttribution () 메소드와 달리 Apple은 새 전환 값이 이전 값보다 크면 24 시간 동안 updateConversionValue () 메소드를 호출 할 수 있습니다. 더 큰 전환 가치로 메서드를 호출하면 24 시간 타이머가 다시 시작됩니다. 타이머가 만료 된 후 0 ~ 24 시간 후에 전환 가치와 함께 설치 알림이 광고 네트워크로 전송됩니다.
-버전 1 ~ 2.2로 서명 된 광고의 경우 기기는 단일 winning postback을 보냅니다.
-버전 3.0 이상으로 서명 된 광고의 경우 iOS 14.6부터 기기는 winning postback하나와 non-winning postback을 최대 5 개까지 보냅니다.