이번 학습 키워드
배열/ 인덱스/ 배열 길이/ 배열 선언/ 배열생성/ 다차원 배열/ 향상된for문
-->변수는 1개 데이터만 저장 가능하다!! 많은 양의 데이터를 적은 코드로 손쉽게 처리해보자
드디어 배열 목차다! 다시 공부하는 마음으로 고고싱
수많은 사람들의 성적을 배열로 저장하면, 그 과목의 평균은 for문으로 돌리면 아주 손쉽게 구할 수 있다.
int sum = 0;
for(int i=0; i<30; i++) {
sum += score[i]
}
int avg = sum /30;
이런 식으로
++int배열, String배열 따로 있다.
다른 타입 값 저장하려고 하면 타입 불일치 컴파일에러 발생 (Type mismatch)
++한번 생성된 배열은 길이를 변경할 수 없다.
>>그래서 저번에 자료구조 공부할 때, 데이터 추가할 때마다 배열 길이 늘리게 수정하는 코드를 작성해본 적이 있다. 아무튼 배열 길이를 변경할 수 없었자나용
<<배열 선언>>
배열 쓰려면 배열 변수를 선언해야 한다!
헤헤 몬가 되게 신난당
암튼 두가지 선언 방법
타입[] 변수; or 타입 변수[];
>>대괄호는 변수를 선언하는 기호.
(cf. 참조 변수인 배열 변수:
1. 배열도 객체이므로 힙 영역에 생성된다.
2. 배열 변수는 힙 영역의 배열 객체를 참조한다.
(힙 영역에는 객체, 배열 등이 들어갔고 이 힙 영역에 있는 아이들을 스택에 있는 변수 등이 참조한다고 했다)
3. 참조할 배열 객체가 없다면 배열 변수도 null값으로 초기화될 수 있다.
>>null인데 인덱스 사용해서 값을 읽게 되면 NullPointerException 발생.
<<배열 객체 생성>>
1. 값 목록으로 배열 생성
2. new 연산자를 이용
ㅇ값 목록으로 배열 생성...
간단하게 이럴 수 있다.
String[] names = {"양대리님", "김깜찍", "신용권님"};
ㄴ중괄호 안 값들을 항목으로 하는 배열 객체는 힙에 생성된다. ++배열에는 기본타입 뿐만 아니라 클래스타입의 배열도 만들 수 있기 때문에, 배열이 객체 저장소로 사용될 수 있다.
ㄴ배열 객체의 번지를 리턴한다.
ㄴ배열 변수는 리턴된 번지를 저장한다. (참조)
항목을 바꾸고 싶다면 인덱스를 이용하여
name[0] = "양귀요미";
ㅇ평균double
ㅇfor문 인덱스 0부터
배열에 항목 넣을때 주의사항!!
ㄴ배열 변수를 먼저 생성한 상태라면 나중에 값 넣을때 그냥 중괄호로 넣을 수 없다.
예를 들면
int intparty[]; / /배열 변수 먼저 생성
intparty = {1, 4, 65, 75, 34}; //<----컴파일 에러 난다.
ㄴ그러므로 배열을 먼저 선언한 뒤에 항목들의 값이 결정되는 상황이라면,
new연산자를 사용하여 항목을 넣어주어야 한다.
intparty = new int[] {1, 4, 65, 75, 34};
변수 = new 타입[] {값0, 값1, 값2, ... }
ㄴ메소드의 매개값이 배열일 경우에도 마찬가지!!
그 자리에는 new연산자를 사용하여 배열에 값을 넣어야 한다.
예를 들면
int add(int[] scores) {..}
int resulte = add( new int[] {95, 86, 49} )
이렇게 값들을 넣어야 한다!!
그냥 add( {...} ) 쓰면 안 된다.
<<배열 객체 생성>>
1. 값 목록으로 배열 생성
2. new 연산자를 이용
ㅇ new연산자를 이용..
값의 목록 안 가지고 있지만 나중에 목록 생성할 거다. 미리 배열을 만들고 싶다... 라면
new연산자로 배열 객체를 미리 생성해 놓을 수 있다.
(배열 객체는 힙 영역에 들어갔지!)
(배열 객체가 힙 영역에 존재한다는 것은 어딘가에서 참조되고 있다는 상태 맞죠? 가비지콜렉터가 안 치웠으니까)
(배열 변수를 선언한 거네요)
타입[] 변수 = new 타입[길이]
또는 이미 배열 변수가 배열 객체보다 먼저 선언된 경우에도 (Null로 선언) 나중에 배열 객체를 생성할 수 있따.
타입[] 변수 = null;
변수 = new 타입[길이]
++new연산자로 배열을 생성하면 배열은 자동적으로 기본값(0)으로 초기화된다.
int[] scores = new int[30];
>>인덱스 0부터 29까지 모두 0(기본값)으로 초기화된다.
String[] names = new String[30]
>>String배열이라면 null값으로 초기화된다.
>>>>타입별로 배열의 초기값이 다르다. 한번 쓰면서 인지하고 넘어가자
분류 | 타입 | 초기값 |
기본 타입 (정수) | byte[ ] char[ ] short[ ] int[ ] long[ ] |
0 \u0000 0 0 0L |
기본 타입 (실수) | float[ ] double[ ] |
0.0F 0.0 |
기본 타입 (논리) | boolean[ ] | false |
참조 타입 | 클래스[ ] | null |
인터페이스[ ] | null |
다음 코드를 작성하면서 다양한 타입의 배열 생성과, 타입별 초기값을 확인해보았다.
저거 특이하당 왜 저렇게 쓰지? 나중에 배우게찌? 일단 고!!
<<배열 길이>>
배열 객체의 "length 필드'를 읽는 방법
(cf, 필드: 객체 내부의 데이터!! 정적 필드가 메소드영역 속의 클래스 안에 들어있었지!!)
(참조 객체는 힙 영역에 들어가고, 참조 변수는 스택 영영에 들어가고, 참조 객체이 배열의 길이 데이터는 필드로서 메소드 영역에 들어가는구나.. )
이렇게 사용한다.
배열 변수.length
length필드는 읽기 전용 필드이므로 값을 바꿀 수 없다.
+++
배열의 length필드는 for문에서 유용하게 쓸 수 있다.
ex: 배열 전체를 루핑
** for문 조건식에서 비교연산자 <를 사용한 이유: length는 우리가 통상적으로 생각하는 길이니까..
인덱스는 0부터 센다는 것을 고려한 것이다.
와와와와!!! 너무 궁금했던거 여기서 다룬다.
우리가 프로그램 실행하려면 main() 메소드가 필요했다.
(기억을 되살려보자면
바이트 코드 파일을 실행할 때 가장 먼저 이 main() 메소드를 찾아 실행했다.
그래서 이 main()을 entry point라고 불렀지)
하지만
main() 메소드의 매개값인 String[] args가 필요한 이유를 몰랐다! 진짜 저걸 왜 쓰는지 궁금했다
public static void main(String[] args) {...}
이 책이 지금부터 알려준다고 하니까 집중!!
main() 메소드는 String[] args 매개 변수를 통해서 명령 라인에서 입력된 데이터의 수와 입력된 데이터를 알 수 있게 된다.
이 때, 데이터의 수는 args배열의 length, 입력된 데이터는 args배열의 항목 값을 말한다.
보통의 배열처럼 사용하면 된다고 하는데..
args는 메인 메소드에 기본으로 항상 있는 문자열 배열이다..
>>자바의 args는 "명령 라인"에서 쓰인다.
명령 라인에서 자바를 실행시킬 때 매개변수를 전달할 수 있게 하는 기능이다!
만약 JDK 11이후버전이면
명령 라인에서..
java -p . -m 자바프로젝트명/패키지명/클래스명 값1 값2
라고 써준다면 args 배열 항목에 값1과 값2가 들어간다.
(JDK 이전 버전은 저 -p . -m을 빼고..)
값이 들어갔는지는 다음처럼 확인할 수 있다.
for(int i=0; i<args.length; i++) {
System.out.prinln(args[i])
}
그러니까 명령 라인에서 사용자가 입력하는 데이터들이 이 args[] 배열에 들어가고,
그러므로 명령 라인에서 이 배열을 활용할 수 있다. 필요할 때 꺼내 써도 되고
무슨 값이 있는지 확인해도 되고..
(주로 이클립스가 실행 환경이라면 args배열을 사용할 일이 많지 않다고 한다.)
(이클립스 내에서 main에 매개값을 주고 시작하려면...
Run탭의 Run Configurations에서 Main탭에서
해당 Project와 Main Class이름을 확인하고, Arguments탭으로 들어가서
Program arguments탭에 값을 입력하면 된다. 값은 빈칸으로 구분한다.)
아항!
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 7/06 06-1 [클래스 선언] [클래스 구성] [new 연산자] [필드] [생성자] [메소드] (0) | 2020.07.06 |
---|---|
[혼자 공부하는 자바] 7/04 05-2 배열2 (0) | 2020.07.04 |
[혼자 공부하는 자바] 7/02 05-1 참조타입 (0) | 2020.07.02 |
[혼자 공부하는 자바] 7/02 04 조건문과 반복문 (0) | 2020.06.30 |
[혼자 공부하는 자바] 6/30 02-4~03-2 (0) | 2020.06.30 |