[Java] 배열

Sun choi·2024년 7월 24일

NEW 지식

목록 보기
8/34

내가 참고하려고 쓰는 배열의 (내가 잘 모르겠는) 모든 것 총정리!

🍄 배열의 선언과 생성

int[] students; //1. 배열 변수 선언
students = new int[5]; //2. 배열 생성

참조형 변수이기 때문에 실제 값을 담지 않고 실제 값의 주소값을 저장!
위와 같은 배열은 5개의 주소칸이 있고 각각 인덱스는 0, 1, 2, 3, 4 이다.
(배열을 생성할 때 0으로 자동 초기화.따라서 사용 가능한 인덱스의 범위는 0 ~ (n-1) 이 된다)

🍄 배열 사용

//변수 값 대입
students[0] = 90;
students[1] = 80;

//변수 값 사용
System.out.println("학생1 점수: " + students[0]);
System.out.println("학생2 점수: " + students[1]);

//0. 배열에 특정값 대입하며 선언
		int[] intArray = {1, 2, 3, 4, 5};
		String[] stringArray = {"a", "b", "c", "d"};

//1. for문을 통해 값을 대입
	for (int i = 0; i < intArray.length; i++) {
		intArray[i] = i;
		}

//2. 향상된 for문을 통한 배열 출력
	for (int i : intArray) {
		System.out.print(i); // 01234
		}

//3. 배열의 주소를 모두 같은값으로 초기화
	Arrays.fill(intArray, 1);//배열의 모든 값을 1로 초기화
		for (int i : intArray) {
			System.out.print(i);  // 11111
			}

🍄 배열을 복사할 때

  • 따라서 배열 변수 간에 대입 연산자 =를 사용해서 복사를 하게 되면 주소값만 복사. 이렇게 주소값만 복사되고 실제 값은 1개로 유지되는 걸 얕은 복사라고 하는데 바람직하지 않은 방법이다.
  • 진짜 새로운 배열을 똑같이 만들고 싶을 때엔 깊은 복사.(= 배열의 올바른 복사법)
    깊은 복사 방법으로는 2가지가 있는데 clone() 메서드는 1차원 배열에서만 깊은 복사임.(=완전 깊은 복사는 아님) 그래서 Arrays.copyOf() 메서드를 사용해야 진정한 깊은 복사!
  • 같은 팀원분이 대입하여 설명해준신 것(이해가 쏙쏙✨) - 얕은복사, 깊은복사 이해할 때 가볍게 집 에다가 비유해서 생각. 단일 자료형(int, char..) 이 아닌 객체를 얕은 복사하면 집(객체) 주소를 복사 하는것이고, 깊은 복사를 하면 집을 아예 새로 만든다. 따라서 얕은복사를 한 원본이든 복사객체든 뭔가를 수정하면 같은 집 주소를 공유하니까 같이 수정 되는거고 깊은 복사는 아예 별개의 집이니까 서로에게 영향을 안끼친다 정도의 개념)
// 깊은 복사 메서드

// 1. clone() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone(); // 가장 간단한 방법입니다. 
// 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!

// 2. Arrays.copyOf() 메서드
	int[] a = { 1, 2, 3, 4 };
	int[] b = Arrays.copyOf(a, a.length);
    // 배열과 함께 length값도 같이 넣어줍니다.
    

🍄 String vs char

문자 (char ,기본형, 1byte), 문자열 (String, 참조형) 구별
char 배열은 “문자 배열”이고 String 은 문자열이다. 즉 수식으로 표현하면
String = char[]

기본형 변수 vs 참조형 변수

  • 기본형 변수는 '소문자로 시작함' 반면, 참조형 변수는 '대문자로 시작함'
    -Wrapper class 에서 기본형 변수를 감싸줄 때(boxing), int -> Integer
  • 기본형 변수는 값 자체를 저장, 참조형 변수는 별도의 공간에 값을 저장 후 그 주소를 저장함(= 주소형 변수)
  • char < String(훨씬 더 많이 씀)
    String 이 가지고 있는 기능이 너무 많아서!
  • Wrapper class와도 상당히 비슷! -> 기본형 변수가 가지고 있는 기능이 제한
    -> 다양한 기능을 제공하는 Wrapper를 감쌈으로써, 추가기능을 더함.

🍄 String 기능 활용 (= char 배열)

// String 기능 활용 예시
        String str = "ABCD";

        // (1) length 길이
        int strLength = str.length();
        System.out.println(strLength);

        // (2) charAt(int index)
        char strChar = str.charAt(1);
        System.out.println(strChar);

        // (3) substring(int fromIdx, int toIdx) 잘라서 새로운 스트링을 주겠다
        String strSub = str.substring(0, 3);  // 0부터 3전까지!
        System.out.println(strSub); //ABC

        // (4) equals(String str) 이 문자열과 일치하니? true or false
        String newStr = "ABCDE";
        boolean strEqual = newStr.equals(str);
        System.out.println(strEqual);

        // (5) toCharArray() : String -> char[]로 변환
        char[] strCharArray = str.toCharArray();

        // (6) 반대로 char[] -> String  -> char
        char[] charArray = {'A', 'B', 'C'};
        String charArrayString = new String(charArray);
        System.out.println(charArrayString);

🍄 2차원 배열

  • 선언과 생성
int[][] array = new int[][];
  • 2가지의 초기화 방법
// 중괄호를 사용해 초기화

int[][] array = {
	{1, 2, 3},
	{4, 5, 6}
};


// 반복문을 통한 초기화

int[][] array = new int[2][3]; // 최초 선언

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
        arr[i][j] = 0;  
    } // i, j 는 인덱스
}
  • 가변 배열
    2차원 배열을 생성할 때 열의 길이를 생략하여, 행마다 다른 길이의 배열을 요소로 저장 가능.
// 선언 및 초기화
int[][] array = new int[3][];
// 배열 원소마다 각기다른 크기로 지정 가능합니다.
array[0] = new int[2];
array[1] = new int[4];
array[2] = new int[1];

// 중괄호 초기화할때도 원소배열들의 크기를 각기 다르게 생성 가능합니다.
int[][] array2 = {
    {10, 20},
    {10, 20, 30, 40},
    {10}

};
profile
풀스택 개발자의 공부기록 📖

0개의 댓글