KoreanFoodie's Study

5. 자바 참조 타입 : 데이터 타입과 메모리 본문

Tutorials/Java

5. 자바 참조 타입 : 데이터 타입과 메모리

GoldGiver 2021. 9. 14. 14:39

데이터 타입

데이터 타입은 primitive type과 reference type(참조 타입)으로 나뉜다. 참조 타입이란 객체의 번지를 참조하는 타입으로, 배열, 열거, 클래스, 인터페이스 타입이 이에 해당된다.

자바는 배열의 주소를 스택 영역에, 실제 데이터 값은 힙 영역에 할당한다.

 

메모리 사용 영역

JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)를 다음과 같이 구분해서 사용한다.

자바 메모리 영역

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

2. 힙(Heap) 영역 : 객체와 배열이 저장된다. 참조하는 변수나 필드가 없다면 JVM이 가비지 콜렉터를 실행시켜 힙 영역에서 자동으로 제거한다.

3. JVM 스택(Stack) 영역 : JVM 스택 영역은 각 스레드마다 하나씩 스레드가 시작될 때 할당된다. JVM 스택은 메소드를 호출할 때만다 프레임(Frame)을 추가(push)하고, 종료되면 해당 프레임을 제거(pop)한다. 예외 발생 시 printStackTrace() 메소드로 보여주는 Strack Trace의 각 라인은 하나의 프레임을 표현한다.

 

스트링 타입 (String)

문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다. 자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있다.

String name1 = "나나나";
String name2 = "나나나";

하지만 new 연산자를 쓰면 새로운 객체를 만들 수 있다.

String name1 = new String("ME");
String name2 = new String("ME");

위의 경우, name1과 name2는 서로 다른 String 객체를 참조한다.

String 비교 시에는 반드시 .equals() 메소드를 사용하자. '==' 연산자는 객체의 번지가 동일한지를 검사하기 때문이다!

// Garbage Collertor
String hobby = "Travel";
hobby = null;

위의 경우, hobby라는 객체가 참조하는 것이 null 이므로, 가비지 컬렉터가 이를 메모리에서 자동 제거한다.

 

배열 복사하기

배열을 복사는 방법에는 여러가지가 있지만, 기본적인 System.arraycopy() 메소드부터 알아보자. 인자는 다음과 같다.

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

따라서 다음과 같이 사용하면 된다.

System.arraycopy(src1, 0, src2, 0, src1.length);

 

열거 타입

한정된 값만을 갖는 데이터 타입이 열거 타입(enumeration type)이다. 열거 타입은 몇 개의 열거 상수(enumeration constant) 중에서 하나의 상수를 저장하는 데이터 타입이다.

 

열거 타입 선언

열거 타입을 선언하기 위해서는 먼저 열거 타입의 이름을 정하고 열거 타입 이름으로 소스 파일(.java)를 생성해야 한다. 단어 첫 문자는 대문자로 하는 것이 관례이다.

Week.java
MemberGrade.java
ProductKind.java

아래는 Week 열거 클래스의 예시이다.

public enum Week
{	
    MONDAY, // 각각은 열거 상수
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

열거 상수는 열거 객체로 생성되는데, Week의 경우 MONDAY부터 SUNDAY까지 열거 상수는 총 7개의 Week 객체로 생성된다. 그리고 각각의 열거 상수가 Week 객체를 참조하게 된다.

// today에 저장되는 값은 Week.SUNDAY 열거 상수가 참조하는 객체의 번지이다.
// 따라서 열거 상수 Week.SUNDAY와 today 변수는 서로 같은 Week 객체를 참조하게 된다.
Week today = Week.SUNDAY;
// today == Week.SUNDAY // true

 

자바는 Date, Calendar, LocalDateTime 등의 클래스를 제공한다.

import java.util.Calendar;

public class EnumWeekExample
{
	public static void main(String[] args)
    {
    	Week today = null;
        
        Calendar cal = Calendar.getInstance();
        int week = cal.get(Calendar.DAY_OF_WEEK); // 일(1) ~ 토(7) 까지의 숫자를 리턴
    }


}

 

열거 객체의 메소드

메소드는 java.lang.Enum 클래스에 선언된 메소드인데, 모든 열거 타입은 컴파일 시에 Enum 클래스를 상속하게 되어 있기 때문에, 다음과 같은 메소드를 사용 가능하다.


해당 포스팅은 이것이 자바다 (신용권 저) 를 참고하였습니다

 

 
Comments