본문 바로가기
개발/Java

자바 API

by BellOne4222 2024. 1. 29.

자바 API


직접 만들어서 사용하는 Class

  • 최대값, 최소값을 구하는 클래스
    • 배열을 돌면서 0번째 인덱스 항을 초기값으로 설정하고 인덱스 1부터 비교하면서 최대, 최소값 찾기
public class MinMaxFinder {

    private MinMaxFinder(){
        // 객체 생성을 막기 위해 private으로 생성자를 구현
    }

    public static int findMin(int[] arr){
        int min = arr[0]; // 초기값
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] < min){
                min = arr[i];
            }
        }
        return min;
    }

    public static int findMax(int[] arr){
        int max = arr[0]; // 초기값
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] < max){
                max = arr[i];
            }
        }
        return max;
    }
}

public class MinMaxFinderTest {
    public static void main(String[] args) {
        int[] arr = {5, 3, 9, 1, 7};
        int min = MinMaxFinder.findMin(arr);
        int max = MinMaxFinder.findMax(arr);

        System.out.println(min);
        System.out.println(max);
    }
}

Java에서 제공해주는 Class

  • 난수를 생성해주는 Random Class
    • import java.util.Random 하고 Random rand = new Random();으로 객체 생성해서 사용
    • rand.nextInt(정수)
      • 0이상 정수 미만의 난수를 반환
      • rand.nextInt(정수 + 1)
        • 1이상 정수 + 1 미만의 난수를 반환
import java.util.Random;

public class RandomAPI {
    public static void main(String[] args) {
        Random rand = new Random();

        int[] arr = new int[6];

        int i = 0;

        while (i < 6) {
            int num = rand.nextInt(45) + 1; // 1~45
            boolean isDuplicate = false;

            // 배열의 이전 인덱스들과 비교하여 중복되는지 확인
            for (int j = 0; j < i; j++) {
                if (arr[j] == num){
                    isDuplicate = true;
                    break;
                }

            }

            // 중복되지 않으면 배열에 추가
            if(!isDuplicate){
                arr[i++] = num; // 후위 연산자로 i에 넣고 i += 1 처리
            }
        }

        for (int num : arr){
            System.out.println(num + "");
        }
    }
}

다운 받아서 사용하는 class

  • API 다운로드 사이트

  • Gson

    • 자바 객체를 JSON 형식으로 변환하거나 JSON 데이터를 자바 객체로 변환하는 라이브러리(API)
  • 객체 다루기

    • 자바 객체를 JSON으로 변환하기
      • JSON
        • 키-값 쌍으로 이루어진 데이터 객체를 표현
        • key : value
        • 경량의 데이터 교환 형식
    • Person 클래스를 정의하고 클래스의 객체를 JSON 형식으로 변환 후 출력
    • Gson 객체를 생성한 후, toJson() 메서드를 사용하여 객체를 JSON 형식의 문자열로 변환
    import com.google.gson.Gson;
    
    import fc.java.model2.Person;
    
    public class GsonToAPI {
        public static void main(String[] args) {
            Person person = new Person("John", 30);
            Gson gson = new Gson();
            String json = gson.toJson(person);
            System.out.println(json); // {"name":"John","age":30}
        }
    }
    • JSON을 자바 객체로 변환하기
    • JSON 형식의 문자열을 자바 객체로 변환하고 필드값 출력
    • Gson 객체를 생성한 후, fromJson()메서드를 사용하여 JSON 문자열을 자바 객체롤 변환
    • 변환한 클래스의 타입을 인자로 전달
    import com.google.gson.Gson;
    
    import fc.java.model2.Person;
    
    public class GsonFromAPI {
        public static void main(String[] args) {
            String json = "{\\"name\\":\\"John\\",\\"age\\":30}"; // JSON->Person
            Gson gson = new Gson();
            Person p = gson.fromJson(json, Person.class);
            System.out.println(p.getName());
            System.out.println(p.getAge());
            // John
            // 30
            System.out.println(p.toString()); // Person{name='John', age=30}
        }
    }

만드는 API


배열처럼 동작하는 API

  • IntArray 클래스
public class IntArray {
    private static final int DEFAULT_CAPACITY = 5; // static final은 나중에 변경 불가능(수정 불가) -> final을 붙이면 상수가 된다
    private int[] elements;
    private int size = 0;

    // 생성 동작
    public IntArray(){
        elements = new int[DEFAULT_CAPACITY]; // 5개 크기 배열
    }

    // 저장하는 동작
    public void add(int element){
        if (size == elements.length){
            // 크기를 2배로 늘리는 작업
            ensureCapacity();
        }
        // 크기 확인
        elements[size++] = element;
    }

