회고록 블로그
[공부 필기] Java 기본 공부하기 (12) 본문
공부 중인 강의 : 윤성우 선생님, 윤성우의 열혈 Java 프로그래밍 강의, https://cafe.naver.com/cstudyjava
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 등)' 뿐만 아니라 '객체'도 배열로 생성할 수 있음
→ 객체를 배열로 만들면 아래와 같이 생성되지 않을까싶음
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]);
}
}
}
→ 하지만 인자값을 주면 출력결과가 달라짐
* "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}
};
'2. 프로그래밍 언어 공부 > Java' 카테고리의 다른 글
[공부 필기] Java 기본 공부하기 (14) (0) | 2021.11.09 |
---|---|
[공부 필기] Java 기본 공부하기 (13) (0) | 2021.11.08 |
javap와 javac 경로 찾을 수 없을 때 (1) | 2021.11.03 |
[공부 필기] Java 기본 공부하기 (11) (0) | 2021.10.27 |
[공부 필기] Java 기본 공부하기 (10) (0) | 2021.10.26 |