파이썬이나 JS 같이 호락호락한 배열을 생각했다면 오산이다
05-2 배열
▶ 배열 주의사항
- 배열은 같은 타입의 데이터만 저장 가능 (선언과 동시에 저장할 수 있는 타입이 결정됨)
- 한 번 생성된 배열은 길이를 바꿀 수 없음
▶ 배열 선언 방법
대괄호를 타입 옆 or 이름 옆에 붙여 선언할 수 있다.
① int[ ] intArray;
② int intArray[ ];
우리가 항상 썼던 main(String[] args)도 배열! => 이걸로 외우면 쉬울 듯!
(( 책에서 직접 언급은 안했지만 전자를 더 자주 쓰는 것 같음 ))
▶ 배열 초기화
※ 원소들을 { }로 감싸고 있는 것 주의! ※
① 선언과 동시에 초기화
int[ ] scores = { 83, 90, 87 };
② 선언 당시에는 null, 나중에 new로 초기화
int[ ] scores;
scores = new int[ ] { 83, 90, 87 }; // new 없이 그냥 {83,90,87}은 안 되는 것 주의!
▶ 함수의 인수로서의 배열
배열을 생성함과 동시에 인수로 사용하려 하면, new로 배열을 만들어줘야 한다.
add(new int[] {83, 90, 87});
add({ 83, 90, 87 }); // 에러 발생
▶ 길이를 지정하는 배열
① 선언과 동시에 초기화
int[ ] intArray = new int[5];
② 선언 당시에는 null, 나중에 new로 초기화
int[ ] intArray;
intArray = new int[5];
이렇게 길이를 지정하는 배열은 기본값으로 초기화된다는 특징을 가지고 있다.
new int[5] => {0, 0, 0, 0, 0}
new String[3] => {null, null, null}
Q. 자바는 왜 배열 선언 방법을 여러 개 주어 사람을 고통스럽게 만드는가?🤔
A. 쓰다 보면 외워지니까 그냥 많이 쓰면 편해진다.
▶ 길이 꺼내 쓰기
배열은 참조 타입 즉, 객체이므로 객체에서 변수 꺼내 쓰듯이 점(.)+length으로 꺼내 쓰면 된다.
배열 전체를 도는 for문에서 유용하게 쓰인다.
▶ main(String[] args)의 의미
❗자바의 모든 프로그램은 public static void main (String[] args) 함수로 시작해야 한다❗
* 접근제어자 예습 - 자바에서 main은 없어서는 안 되는 기본 함수이므로 모든 곳에서 접근이 가능한 public이어야 하며,
메모리에 상주해야 하므로 static이어야 하고, main이 종료되면 프로그램이 종료되므로 리턴 값이 의미 없기 때문에 void를 사용해야 한다. (void 말고 다른 타입을 사용하면 에러 발생)
* String[] args - args(arguments)라는 문자열을 인자로 사용한다는 의미, args는 변수 명이기 때문에 바뀌어도 되지만, String[] args라는 구문은 빠지면 안 된다.
=> 그렇다면 main(String[] args)는 어떤 의미인가?
main 함수를 실행할 때, 즉 프로그램을 실행할 때 문자열 파라미터를 넘겨받는다는 의미이다.
cf. 아무것도 넘겨주지 않으면 args는 length가 0인 배열이 된다.
▶ 문자열 아규먼트를 넘겨주는 방법
아래와 같은 코드가 있을 때
public class MainStringArguments {
public static void main(String[] args) { // String으로 된 배열 args 넘겨받음
if(args.length !=2) {
System.out.println("값의 수가 부족합니다.");
} else {
int x = Integer.parseInt(args[0]);
int y = Integer.parseInt(args[1]);
int z = x+y;
System.out.println("결과는 "+z);
}
}
}
① 명령 프롬프트
명령 프롬프트에서 자바 프로그램을 실행할 때,
1. javac로 컴파일
2. java 명령어로 클래스 실행
을 하게 되는데
이때 2번째 단계에서 문자열을 넘겨줄 수 있다.
(component는 공백으로 구분함)
> javac MainstringArguments.java
> java MainstringArguments 12
값의 수가 부족합니다.
> java MainstringArguments 12 34
결과는 46
② 이클립스
[Run] - [Run Configurations] - [Arguments창] - [Program arguments] 입력란에 입력 - [Apply] - 실행
▶ 이중 배열
행렬을 생각하면 쉽다. 하지만, 수학의 행렬과 구현이 100% 같진 않다.
수학에서의 행렬은 하나의 표처럼 되어있지만, 자바에서의 행렬은 큰 배열 안에 작은 배열들이 들어가 있는 구조이다.
그래서 2,3 행렬을 만들면, length가 2인 큰 배열 안에 각각 length가 3인 배열이 들어가 있는 형식이 된다.
예를 들어, 2x3 크기의 이중 배열 arr이 있다면
arr.length == 2, arr[0].length == 3, arr[1].length == 3 이 된다.
※ 이중 배열의 특이점
큰 배열 안에 작은 배열이 들어간다는 특징 때문에, 행마다 열의 크기를 다르게 줄 수도 있다.
// 1. 선언과 동시에 초기화
int[ ][ ] Mscores = {{1},{2,3}};
// 2. new 이용
int[ ][ ] Escores = new int[2][ ];
Escores[0] = new int[ ] {1};
Escores[1] = new int[ ] {2,3};
▶ 배열 복사
자바에서 배열은 한번 생기고 나면 크기를 바꿀 수 없으므로, 더 많은 저장 공간이 필요하면 더 큰 배열을 만들고 항목을 복사해야 한다. for문을 이용해 모든 컴포넌트를 대입하거나, System.arraycopy() 메소드를 사용할 수 있다.
* System.arraycopy() 문법 :
System.arraycopy(복사할 배열, 복사 시작 인덱스, 붙여넣기할 배열, 붙여넣기 시작 인덱스, 복사할 크기)
▶ 배열을 위해 향상된 for문
파이썬의 for i in (배열)과 사용 의도는 동일하다.
문법 : for (타입 변수 : 배열) { 실행문 }
예시 : for (int score : scores) { sum += score; }
'JAVA > 혼공자' 카테고리의 다른 글
[혼공자] Chapter 06-1~3 객체 지향 프로그래밍, 생성자 (1) | 2022.07.27 |
---|---|
[혼공자] Chapter 05-3 열거 타입 (0) | 2022.07.26 |
[혼공자] Chapter 05-1 참조 타입과 변수 (1) | 2022.07.23 |
[혼공자] Chapter 04. 조건문과 반복 (0) | 2022.07.21 |
[혼공자] Chapter 03. 연산자 (0) | 2022.07.21 |