elevne's Study Note

Java (Primitive Type, Reference Type ~) 본문

Backend/Java

Java (Primitive Type, Reference Type ~)

elevne 2023. 4. 25. 21:21

Java 에는 byte, short, int, long, float, double 그리고 char, boolean 8 개의 기본 데이터 타입이 있다.

 

 

 

public class Main {
    public static void main(String[] args) {

        System.out.println(Byte.MAX_VALUE);
        System.out.println(Byte.MIN_VALUE);

        System.out.println(Short.MAX_VALUE);
        System.out.println(Short.MIN_VALUE);

        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);

        System.out.println(Long.MAX_VALUE);
        System.out.println(Long.MIN_VALUE);

        System.out.println(Float.MAX_VALUE);
        System.out.println(Float.MIN_VALUE);

        System.out.println(Double.MAX_VALUE);
        System.out.println(Double.MIN_VALUE);
        
    }
}

 

 

result

 

 

 

위와 같이 최대값, 최소값 상수의 크기를 확인해볼 수 있다.

 

 

 

Java 에서 ~ 는 비트 반전 연산자로 사용된다. 이는 정수타입 (byte, short, int, long) 에만 사용되며, 피연산자를 2 진수로 표현했을 때 비트값인 0 을 1 로, 1 은 0 으로 반전한다. (부호 비트인 최상위 비트를 포함해서 모든 비트가 반전되기 때문에 부호가 반대인 새로운 값이 산출된다) 

 

 

 

public class Main {
    public static void main(String[] args) {

        int value = 10;
        System.out.println(~value);
        
    }
}

 

 

 

 

 

>>, <<, >>> 는 비트 이동 연산자로 사용된다. a << b 는 정수 a 의 각 비트를 b 만큼 왼쪽으로 이동시킨다 (빈 자리는 0 으로) . a >> b 는 각 비트를 b 만큼 오른쪽으로 이동시킨다 (빈 자리는 정수 a 의 최상위 부호 비트와 같은 값으로). a >>> b 는 정수 a 의 비트를 b 만큼 오른쪽으로 이동시키고, 빈 자리를 0 으로 채운다. 

 

 

 

public class Main {
    public static void main(String[] args) {

        System.out.println(1 << 3);
        System.out.println(-8 >> 3);
        System.out.println(-8 >>> 3);

    }
}

 

 

result

 

 

 

데이터 타입에는 위에서 알아본 기본형(Primitive Type)과 다른 참조 타입(Reference Type)이 있다. 참조 타입이란 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 말한다. 기본 타입 변수들은 실제 값을 변수 안에 저장하지만, 참조 타입인 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리의 번지를 값으로 갖는다. (번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라 불림) 

 

 

 

 

 

 

변수는 스택 영역에 생성되고 객체는 힙 영역에 생성된다. 위의 Integer value 는 직접 값을 저장하고 있지만 String, Student 클래스는 힙 영역의 주소값을 갖고있다. 

 

 

 

 

 

 

java.exeJVM 이 시작되면 JVM 은 운영체제에서 할당받은 메모리 영역 (Runtime Data Area) 을 위와 같이 세부 영역으로 구분해서 사용한다. Method Area 에는 코드에서 사용되는 클래스 (~.class) 들을 클래스 로더로 읽어 클래스별로 Runtime constant pool, Field 데이터, Method 데이터, Method 코드, 생성자 코드 등을 분류해서 저장한다. Method Area 는 JVM 이 시작할 때 생성되고 모든 쓰레드가 공유하는 영역이다. 그 다음으로 Heap객체와 배열이 생성되는 영역이다. Heap 에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 이를 Garbage 로 취급하고 JVM 은 Garbage Collector 을 실행시켜 이들을 Heap 에서 자동으로 제거한다. JVM Stack 영역은 각 쓰레드마다 하나씩 존재하며 쓰레드가 시작될 때 할당된다. Java 프로그램에서 추가적으로 쓰레드를 생성하지 않았다면 main 쓰레드만 존재하므로 JVM 스택도 하나가 된다. JVM 스택은 메서드를 호출할 때마다 Framepush 하고 메서드가 종료되면 해당 프레임을 pop 하는 동작을 수행한다. (예외 발생 시 printStackTrace() 메서드로 보여주는 Stack Trace 의 각 라인은 하나의 Frame 을 표현하는 것)

 

 

 

main() 메서드는 String 배열을 인자로 받아서 실행된다. IntelliJ 에서는 이 배열의 값을 아래와 같이 할당해볼 수 있다.

 

 

 

 

 

result

 

 

Array 를 복사할 때는 System.arrayCopy 메서드를 사용한다. 

 

 

 

public class Main {
    public static void main(String[] args) {

        String[] oldStrArray = {"Java", "Python", "JS"};
        String[] newStrArray = new String[5];

        System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);

        for (int i = 0; i < newStrArray.length; i++){
            System.out.println(newStrArray[i]);
        }
    }
}

 

 

result

 

 

 

 

'Backend > Java' 카테고리의 다른 글

Java (try-with-resources)  (0) 2023.04.29
Java (Singleton, 접근제어, Annotation)  (0) 2023.04.26
Java Gson  (0) 2023.04.21
Java Enum  (0) 2023.04.19
Java Functional Interface  (0) 2023.04.18