My Melody Is Cute JAVA 기초 2-1
본문 바로가기

개발공부🌷/JAVA

JAVA 기초 2-1

 

상수(Constant) : 변하지 말아야 할 데이터를 임시로 저장하기 위한 수단

재할당이 금지된 변수

선언,할당은 가능하지만 재할당이 금지

상수는 final이라는 키워드를 사용해 선언할 수 있으며

관례로 대문자에 언더바(_)를 넣어 구분하는 SCREAMING_SNAKE_CASE를 사용합니다.

final double CALCULATOR_PI = 3.14;

 

상수를 사용하는 이유

재할당을 할 수 없는데 왜 사용할까? 

- 프로그램이 실행되면서 값이 변하면 안되는 경우

- 코드 가독성을 높이고 싶은 경우 = 값을 저장하고 있는 상수 명으로 값을 사용할 수 있기때문에 가독성 향상됨.

- 코드 유지 관리를 쉽게 하고자하는 경우

( 같은 값을 여러개의 코드에 사용했을때 수정하고자 할때 상수를 사용했다면 상수에 할당한 값만 변경하면 일일이 수정할 필요가 없음 )

 

타입이란?

타입은 어떤 값의 유형 및 종류를 의미

타입에 따라 값이 차지하는 메모리공간의 크기와 값이 저장되는 방식이 결정됨

- 메모리공간의 크기 ex) 정수형타입 = 4byte 문자형타입 = 1byte

- 값이 저장되는 방식

값을 그대로 저장하는 기본타입 / 값을 임의의 메모리공간에 저장후 그 메모리 공간의 주소를 저장하는 참조타입 

 

기본타입 (primitive type)

값을 저장할 때 데이터의 실제 값이 저장

정수타입(byte,short,int,long)

실수타입(float, double)

문자타입(char)

논리타입(boolean)

 

참조타입(reference type)

값을 저장할 때 데이터가 저장된 곳을 나타내는 주소값이 저장

객체의 주소를 저장,8개의 기본형을 제외한 나머지 타입

ex) 변수는 ~ 이다 = 기본타입의 데이터 / 변수는 23페이지에 설명되어있다 = 참조타입의 데이터

 

기본타입변수는 1이라는 값을 저장 (정수형)

출력(기본타입변수);의 결과는 저장하고 있는 값 1이 그대로 출력됨

 

참조타입변수는 무언가를 저장할 때 저장하고자 하는것이 존재하는 위치를 저장

예제의 객체는 참조타입의 데이터에 해당하고

객체를 변수에 저장하면 그 변수에는 객체가 존재하는 메모리 주소를 값으로 가짐

출력(참조타입변수);의 결과는 참조타입변수가 저장하고 있는 값 = 객체의 주소값이 출력됨

...
> Task :Main.main()
1
java.lang.Object@626b2d4a
...

 

primitive의 출력결과는 왜 1일까?

- 기본타입변수는 값을 그대로 저장하기 때문에 1이라는 값이 그대로 출력됨

reference의 출력결과 java.lang.Object@626b2d4a 가 의미하는 것은 무엇이며 왜 이러한 결과가 출력된것인가?

- 객체값은 참조타입변수이고 참조타입은 변수에 객체의 주소값이 저장되기 때문에 주소값이 출력됨

 

 

리터럴

리터럴이란?

사전적으로 리터럴(Literal) 문자 그대로의 라는 뜻프로그래밍에서 리터럴이란 문자가 가리키는 값 그자체를 의미함

class Main {
	public static void main(String[] args) {
		int num; // 변수 선언
		num = 1; // 값 할당
	}
}

num에 값을 할당하고 있는 1이 리터럴리터럴은 변수,상수에 할당할 수 있음

// 정수형 리터럴 20을 정수형 변수 currentAge에 할당
int currentAge = 20;

// 실수형 리터럴 3.14159를 실수형 변수 pi에 할당
double pi = 3.14159;

// 논리형 리터럴 true를 논리형 변수 boolean에 할당
boolean isGenius = true;

// 문자형 리터럴 'A'를 문자형 변수 firstAlphabet에 할당
char firstAlphabet = 'A';

// 문자열 리터럴 "CodeStates"를 문자열 타입 변수 learnedAt에 할당
String learnedAt = "CodeStates";

 

float 타입의 변수에 실수형 리터럴을 할당할 때 리터럴 뒤에 접미사 f를 붙여주어야 함

long 타입의 변수에 정수형 리터럴을 할당할 때 리터럴 뒤에 접미사 L을 붙여주어야 함

float weight = 74.5f;
final long LIGHT_YEAR = 9460730472580L;

float = 9460730472580.0F;
double = 9460730472580.0D;

 

정수 타입

정수타입은 숫자를 나타냄 byte,short,int,long 4개의 타입으로 분류

 

정수형의 오버플로우와 언더플로우

어떤 값이 실수로 각타입의 표현 범위를 넘어서는 경우

 

오버플로우 : 최대값 이상의 값을 표현한 경우 발생 / 대값을 넘어가면 최소값으로 값이 순환됨

ex) byte형의 최대값인 127을 값으로 가지는 경우 이 값에 1을 더하면 128이 아니라 최소값인 -128이 됨

언더플로우 : 최소값 이하의 값을 표현한 경우 발생 / 최소값을 넘어가면 해당 데이터 타입의 최대값으로 값이 순환됨

ex) byte형의 최소값인 -128을 값으로 가지는 경우 이 값에 1을 빼면 -129가 되는게 아니라 최대값인 127이 됨

 

