티스토리 뷰

public static void main(String[] args) {} -> 메인 메소드이다. (함수와는 다르다.)

- 위의 메인 메소드의 종료 시점이 마지막 괄호가 닫힐때까지 인데, 

return을 주게 되면 그 시점에 프로그램을 종료한다. 

 

[데이터 타입]

1. 기본 타입(primitive type)

: 값 자체를 저장함 

정수 타입 byte
char
short
int
long
실수 타입 float
double
논리 타입 boolean

 

2. 참조 타입 (reference type)

: 값 자체가 아닌 값이 저장되어 있는 메모리 주소를 저장하는 타입 

- 참조 타입 변수는 객체를 참조하는 변수이다. 

배열 타입
열거 타입
클래스 - String
인터페이스

 

[기본 타입과 참조 타입의 메모리 위치 비교]

 

- 참조 타입 변수는 힙에 있는 번지 주소를 가지고 있음 

- 힙 영역에 생성되는 것은 모두 객체라고 한다. 

 

(ex)

int age = 25;

double price = 100.5;

String name = "채정";

String hobby = "필라테스";

 

 


※ Runtime Data Area

1. 메소드 영역(정적 영역)

- JVM을 시작할 때 생성

- 로딩된 클래스 바이트 코드 내용을 분석후 저장

- 모든 스레드가 공유

 

2. 힙 영역

- JVM을 시작할 때 생성

- 객체/배열 저장

- 사용되지 않는 객체는 GC가 자동 제거

 

3. JVM 스택 

- 스레드별로 생성

- 메소드를 호출할 때마다 Frame을 스택에 추가(push)

- 메소드가 종료하면 Frame을 제거(pop)

 

 


※ null과 NullPointerException

[null]

- 위치 정보가 없을 수 있다. 힙 영역에 어떠한 객체를 참조하고 있지 않다는 의미이다.

- 변수가 참조하는 객체가 없을 경우 초기값으로 사용 가능

- 참조 타입의 변수에만 저장가능

- null로 초기화된 참조 변수는 스택 영역 생성 

 

[NullPointerException]

- 참조 변수에 null이 들어가있으면 사용할 수 없다. 그런데도 사용하면 NullPointerException 이 발생한다.


▶ 이제부터 Reference Type 에 해당하는 타입에 대하여 알아보기 

※ String (클래스 타입에 속함)

cf)  리터럴 : 직접 코드에 입력한 값 (숫자던 문자던)

- 문자열 리터럴이 동일하다면 String 객체를 공유한다.

- String 타입이 가진 메소드 : equals() 

 

[실습]

package pr05;

public class exam01 {

	public static void main(String[] args) {
		
		int var1 = 10;
		int var2 = 10;
		
		// 값 자체 비교 
		System.out.println(var1 == var2); // true
		System.out.println(var1 != var2); // false
		
		String var3 = "자바";
		String var4 = "자바";
		String var5 = new String("자바");
		
		// 번지비교 
		System.out.println(var3 == var4); // true - 리터럴이 같으면 주소가 같다.
		System.out.println(var3 == var5); // false - new로 생성한 객체는 다른 주소를 가리킴 
		System.out.println(var3 != var4); // false
		System.out.println(var3.equals(var5)); // true	
		
	}
}

※ 배열 타입 

- 같은 타입의 데이터를 연속된 공간에 저장하는 자료구조

 

1. 배열을 생성하는 첫 번째 방법

package pr05;

import java.util.Arrays;

public class exam02 { // 배열을 생성하는 첫 번째 방법 

	public static void main(String[] args) { // main 메소드 
		// 변수를 선언하면서 값 목록을 제공할 경우 
		int[] scores1 = {90, 85, 95};
		System.out.println(scores1[0]);
		System.out.println(scores1[1]);
		System.out.println(scores1[2]);

		// 변수를 선언하면서 값 목록을 제공할 경우 
		int[] scores2 = null;
		// scores2 = {90, 85, 95}; 잘못된 코드 
		scores2 = new int[] {10, 20, 30};
		// 컴파일러는 scores가 참조변수인것은 알아도 정확히 배열을 가리키는 건 모를수가 있다.
		// 컴파일러를 위해서 int 배열임을 명시적으로 나타내준다. 
		
		// 메소드 호출 - 값을 전달하면서 호출하겠다 
		add(10); // call by value
		add2(scores1); // call by reference
		add2(scores2);
		add2( new int[]{10, 20, 30});
	}
	
