천천히 빛나는

Java 기초 : 변수 본문

JAVA/JAVA

Java 기초 : 변수

까만콩 •ᴥ• 2023. 7. 21. 18:37

 

리터럴(literal) & 변수

리터럴: 변하지 않는 데이터(값)

변수: 값을 담을 수 있는 공간

int age = 30;
final int MAX_AGE = 100;
String str = "text";

왼쪽(age)가 변수, 오른쪽(30)이 리터럴이다

 

RAM이라는 메모리 공간 (유한한 공간)에 변수를 할당할 때 많은 메모리를 차지않도록 담고자 하는 리터럴 크기에 맞는 절절한 타입을 지정해주어야 한다.

 

 

- 리터럴

실제 코드에서 확인하기 위해서 프로젝트와 클래스를 생성하였다 (https://shine-slowly.tistory.com/12)

여기서 com.greedy.section.leteral의 경우에는 패키지이다.

패키지는 클래스의 모음집이다. 이름이 충돌하는 클래스들이 있을 수 있는데 이럴 때 패키지 기능을 사용하여 클래스의 이름이 충돌되는 것을 방지할 수 있다. 보통 서로 관련된 클래스끼리 묶어서 효율적으로 관리할 수 있게 한다.  같은 클래스여도 폴도로 분리하여 서로 다른 패키지에 존재하는 것이 가능하다. 하나의 소스파일에는 오직 하나의 패키지만 선언이 가능하다.

단축어 psvm을 잊지마세요!

package 패키지이름;

 

리터럴을 출력해보았다. 문자 형태의 값은 작은 따옴표 ' (single-quotation)를 사용하는데, 두 개 이상의 문자는 문자로 취급하지 않기 때문에 오류가 난다. 또한 아무 문자도 기록되지 않는 경우는 컴파일 에러가 발생한다.

자바는 유니코드 기반이므로 '김'과 같은 한글 한글자도 문자로 받아준다.

 

문자열은 큰 따옴표 " (double-quotaion)을 사용한다.

여기서 'a'와 "a'는 다른데, 'a'와 같은 경우는 아스키코드나 유니코드 기반으로 숫자로 치환을 하지만 문자열은 객체의 주소값이다.

 

문자열 이후 부터는 모두 문자열로 인식이 되는데, 만약 숫자의 합이 필요하다면 소괄호 ()를 이용하여 우선순위를 높여줘야 한다.

 

 

- 변수

정수는 일반적으로 int로 설정한다. 실수형은 double을 기본으로 한다. 바이트는 암기하는 것이 좋다.

 

int가 약 21억까지 표현을 하기 때문에 21억이 넘어가는 정수는 L을 붙이는 것이 좋으며 float 형은 f를 붙이는 것이 좋다.

암기하면 좋은 것들

byte -128 ~ 127
int -2,147,483,648 ~ 2,147,483,647

byte -> short -> int -> long

 

비트 수가 8이면 맨 앞은 부호비트이므로 -2^7~2^7-1이 값의 범위가 된다.

 

상수 (Constant)

변수와 동일하게 데이터를 저장할 수 있는 공간이다. 하지만 저장된 데이터를 변경할 수 없다. 보통 상수명은 대문자로 작성한다.

ex) 수학 공식에 사용되는 수칙, 프로그램의 기본 환경설정 정보(DB 정보, IP 주소정보 등)

 

final을 앞에 적으면 상수로 선언된다.

 

 

데이터 형변환 (Type Casting)

화살표 방향으로만 데이터 형변환이 가능하다.

char는 부호가 없기 때문에 short와 형변환이 불가능하다. (음수에선 short 범위가, 양수에선 char 범위가 크다)

byte i = 1;

자바는 기본적으로 정수를 원래 int 형으로 인식한다. 하지만 왼쪽은 byte이다. int를 byte, short로 변환하는 것은 예외적으로 가능하다. 다른 경우는 자바가 자동으로 해주지 않는다.

 

byte bNum = 1;
short sNum = 1;
int iNum = bNum + sNum;
// int iNum = (int)((short)bNum + sNum);

bNum + sNum은 short 형으로 자동 변환되고 int iNum에 저장되므로 int형으로 자동변환된다

주석은 자바가 자동형변환을 해주지 않을 경우 작성되는 코드이다

 

long num = 20L;

L을 붙이면 20L은 처음부터 long 형이다. int 형이 아니다. 그렇기 때문에 float형 변수에 4.0과 같은 수로 초기화 하는 것은 불가능하다. 4.0은 자바에서 기본적으로 double 형이기 때문이다.

 

double height = 175.5;
int floorHeight = (int)height; // 175
System.out.println("height: " + height);
System.out.println("버림: " + (int)Math.floor(height)); // 175

 

 

primitive는 primitive끼리, reference는 reference끼리 형 변환이 가능하다. boolean은 다른 기본 형과 호환되지 않는다.

그래서 c++과 다르게 boolean b = 1;과 같이 작성할 수 없게 된다. 기본형과 참조형의 형 변환을 위해 Wrapper 클래스를 사용한다. Wrapper 클래스는 8개가 된다. (위에서 서술한 자료형 타입)

 

byte b1 = 10;
byte b2 = 20;
// TODO: 다음에서 발생하는 오류를 읽고 원인을 말한 후 수정하시오.
byte b3 = b1 + b2;

b1과 b2를 더하면 정수형으로 자동 형변환이 일어나게 된다. 더해진 결과가 byte에 다시 할당되려고 하기 때문에 오류가 발생하게 된다. 피연산자의 크기가 int 미만이면 int로 변경한 후 연산을 진행하게 된다.

 

 

오버플로우 (Overflow)

public class Lang_01 {
    public static void main(String[] args) {
        int i1 = Integer.MAX_VALUE;

        int i2 = i1 + 1;
        
        System.out.println(i2); // 오버플로우
    }
}

-2147483648가 출력되게 된다. int의 정수범위를 벗어나서 오버플로우가 발생했다.

 

 

 

 

 

'JAVA > JAVA' 카테고리의 다른 글

Java 기초 : 제어문  (0) 2023.07.25
Java 기초 : 메소드와 API  (0) 2023.07.25
IntelliJ : 프로젝트 생성 (Hello World 출력)  (0) 2023.07.18
Java, IntelliJ : 개요 및 개발환경 구축  (0) 2023.07.15
자바 vs 자바스크립트  (0) 2023.07.14