(신규개발자) 자바의 정석, 1주차 ch2-5

ch2-11 기본형과 범위

논리형 boolean 1 byte
문자형 char 2 bytes
정수형 byte 1 byte, short 2 byte, int 4 bytes, long 8 bytes
실수형 float 4 bytes, double 8 bytes

범위
1 byte = 8 bit 2^8-1
1 sign bit + 7 bit + and - of 2^7-1

-1 붙는건 0 때문에
int 는 2^31 임으로 대략 20억임 즉 int는 -20억~20억

실수형
float 4byte/32bit : S 부호 + 지수 E(8) + 가수 M(23) = 32 bit ; 정밀도 7자리 ; 10^7 < 2 ^24 < 10^8 > 그래서 정밀도 7자리
double 8byte/64bit : S 부호 + 지수 E(11) + 가수 M(52) = 64 bit ; 정밀도 15자리

ch2-12,13 printf 이용한 출력

printf 지시자
%b boolean
%d 10진 정수
%o 8진 정수
%x 16진 정수

%f 부동 소수점
%e 지수 (exponent) 표현식

%c 문자
%s 문자열

2진수 찍기: System.out.print(“%s”, Integer.toBinaryString(15); // 1111 로 나옴
8진수와 16진수 앞에 접두사 붙이기 : …”%#x”, 15) // 0xf 로 나옴

ch2-14 화면에서 입력 받기 Scanner

1
2
3
4
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
String input = scanner.nextLine();
int num = Integer.parseInt(input);

ch2-17 타입간의 변환방법

  1. 문자와 숫자간의 변환
  2. 문자열로의 변환
    “3” -> ‘3’ : str.charAt(0); // 인자는 str의 index
    “3” -> 3 : Integer.parseInt(“3”);
    “3.4” -> 3.4 : Double.parseDouble(“3.4”);

ch3-1,2 연산자와 피연산자

산술연산자 + - * / % << >>
비교연산자 > < >= <= == !=
논리연산자 && || ! & | ^ ~
대입연산자 =
기타 (type) ?: instanceof

ch3-3,4 연산자의 우선순위와 결합규칙

  1. 산술 > 비교 > 논리 > 대입 순서
  2. 단항 > 이항 > 삼항
  3. 방향 왼쪽 -> 오른쪽, 단항하고 대입만 오른쪽 -> 왼쪽

ch3-5,6 증감 연산자

증가 연산자 ++
감소 연산자 –
전위형: 값 참조 전에 증가 j = ++i; >> ++i; j=i;
후위형: 값 참조 후에 증가 j = i++; >> j=i; i++;

ch3-7 형변환 연산자

(타입) 피연산자

1
2
double d = 85.4;
int i = (int) d; // i 는 85가 됨

작은 범위 타입에서 큰 범위 타입은 자동 변환이 안되어 명시적으로 해주지 않으면 컴파일 에러 난다.

ch3-11,12 반올림

1
Math.round()

ch3-13 비교 연산자

문자열 비교에는 == 대신 equals() 를 사용

ch3-17 조건 연산자 ?

조건식에 결과에 따라 연산 결과를 달리 한다.

조건식 ? 식1: 식2
조건식 참이면 식1, 거짓이면 식2

result = (x > y) ? x : y;

ch4 조건문과 반복문

if문, if-else문

1
2
3
4
5
6
7
8
9
10
switch (조건식) {
case1:
break;

case2:
break;

default:
break; // 생략은 가능
}

switch문의 조건식 결과는 정수 또는 문자열

ch4-12 임의 정수 만들기

Math.random() - 0.0와 1.0 사이의 임의 double 값

1에서 X 사이의 랜던 정수 얻는 법

0.0 < Math.randome() * X < 1.0

  1. 각변에 원하는 숫자 곱한다.
  2. 각 변을 int 로 변환
  3. 각변에 1 더한다.
    1 < Math.random() * X < X+1

ch4-13 반복문

1
2
3
4
for (초기화;조건식;증감식)
{
수행 될 문장들 블럭
}

중첩 for 문

1
2
3
4
5
6
for (int i = 2; i < 10; i++)
{
for(int j = 1; j < 10; j++)
System.out.printf("%d * %d = %d\n", i, j, i*j);

}

ch4-16 while 문

while문의 loop 구문의 원조
이후 for loop 좀더 편하게 나옴

1
2
3
4
5
초기화;
while(조건식) {
수행될 문장
증감식;
}

ch4-19 do-while문

블럭 {}을 최소한 한번 실행

1
2
3
4
5
do {

실행할 문장들..

} while(조건식);

break; > 빠져 나올때는 사용
continue; > 반복문 실행 블락의 제일 밑으로 이동 , 다음 반복으로 갈때 사용

ch4-23 이름 붙은 반복문

label 을 붙여서 goto 하는 듯한 구문이
자바에도 있다.

1
2
3
4
5
6
7
8
9
10
11
Loop1 : for (int i = 2; i < 10; i++)
{
for(int j = 1; j < 10; j++)
{
if(j==5)
{
break Loop1;
System.out.printf("%d * %d = %d\n", i, j, i*j);
}
}
}

ch5 배열이란?, 선언 방법, 길이

  • 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
1
2
3
4
5
6
7
8
9
10
11
12
int score1, score2, score3...
int[] score; // 배열의 선언, 참조 변수 score
score = new int[5]; // 실제 저장 공간 생성

score[0]; // index 0 부터 시작됨
score[1];
score[2];
score[3];
score[4];

int[] arr = new int[5];
int tmp = arr.length; // 길이 5, 리턴 됨
  • 자바는 2가지 선언 방식 전부 지원
    언어 | 선언방법 | 선언 예

——— | ———
Java | 타입[] 변수이름; | int[] score;
C | 타입 변수이름[]; | int score[];

ch5-5 배열의 초기화

  • 기본적으로 자동 초기화 된다.
1
2
3
4
int[] score = new int[5];
score[0] = 50;
...
int[] score = {50, 60, 70, 80, 90};

Arrays 의 toString 메서드

1
2
int[] iArr = { 100, 95, 80, 70, 65};
System.out.println(Arrays.toString(iArr));

System에 Copying Arrays 메서드 arraycopy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void arraycopy(Object src, int srcPos,
Object dest, int destPos, int length)

class ArrayCopyDemo {
public static void main(String[] args) {
String[] copyFrom = {
"Affogato", "Americano", "Cappuccino", "Corretto", "Cortado",
"Doppio", "Espresso", "Frappucino", "Freddo", "Lungo", "Macchiato",
"Marocchino", "Ristretto" };

String[] copyTo = new String[7];

// copying
System.arraycopy(copyFrom, 2, copyTo, 0, 7);

// 결과 출력
for (String coffee : copyTo) {
System.out.print(coffee + " ");
}
}
}

The output from this program is: Cappuccino Corretto Cortado Doppio Espresso Frappucino Freddo

Arrays, array manipulations (common tasks) : copying, sorting, searching

For your convenience, Java SE provides several methods for performing array manipulations (common tasks, such as copying, sorting and searching arrays) in the java.util.Arrays class.

위에 예제는 copyOfRange 를 사용 하면 더 간편하다. (dest array 생성 불 필요)

1
2
3
4
5
6
7
8
9
10
11
12
13
class ArrayCopyOfDemo {
public static void main(String[] args) {
String[] copyFrom = {
"Affogato", "Americano", "Cappuccino", "Corretto", "Cortado",
"Doppio", "Espresso", "Frappucino", "Freddo", "Lungo", "Macchiato",
"Marocchino", "Ristretto" };

String[] copyTo = java.util.Arrays.copyOfRange(copyFrom, 2, 9);
for (String coffee : copyTo) {
System.out.print(coffee + " ");
}
}
}

결과: [Cappuccino, Corretto, Cortado, Doppio, Espresso, Frappucino, Freddo]

initial index of the range to be copied, inclusively, while the third parameter is the final index of the range to be copied, exclusively. 예제 에서는 index 2 와 9 까지, 2는 포함, 9는 미포함

java.util.Arrays class의 다른 유용한 함수들

  1. Searching (binarySearch method).
  2. Comparing two arrays to determine if they are equal or not (the equals method).
  3. Filling an array to place a specific value at each index (the fill method).
  4. Sorting an array into ascending order. using sort method, or parallelSort method introduced in Java SE 8.
  5. Converting an array to a string. The toString method converts each element of the array to a string, separates them with commas, then surrounds them with brackets.
  6. Creating a stream that uses an array as its source (the stream method).
1
java.util.Arrays.stream(copyTo).map(coffee -> coffee + " ").forEach(System.out::print);  

See Aggregate Operations for more information about streams.

ch5-16 커맨드 라인을 통해 입력 받기

main(String[] args) 는 cmd 실행시 java example abc 123 “hello world” 하면 args[0]은 abc, [1]는 123, [2] hello world가 들어간다.

ch5-18~20 2차원 배열

1
2
3
4
5
6
int[][] score = {
{100, 100, 100},
{20, 20, 20},
{30, 30, 30},
{40, 40, 40}
};

ch5-14,15 String 클래스

ch5-24 Arrays 배열 다루기

Spring boot basic

컨트롤러에서 리턴 값으로 문자를 반환 하면
뷰 리졸버가 해당 화면을 찾아 처리 한다.

맵핑 되는 화면의 폴더 위치: resources/templates

예로 리턴 값이 “hello” 이라면
resources/templates/hello.html

Model이라는 Spring UI 객체를 사용 해서
template engine 에 data을 넘겨 줄수 있고 관련 문서는 여기
https://www.thymeleaf.org/doc/articles/springmvcaccessdata.html

  1. Model 활용 해서 View Engine (Tymeleaf)
  2. with Request Param (?name=lee)
  3. View Engine 사용 X 하고 싶을때 @RequestBody

1, 2번은 HTML로 만들어 보낸다. 즉 받는 쪽은 웹브라우져 등이다.

3번은 원하는 데이타 포멧을 보낼수 있다.

서버간 서버 혹은 모바일 앱에서 활용 되는 것을 생각 해 보면
HTML로 주고 받을 필요가 없다.

요즘은 JSON 이 대세이다. 이것을 API 방식이라고도 부른다.

(신규개발자) 자바의정석 스터디 (5/4~7/13, 10주)

자바의 정석 온라인 스터디
발표 없고, 취준생/실무자이신분들 제한 없음

  1. 스터디 목표 : 자바의 정석(유튜브 강의) 1회독

  2. 진도
    아래 진도를 10주차로 진행~

  • 1주차 : 챕터 1-5 - 초반 내용
  • 2주차 : 챕터 6 - 객체지향 개념1
  • 3주차 : 챕터 7 - 객체지향 개념2
  • 4주차 : 챕터 8,9,10 - 예외 처리~사용시 유용한 클래스
  • 5주차 : 챕터 11 - Collections Framework
  • 6주차 : 챕터 12 - Generics, Enum, Annotation
  • 7주차 : 챕터 13 - Thread
  • 8주차 : 챕터 14 - Lambda, Stream
  1. 시간 : 주 1회 (매주 수 10시)

  2. 기간 : 5월 4일 ~ 7월 13일 (총 10주)

  3. 진행 방식

  • 게더타운 또는 디스코드에 모여 화면공유 킨 후 각자 자바의 정석 인강 시청
  • 시작 전 공부 시작, 종료 후 완료 챕터 공유
  • 진도 다 나가신 분은 코딩 예제 풀기 혹은 진도 막히신분 도와 드리기
  • 주차 챕터 내용 요약 및 정리 포스팅, 링크 공유
    주 1회 포스팅 필수
  • 1주간 1챕터 분량 못 채울 경우 주말에라도 진행!
  1. 기타
  • 포스팅은 블로그 활용 (velog, notion, github, tistory 등)
  • 책 있으시면 책 보고 하셔도 되고, 없으셔도 무관 합니다.
  • 알고있는 내용이라고 대충 하거나, 중도포기 하실분은 신청하지 말아주세요.

따로 보증금 개념 없고, 어떤 조건 없습니다만, 완주하실분만 참가 부탁 드립니다.
개인적으로 완주한 사람끼리 이후 조금 더 깊게 들어가는 책/강좌 들어갔으면 합니다.

(오키) 자바의정석, 1주차 챕터 6 - 객체지향 개념1

1. 개념

프로그램밍 언어 패러다임으로 절차형, 선언형이 있었고 자바가 나올 때 객체지향 이 트렌드로 나오면서 자바가 객체지향을 기본으로 해서 만들어진 언어이다. 최근에는 함수형 프로그래밍 언어가 많이 쓰이기도 한단다. (스칼라 등) https://www.youtube.com/watch?v=H6JxxWL6bJI&t=2s

중요 객체지향 개념

  1. 다형성
  2. 추상화
  3. 인터페이스

객체지향 언어 = 프로그래밍 언어 + 객체지향 개념 (규칙)

2. 클래스와 객체

클래스의 정의 : 객체를 정의함, 설계도
객체의 정의: 실제로 존재, 인스턴스 화, aka 오브젝트

클래스의 구성

  1. 속성 > 변수
  2. 기능 > 메서스

객체: 모든 인스턴스를 대표 하는 일반 용어
인스턴스: 특정 크래스로부터 생성된 객체

5. 하나의 소스파일에 여러 클래스 작성

파일안에 여러 클래스 선언 가능 하지만 public class 는 단 하나만 가능하고 파일이름과 public class 명은 반드시 일치 해야 한다. 대소문자 또한 맞추어야 한다

6. 객체의 생성 및 사용

클래스명 변수명 = new 클래스명();
new 를 사용해서 인스턴스화 (객체 생성)한다.

변수명.멤버변수 = XXX;
. 를 사용해서 멤버 변수에 접근한다.

인스턴스시 객체 주소가 잡히고 거기에 멤버 변수와 메서드가 잡힌다.

1
2
3
4
5
6
7
8
9
Class TV {
String color;
boolean power;
int channel;

void power() { power = !power; }
void channelUp() { channel++; }
void channelDown() { channel--; }
}

객체주소에 6개 멤버 (3개 변수, 3개 메서드)

1
2
3
4
Class t1 = new TV();
Class t2 = new TV();

t1 = t2;

객체마다 메모리가 따로 잡히고 참조가 없어지면 GC가 메모리를 정리 한다.

8 객체 배열

TV tv1, tv2, tv3;
TV[] tvArr = new TV[3];

9 클래스의 정의

클래스 = 데이터 + 함수
사용자 정의 가능 하다.

변수의 진화체
변수 -> 배열 -> 구조체 -> 클래스

11 선언 위치에 따른 변수의 종류

1
2
3
4
5
6
7
8
9
10
class Variables
{
int iv;
static int cv;

void method()
{
int lv = 0;
}
}
  1. 인스턴스 변수
  2. 클래스 변수 (static변수, 공유 변수)
  3. 메서드 영역 (지역 변수)

클래스 안을 클래스 영역과 메서스 영역으로 볼수 있고
클래스 영역에는 선언만 가능하다.

각 변수 종류별 생성 시기가 틀리다. (클래스 메모리 로딩 시점, 인스턴스 생성시, 변수 선언문 수행시)

12 클래스 변수와 인스턴스 변수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Card {
String kind; // iv
int number;

static int width = 300; // cv
static int height = 250;
}

Card.width;
Card.height;

Card c = new Card();
c.kind;
c.number;

14 메서드 란?

문장들 (statements)을 묶어 놓은것
한개의 메서드에 한개의 작업을 하도록..

15 호출 스택 (call stack)

메서드 수행에 필요한 메모리가 제공 되는 공간
메서드가 호출 되면 호출스택에 메모리 할당, 종료 되면 해제

1
2
3
main(){
print()
}

x -> main -> main,print -> main -> x

23 기본형 매개변수

매개변수로 기본형과 참조형이 있다.

  1. 기본형 매개변수 (primitive 로 8개 이다)
    함수로 passing 시키면 기본형은 read only
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Data { 
int x;
}
class Ex6_7 {
public static void main(String[] Args) {
Data d = new Data();
d.x = 10;
change(d.x);
}
static void change(int x)
{
x =1000;
}
}

2.참조형 매개변수, read & write 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Data { 
int x;
}
class Ex6_7 {
public static void main(String[] Args) {
Data d = new Data();
d.x = 10;
change(d);
}
static void change(Data d)
{
d.x =1000;
}
}

call by value 와 call by reference 으로 이해된다.

25 참조형 반환 타입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Data3 { int x; }
class Ex6_8 {
public static void main(String[] args) {
Data3 d = new Data3();
d.x = 10;

Data d2 = copy(d);
}
static Data3 copy(Data3 d) { // 참조형 반환 타입
Data3 tmp = new Data3();
tmp.x = d.x;
return tmp;
}
}

26 인스턴스 메서드 와 클래스(static) 메서드

  1. 클래스는 인스턴스, 객체 생성 없이 쓸수 있다. 구문은 ClassName.MethodName();
    같은 class 안에 있는 static 메서스는 앞에 ClassName없이 부를수도 있다.

  2. 객체는 ? iv (인스턴스 변수의) 묶음 이다.

  3. static을 언제 붙혀야 하는가?

속성 (멤버 변수) 중에서 공통 속성에 static 을 붙인다.
인스턴스 멤버(iv, im)을 사용하지 않는 메서드에 static을 붙인다.

4.메서드에서의 변수 사용 가능 여부

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class TestClass2 {
int iv; // 인스턴스 변수
static int cv; // 클래스 변수

void instanceMethod() {
iv; // 사용 가능
cv; // 사용 가능
}

void static staticMethod() {
iv; // 호출 X
cv; // 사용 가능
}
}

5.메서드 간의 호출과 참조

1
2
3
4
5
6
7
8
9
10
11
12
13
class TestClass {
void instanceMethod(){}
static void staticMethod() {}

void instanceMethod2() {
instanceMethod(); // 가능
staticMethod(); // 가능
}
void staticMethod() {
instanceMethod(); // 에러 (클래스 메서드 에서 인스턴스 메서드 호출 X)
staticMehtod2(); // 가능
}
}

30 오버로딩 (overloading)

한 클래스 안에 같은 이름의 메서드 여러 개 정의 하는 것

1
2
3
4
printf(int x);
printf(char c);
printf(double d);
...

오버로딩이 성립하기 위한 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 반환 타입은 영향 없다.

32 생성자 constructor

  • 인스턴스 생성 될때 호출 되는 인스턴스 초기화 메서드
  • iv 초기화 등에 사용 됨
  • 규칙:
  1. 클래스이름과 이름이 같아야 한다.
  2. 매개 변수 없는 생성자를 default constructor라고 한다.
  3. 생성자가 하나도 없을때에만 컴파일러가 default을 자동 추가 해준다.
  4. 매개 변수 있는 생성자 (오버로딩 사용됨)를 추가 할수 있다.

36 생성자 this()

  • 생성자에서 다른 생성자 호출 할때 사용
  • 다른 생성자 호출 시 첫줄에서만 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Car {
String color;
String gearType;
int door;

Car() {
color = "red";
gear Type = "auto";
door = 4;
}

Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}

this()의 좋은 사용처 예시
중복된 코드 삭제 가능 하다.

1
2
3
Car() {
this("red", "auto", 4);
}

37 this 참조 변수

  • 인스턴스 자신을 가리키는 참조 변수, 인스턴스의 주소가 저장
  • 인스턴스 메서드 (생성자 포함)에서 사용 가능
  • 지역 변수와 인스턴스 변수를 구별 할때 사용

this는 자기 자신 참조 변수, this()는 생성자

38 변수의 초기화

  • 지역변수(lv)는 수동 초기화 해야 함 (사용전에 꼭)
  • 멤버변수(iv,cv)는 자동 초기화 된다.
1
2
3
4
5
6
7
8
9
class InitTest {
int x;
int y = x;

void method1() {
int i;
int j = i; // 에러
}
}

초기화 순서 방식

  1. 기본 초기화 (0으로)
  2. 명시적 간단 초기화
  3. 복잡 초기화

명시적으로 초기화 하는 습관 중요, 특히 참조형 변수의 경우 null 초기화 하는건 NPE 발생 위험으로 나쁜 방식이라 할수 있다. 아래 처럼 항시 명시적 초기화 하자

1
2
3
4
class Car {
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
}

cv 복잡 초기화인 static {} 구문 사용 예제

1
2
3
4
5
6
7
8
9
class StaticBlockTest {
static int[] arr = new int[10]; // 명시적 초기화

static { // 클래스 초기화 블럭
for (int i = 0 ; i < 10; i ++){
arr[i] = (int) (Math.random()*10)+1;
}
}
}

iv는 항시 생성자로 복잡 초기화 해주는 것이 좋다

1
2
3
4
5
6
7
8
9
10
11
12
13
class InitTest {
static int cv = 1; // 명시적 초기화 (간단)
int iv = 1;

static {
cv = 2; // 클래스 초기화 블럭 (복잡)
}
{ iv = 2; } // 인스턴스의 초기화 블럭 (복잡)

InitTest() {
iv = 3;
}
}

(오키) 자바의정석 스터디 (5/2~6/18, 7주)

자바의 정석 온라인 스터디 (객체지향부터, 총 7주)
발표 없고, 취준생/실무자이신분들 제한 없음

1.스터디 목표 : 자바의 정석(유튜브 강의) 1회독
2.공부 범위

  • 1주차 : 챕터 6 - 객체지향 개념1
  • 2주차 : 챕터 7 - 객체지향 개념2
  • 3주차 : 챕터 8,9,10 - 예외 처리~사용시 유용한 클래스
  • 4주차 : 챕터 11 - Collections Framework
  • 5주차 : 챕터 12 - Generics, Enum, Annotation
  • 6주차 : 챕터 13 - Thread
  • 7주차 : 챕터 14 - Lambda, Stream

3.시간 : 주 4회 (매주 월-목 8시-10시)
4.기간 : 5월 2일 ~ 6월 18일 (총 7주)

5.진행 방식

  • 매일 시작 전 공부 시작, 종료 후 완료 챕터 공유

  • 공부 내용 당일 또는 주말에 1챕터 요약 및 정리 포스팅, 링크 공유

    • 주 1회 이상 1챕터 내용 요약 및 정리 포스팅 필수
  • 게더타운 또는 디스코드에 모여 화면공유 킨 후 각자 자바의 정석 인강 시청

  • 1주간 1챕터 분량 못 채울 경우 주말에라도 진행!

6.기타

  • 포스팅은 블로그 활용 (velog, notion, github, tistory 등)
  • 책 있으시면 책 보고 하셔도 되고, 없으셔도 무관 합니다.
  • 챕터별로 필요한 시간이 달라 시간이 남는 경우 포스팅 또는 복습, 부족할 경우 시간 합의 후 주말에 추가 진행
  • 알고있는 내용이라고 대충 하거나, 중도포기 하실분은 신청하지 말아주세요.
  • 인원은 저 포함 최소 5명 ~ 최대 8명으로 생각중입니다.

따로 보증금 개념도 없고, 어떤 조건도 없습니다만, 완주하실분만 참가 부탁 드립니다.

(개인적으로는 완주한 사람끼리 이후 조금 더 깊게 들어가는 책 혹은 강좌 들어갔으면 합니다)

타임라인

계획

5월3주차 스프링부트와AWS혼자배우는 예제 프로젝트 완성
5월4주차 SQL 공부
6월1주차 MyBatis 공부, 사용 예제 프로젝트 완성
6월2주차 …

코테 사이트: leetcode

Explore > Learn 진도
Arrays 5/16~ 진행중
Explore > Interviews 진도
머 시작할 예정 5/17~ 진행중
Problems > Study Plan 진도
Programming Skills II 20일 과정 1일차 5/16 시작~

코테 책? 유튜브 ? 무료 강좌?

Naver Open API 검색 활용, 맛집 서비스

네이버 Open API 를 활용해서 맛집 검색을 해 보는 예제

사용할 API

[네이버 오픈 API 목록]
(https://developers.naver.com/products/intro/plan/plan.md)

이중에 검색 API 을 사용 하면 네이버 블로그, 이미지, 웹, 뉴스, 백과사전, 책, 카페, 지식iN 등 검색 할수 있음

[비로그인 방식 API 이고 호출 예제]
(https://developers.naver.com/docs/common/openapiguide/apicall.md#%EB%B9%84%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EB%B0%A9%EC%8B%9D-%EC%98%A4%ED%94%88-api-%ED%98%B8%EC%B6%9C-%EC%98%88)

[검색 > 지역]
(https://developers.naver.com/docs/serviceapi/search/local/local.md#%EC%A7%80%EC%97%AD)

Talend 사용 해서 API 호출 해보기

검색 값을 UTF8 해야 한다. [변환 해주는 사이트] (https://meyerweb.com/eric/tools/dencoder/)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Naver Open API - local ::'갈비집'</title>
<link>http://search.naver.com</link>
<description>Naver Search Result</description>
<lastBuildDate>Tue, 04 Oct 2016 13:10:58 +0900</lastBuildDate>
<total>407</total>
<start>1</start>
<display>10</display>
<item>
<title>조선옥</title>
<link />
<category>한식&gt;육류,고기요리</category>
<description>연탄불 한우갈비 전문점.</description>
<telephone></telephone>
<address>서울특별시 중구 을지로3가 229-1 </address>
<roadAddress>서울특별시 중구 을지로15길 6-5 </roadAddress>
<mapx>311277</mapx>
<mapy>552097</mapy>
</item>
...
</channel>
</rss>

Java 에서 해보기

강사님 코드가 제공 되어 가져와서 빌드 하니 잘 동작 한다.
강사님 코드를 참고 해서 코딩을 해보니 API 호출 시 응답은 200으로 잘 오는데 맛집 정보는 item = 0 으로 온다.
이리저리 고쳐봐고 다르게 코딩을 해 보도 동일한다. 검색어를 영어로 해보니 정보가 담아져서 온다.

아래는 강사님 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        var uri = UriComponentsBuilder.fromUriString(naverLocalSearchUrl)
.queryParams(searchLocalReq.toMultiValueMap())
.build()
.encode()
.toUri();

System.out.println(uri);
//https://openapi.naver.com/v1/search/local.json?
// query=%EA%B0%88%EB%B9%84&display=1&start=1&sort=random

var headers = new HttpHeaders();
headers.set("X-Naver-Client-Id", naverClientId);
headers.set("X-Naver-Client-Secret", naverClientSecret);
headers.setContentType(MediaType.APPLICATION_JSON);

var httpEntity = new HttpEntity<>(headers);
var responseType = new ParameterizedTypeReference<SearchLocalRes>(){};

var responseEntity = new RestTemplate().exchange(
uri,
HttpMethod.GET,
httpEntity,
responseType
);

아래는 나의 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

String uri = local + "?query=food&display=1&start=1&sort=random";

var headers = new HttpHeaders();

headers.set("X-Naver-Client-Id", id);
headers.set("X-Naver-Client-Secret", secret);
headers.setContentType(MediaType.APPLICATION_JSON);

var request = new HttpEntity<>(headers);

var responseEntity = restTemplate.exchange(
uri,
HttpMethod.GET,
request,
String.class
);

Local local = convertData(responseEntity.getBody());
System.out.println(local);

restTemplate 이란 클래스가 MVC에서 제공 되고 여기에 exchange 함수가 사용 되어 API 호출을 한다.

또 다른 문제

응답 값이 JSON 으로 오고 이를 쓰기 위해 Java Object 로 변환을 하게 되는데 이상하게 일부만 저장 되어 돌아 온다.

정확히는 Java Object의 앞의 멤버 변수들은 잘 채워졌는데 뒤에 item list 부분은 안 채워져서 온다.

Gson이라는
라이브러리가 있어 적용 해 보았는데 이방식은 변환이 되어 잘 들어 온다.

private static Gson gson;

static Local convertData(String json) {
    if (gson == null)
        gson = new Gson();

    Local local = gson.fromJson(json, Local.class);

    return local;
}