	// 메소드 선언 
	public static void add(int value) { // add 메소드 
		System.out.println("값: ");
		
	}
	
	// 메소드 선언 
	public static void add2(int[] arr) { 
		System.out.println("값: " + Arrays.toString(arr));
		System.out.println("번지: " + arr);
	}

}

 

package pr05;

public class exam03 { // 배열을 생성하는 첫 번째 방법 

	public static void main(String[] args) { // main 메소드 

		int[] scores1 = {90, 85, 95};
		int[] scores2 = {90, 85, 95};
		int[] scores3 = scores1;
		
		System.out.println(scores1 == scores2); // false
		System.out.println(scores1 == scores3); // true 
	}
}

 

2. 배열을 생성하는 두 번째 방법 - new 연산자로 배열 생성 

: 향후 값들을 저장할 배열을 미리 생성하고 싶을 경우

 

[기본값 ]

package pr05;

public class exam04 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr1 = new int[3];
		for(int i=0; i<arr1.length; i++) {
			System.out.println(arr1[i]); // 0 
		}
		
		double[] arr2 = new double[3];
		for(int i=0; i<arr2.length; i++) {
			System.out.println(arr2[i]); // 0.0 
		}
		
		boolean[] arr3 = new boolean[3];
		for(int i=0; i<arr3.length; i++) {
			System.out.println(arr3[i]); // false
		}
		
		String[] arr4 = new String[3];
		for(int i=0; i<arr4.length; i++) {
			System.out.println(arr4[i]); // null
		}
	}

}

- 기본타입을 제외한 참조타입의 기본값은 null이 들어감. 번지가 없다는 뜻 

 

[다차원 배열]

- 자바는 1차원 배열을 이용해서 2차원 배열을 구현한다. 

- 자바는 행렬 구조, 테이블 구조로 만들어지는 것이 아니다.

 

그럼 여기서 질문!

Q) scores[0]과 scores[1]이 참조하는 객체의 길이를 각각 다르게 줄 수 있을까? 

답은 YES ~!!  아래 코드를 보시오! 

int[][] scores = new int[2][];
scores[0] = new int[2];
scores[1] = new int[3];

 


※ 열거 타입 

: 한정된 값만을 갖는 데이터 타입이 열거 타입(enumeration type) 이다.

열거 타입은 몇 개의 열거 상수중에서 하나의 상수를 저장하는 데이터 타입이다. 

 

1. 열거 타입 선언 

- 열거 타입은 관례적으로 첫 문자를 대문자로 하고 나머지는 소문자로 구성한다. 

2. 열거 타입 변수 

- 열거 타입도 하나의 데이터 타입이므로 변수를 선언하고 사용해야 한다. 

		Week today = Week.SUNDAY;

- 열거 상수는 단독으로 사용할 수 없고 반드시 열거타입.열거상수로 사용된다. 

- 열거 타입 변수는 null 값을 저장할 수 있는데 열거 타입도 참조 타입이기 때문이다.

- 열거 상수도 SUNDAY는 Week객체이다.  

 

3. 열거 객체의 메소드

리턴 타입  메소드(매개 변수) 설명 
String name() 열거 객체의 문자열을 리턴
int ordinal() 열거 객체의 순번(0 부터 시작)을 리턴
int compareTo() 열거 객체를 비교해서 순번 차이를 리턴
열거 타입 valueOf(String name) 주어진 문자열의 열거 객체를 리턴
열거 배열 values 모든 열거 객체들을 배열로 리턴 

[실습]

package ch05homework;

public class EnumMethodExample {

	public static void main(String[] args) {
		Week today = Week.SUNDAY;
		String name = today.name();
		System.out.println(name);
		
		int ordinal = today.ordinal();
		System.out.println(ordinal);
		
		Week day1 = Week.MONDAY;
		Week day2 = Week.WEDNESDAY;
		int result1 = day1.compareTo(day2);
		int result2 = day2.compareTo(day1);
		System.out.println(result1);
		System.out.println(result2);
		
		if(args.length == 1) {
			String strDay = args[0];
			Week weekDay = Week.valueOf(strDay);
			if(weekDay == Week.SATURDAY || weekDay == Week.SUNDAY) {
				System.out.println("주말 이군요");
			} else {
				System.out.println("평일 이군요");
			}
		}
	
		Week[] days = Week.values();
		for(Week day : days) {
			System.out.println(day);
		}
	}

}