즐거운 자바(3) - 배열

지환·2023년 8월 5일
0

JAVA

목록 보기
3/39

출처 |
https://www.youtube.com/watch?v=iVX4uGfGXck&list=PLHpaQi-LiUCx-vcbcnpU5Tzv2X99WCowN

배열이란?

  • 참조 타입
  • 같은 타입의 변수가 여러개 필요할 때 사용한다.

기본형 배열

  • 배열은 기본형 배열과 참조형 배열로 나뉜다.

  • 기본형 배열이란 boolean, byte, short, char ,int, long , float, double 타입의 변수를 여러개 선언할 필요가 있을 때 사용한다.

public class Main {
    public static void main(String[] args) {
        int[] array1;
        int array2[];
        int array3[];

        array1 = new int[5];
        array2 = new int[5];
        array3 = new int[0];
    }
    }
}
  • 위에 3가지는 배열을 가리킬 수 있는 변수가 선언된것이다. 지금 null 값을 가지고 있는 것이다.

  • 초기화 하는 과정이 필요하다.
        array1 = new int[5];
        array2 = new int[5];
        array3 = new int[0];
  • 1,2번쨰는 정수 5개를 가질 수 있는 배열 참조

  • 3번째는 배열을 담지 못한다. [아무것도 가질 수 없다]

2)

public class Exam {

    public static void main(String[] args)
    {
        int[] array1, array2; .... 1
        int array3[], array4; .... 2

    }

}

1번은 array1,2 둘 다 배열 vs 밑은 array3만 배열 4는 변수

배열 초기값 선언

public class Exam {

    public static void main(String[] args)
    {
        int[] array1 = new int[5];
        array1[0] = 1;
        array1[1] = 2;
        array1[2] = 3;
        array1[3] = 4;
        array1[4] = 5;

        int[] array2 = new int[] {1,2,3,4,5}; // 숫자값이 안 들어감
        int[] array3 = {1,2,3,4,5};

        System.out.println("array1의 값 출력");

        for(int i = 0; i < 5; i++)
        {
            System.out.println(array1[i]);
        }

        System.out.println("array2의 값 출력");
        for(int i = 0; i < 5; i++)
        {
            System.out.println(array2[i]);
        }
        System.out.println("array3의 값 출력");
        for(int i = 0; i < 5; i++)
        {
            System.out.println(array3[i]);
        }


    }

}

참조형 배열

  • 참조형 배열이란 배열의 타입이 기본형이 아닌 경우를 말한다.

  • 배열 변수가 참조하는 배열의 공간이 값을 저장하는 것이 아니라 참조한다는 것을 의미한다.

예제1

ItemForArray

public class ItemForArray { //불변 Class
    private int price;
    private String name;

    public ItemForArray(int price, String name){
        this.price = price;
        this.name = name;
    }


    public int getPrice()
    {
        return price;
    }

    public String getName()
    {
        return name;
    }
}

Array04

public class Array04 {
    public static void main(String[] args)
    {
        ItemForArray[] array1;
        ItemForArray array2[];

        array1 = new ItemForArray[5];
        array2 = new ItemForArray[5];

        array1[0] = new ItemForArray(500, "item01");
        array1[1] = new ItemForArray(1500, "item02");
        
        System.out.println(array1[1].getName());

    }
}

예제2

public class Array05 {   //psvm ctrl + space
    public static void main(String[] args) {
        ItemForArray[] array1 = new ItemForArray[3];
        array1[0] = new ItemForArray(500, "사과");
        array1[1] = new ItemForArray(600, "바나나");
        array1[2] = new ItemForArray(700, "수박");


        ItemForArray[] array2 = new ItemForArray[]{new ItemForArray(500,"사과"), new ItemForArray(600,"바나나"), new ItemForArray(700,"수박")};
        ItemForArray[] array3 = {new ItemForArray(500,"사과"), new ItemForArray(600,"바나나"), new ItemForArray(700,"수박")};

        System.out.println(array1[0].getName());
        System.out.println(array1[0].getPrice());
        System.out.println(array1[1].getName());
        System.out.println(array1[1].getPrice());
        System.out.println(array1[2].getName());
        System.out.println(array1[2].getPrice());

    }


}

배열의 길이 구하기

