[java]API 사용

송어·2023년 11월 14일
post-thumbnail

custom API & JavaAPI

java를 다루면서 java내부 및 외부에서 제공하는 API를 사용할 수도 있고, 내가 직접 API를 만들어서 사용할 수도 있을 것이다. 이번엔 직접 최대값, 최소값을 구하는 API를 JavaAPI를 활용해 main과 util 클래스로 나누어 간단한 로직을 구성했다.

main클래스는 단순히 util 클래스의 메서드를 호출만 하고, util클래스는 계산을 위한 랜덤 난수를 구성(1~10,000)하는 클래스(RandomNumAPI) 및 최대&최소값을 반환하는 클래스(MinMaxAPI)로 설계했다.
util클래스의 전 메서드는 편의상 static메서드로 구성했다.

원하는 값을 구하는 로직은 아래와 같다.

  1. RandomNumAPI클래스의 RandomNum()메서드를 호출해 1~10,000사이의 난수로 생성됨 정수 50개 배열을 main으로 반환받는다.

  2. 반환받은 배열을 MinMaxAPI클래스의 최대값 & 최소값을 구하는 메서드의 매개변수로 저장해 원하는 값을 반환받는다.

// util class
public class MinMaxAPI {

    private MinMaxAPI() {}

    public static int MinNum(int[] arr) {
        int min = arr[0];
        for(int i=0; i<arr.length; i++) {
            if(arr[i] < min) {
                min = arr[i];
            }
        }
        return min;
    }

    public static int MaxNum(int[] arr) {
        int max = arr[0];
        for(int i=0; i<arr.length; i++) {
            if(arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }
}
public class RandomNumAPI {

    private RandomNumAPI() { }

    public static int[] RandomNum() {
        int[] arr = new int[50];
        for(int i = 0; i < 50; i++) {
            arr[i] = (int)(Math.random()*10000 + 1);
        }
        return arr;
    }
}
public class MinMaxFinderTest {
    public static void main(String[] args) {

        int[] arr = MinMaxAPI.RandomNum(); // Random의 결과값을 배열로 생성( 1 ~ 10000 )

        System.out.printf("min value = %s%n", MinMaxAPI.MinNum(arr));
        System.out.printf("max value = %s%n", MinMaxAPI.MaxNum(arr));
    }
}

자바에서 제공하는 MathAPI의 Random()메서드는 기본적으로 반환 타입이 double이기 때문에 정수(int)로 받을 경우 DownCasting을 해주어야 한다.

간단한 로직이라 SRP원칙을 크게 신경쓰지 않고 비즈니스 로직만 나누어 코드를 설계하였다.
아직 객체지향 5원칙에 대해 제대로 공부해보지 않아 간단한 로직을 짜는 과정에서도 고민을 했었는데 시간을 내서 객체지향 설계에 대해 더 깊게 공부를 해봐야겠다.

JavaAPI

Java에서 제공해주는 API중 Random class를 사용해보자

java의 Random class는 java에서 제공하는 util패키지에 들어있는 클래스이다.

다음은 Random클래스를 이용해 6개의 숫자를 중복되지 않게 배열에 저장하는 코드를 설계한 내용이다.

import java.util.Arrays;
import java.util.Random;

// 6개의 난수를 생성해 중복되지 않게 배열에 저장
public class RandomApiTest {
    public static void main(String[] args) {
        Random random = new Random(); // java.util.Random
        int[] arr = new int[6];
        int i = 0;
        while (i < 6) {
            int num = random.nextInt(45) + 1; // random.nextInt() : 랜덤 난수를 반환, 파라미터 설정 시 0이상 parameter-1의 난수 반환
            boolean isDuplicate = false;

            // 배열의 인덱스들과 비교해 중복을 확인
            for(int j=0; j<i; j++) {
                if(arr[j] == num) {
                    isDuplicate = true;
                    break;
                }

            }
            // 중복이 안될시 배열에 추가
            if(!isDuplicate) {
                arr[i++] = num;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

외부 제공 API

이번엔 외부에서 제공하는 API인 GsonAPI를 사용해보았다.

Gson라이브러리는 Java에서 JSON 형태의 데이터를 파싱 & 생성하기 위해 사용되는 구글에서 개발한 오픈소스 라이브러리다. Gson을 사용해 Java Object를 JSON 형태의 문자열로 변환하거나 JSON문자열을 Java ㅒObject로 변환할 수 있다.
https://mvnrepository.com 에서 GsonAPI를 검색 후 사용하면 된다.

링크를 타고 들어가 원하는 버전을 선택한 뒤

다음에 나오는 화면에서
1. jar파일 다운로드
2. Maven.xml에 추가
3. Gradle에 추가

하는 방식으로 라이브러리를 추가하면 된다.

나는 Gradle을 사용하고 있어서 의존성을 추가하는 방식으로 라이브러리를 추가했다.

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return String.format("name : %s, age : %s", this.name, this.age);
    }
}
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.example.part4.model.Person;

public class GsonApiTest {
    public static void main(String[] args) {
        Person person = new Person("John", 26);
//        Gson gson = new Gson();

        // GsonBuilder()를 사용해 Gson 객체를 생성하면 객체 생성 과정에서 다양한 옵션을 설정할 수 있다.
        Gson gson = new GsonBuilder().setPrettyPrinting().create(); // setPrettyPrinting(); : GsonBuilder()를 통해 생성된 Json문자열의 가독성을 높여줌

        String toJson = gson.toJson(person); //toJson(Object obj); : 인스턴스를 JSON형태 문자열로 변환

        System.out.printf("--- Person객체를 JSON타입의 문자열로 변환 --- %n%s%n", toJson);

        Person fromJson = gson.fromJson(toJson, Person.class); // fromJson(Json, class); : Json타입의 문자열을 객체로 변환
        System.out.printf("--- JSON타입 문자열을 Person 객체로 변환 --- %n%s%n", fromJson);
    }
}

GsonBuilder()를 사용해 Gson 객체를 생성하면서 옵션을 추가했다. setPrettyPrinting()은 GsonBuilder()를 통해 생성된 JSON문자열에 개행처리를 하거나 들여쓰기 등 처리를 하여 가독성을 높여준다.

Gson의 toJson()메서드는 매개변수로 인스턴스를 받아 JSON형태의 문자열로 변환한다.

Gson의 fromJson()메서드는 JSON형태 문자열, Class객체정보를 매개변수로 받아 JSON데이터를 java Object로 변환한다.

1개의 댓글

comment-user-thumbnail
2023년 11월 14일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기