int age = 25;
double price = 100.5;
String name = "홍길동";
String hobby = "독서";
위와같이 기본타입(int,double)과 참조타입(String) 변수에 값을 주면,
기본타입변수는 값을 직접 스택에 저장한다.
그러나 참조타입의 경우 힙 영역에 데이터가 번지수와 함께 들어있고, 스택에서는 그 번지를 참조하기만 하는 형태로 존재한다!
예시를 통해 이해해보자
public class StringExample {
public static void main(String[] args) {
String name1 = new String("홍길동");
String name2 = new String("홍길동");
if(name1==name2) {
System.out.println("같음");
}
else {System.out.println("다름");}
}
다름이 왜 나와? >> new를 이용해 따로 선언했으니까! 힙과 스택에도 서로 다른 주소가 생겨서 각자 참조했으니 다름,,, 주소가 다르면 다른값으로 인식한다는것 잊지말기
그렇다면 어떻게 해결해야 하는가?
public class StringExample {
public static void main(String[] args) {
// String name1 = new String("홍길동");
// String name2 = new String("홍길동");
String name1 = "홍길동";
String name2 = "홍길동";
if(name1==name2) {
System.out.println("같음");
}
else {System.out.println("다름");}
}
new를 사용하지 않고 선언! 참조타입은 원래 new를 이용해 선언해야 하나 String은 jdk1.5이상부턴 같은글자면 같은 주소를 참조하게끔 만들었다. ( 원래거는 주소가 두배이므로 효율안좋음! )
동일한 String객체이건 다른 객체이건 상관없이 내부문자열을 비교하고 싶을때는 String객체의 equals()메소드를 사용해야함!
int[] array = null;
array[0] = 10;
array는 배열이므로 참조변수이고, 참조변수는 null로 초기화가 가능하다. 이상태에서 10을 [0]위치에 저장하려고 시도하면 NullPointExeption이 발생한다.
즉, array변수가 참조하는 배열객체가 없어서 발생하는것!
또다른 예시로는
String str = null;
System.out.println("총 문자수: "+str.length());
String은 참조타입이며, null로 초기화가 가능하다. 이때 String객체의 length()라는 메소드를 호출하면 NullPointExeption 발생한다. str변수가 참조하는 객체가 없기때문!
score[인덱스]
int intrArray[];
int[] intArray;
타입[]변수 = null;
그런데 이 null로 초기화된 변수를 변수[인덱스]로 값을 읽거나 저장하게 되면
Nullpoint Exception이 발생한다
→ 그럼 배열에 값을 저장하려면 어떻게 해야 하는가?
변수 = new 타입[] {값0 값1, 값2, ...};
타입[] 변수;
변수 = {값0,값1,값2,값3 ...}; //error!
그럼 어떻게 값을 넣는가? → new 연산자를 이용한다!
String[] names = null;
names = new String[] {"신용권", "홍길동", "감자바"}
값의 목록을 가지고있지 않지만, 향후 값을 저장할 배열을 미리 만들고 싶다면?
타입[] 변수 = new 타입[길이];
int[] intArray = new int[5]; << 5개 인덱스 생김!
모두 null값으로 초기화 된다.
public class ArrayCreateExample {
public static void main(String[] args) {
int[] scores = {95,71,84,93,87};
int sum =0;
//향상된 for문
for(int score : scores){
sum+=score;
}
System.out.println("sum= " +sum);
}}
인덱스가 필요할땐 못씀 밑에같은거
public class ArrayCreateExample {
public static void main(String[] args) {
int[] scores = {95,71,84,93,87};
int sum =0;
for(int i = 0; i<scores.lenght;i++) {
System.out.println("scores["+i+"]:"+scores[i]);
if(i%2==0) {System.out.println("점");}
else {System.out.println();}
for (int score : scores) {System.out.println(score);}
}}
}