JAVA 3주차

ndy·2022년 9월 19일

Java

목록 보기
3/10

5장 데이터 타입 분류


메모리 사용 영역

  • JVM은 OS에서 할당받은 메모리 영역을 세 영역으로 구분

메소드 영역

JVM을 시작할 때 생성
로딩된 클래스 바이트 코드 내용을 분석후 저장
모든 스레드가 공유

힙 영역

JVM을 시작할 때 생성
객체/배열 저장
사용되지 않는 객체는 GC(Garbage Collection)가 자동 제거

JVM 스택

스레드별로 생성
메소드를 호출할 때마다 Frame을 스택에 추가(push)
메소드가 종료하면 Frame을 제거(pop)

기본 타입 변수는 스택에 데이터가 저장됨

char v1 = 'A';
int v2 = 100;
double v3 = 3.14;
boolean v4 = true;

참조 변수는 스택에 힙 영역의 번지가 저장됨

String name1 = new String("신용권");
String name2 = new String("신용권");

참조 변수의 == != 연산

refVar1 == refVar2 // false 
refVar1 != refVar2 // true

refVar2 == refVar3 // true
refVar2 != refVar3 // false

null

  • 변수가 참조하는 객체가 없을 경우 초기값으로 사용 가능
  • 참조 타입 변수에만 저장가능
  • null로 초기화된 참조 변수는 스택 영역 생성

refVar2 == null // true

NullPointerException

  • 참조 변수가 null 값을 가지고 있을 때, 객체의 필드나 메소드를 사용하려고 했을 때 발생
int[] intArray = null;
int Array[0] = 10; // NullPointerException

String str = null;
System.out.println("총 문자수 : " + str.length()); // NullPointerException

String 타입

  • 문자열을 저장하는 클래스 타입
String name1 = "신용권";
String name2 = "신용권";

name1 == name2; // true
name1.equals(name2); // true

String name1 = new String("신용권");
String name2 = new String("신용권");

name1 == name2; // false
name1.equals(name2); // true


배열

  • 같은 타입의 데이터를 연속된 공간에 저장하는 자료구조
  • 각 데이터 저장 위치는 인덱스를 부여해서 접근할 수 있다.
int[] intArray;
double[] doubleArray;
String[] strArray;

int intArray[];
double doubleArray[];
String strArray[];
  • 배열 변수는 참소 변수이므로 배열이 생성되기 전에 null로 초기화 가능
int[] intArray = {1, 2, 3}; // 변수 선언과 동시에 값 목록 대입

int[] intArray;
intArray = new int[]{1, 2, 3}; // 변수 선언 후 값 목록 대입

new 연산자로 배열 생성

  • 배열 생성시 값 목록을 가지고 있지 않고 향후 값들을 저장한 배열을 미리 생성하고 싶을 경우
int[] intArray = new int[5]; // int값 5개 저장 가능
// 인덱스 0~4까지 저장


타입 별 항목의 기본값

int[] scores = new int[10]; // [ 0 0 0 0 0 0 0 0 0 0 ]

배열의 길이

  • 코드에서 배열의 길이를 얻는 방법
int[] intArray = {10, 20, 30};
int num = intArray.length; // num = 3
  • 커맨드 라인 입력

다차원 배열

  • 2차원 배열 이상을 다차원 배열이라고 함
int[][] scores = new int[2][3] // 

score.length	// 2 (배열 A)
score[0].length	// 3 (배열 B)
score[1].length	// 3 (배열 C)
  • 계단식 구조의 2차원 배열
int[][] scores[2][];	// 2차원 배열을 정하지 않음
scores[0] = new int[3];
scores[1] = new int[5];

//int[][] scores[2][3]는 2차원 배열을 각각 따로 배열 길이 지정 불가능
  • 값 목록을 이용한 다차원 배열
int [][][] scores = 

{	{	{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}	},
	{	{11, 12, 13, 14, 15}, {16, 17, 18, 19, 20}	}
};

// scores[2][2][5]

객체를 참조하는 배열

- `기본 타입` : 각 항목에 <span style="color: LightPink">직접 값</span>을 가짐
- `참조 타입` : 각 항목에 <span style="color: LightPink">객체의 번지</span>를 가짐
String[] strArray = new String[3];

strArray[0] = "java";
strArray[1] = "C++";
strArray[2] = "C#";

System.arrayCopy()를 이용한 배열 복사

String[] oldStrArray = {"java", "array", "copy"};
String[] newStrArray = new String[5];

System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
/* 
(옮겨질 배열, 옮겨질 배열의 시작 인덱스, 옮겨넣을 배열, 
옮겨넣을 배열의 시작 인덱스, 옮겨 넣을 배열의 길이) 
*/

향상된 for 문

int[] scores = {95, 71, 84, 93, 87};

int sum = 0;
for (int score : scores){
	sum = sum + score;
}

열거 타입

  • 한정된 값만을 갖는 데이터 타입
  • 한정된 값은 열거 상수(Enumeration Constant)로 정의

열거 타입 선언

  • 열거 타입 소스 파일 생성 : ~.java

    • 열거 타입 이름의 첫 문자는 대문자로 작성

      Week.java
      MemberGrade.java
  • 소스 작성 방법

public enum Week {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,
					SATURDAY, SUNDAY}

0개의 댓글