(1) Null : 변수(스택 영역)가 참조하는 객체(힙 영역)가 없을 경우 초기값으로 사용
: 참조 타입의 변수에만 저장 가능 (기본타입은 사용 x)
: 값이 없는 변수는 stack 영역에 생성되지 않지만, null로 초기화된 참조 변수는 stack 영역에 생성
String str = null;
char c = str.charAt(0); //NullPointerException
여기서 null이란 str이란 String 변수가 선언만 되어 있고, 참조하고 있는 주소값이 없다는 것
즉, 존재하지 않는 객체를 가리킬 때 발생한다.
null을 사용하는 이유는? 자원을 해제하기 위해서 주로 사용한다. 추후에 사용되지 않으면 자동 소멸됨.
(2) NullPointerException : 가장 자주 발생하는 에러, 가장 잡기 쉬우면서 어려운 에러
- 발생 원인 : 참조 변수가 null값을 가지고 있는데 객체의 필드나 메소드를 사용하려고 했을 때 발생
(에러가 발생된 곳에서 객체를 참조하지 않은 상태로 참조 타입 변수를 사용하고 있음)
- 해결법 : 변수 추적, 객체를 참조하도록 수정
(3) String : 문자열을 저장하는 클래스 타입
Q.동일한 문자열 리터럴을 String에 대입하고자 한다면? 힙 영역의 같은 String 객체를 공유 (객체 하나만 생성됨)
Q. 동일한 문자열 리터럴을 같은 String이 아닌 다른 String 객체에 대입하고자 한다면?
new 연산자를 이용한 String 객체 생성 : 힙 영역에 새로운 String 객체를 생성 >> 번지를 리턴
(4) 참조 변수의 ==, != 연산
- 동일한 객체를 참조하는지 서로 다른 객체를 참조하는지 조사하는 것
(5) 문자열 비교시 주의사항 ***
주로 Sring은 동일한 객체를 참조하는지를 비교하지 않고, 객체 안 문자열이 동일한지를 비교한다.
ex) String name1 = "홍길동";
String name2 = "홍길동";
String name3 = new String ("홍길동");
>> name1.equals(name3) //true (문자열 동일 o, 객체 동일x)
(6) 배열
- 같은 타입의 데이터를 연속된 공간에 저장하는 자료구조
- 각 데이터의 저장 위치는 인덱스(번호)를 부여해서 접근할 수 있다.
Q. 배열을 왜 사용하는가?
>> 변수의 수가 많을 경우, 연산을 하기 어렵기 때문에 쉽게 연산을 하기 위해서
>> 같은 타입의 변수들을 효율적으로 관리하기 위해서 (반복문 사용)
>> 코드 절감하기 위해서
index |
85 0 |
96 1 |
74 2 |
76 3 |
..... .... |
88 44 |
- 배열이름[인덱스번호] (*인덱스 번호는 0번부터 시작되고, 자동으로 생성된다.)
( 주로 배열은 for문과 함께 사용되어 최댓값, 최솟값, 평균, 총합 등을 구한다.)
ex) score[2] = 79; // index 2번인 74점을 79점으로 변경하여 대입.
ex) 0~44번까지의 총학점과 평균을 구하라.
int sum = 0;
for (i=0; i<45; ,i++) {
sum += score[i];
}
int avg = sum / 45;
선언) 타입[ ] 변수;
int[ ] intArray;
double[ ] doubleArray;
String[ ] strArray;
사용)
1. 변수 선언과 동시에 값 대입
데이터 타입[ ] 변수 = {값1,값2.........};
String[ ] names = {"홍길동", "임꺽정"};
public class ArrayCreateByValueListExample{
public static void main(String[] args) {
int[] scores = {95,80,99}; // scores 배열 변수는 stack 영역에 생성, {95,80,99} 배열 객체는 heap 영역에 생성
System.out.println("scores[0]:" + scores[0] ); //index번호 0부터 자동 생성됨
System.out.println("scores[1]:" + scores[1] );
System.out.println("scores[2]:" + scores[2] );
int sum = 0;
for (int i=0;i<3 ;i++ ){ //0~2
sum += scores[i]; //배열에 저장되어 있는 값들을 더하라
}
System.out.println("총합 :" + sum);
double avg = (double) sum/ 3;
System.out.println("평균 : " + avg);
}
}
---------- run ----------
scores[0]:95
scores[1]:80
scores[2]:99
총합 :274
평균 : 91.33333333333333
2. 변수 선언 후 값 대입
데이터 타입 [ ] 변수;
변수 = new 타입 [ ] {값1, 값2.....};
String[ ] names = null;
names = new String [ ] {"홍길동","임꺽정"};
* 배열은 참조 변수이기 때문에 null로 초기화가 가능하다.
(but, null값을 가진 상태에서 항목에 접근하기 위해 "변수[인덱스]"를 하면 NullPointerException 발생)
Q. 이미 선언한 배열을 매개변수로 가지는 메소드를 호출하고 싶다면?
>> int add (int[] scores) {......} --- int 배열의 값을 모두 더해서 return하는 메소드
ex)
int result = add({95,80,99}); //컴파일 에러 발생
int result = add(new int[] {95,80,99} );
public class ArrayCreateByValueListExample2 {
public static void main(String[] args) {
int[] scores;
//scores = {83,90,87}; //컴파일 에러
scores = new int[] {83,90,97};//배열변수 선언 후 값 대입을 할 떄는 new 붙이기
int sum1 = 0;
for (int i=0;i<3;i++){
sum1 += scores[i];
}
System.out.println("총합 : " + sum1);
int sum2 = add(new int[] {83,90,97});
System.out.println("총합 : " + sum2);
}
public static int add(int[] scores) { //add라는 메소드 사용
int sum = 0;
for (int i=0;i<3;i++){
sum += scores[i];
}
return sum;
}
---------- run ----------
총합 : 270
총합 : 270
3. new 연산자로 배열 생성 : 배열 생성시 값을 대입하지 않고, 추후에 값들을 대입하고 싶을 경우
>> 타입[] 변수 = new 타입[길이];
int[] socres = new int[5]; //5개의 값
|
데이터 타입 |
초기값 |
기본타입(정수) |
new byte[] new char[] new short[] new int[] new long[] |
0 공백 0 0 0 |
기본타입(실수) |
new float[] new double[] |
0.0 0.0 |
기본타입(논리) |
new boolean[] |
false |
참조타입 |
클래스[] 인터페이스[] |
null null |
public class ArrayCreateByNewExample {
public static void main(String[] args) {
int [] arr1 = new int[3]; //배열생성
for (int i=0;i<3 ;i++ ){
System.out.println("arr1[" + i + "] : " + arr1[i]);//초기값 알아보기 위해서
}
System.out.println(); // 한 줄 생성
arr1[0] = 10; // 0번 인덱스에 10이라는 값 저장
arr1[1] = 20;
arr1[2] = 30;
for (int i=0;i<3 ;i++ ){
System.out.println("arr1[" + i + "] : " + arr1[i]);
}
System.out.println();
double[] arr2 = new double[3];
for (int i=0;i<3 ;i++ ){
System.out.println("arr2[" + i + "] : " + arr2[i]);//초기값 알아보기 위해서
}
System.out.println();
arr2[0] = 0.1;
arr2[1] = 0.2;
arr2[2] = 0.3;
for (int i=0;i<3 ;i++ ){
System.out.println("arr2[" + i + "] : " + arr2[i]);
}
System.out.println();
String[] arr3 = new String[3];
for (int i=0;i<3 ;i++ ){
System.out.println("arr3[" + i + "] : " + arr3[i]);//초기값 알아보기 위해서
}
System.out.println();
arr3[0] = "1월";
arr3[1] = "2월";
arr3[2] = "3월";
for (int i=0;i<3 ;i++ ){
System.out.println("arr3[" + i + "] : " + arr3[i]);
}
}
}
---------- run ----------
arr1[0] : 0
arr1[1] : 0
arr1[2] : 0
arr1[0] : 10
arr1[1] : 20
arr1[2] : 30
arr2[0] : 0.0
arr2[1] : 0.0
arr2[2] : 0.0
arr2[0] : 0.1
arr2[1] : 0.2
arr2[2] : 0.3
arr3[0] : null
arr3[1] : null
arr3[2] : null
arr3[0] : 1월
arr3[1] : 2월
arr3[2] : 3월
(7)
java : 객체 지향 프로그래밍 |
c : 절차 지향 프로그래밍 |
객체들은 서로 다른 객체들과 관계를 맺고 있다. |
(위에서부터 순서대로 이루어짐) |
- 관계 종류 1. 집합 관계 : 자동차 -- 엔진, 타이어, 핸들 2. 사용 관계 : 사람 --> 자동차 3. 상속 관계 : 자동차 --> 기계 |
|
'Language > Java' 카테고리의 다른 글
19.10.26. (배열의 길이/다차원 배열/객체 참조 배열/배열 복사/향상된 for문) (0) | 2021.01.15 |
---|---|
19.10.25. (Car/CarUser) (0) | 2021.01.15 |
19.10.24. (Reference DataType/Class/Method/Constructor/Overloading/메모리 사용 영역/Method/Heap/Stack) (0) | 2021.01.15 |
19.10.23. (do ~ while문/로또 소스/숫자 야구 게임 소스/break/continue) (0) | 2021.01.15 |
19.10.22. (while문/반복문/로또 소스/구구단 소스/주사위 합 소스) (0) | 2021.01.15 |