public class Array06 {
    public static void main(String[] args) {
        double[] array1 = new double[5];
        double[] array2 = {1.5,2.4,3.5};
        double[] array3;
        double[] array4 = null;

        System.out.println(array1.length);
        System.out.println(array2.length);
    }
}
  • double 라고 선언하면 배열에 0을 다 넣는다. boolean형은 다 false다.

이차원배열

public class Array08 {
    public static void main(String[] args) {
        int[][] array = new int[2][3];
        array[0][0] = 0;
        array[0][1] = 1;
        array[0][2] = 2;


        array[1][0] = 3;
        array[1][1] = 4;
        array[1][2] = 5;

        for(int i = 0; i < array.length; i++) //2까지
        {
            for(int j = 0; j < array[i].length; i++) //012 ->  3까지
            {
                System.out.println(array[i][j] + "\t");
            }
            System.out.println();
        }

    }
}

이차원 배열 선언과 초기화

public class Array09 {
    public static void main(String[] args) {
        int[][] array = {{0,1,2}, {3,4,5}};

        for(int i = 0; i < array.length; i++)
        {
            for(int j = 0; j < array[i].length; j++)
            {
                System.out.println(array[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

이차원 가변 배열의 선언과 초기화

public class Array10 {
            public static void main(String[] args) {
                int[][] array = new int[2][];
                array[0] = new int[2];
                array[1] = new int[3];

                array[0][0] = 0;
                array[0][1] = 1;
                array[0][2] = 2;


                array[1][0] = 3;
                array[1][1] = 4;
                array[1][2] = 5;

                for(int i = 0; i < array.length; i++) //2까지
                {
                    for(int j = 0; j < array[i].length; i++) //012 ->  3까지
                    {
                        System.out.println(array[i][j] + "\t");
                    }
                    System.out.println();
                }

            }

}

for each문

예제1

public class Array11 {
    public static void main(String[] args){
        int[] array = {1,2,3,4,5};

        for(int i : array) //array배열로부터 하나씩 꺼내라는 말
        {
            System.out.println(i);
        }
    }
}

예제2

public class Array12 {
    public static void main(String[] args) {
        ItemForArray[] array = new ItemForArray[3];
        array[0] = new ItemForArray(500, "사과");
        array[1] = new ItemForArray(300, "참외");
        array[2] = new ItemForArray(600, "수박");
        
        for(ItemForArray item : array)
        {
            System.out.println(item.getName());
            System.out.println(item.getPrice());
        }
    }
}

Arrays

  • 자바가 제공해주는 클래스
import java.nio.file.Files;
import java.util.Arrays;

public class Array14 {
    public static void main(String[] args) {
        int[] copyFrom = {1,2,3};
        int[] copyTo = Arrays.copyOf(copyFrom, copyFrom.length);

        if(copyTo == copyFrom)
        {
            System.out.println("copyTo == copyFrom");
        }
        else
        {
            System.out.println("copyTo != copyFrom");
        }

        for(int c : copyTo)
        {
            System.out.println(c);
        }
        System.out.println("----------------------------");

        int[] copyTo2 = Arrays.copyOf(copyFrom, 5);

        for(int c : copyTo2)
        {
            System.out.println(c);
        }



    }

}

  • 배열을 참조하는 곳이 다르기 때문에 같지 않다. System.out.println("copyTo != copyFrom");

  • 같은 걸 참조하느냐? copyFrom == copyTo3는 True
    배열을 복사하는 것은 다른 부분

예제2

public class Array15 {
    public static void main(String[] args) {
        char[] copyFrom = {'h', 'e', 'l', 'l', 'o', '!'};
        char[] copyTo = java.util.Arrays.copyOfRange(copyFrom,1,3);
        for(char c : copyTo)
        {
            System.out.println(c);
        }
    }
}

예제3[compare]

import java.util.Arrays;

public class Array16 {
    public static void main(String[] args) {
        int[] array1 = {1,2,3,4,5};
        int[] array2 = {1,2,3,4,5,6};

        int compare = Arrays.compare(array1, array2);
        // 비교 할 때는 양수, 0 , 음수 기억하자.
        // x-y = 결과가 양수가 나온다면? 
        // 

        System.out.println(compare);

    }
}

정렬 및 비교

import java.util.Arrays;

public class Array172 {
    public static void main(String[] args) {
        Item[] items = new Item[5];
        items[0] = new Item("java", 5000);
        items[1] = new Item("파이썬", 7000);
        items[2] = new Item("C#", 10000);
        items[3] = new Item("자바스크립트", 17000);
        items[4] = new Item("Peal", 15000);

        // sort(Object[]) - Object는 모든 객체의 조상이니깐. 어떤 객체의 배열이든 올 수 있다.
        Arrays.sort(items);
        for(Item item : items)
        {
            System.out.println(item);
        }


    }
}

// Comparable는 어떤 Item이 큰지, 직은지 기준을 정하는 interface
class Item implements Comparable
{
    private String name;
    private int price;

    public Item(String name, int price) { //생성자
        this.name = name;
        this.price = price;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(int price) {
        this.price = price;
    }


    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return "Item{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    @Override //파라미터로 들어온 Object와 내 자신을 비교하는 메소드
    //CompareTo에는 Object를 받아들이도록 했지만 실제로 Item이 들어온다.
    public int compareTo(Object o) {
        Item d = (Item)o;
        return this.name.compareTo(d.name); // 자기 자신의 이름과 this.name vs d.name 비교
        // 비교할 땐, 양수, 0, 음수로 비교한다.
    }
}

+ 밖에서 정렬 및 비교할 순 없을까?

import java.util.Arrays;
import java.util.Comparator;

public class Array172 {
    public static void main(String[] args) {
        Item[] items = new Item[5];
        items[0] = new Item("java", 5000);
        items[1] = new Item("파이썬", 7000);
        items[2] = new Item("C#", 10000);
        items[3] = new Item("자바스크립트", 17000);
        items[4] = new Item("Peal", 15000);

        // sort(Object[]) - Object는 모든 객체의 조상이니깐. 어떤 객체의 배열이든 올 수 있다.
        Arrays.sort(items, new ItemSorter()); //Arrays.sort(items, 정렬방법정의);
        for(Item item : items)
        {
            System.out.println(item);
        }


    }
}

class ItemSorter implements Comparator {

    public int compare(Object o1, Object o2) { // o1 - o2
        Item item1 =(Item)o1;
        Item item2 =(Item)o2;
        return 0;
    }
}

명령 행 아규먼트(Command-Line Arguments)

  • main 메소드에 있는 String[] args
  • main 메소드는 JVM이 실행하는 메소드다.
  • JVM이 main 메소드를 실행할 때 String[]을 아규먼트로 넘겨 준다는 것을 의미한다.

제네릭

  • 무엇이든 담을 수 있는 상자를 만들어보자.

ObjectBox

public class ObjectBox {
    private Object object;
    public void set(Object obj)
    {
        this.object = obj;
    }

    public Object get() //obj 리턴한다.
    {
        return this.object;
    }
}

ObjectBoxMain

public class ObjectBoxMain {
    public static void main(String[] args) {
        ObjectBox box = new ObjectBox();
        box.set("kim");
        String str = (String)box.get();
        System.out.println(str.toUpperCase());
        box.add(new Integer(5));
        Integer i = (Integer)box.get();
        System.out.println(i.intValue());
    }
}

사용하는 이유는 ObjectBox는 어떤 Object든 저장할 수 있고, 어떤 Object를 꺼낼 수 있다. 꺼내서 사용할 때는 원래 타입으로 변환시키는 번거로운 과정이 필요하다.

GenericBox

public class GenericBox <T>{ 
//t타입을 꺼낸다. 아직 정해져있지 않다.
    private T t;
    public void add(T obj)
    {
        this.t = obj;
    }
    public T get()
    {
        return this.t;
    }
}

GenericBoxMain

public class GenericBoxMain {
    public static void main(String[] args) {
        GenericBox<String> genericbox = new GenericBox<>();
        //<string> T라는 아직 정해져있지 않은 클래스를 제네릭 박스로 쓰겠다.  T = String으로 다 통일되어 취급된다.
        genericbox.add("kim");
        String str = genericbox.get();
        System.out.println(str.toUpperCase());


        GenericBox<Object> objectbox = new GenericBox<>();
        objectbox.add("hello");
        String  str2 = (String)objectbox.get();
        System.out.println(str2);

    }
}

GenericBox

  • T는 제네릭과 관련된 부분이다.

  • 제네릭은 클래스 이름 뒤나, 메소드의 리턴타입 앞에 붙을 수 있다.

  • 부분은 T라는 이름의 제네릭 타입을 선언한다는 것을 의미한다.

  • T는 Type의 약자기 때문에 많이 사용되는 문자이지 T를 쓸필요는 없다.

  • T가 아니라 E나 D등의 단어를 사용해도 된다.

제네릭의 장점

  • 정해진 타입만 사용할 수 있도록 강제할 수 있다.

컬렉션 프레임워크

  • java Collections Framework라고 불리워지는 Collections API는 Java 2부터 추가 된 자료구조 클래스 패키지를 말한다.

  • 자료를 다룰 때 반드시 필요한 클래스의 모음으로써 JAVA프로그래머라면 꼭!!! 숙지해야한다.

Java.util.List 인터페이스

  • java.util.List 인터페이스는 순서가 중요한 자료를 다룰 때 사용하는 인터페이스다.
  • Collection을 상속받음으로써 Collection이 가지고 있는 add(), size(), iterator() 메소드를 사용할 수 있다.
  • 해당 인터페이스는 순서를 알고 있다고 가정하기 때문에 특정 순서로 저장된 자료를 꺼낼 수 있는 get(int) 메소드를 가지고 있다.

Java.util.Set 인터페이스

  • java,util.Set 인터페이스는 중복을 허용하지 않는 자료를 다룰 때 사용하는 인터페이스다.
  • 중복을 허용하지 않는다는 것은 같은 값을 저장할 수 없다는 것이다.
  • 같은 값을 여러번 추가하여도 마지막 값 하나만 저장됨을 의미한다.
  • Set 인터페이스에 저장되는 객체들은 Object가 가지고 있는 equals() 메소드와 hashCode() 메소드를 오버라이딩 해야한다.

Java.util.iterator 인터페이스

  • 자료구조에서 자료를 꺼내기 위한 목적으로 사용되는 인터페이스다.
  • iterator 패턴을 구현하고 있다.

Java.util.Map 인터페이스

  • 키와 값을 함께 저장하기 위한 목적으로 만들어진 인터페이스다.
  • 같은 Key 값으론 하나의 값만 저장할 수 있다.

제네릭을 사용하지 않고 ArrayList 작성하기

import java.util.ArrayList;

public class ListExam01 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("Kim");
        list.add("Lee");
        list.add("hong");

        String str1 = (String)list.get(0);
        String str2 = (String)list.get(1);
        String str3 = (String)list.get(2);

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }
}

제네릭을 사용하고 ArrayList 작성하기

import java.util.ArrayList;

public class ListExam02 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList();
        list.add("Kim");
        list.add("Lee");
        list.add("hong");

        String str1 = list.get(0);
        String str2 = list.get(1);
        String str3 = list.get(2);

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }

}

결과
  
Kim
Lee
hong  
  
  • 차이점은 형 변환을 하지 않아도 된다.

Collection & iterator

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class ListExam03 {
    public static void main(String[] args) {
        Collection<String> collection = null; // collection을 구현하고 있는 자료구조
        collection.add("Ohj");
        collection.add("KKIM");
        collection.add("Rong");
        System.out.println(collection.size());

        Iterator<String> iter = collection.iterator(); // iterator는 collection 안에 들어있는 모든 원소를 받는다.
        while(iter.hasNext()) // 꺼낼게 있다는 말
        {
            String str = iter.next();
            System.out.println(str);
        }
    }

}

List

import java.util.ArrayList;
import java.util.List;

public class ListExam02 {
    public static void main(String[] args) {
        List<String> list = new ArrayList();
        list.add("Kim");
        list.add("Lee");
        list.add("hong");

        String str1 = list.get(0);
        String str2 = list.get(1);
        String str3 = list.get(2);

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }

}

Set

import java.util.*;
public class SetExam {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        boolean flag1 = set.add("Hello");
        boolean flag2 =  set.add("hi");
        boolean flag3 = set.add("hong");
        boolean flag4 = set.add("hong");
        System.out.println(flag1);
        System.out.println(flag2);
        System.out.println(flag3);
        System.out.println(flag4);


        Iterator<String> iter = set.iterator();
        while(iter.hasNext() )
        {
            String str = iter.next();
            System.out.println(str);
        }
    }
}

Map

import java.util.HashMap;
import java.util.Map;
public class MapExam {
  public static void main(String[] args) {
      Map<String,String> map = new HashMap<>();
      map.put("k1", "hello");
      map.put("k2", "heo");
      map.put("k3", "he");

      System.out.println(map.get("k1"));
      System.out.println(map.get("k2"));
      System.out.println(map.get("k3"));

  }
}
profile
아는만큼보인다.

0개의 댓글