JAVA/이것이 자바다

이것이 자바다 Ch 5 참조 타입

본이qq 2022. 9. 5. 12:41

1. 데이터 타입 분류 

 - 프로그램이 하는 일은 결국 데이터를 처리하는 일이다. 따라서 데이터를 얼마나 잘 다루느냐가 좋은 프로그램을 작성할 수 있는 관건이다.

 - 자바의 데이터 타입에는 크게 기본 타입(원시타입 : primitive type)과 참조 타입(reference type)으로 분류된다. 

 - 기본 타입은 정수, 실수, 문자, 논리 리터럴을 저장하는 타입이다.

 - 참조 타입은 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 말한다. 

 - 변수는 스택 영역에 생성되고, 객체는 HEAP 영역에 생성된다. 

 - 기본 타입의 변수들은 스택에 값을 직접 저장하고 있지만, 참조 타입의 변수들은 HEAP 영역에 저장된 객체의 주소값만 저장하고 있다. 

 

2. 메모리 사용 영역 

 - java.exe로 JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역을 세부 영역으로 구분해서 사용한다. 

 - 1)메소드 영역 : 코드에서 사용되는 클래스(.class)들을 클래스 로더로 읽어 클래스별로 런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장한다. 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다. 

 - 2)힙(Heap) 영역 : 힙 영역은 객체와 배열이 생성되는 영역이다. 이들은 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 JVM은 쓰레기 수집기를 실행시켜 힙 영역에서 자동으로 제거한다. 

 - 3)JVM 스택(Stack) 영역 : JVM 스택 영역은 스레드마다 하나씩 존재하고 스레드가 시작될 때 할당된다. 자바 프로그램에 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재하므로 스택도 한 개 이다. 변수가 생성되는 공간이다. 

 

3.Null과 NullPointerException

- 참조 타입 변수는 힙 영역의 객체를 참조하지 않는 다는 뜻으로 null값을 가질 수 있다. null값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다. 

-참조 타입 변수가 null값을 가지고 있을 경우, 참조 타입 변수는 사용할 수 없다. (참조하고 있는 객체가 없기 때문)

  -> NullPointerException 예외 발생 

 

4.String

- String name1 = "문자열"; String name2 = "문자열";  --> 동일한 String 객체를 참조하고 있음

- String name1 = new String("문자열"); String name2 = new String("문자열"); --> 서로 다른 String 객체를 참조한다. 

 

5. 배열 선언

- 타입 [] 변수; 타입 변수 []; 로 선언한다. 

- 배열 변수도 참조 변수에 속하기 때문에 null값으로 초기화가 가능하다. 

-마찬가지로 배열 변수가 null값인데 변수[인덱스]로 값을 읽거나 저장하려고 하면 NullPointerException 예외가 발생한다. 

-String [] names = {"홍길동", "홍길서", "홍길남"}; 로 생성 가능

     -> 배열 객체들을 힙에 생성하고, 배열 객체의 번지를 리턴한다. 

- 타입 [] 변수; 

  변수 = {값0, 값1, 값2, 값3, 값4, 값5 };       -->배열 변수를 이미 선언한 후에 다른 실행문에서 중괄호를 사용한 배열 생성은 허용 X

  변수  = new 타입 [] {값0, 값1, 값2, 값3, 값4, 값5 }; --> O 

- String [] names = null;

  names = new String[] {값0, 값1, 값2, 값3, 값4, 값5 }; --> O

- int [] scores = new int[30]; 

   --> scores[0] ~ scores[29] 까지 모두 기본값 0으로 초기화된다.  (*String 배열은 모두 null값으로 초기화됨) 

 

6.다차원 배열 

- 행과 열로서 구성된 배열을 2차원 배열이라고 한다. 

- int[][] scores = new int[2][3]; ---> 2행 x 3열 행렬의 배열이 생성됨 

-배열 변수인 scores는 길이 2인 배열 A를 참조한다. 배열 A의 scores[0]은 다시 길이 3인 배열 B를 참조한다. scores[1]도 길이 3인 배열 C를 참조한다. 

-int[][] scores = new int[2][];

 scores[0] = new int[2]; 

 scores[1] = new int[3];  -->scores[0]은 길이 2인 배열을 참조, scores[1]은 길이 3인 배열을 참조한다. 

-타입 [][] 변수 = {{값1, 값2 ...}, {값1, 값2 ....}};

 int [ ][ ] scores = {{95,80}, {92,96}}; -->scores[0]은 {95,80} 배열을 참조하고, scores[1]은 {92,96} 배열을 참조한다. 

 

7. 배열 복사 

-for문을 사용하거나 System.arraycopy() 메소드를 사용하면 된다. 

-System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

  --> src는 원본 배열, srcPos는 원본 배열에서 복사할 항목의 시작 인덱스, dest는 새 배열, destPos는 새 배열에서 붙여넣을 시작 인덱스, length는 복사할 개수 

 

8. 열거 타입

- 데이터 중에는 몇 가지 한정된 값만을 갖는 경우가 흔히 있다. 예를 들어 월화수목금토일, 봄여름가을겨울

 이와 같이 한정된 값만을 갖는 데이터 타입이 열거 타입이다. 

- 열거 타입의 선언을 위해서는 먼저 열거 타입이름으로 소스 파일(.java)를 생성한다. 첫문자는 대문자로하고 나머지는 소문자로 한다. 

- 열거 타입의 값인 열거 상수는 대문자로 작성하면된다.

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

- 열거 상수가 여러개의 단어로 이루어진 경우에는 '_'로 구분한다. 

public enum LoginResult{LOGIN_SUCCESS, LOGIN_FAILED}

- 열거 타입 변수를 사용하기 위해선 일반 변수 선언처럼 선언하고 사용하면 된다.

  Week today = Week.SUNDAY;

 

9.열거 객체의 메소드 

-모든 열거 타입은 생성시에 java.lang.Enum 클래스를 상속한다. (Enum클래스의 메서드 사용가능)
- name() -> 열거 객체의 문자열을 리턴 

  ordinal() ->열거 객체의 순번(0부터)을 리턴

  compareTo() -> 열거 객체를 비교해서 순번 차이를 리턴 

  valueOf(String name) -> 주어진 문자열의 열거 객체를 리턴 

  values() -> 모든 열거 객체들을 배열로 리턴