(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. 상속 관계 : 자동차 --> 기계

 

 

+ Recent posts