    // 데이터를 얻는 동작
    public int get(int index){ // -1, 5~ 이면 에러 발생
        // index 체크
        return elements[index];
    }

    // 원소의 개수를 넘겨주는 동작
    public int size(){
        return size;
    }

    //
    public void ensureCapacity(){
        int newCapacity = elements.length * 2;
        elements = Arrays.copyOf(elements, newCapacity); // 복사 : Arrays.copyOf(); 복사한 배열은 elements로 초기화
    }

}

public class MyIntArrayTest {
    public static void main(String[] args) {
        // 정수 3개를 배열에 저장하고 출력하세요
        IntArray list = new IntArray(); // 5 크기의 정수형 배열
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6); // 에러 발생(리스트의 크기는 5이므로) -> 예외 발생(ArrayIndexOutOfBoundsException) -> 배열의 길이를 2배로 늘려주어야 한다.(ensureCapacity)

        System.out.println(list.get(0)); // 1
        System.out.println(list.get(1)); // 2
        System.out.println(list.get(2)); // 3

        System.out.println(list.size()); // 3

        for (int i = 0; i < list.size(); i++) { // 123
            System.out.println(list.get(i));
        }
    }
}

사용자 정의 자료형 클래스 만들어 사용하기

public class MyBookArrayTest {
    public static void main(String[] args) {
        // 책 3권의 데이터를 배열에 저장하고 출력하세요.
        BookArray list = new BookArray(); // 책, 길이 = 5
        list.add(new Book("자바",15000, "한빛","홍길동"));
        list.add(new Book("C++",17000, "대림","이길동"));
        list.add(new Book("Python",16000, "정보","나길동"));

        // Book vo = list.get(0);
        // System.out.println(vo.toString());
        //
        // vo = list.get(1);
        // System.out.println(vo.toString());
        //
        // vo = list.get(2);
        // System.out.println(vo.toString());

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        // Book{title='자바', price=15000, company='한빛', author='홍길동'}
        // Book{title='C++', price=17000, company='대림', author='이길동'}
        // Book{title='Python', price=16000, company='정보', author='나길동'}
    }
}

public class BookArray {
    private static final int DEFAULT_CAPACITY = 5; // static final은 나중에 변경 불가능(수정 불가) -> final을 붙이면 상수가 된다
    private Book[] elements;
    private int size = 0;

    // 생성 동작
    public BookArray(){
        elements = new Book[DEFAULT_CAPACITY]; // 5개 크기 배열
    }

    // 저장하는 동작
    public void add(Book element){
        if (size == elements.length){
            // 크기를 2배로 늘리는 작업
            ensureCapacity();
        }
        // 크기 확인
        elements[size++] = element;
    }

    // 데이터를 얻는 동작
    public Book get(int index){ // -1, 5~ 이면 에러 발생
        // index 체크
        if(index < 0 || index >= size){
            throw new IndexOutOfBoundsException("index의 범위(0~9)가 초과됨"); // JVM이 오류를 잡아서 예외 발생
        }
        return elements[index];
    }

    // 원소의 개수를 넘겨주는 동작
    public int size(){
        return size;
    }

    //
    public void ensureCapacity(){
        int newCapacity = elements.length * 2;
        elements = Arrays.copyOf(elements, newCapacity); // 복사 : Arrays.copyOf(); 복사한 배열은 elements로 초기화
    }

}

ObjectArray 클래스를 만들어 사용하기

  • 다형성 인수, 배열 사용
public class MyObjectArrayTest {
    public static void main(String[] args) {
        // A, B, C 객체를 배열(서로 다른 객체를 저장하는 다형성 배열 사용)에 저장하고 출력하세요

        ObjectArray list = new ObjectArray();
        list.add(new A()); // Upcasting -> Object element = new A(); 형식으로 메모리에 들어간다.
        list.add(new B()); // Upcasting -> Object element = new B(); 형식으로 메모리에 들어간다.
        list.add(new C()); // Upcasting -> Object element = new C(); 형식으로 메모리에 들어간다.

        A a = (A)list.get(0); // 다운캐스팅을 해야 get사용 가능 A <= Object
        a.display();

        B b = (B)list.get(1); // 다운캐스팅을 해야 get사용 가능 B <= Object
        b.display();

        C c = (C)list.get(2); // 다운캐스팅을 해야 get사용 가능 C <= Object
        c.display();

        for (int i = 0; i < list.size(); i++) {
            if(list.get(i) instanceof A){
                ((A)list.get(i)).display();
            }else if(list.get(i) instanceof B){
                ((B)list.get(i)).display();
            }else{
                ((C)list.get(i)).display();
            }
        }
    }
}

