Language/Java

Java - 참조 타입 복습

둉이 2021. 6. 19. 23:13

 

데이터 타입

- 기본 타입(Primitive Type)

: 정수, 실수, 문자, 논리 리터럴을 저장하는 타입

- 참조 타입(Reference Type)

: 객체의 번지를 참조하는 타입 = 배열, 열거, 클래스, 인터페이스 등 + 문자열(String)

→ 차이점

   1. 기본 타입(일반 변수)는 값을 스택 영역에 저장하고, 참조 타입(객체)은 값을 힙 영역에 저장, 스택 영역에는 번지를 저장

   2. 참조 타입 변수는 null로 초기화 가능

 

 

메모리 사용 영역

1. 메소드 영역

: 코드에서 사용되는 클래스를 클래스 로더로 읽어 클래스별로 런타임 상수풀, 필드/메소드 데이터, 메소드/생성자 코드 등을 분류하여 저장

→ 모든 스레드가 공유

2. 힙 영역

: 객체와 배열이 생성되는 영역

3. JVM 스택 영역

: 메소드를 실행할 때마다 프레임 추가, 메소드가 종료되면 해당 프레임 제거

프레임 내부에는 로컬 변수 스택 존재하는데, 기본 타입 변수와 참조타입 변수가 추가되거나 제거됨

변수는 선언된 블록에서만 스택에 존재하고 블록을 벗어나면 제거

→ 각 스레드마다 하나씩 존재

 

 

문자열 객체(String)

1. new 연산자를 사용하여 객체를 생성하면 같은 값을 가지는 경우에도 같은 힙 영역을 참조하지 않음

ex) String name1 = "둉이", name2 = "둉이", name3 = new String("둉이");

     // name1과 name2는 같지만 name3과는 같지 않음

2. 값에 null을 대입하면 더이상 힙 영역을 참조하지 않음

 

 

배열 객체

1. 같은 타입의 데이터를 연속된 공간에 나열하고 인덱스를 부여한 자료구조

2. 길이가 고정되어 있음(리스트와의 차이점)

3. 값을 직접 대입하는 방식과 new 연산자를 사용하여 선언하는 방식이 있음

   ex) String[] arr = new String[] {값1, 값2, ...}, arr2 = {값1, 값2, ...};  // 값의 개수에 따라 배열 길이가 자동으로 설정됨

4. 배열을 매개변수로 하는 메소드에 값을 넘겨줄 때는 반드시 new 연산자를 사용해야 함

5. 값을 넣기 전에 배열의 길이를 정해주고 싶다면 new 연산자에 값을 지정하여 선언

   ex) String[] arr = new String[5];

   → int 타입의 배열은 0, String 타입의 배열은 null로 초기화됨

6. 배열의 길이는 .length 사용

7. 배열 복사는 System.arraycopy() 메소드 이용

   : System.arraycopy(원본 배열, 복사를 시작할 인덱스, 새 배열, 새 배열의 복사 시작 인덱스, 복사할 갯수)

   ex) System.arraycopy(arr1, 0, arr2, 0, arr.length)

 

 

다차원 배열

1. 2차원 배열은 메모리 내 힙 영역에 3개의 배열 객체를 생성

   ex) int[][] scores = new int[2][3]; 

       // size = 2인 차원 저장 배열 + size = 2인 행 저장 배열 + size = 3인 열 저장 배열 총 3개 생성

 

 

열거 타입(enum)

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

  ex) public enum Week { MONDAY, THUSDAY, WEDNESDAY, THURSDAY, ... }

1. 열거 타입을 이용한 선언

    ex) Week today;

2. 열거 타입 변수에 상수 저장

   ex) today = Week.SUNDAY;

3. 열거 타입으로 선언된 변수는 null값을 가질 수 있음

 

 

열거 객체의 메소드

1. name() 메소드

: 열거 객체가 가지고 있는 문자열 리턴

  ex) Week today = Week.SUNDAY;

       String name = today.name();  // name = "SUNDAY"; 와 같음

2. ordinal() 메소드

: 열거 객체 중 몇 번째인지 인덱스를 알려줌

3. compareTo() 메소드

: 열거 객체들끼리 몇 번째에 있는지 상대적으로 비교

  ex) Week day1 = Week.MONDAY, day2 = Week.WEDNESDAY;

       int result = day1.compareTo(day2);  // -2 리턴(day1 - day2)

4. valueOf() 메소드

: 문자열을 열거 객체로 리턴

5. values() 메소드

: 열거 타입의 객체들을 배열로 리턴

 

 

Calendar

: 날짜와 시간을 얻을 수 있는 클래스

1. 객체 선언

   ex) Calendar now = Calendar.getInstance();

2. 날짜 및 시간 가져오기

   ex) now.get(Calendar.YEAR);  // 년도 가져오기

 

 


 

 

날짜 관련 클래스들은 나중에 따로 정리해서 공부해야 겠다. 오늘은 시간이 늦었으니 여기까지 ㅜㅜ