본문 바로가기
JAVA

백기선 자바 스터디 2주차

by 소고기 굽는 개발자 2023. 6. 26.

자바 데이터 타입, 변수 그리고 배열

목표

자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

프리미티브 타입 종류와 값의 범위 그리고 기본 값

프리미티브 타입 종류

  타입
논리형  boolean
문자형  char
정수형  byte, short, int, long
실수형  float, double

값의 범위 및 기본값

  타입 기본값 값의 범위 데이터 표현 범위
논리형 boolean FALSE  false, true 1byte
문자형 char \u0000  0 ~ 65,535 2byte
정수형 byte 0  -128 ~ 127 1byte
short 0  -32,768 ~ 32,767 2byte
int 0  -2,147,483,648 ~ 2,147,483,647 4byte
long 0L  -9,223,372,036,854,775,808 ~  9,223,372,036,854,775,807 8byte
실수형 float 0.0f  (3.4 X 10-38) ~ (3.4 X 1038) 의 근삿값 4byte
double 0.0  (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 8byte

프리미티브 타입과 레퍼런스 타입

프리미티브 타입(Primitive Type)
기본값이 있기에 null이 존재하지 않습니다.
값이 할당되면서 JVM Runtime Data Area 영역 중 Stack 영역에 값이 저장됩니다.
값의 범위를 벗어나면 컴파일 에러가 발생합니다.


레퍼런스 타입(Reference Type)
프리미티브 타입을 제외한 모든 타입은 참조형 타입이며, 빈 객체를 의미하는 null이 존재합니다.
JVM Runtime Data Area 영역 중 Stack 영역에 주소값이 저장되고, 그 주소의 실제 값은 힙(heap)영역에 저장됩니다.


타입 속도 차이

출처- https://www.baeldung.com/java-primitives-vs-objects

프리미티브 타입의 값은 Stack 영역에 존재하고, 레퍼런스의 값은 Heap 영역에 존재합니다.
그러다 보니 레퍼런스 값은 값이 필요할 때마다 Unboxing을 하는 과정을 거쳐야 합니다.
그래서 프리미티브 타입에 비해 접근 속도가 느려집니다.
하지만 예외적으로 엄청 큰 숫자를 복사한다면 참조값만 넘기는 레퍼런스 타입이 좋을 수도 있습니다.


리터럴

프로그래밍에서 상수는 변경할 수 없는 변수를 의미합니다.
상수를 사용하는 이유는 다음과 같습니다.

1) 어떤 값이 어떤 의미를 갖는 지를 이해하기 쉽게 전달

2) 공통적으로 적용할 것


예를 들어, 프로필 이미지를 저장할 때 C:/Images/Profile보단 profileImagePath라는 변수로 설정하면 "프로필 사진 경로"라는 명칭으로 명확히 이해할 수 있게 됩니다.
또한 프로필 사진을 저장할 때 위의 변수만을 사용해 개발자간의 프로필 사진 경로의 오해를 없앨 수 있습니다.


변수 선언 및 초기화하는 방법

변수 선언

String adress;

변수 선언 방법은 변수 타입과 변수명을 함께 작성하는 것입니다.
변수 타입은 변수에 담는 값의 성질과 직접적으로 연관되어 있어, 어떤 값을 변수에 담느냐에 따라 변수 타입을 결정해야 합니다.


변수 초기화

String address; // 변수 선언

address = "MungRun"; // 변수 초기화

String adress1 = "Busan"; // 변수 선언 및 초기화

변수 초기화는 변수 선언 후 변수를 초기화하는 방법이 있고, 변수 선언과 함께 초기화를 하는 방법이 있습니다.


String address, address1;

한 문장에 여러 개의 변수를 선언하는 방법도 있지만 추천되진 않습니다.


변수 스코프와 라이프타임

변수 스코프
변수를 사용할 수 있는 범위를 이야기합니다.
보통 중괄호({}) 안에서 변수를 선언했을 경우 영역이 끝나기 전까지는 어디서든 사용할 수 있습니다.


자바 변수