public class ObjectArray {
    private static final int DEFAULT_CAPACITY = 5; // static final은 나중에 변경 불가능(수정 불가) -> final을 붙이면 상수가 된다
    private Object[] elements; // 다형성 배열
    private int size = 0;

    // 생성 동작
    public ObjectArray(){
        elements = new Object[DEFAULT_CAPACITY]; // 5개 크기 배열
    }

    // 저장하는 동작
    public void add(Object element){
        if (size == elements.length){
            // 크기를 2배로 늘리는 작업
            ensureCapacity();
        }
        // 크기 확인
        elements[size++] = element;
    }

    // 데이터를 얻는 동작
    public Object get(int index){ // -1, 5~ 이면 에러 발생
        // index 체크
        if(index < 0 || index >= size){
            throw new IndexOutOfBoundsException("index의 범위(0~9)가 초과됨"); // JVM이 오류를 잡아서 예외 발생
        }
        return elements[index];
    }

    // 원소의 개수를 넘겨주는 동작
    public int size(){
        return size;
    }

    //
    public void ensureCapacity(){
        int newCapacity = elements.length * 2;
        elements = Arrays.copyOf(elements, newCapacity); // 복사 : Arrays.copyOf(); 복사한 배열은 elements로 초기화
    }

}

ArrayList 클래스 사용

  • ArrayList
    • 자바에서 제공해주는 모든 객체를 배열에 저장하여 관리하는 클래스
    • 알아서 늘어나기 때문에 크기의 제약이 없다.
    • ArrayList list = new ArrayList();
      • 제네릭 표현을 쓰면(일반화) 안에 배열이 제네릭<타입>으로 배열이 생성된다
        • 다운캐스팅을 할 필요가 없어진다.
        • Book타입만 넣을수 있다.
public class ArrayListTest {
    public static void main(String[] args) {
        // Book 3권을 배열에 저장하고 출력하세요
        // Book[], Object[]
        ArrayList list = new ArrayList(1); // 기본크기 : 10, 내부에 Object 배열을 가지고 있다.
        list.add(new Book("자바",15000, "한빛","홍길동"));
        list.add(new Book("C++",17000, "대림","이길동"));
        list.add(new Book("Python",16000, "정보","나길동"));

        System.out.println(list.get(0));

        Book vo = (Book)list.get(0); // Book <-- (Book)Object : 내부에 Object배열을 가지고 있기 때문에 다운캐스팅 해야한다.
        System.out.println(vo.toString());

        vo = (Book)list.get(1); // Book <-- (Book)Object : 내부에 Object배열을 가지고 있기 때문에 다운캐스팅 해야한다.
        System.out.println(vo.toString());

        vo = (Book)list.get(2); // Book <-- (Book)Object : 내부에 Object배열을 가지고 있기 때문에 다운캐스팅 해야한다.
        System.out.println(vo.toString());

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i)); // 자체가 Object -> Book(JVM에서 자동으로 Book의 toString을 호출해주기 때문에 가능 -> 동적 바인딩)
            // Book b = (Book)list.get(i); // 바로 값을 빼는 경우는 다운캐스팅을 해줘야한다.
        }
    }
}

public class MyBookArrayTest {
    public static void main(String[] args) {
        // 책 3권의 데이터를 배열에 저장하고 출력하세요.
        BookArray list = new BookArray(); // 책, 길이 = 5
        list.add(new Book("자바",15000, "한빛","홍길동"));
        list.add(new Book("C++",17000, "대림","이길동"));
        list.add(new Book("Python",16000, "정보","나길동"));

        // Book vo = list.get(0);
        // System.out.println(vo.toString());
        //
        // vo = list.get(1);
        // System.out.println(vo.toString());
        //
        // vo = list.get(2);
        // System.out.println(vo.toString());

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        // Book{title='자바', price=15000, company='한빛', author='홍길동'}
        // Book{title='C++', price=17000, company='대림', author='이길동'}
        // Book{title='Python', price=16000, company='정보', author='나길동'}
    }
}
  • this
    • this() : 생성자 안에서 다른 생성자를 호출할 때 사용

'개발 > Java' 카테고리의 다른 글

인터페이스 기반의 프로그래밍  (0) 2024.01.29
자바 String 클래스  (1) 2024.01.29
자바 최상위 클래스 Object  (0) 2024.01.29
추상클래스와 인터페이스  (0) 2024.01.29
다형성  (0) 2024.01.29