byte형

최소값 - 128

최대값 127

 

byte형 값 125에 10을 더하면 오버플로우가 발생해서 최소값 -128로 순환 된다.

byte형 값 -125에 10을 빼면 언더플로우가 발생해서 최대값 127로 순환 된다.

 

 

데이터 타입의 크기와 표현범위

 

데이터 타입의 크기가 데이터의 표현범위를 결정함

byte 형은 1byte 크기의 정수형 데이터타입 1byte는 8bit 8자리 이진수 표현 2^8  = 256개의 데이터

하지만 음수의 범위도 표현하기위해 맨앞의 비트가 0이면 양 1이면 음수 , 남은 7비트로 숫자를 표현 2^7= 128개의 숫자

byte형은 8bit의 크기 중 1bit는 부호 표현에 사용하며, 7bit는 숫자 표현에 사용하여 -128 ~ 127의 정수 범위를 표현

 

Q. 왜 정수형의 범위가 -2,147,483,648(-231) ~ 2,147,483,647(231-1)일까?

 정수형은 32비트 부호비트 1비트, 나머지 31비트로 표현할 수 있는 최대값 31 2^31-1

 

실수타입

실수는 소수점을 가지는 값을 의미

float형과 double

double형 리터럴에는 접미사 d를 붙여도 , 붙이지 않아도 되지만 float형 리터럴에는 반드시 접미사 f를 붙여주어야 함

// float형 리터럴을 float형 변수에 할당
float num1 = 3.14f;

// double형 리터럴을 double형 변수에 할당
double num2 = 3.141592d;
double num2 = 3.141592;

double형은 float형보다 더 큰 실수를 저장할 수 있고 더 정확하고 정밀하게 저장할 수 있다.(정밀도가 높다)

 

실수형의 오버플로우와 언더플로우

오버플로우

값이 음의 최소범위 또는 양의 최대범위를 넘어갔을때 발생 이때 값은 무한대가 됨

언더플로우

값이 음의 최대범위 또는 양의 최소범위를 넘어갔을때 발생 이때 값은 0이 됨

 

 

논리타입

논리타입의 boolean

참 또는 거짓을 저장할 수 있는 데이터타입 오직 true / false를 값으로 가짐

단순히 참과 거짓을 표현하기 위해서는 1bit만 있으면 되지만

JVM이 다룰 수 있는 데이터의 최소단위가 1byte기 때문에 boolean형은 1byte(8bit)의 크기를 가짐.

조건문과 함께 사용됨

boolean isRainy = true;
boolean isAdult = false;

문자타입

문자타입은 2byte크기의 char형

문자타입 변수를 서언하면 해당 변수에 오직 하나의 문자형리터럴을 저장할 수 있음

문자형 리터럴을 작성할때 반드시 큰 따옴표("")가 아닌 작은 따옴표('')를 사용해야 함

큰따옴표를 사용한 리터럴은 문자형리터럴이 아니라 문자열리터럴로 인식됨

자바에서 문자형과 문자열은 다름!

char letter1 = 'a';
char letter2 = 'ab'; // 에러 : 단 하나의 문자만 할당할 수 있습니다. 
char letter3 = "a"   // 에러 : 작은따옴표를 사용해야 합니다.

문자타입의 리터럴은 문자타입 변수에 어떻게 저장 될까? 

유니코드로 저장 됨 (각 문자에 숫자코드 번호를 부여한 것)

 

숫자를 문자형 변수에 할당할 수도 있다.

문자형 변수에 할당하면 숫자가 그대로 저장 되지만

나중에 변수를 참조할(값을 읽어옴) 때 변수가 저장하고 있는 숫자값을 유니코드로 인식하여

해당숫자의 코드를 가진 문자로 변환해 줌

char letter = 65;
System.out.print(letter); // 출력 결과 : A

타입변환

boolean을 제외한 기본타입 8개는 서로 타입을 변환할 수 있으며

자동으로 변환되는 경우와 수동으로 변환해주어야 하는 경우가 있다

 

자동타입변환

-바이트 크기가 작은 타입에서 큰 타입으로 변환할 때 (byte->int)

-덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때(정수->실수)

float가 모든 정수형 (int,long) 보다 더 정밀한 값을 표현하기 때문에 같은 4byte값이지만 더 뒤쪽에 있음

byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)

 

수동타입변환

메모리용량이 큰 타입에서 작은타입으로는 자동으로 변환되지 않음

이때 더 큰 데이터 타입을 작은 데이터타입의 변수에 저장하기 위해서는 수동으로 타입을 변환해주어야 한다

= 캐스팅(casting)

 

수동으로 타입을 변환할 때는 캐스팅 연산자 ()를 사용하며 연환하고자 하는 타입을 적어주면 된다

//int 타입으로 선언된 변수 intValue를 더 작은 단위인 byte로 변환합니다.
int intValue = 128;
byte byteValue = (byte)intValue;

System.out.println(byteValue); // -128

byte형의 오버플로우가 발생해서 -128이 저장된다]

 

메모리용량이 넉넉해진 지금은 일반적으로 int , long / double 로 사용해서 수동타입변환의 빈도가 줄었음

 

 

 

'개발공부🌷 > JAVA' 카테고리의 다른 글

JAVA 기초4  (0) 2023.10.13
JAVA 기초 3  (0) 2023.10.12
JAVA 기초 2-2  (0) 2023.10.12
JAVA 기초 2  (0) 2023.10.11
JAVA 기초  (0) 2023.10.10