회고록 블로그

[공부 필기] Java 기본 공부하기 (12) 본문

2. 프로그래밍 언어 공부/Java

[공부 필기] Java 기본 공부하기 (12)

김간장 2021. 11. 3. 23:25

공부 중인 강의 : 윤성우 선생님, 윤성우의 열혈 Java 프로그래밍 강의, https://cafe.naver.com/cstudyjava

 

윤성우의 프로그래밍 스터디그룹 [C/... : 네이버 카페

윤성우의 스터디 공간입니다. C와 JAVA를 공부하시는 분들은 모두 들어오세요. ^^

cafe.naver.com

 


1. 배열 - 생성

- 동일한 자료형의 데이터를 나란히 둘 이상 저장할 수 있는 공간이 '배열'

- 1차원 배열, 다차원 배열이 있음

- 1차원 배열 선언 예시

int[] arr1 = new int[5];

   → 메모리에 int형 공간(4바이트) 5개가 나란히 만들어지고, 그 공간을 가리키는 참조변수 arr1

// int형 변수 5개(=배열) 메모리 공간 할당
new int[5];

// int형 배열 메모리 공간 할당 + 그 공간을 참조할 수 있는 변수 arr1를 선언함
int[] arr1;		// 참조변수 선언: int형 배열(int[])을 참조할 수 있는 변수 arr1을 선언함
arr1 = new int[5];	// 배열 생성: new int[5]로 배열 생성 후 참조값 반환되고 arr1에 대입됨

   → 참조변수의 타입(자료형)에는 배열의 길이(1, 2, 3 등 숫자)가 포함되지 않음

int[] arr1 = new int[5];
double[] arr2 = new double[3];

- 배열도 "인스턴스"임

   → new int[5]를 선언하면 int형 변수 5개가 나란히 생성되는데 이 나란한 변수 5개는 사실 배열 인스턴스의 멤버 변수임

   → 그렇기 때문에 인스턴스 안에 존재함

   → 이 외에 다른 멤버 변수도 있음 (length 등)

이런 형태..?

 - '기본 자료형(int, double 등)' 뿐만 아니라 '객체'도 배열로 생성할 수 있음

Practice37 클래스
메인메소드

   → 객체를 배열로 만들면 아래와 같이 생성되지 않을까싶음

 

2. 배열 - 접근

- 인덱스는 0부터 시작함

- 배열에 접근하는 방법

   → arr[0] , arr[1] , arr[2] 등으로 접근

public class Practice37 {
	private String student;
	
	Practice37(String student) {
		this.student = student;
	}
	public String toString() {
		return student;
	}
}
public class MainMethod {
	public static void main(String args[]) {
		Practice37[] p = new Practice37[3];
		
		p[0] = new Practice37("Kim");
		p[1] = new Practice37("Lee");
		p[1] = new Practice37("Park");
		System.out.println(p[0]); // p[0]의 toString을 출력
		System.out.println(p[1]); // p[1]의 toString을 출력
		System.out.println(p[2]); // p[2]의 toString을 출력
		System.out.println(p); // p의 toString을 출력
	}
}

- 배열은 "순차적 접근"이 가능하다는 장점 덕분에 사용함

   → 배열을 사용하지 않고 문자의 총 개수 출력하기

         * 참조변수 sr1, sr2, sr3, sr4에 하나하나 접근을 해야함

         * sr5, sr6, sr7 등 참조변수가 늘어나면 하나하나 추가 해줘야함

public static void main(String args[]) {
	// 배열을 사용하지 않으면?
	String sr1 = new String("Java");
	String sr2 = new String("System");
	String sr3 = new String("Compiler");
	String sr4 = new String("Park");
	
	int count = sr1.length()+sr2.length()+sr3.length()+sr4.length();
	System.out.println(count);
}

   → 배열을 사용해서 문자의 총 개수 출력하기

         * 반복문을 이용해서 인덱스로 접근할 수 있기 때문에 훨씬 효율적임

public static void main(String args[]) {
	// 배열을 사용하면?
	String[] str = new String[4];
	str[0] = new String("Java");
	str[1] = new String("System");
	str[2] = new String("Compiler");
	str[3] = new String("Park");
	
	int count = 0;
	//for문의 조건은 str 인스턴스의 개수(str[0]부터 str[3]까지 총 4개)
	for(int i=0; i<str.length; i++) {
		count += str[i].length();
		// str[0], str[1], str[2], str[3]의 길이(문자의 개수)가 각각 count에 누적되어 저장됨
	}
	System.out.println(count);
}

 

 

3. 배열 - 그외

- 배열을 초기화는 방법은 여러가지임

   → 방법1

int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

   → 방법2

int[] arr = new int[] {1, 2, 3};

   → 방법3

int[] arr = {1, 2, 3};

- 배열을 선언할 때 아래와 같이 두가지 방법이 있음

   → 하지만 첫번째 방법이 대부분이 더 선호하는 방법임

int[] arr1 = new int[3]; // 첫번째 방법
int arr2[] = new int[3]; // 두번째 방법

- 배열을 메소드의 인자값으로 전달하면 "배열의 참조값"이 전달됨

   → 배열의 참조값이 전달되기 때문에 메소드 내에서 배열의 값을 변경하면 실제 배열에게 영향을 줌

   → 아래 코드에서 확인해보면 num과 arr는 동일한 참조값을 가지고 있으므로

         완전히, 동일하게, 같은 배열을 가리키고 있는 것

public class Practice39 {
	public static void main(String[] args) {
		int[] num = {1, 2, 3, 4}; // num 배열에 1,2,3,4 저장
		System.out.println(num); // num의 참조값 확인 (0x5ca881b5)
		
		modifyArray(num); // printArray 메소드 호출하면서 num을 인자로 전달
		System.out.println(num[1]); // 12번째 줄에서 배열의 값을 수정했기 때문에 num[1]은 수정된 값이 출력됨
	}
	
	static void modifyArray(int[] arr) { // num의 참조값 전달받아서 arr에 대입
		System.out.println(arr); // arr의 참조값 확인 (0x5ca881b5)
		arr[1] = 5; // arr[1]의 값을 변경해보기
	}

}

출력결과

- 배열은 별도로 초기화 하지 않으면 모두 0으로 초기화됨(int, double 등을 말함)

   → 인스턴스 배열은 모두 null로 초기화됨

 

4. main 메소드의 파라미터(매개변수), String 배열

- main 메소드의 매개변수인 String[] args 또한 배열임

- 아래와 같이 코드를 입력해보면 배열인지 알 수 있음

   → 전달받은 값이 없기 때문에 길이가 0인 String형 배열을 만듦

public class Practice41 {
	public static void main(String[] args) {
		for(int i=0; i<args.length; i++) {
			System.out.println(args[i]);
		}
	}
}

길이가 0인 String형 배열을 만듦

   → 하지만 인자값을 주면 출력결과가 달라짐

         * "Coffee", "Bread", "Macaroon"을 각각 String 인스턴스로 만들고

         * 이 인스턴스들을 하나의 인스턴스(참조변수 args)로 묶어버림

- 즉, args는 String[] 인스턴스의 참조값을 가지고 있고

   main 메소드에게 인자로 args(String[] 참조값)를 전달함

5. enhanced for문 (다른 말로는 for-each문)

- 배열이 등장할 때 for문이 함께 쓰이는 경우가 빈번함(배열 요소에 순차적 접근하기 위해서)

- 배열과 for문을 간단하게 줄여서 표현할 수 있도록 하는 방법이 enhanced for문!

public static void main(String args[]) {
	int[] arr = {1, 2, 3, 4, 5};
	for(int e : arr) {
		System.out.println(e);
	}
}

   → for(int e : arr) : arr의 모든 요소를 대상으로 중괄호({}) 안의 코드를 실행한다는 의미

                                      이때, arr의 요소를 하나씩 가져와서 e에 저장함

   → for문이 시작되면 arr의 첫번째 요소를 가져와서 변수 e에 저장하고, 중괄호 안의 코드가 실행됨

- 인스턴스 배열에서도 사용할 수 있음

   → 단, 변수 e의 자료형이 배열의 자료형과 동일해야함

 

6. 다차원 배열

- 다차원 배열 : 2차원, 3차원 배열

- 2차원 배열은 행(row)과 열(column)로 이루어진 배열이라고 생각하면 됨

- 3차원 배열은 x, y, z축으로 이루어진(?) 배열이라고 생각하면 됨

- 3차원 배열은 컴퓨터 그래픽스 등에서 사용되긴 하지만, 보편적으로 프로그래밍할 때 2차원 배열 정도까지만 사용함

 

- 2차원 배열

- 2차원 배열 코드 예시

   → 3차원 배열도 마찬가지임

         e.g. int[][][] arr = new int[1][2][3] 등

public class MainMethod {
	public static void main(String args[]) {
		int[][] arr = new int[3][2];
		
		arr[0][0] = 1;
		arr[0][1] = 2;
		arr[1][0] = 3;
		arr[1][1] = 4;
		arr[2][0] = 5;
		arr[2][1] = 6;
       	// 주의. arr[3][0], arr[3][1], arr[3][2]는 없는 배열 요소임
		
		for(int i=0; i<3; i++) {
			for(int j=0; j<2; j++) {
				System.out.println(arr[i][j]);
			}
		}
	}
}

- 2차원 배열은 사실 1차원 배열의 모임의 형태로 구성을 함

   → JVM이 자동적으로 그렇게 구성함

   → 실제로 JVM이 이해하는 2차원 배열의 모습은 이런 모습이지 않을까싶음 (추측)

         (arr, arr[0], arr[1], arr[2]에는 각각 참조값이 있을 듯)

 

- 2차원 배열 선언과 동시에 초기화하는 방법

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

- 이런 초기화도 가능함 (실제로 이렇게 쓰는 경우는 드물지만)

   → 이렇게 가능한 이유는 Java에서 2차원 배열은 1차원 배열의 묶음으로 구현이 되기 때문

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

 

Comments