Confusing things :
- 객체생성의 기본원리
- 참조형 배열생성과 객체생성의 차이
- 객체생성과 초기화의 차이
- 배열참조변수 list가 null인것과 list[0]이 null인것의 차이
객체생성
객체생성 (객체가 가진 속성을 사용하기위해)
클래스명 변수명; //참조변수선언
변수명 = new 클래스명(); //객체의 주소를 참조변수에 저장
객체사용방법 :
변수명.메서드명();
변수명을 이용해 점뒤에있는 메서드를 이용
배열참조변수 list가 null인것 vs list[0]이 null인것의 차이
Covid19[] list = new Covid19[3];
list[0].date = "2020";
list는 배열객체가있음(3개짜리만들어짐), null이 아님.
list[0]은 null, NullpointerException발생
Covid19[] list = null;
list 자체가 null, 배열이아니다.
list사용시 NullpointerException 발생
Covid19[] list = new Covid19[10];
list[0].date = "hello";
list는 배열객체만가지고있다.
list[0] 는 가리키는곳이없다. (객체생성이 안되었다)
에러발생한다. 이름에 해당되는 list[0]에 객체생성이안되어있기때문이다.
list[0] = new Covid19(); (list[0]에 Covid19()객체를 대입 해줘야한다.)
list의 자료형이 Covid19()이기 때문이다.
int a = new int[3];
정수 변수가 3개 만들어짐.
정수를 담을 수있는 공간 3개 생성
a[0], a[1],a[2] 변수가 만들어진다.
배열의 자료형 : 기본형이 아닌 참조형이라면 ?
Covid19[] covid = new Covid19[3]; 의미
Covid19 a;
Covid19 b;
Covid19 c;
Covid19 변수 3개를 한번에 만들어서 사용하기위한것이 Covid19[3] 배열이다.
배열객체만 만들어지는것, Covid19()객체는 만들어지지않았다.
배열생성은 변수3개를 만들뿐 객체를 생성하지않았다.
확진자수, 격리자수 등 저장할 공간은 만들어지지않았다.
기본형이 아닌것들은 heap영역에 공간을 만들어야 값을 넣을 수 있다.
Covid19() 객체를 만들려면 new연산자를 통해 객체를 생성해야한다. (변수선언,생성과 비슷하다)
Covid19 a = new Covid19();
Covid19 b = new Covid19();
Covid19 c = new Covid19();
마찬가지로 Covid19 배열도 new연산자를 통해 객체를 생성해야한다.
covid = new Covid19();
객체생성 후 대입
list[i] = covid; // 담아서 쓰는것
list[i] = Covid19(); 도 되지만, 이미 윗 코드에서 Covid19 covid = new Covid19()를 통해 참조변수를 만들었으므로 참조변수를 사용한다.
초기화가 아니라 객체생성이다.
stack : 선언을 통한것만 저장
heap : new연산자를 통해만들어진 객체만
list[0].date 와 temp.date의 차이
임시변수선언없이 list[0]로 사용하면 매번 list[0].date , list[0].cases, ..로 계속써야한다.
Covid19()클래스에 있는 변수를 쓰기위해 list[0]와 temp모두 사용 할 수있지만 임시변수쓰는것이 복잡도를 낮출 수있다.
변수는 이름을 여러개 가질 수 있다.
배열생성후 객체생성을 하지않으면 null 오류가 발생한다.
맨 위의 상단에 Covid19[] list = null; 이라고 선언했기때문에
출력시 list자체가 null이라는 오류가 뜬다.
package ex4.struct;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
public class prac1 {
public static void main(String[] args) throws IOException {
int count = 0;
Covid19[] list = null;
//---------------------------------------------------------
// 레코드 개수를 알아내는 코드
{
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner fscan = new Scanner(fis);
// while 반복을 하면서 count++ 연산을 한다. 마지막 줄을 만날 때까지
while(fscan.hasNextLine()) {
fscan.nextLine();
count++;
}
fscan.close();
fis.close();
count--;
}
//--------------------------------------------------------
// Covid19를 로드하는 코드
// Covid19[] list = new Covid19[count];
{
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner fscan = new Scanner(fis);
String line;
fscan.nextLine();
for(int i=0; i<count; i++) {
line = fscan.nextLine();
String[] tokens = line.split(",");
Covid19 covid = new Covid19(); //covid는 지역화된 변수라 }만나면 사라지고 반복되면서 다시생긴다
covid.date = tokens[0];
covid.cases = Integer.parseInt(tokens[1]); //int = String
covid.deaths = Integer.parseInt(tokens[2]);
covid.tests = Integer.parseInt(tokens[3]);
covid.selfIsolation = Integer.parseInt(tokens[4]);
covid.release = Integer.parseInt(tokens[5]);
covid.recover = Integer.parseInt(tokens[6]);
covid.selfQuarantineDomestic = Integer.parseInt(tokens[7]);
covid.selfQuarantineImported = Integer.parseInt(tokens[8]);
covid.pubDate = tokens[9];
list[i] = covid;
// list[i] = covid.date; //covid.date는 String 자료형불일치
}
fscan.close();
fis.close();
}
}
}
count만큼 배열을 만들어준다.
Covid19[] list = new Covid19[count];
package ex4.struct;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
public class prac1 {
public static void main(String[] args) throws IOException {
int count = 0;
//---------------------------------------------------------
// 레코드 개수를 알아내는 코드
{
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner fscan = new Scanner(fis);
// while 반복을 하면서 count++ 연산을 한다. 마지막 줄을 만날 때까지
while(fscan.hasNextLine()) {
fscan.nextLine();
count++;
}
fscan.close();
fis.close();
count--;
}
//--------------------------------------------------------
// Covid19를 로드하는 코드
Covid19[] list = new Covid19[count];
{
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner fscan = new Scanner(fis);
String line;
fscan.nextLine();
for(int i=0; i<count; i++) {
line = fscan.nextLine();
String[] tokens = line.split(",");
Covid19 covid = new Covid19(); //covid는 지역화된 변수라 }만나면 사라지고 반복되면서 다시생긴다
covid.date = tokens[0];
covid.cases = Integer.parseInt(tokens[1]); //int = String
covid.deaths = Integer.parseInt(tokens[2]);
covid.tests = Integer.parseInt(tokens[3]);
covid.selfIsolation = Integer.parseInt(tokens[4]);
covid.release = Integer.parseInt(tokens[5]);
covid.recover = Integer.parseInt(tokens[6]);
covid.selfQuarantineDomestic = Integer.parseInt(tokens[7]);
covid.selfQuarantineImported = Integer.parseInt(tokens[8]);
covid.pubDate = tokens[9];
list[i] = covid;
// list[i] = covid.date; //covid.date는 String 자료형불일치
}
fscan.close();
fis.close();
}
}
}
list 자체는 배열객체만 가리키고있어서 주소의 변화가없다.
list[i]는 Covid19()객체를 가리키고있어서 주소가 바뀐다. for문의 반복으로 객체가 계속 생성되기때문
covid도 Covid19()객체를 가리키기 때문에 list[i]와 주소가 동일하다.
'2021 Newlecture > JAVA' 카테고리의 다른 글
함수를 사용하는 이유/ 데이터 입출력 분리/ 메소드생성 (0) | 2021.03.23 |
---|---|
코드정리 / 함수와 인터페이스 / 메소드생성 / 메소드호출 (0) | 2021.03.22 |
메소드생성 (0) | 2021.03.22 |
배열을 바로출력 vs 변수로 출력 (구조체) (0) | 2021.03.19 |
구조체 (0) | 2021.03.18 |
2차원배열의 참조/ 가변배열/참조배열 (0) | 2021.03.17 |
2차원배열 / 반복문을 통해 1차원배열생성 하면서 2차원배열에 대입 (0) | 2021.03.17 |
2차원배열 / 열에서 최대값 구하기/ 해당 인덱스값구하기/값변화 차이 (0) | 2021.03.16 |