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이라는 오류가 뜬다.

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]와 주소가 동일하다.

 

+ Recent posts