자바 공부중 new 연산자와 반복문의 활용에 관련해서 기술하고자 한다.
우선 간단히 이론적인 부분을 적으면
new 연산자는 새로 heap영역에 주소를 할당하여 객체가 생성되는 것이다.
코드 작성 중 체감하는 기믹으로
반복문과의 조합에 있어 생각해볼 점이 있는 것 같아. 다뤄보려고 한다.
ArrayList<ArrayList<String>> arr01 = new ArrayList<ArrayList<String>>();
ArrayList<String> arr02 = new ArrayList<String>();
String[] rs;
try {
BufferedReader br = new BufferedReader(new FileReader(file));
while (true) {
String line;
line = br.readLine();
if (line == null) {
break;
}
rs = null;
rs = line.split("\t");
for (int i = 0; i < rs.length; i++) {
arr02.add(rs[i]);
}
arr01.add(arr02);
}
}catch(Exception e) {
System.out.println(e.getMessage());
}
이 코드를 보자. 파일의 텍스트를 읽어와서 배열에 저장하는 코드의 일부이다.
결코 잘 만든 코드는 아닐거라 생각하지만, new 연산자와 반복문에 대한 내용을 생각해보고자 만든 코드이니 참고바란다.
또한, 해당 블로그에 독자가 있을지 모르겠기에, 어느 정도 수준으로 글을 써야할지 감을 잡기가 어렵다. 작성하는 모든 글은 주안점에 대한 설명이외에는 설명을 줄이고 꼭 필요하다 생각되는 내용만 추가기술 하겠다.
상기의 코드는 while문과 new연산자에 집중해달라.
readLine()이라는 메소드는 한 줄을 읽어오고 커서를 다음 줄로 옮긴다고 생각하면
된다. 이로인해 마지막 줄 까지 읽고나서 다음으로 커서를 옮기게되면
그 다음 메소드가 읽어올 줄은 null값이 된다.
이를 이용해 while문의 무한반복을 제어한 반복문이다.
주요한 로직은 2가지 흐름이다.
첫째로, new 연산자는 while문의 밖에서 객체를 생성하고, 생성된 배열은 문자열을 add하게 된다.
또한, rs라는 String배열은 17행에서 null값으로 초기화되고, 18행에서 값을 갖게 된다.
둘때로, 21행의 arr02는 한 줄의 글을 tap으로 split한 배열을 담고 있는데,
이를 arr01에 담는 로직이다.
상기 배열대로 진행하게 된다면,
rs는 while문이 반복됨에 따라 비워졌다가 새로운 문자열을 받아 배열을 형성하는 것을 반복하고
arr02는 비워지지 않고, 추가로 rs의 각 인덱스의 문자열을 추가하게 되고
arr01은 arr02의 계속 추가되기만 하는 배열을 추가하게된다.
글자를 예시로 들면
while문 1회차
rs = a
arr02 = a
arr01 = a
while문 2회차
rs = b
arr02 = ab
arr01 = aab
while문 3회차
rs = c
arr02 = abc
arr01 = aababc
의 형식이 된다. 반복되는 데이터가 의미있는 경우는 반복해서 발생하는 경우인데, 지금은 그런 상황이 아닌 로직이 반복되는 것으로 처리가 잘 못 되고 있는 것이다.
ArrayList<ArrayList<String>> arr01 = new ArrayList<ArrayList<String>>();
ArrayList<String> arr02;
String[] rs;
try {
BufferedReader br = new BufferedReader(new FileReader(file));
while (true) {
arr02 = new ArrayList<String>();
String line;
line = br.readLine();
if (line == null) {
break;
}
rs = null;
rs = line.split("\t");
for (int i = 0; i < rs.length; i++) {
arr02.add(rs[i]);
}
arr01.add(arr02);
}
}catch(Exception e) {
System.out.println(e.getMessage());
}
고로 지금처럼 while문 안에 new 연산자가 들어가게되면,
반복될 때 마다 arr02가 새로 초기화 되므로
while문 1회차
rs = a
arr02 = a
arr01 = a
while문 2회차
rs = b
arr02 = b
arr01 = ab
while문 3회차
rs = c
arr02 = c
arr01 = abc
가 될 수 있다.
이처럼 반복문과 new연산자는 의도하는 로직을 연출하기 위해 신경을 기울일 필요가 있다.
=================================================
2개월차 초보의 수업듣고 떠오르는 코딩을 해보는 내용입니다.
부족한 내용이나 잘못된 내용이 있다면 피드백해주시면 감사합니다.
'JAVA' 카테고리의 다른 글
call by Value, call by reference. 근데 자바는 call by value만 쓴다고? (0) | 2022.12.27 |
---|---|
변수, 기본형, 참조형 선언 with 메모리 (1) | 2022.12.26 |
==연산자와 .equals() 그리고 hashCode (0) | 2022.01.27 |
정렬 알고리즘(2) - 기본적인 정렬 알고리즘 (0) | 2021.04.16 |
정렬 알고리즘 - 오름차순 (0) | 2021.04.14 |