public class Test{
    int instanceVar; // 인스턴스 변수
    static int classVar; // 클래스 변수

    void method(){
        int localVar; // 지역 변수
    }
}

전역 변수(Global Variable)

클래스 변수(static 멤버)

클래스내 static 키워드로 선언된 변수를 말합니다.

JVM이 실행되어 클래스가 메모리에 올라간 후 종료될 때 까지 유지됩니다.

동일한 클래스의 모든 객체들에 의해 공유됩니다.


인스턴스 변수(instance)

클래스 영역에서 선언되어, 객체가 생성 될 때마다 만들어집니다.


지역 변수(Local Variable)
특정 스코프내에서 생성되어 그 스코프 안에서만 사용 가능합니다.


변수의 종류 선언위치 생성시기(메모리 할당 시기)
클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수 인스턴스가 생성될 때
지역 변수 클래스 이외의 영역(메서드, 생성자, 초기화, 블럭) 변수 선언문이 수행되었을 때

타입 변환, 캐스팅 그리고 타입 프로모션

타입 변환
변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 말합니다.


형변환 방법

(type) operand // (변환할 타입) 피연산자

변환할 변수나 리터럴 앞에 타입을 괄호와 함께 붙여주기만 하면 형변환이 완료됩니다.
이때, 형변환 연산자는 그저 피연산자의 값을 읽어서 지정된 타입으로 형변환하고 그 결과를 반환할 뿐이기에 기존의 변수나 리터럴은 변환되지 않습니다.

double value = 123.456;
int score = (int) value;

기본형(primitive type) 변수는 boolean을 제외한 나머지 타입은 서로 형변환이 가능합니다.


단점
타입간 각각이 가지는 범위(크기)가 다르기에 형변환을 통해 크기의 차이만큼 값이 잘려나가 손실이 발생할 수 있습니다.


자동 형변환
경우에 따라서 형변환을 생략할 수 있습니다. 그래도, 컴파일러가 생략된 형변환을 자동으로 추가합니다.

byte b = 10000; // 에러 발생
byte c = (byte)10000;

byte b = 10000;의 경우 에러가 발생합니다. 왜냐하면 byte의 범위는 -128 ~ 127 이기 때문입니다.
byte c = (byte)10000;는 명시적으로 형변환을 진행해 에러가 발생하지 않습니다.
참고로 c의 결과 값은 16입니다.

계산식은 ChatGPT의 응답으로 추론해 만들어 보았습니다.

1. 10000의 이진수 = 10011100010000
2. 10000의 이진수 int 범위로 표현 = 00000000 00000000 00100111 00010000
3. 10000의 이진수 int 범위로 표현에서 byte 로 형변환 = 00010000
4. 00010000의 십진수 = 16

계산 결과를 보면 명시적으로 선언한 값도 데이터의 손실이 발생합니다.


자동 형변환 규칙

기존의 값을 최대한 보전할 수 있는 타입으로 자동 형변환이 됩니다.

그래서 표현 범위가 좁은 타입에서 넓은 타입으로 형변환을 할 때 손실이 없기에 두 타입 중 표현 범위가 더 넓은 쪽으로 형변환이 됩니다.


1차 및 2차 배열 선언하기

1차 배열 선언

int[] array;
int array[];

위처럼 자바의 배열 선언 방법은 2가지입니다.
선언되었을 때 기본 배열 값은 null이며, 이후 초기화를 하면 배열의 주소가 할당되어 사용할 수 있게 됩니다.


2차 배열 선언

int[][] array;
int array[][];

[]를 추가해주는 것 만으로도 2, 3차원 배열을 구성할 수 있습니다.


출처(참고문헌)

백기선 자바 스터디 2주차

'JAVA' 카테고리의 다른 글

백기선 자바 스터디 8주차  (0) 2023.08.31
백기선 자바 스터디 6주차  (0) 2023.08.15
백기선 자바 스터디 4주차  (0) 2023.07.18
백기선 자바 스터디 3주차  (0) 2023.07.12
백기선 자바 스터디 1주차  (0) 2023.06.22