MLOps 개발자 양성과정/java

[Day- 16] 변수와 타입

숲로 2023. 1. 12. 17:36

파이썬은 밀려서 블로그를 썼더니 순서가 뒤죽박죽이다...

자바는 꼭 매일매일 작성해보겠다.

 

2023.01.12(목) 

<수업 내용>

chap.01 자바 시작하기

01-1. 자바 설치 및 환경변수 설정

01-2. 이클립스 설치

01-3. 이클립스 모듈 패키지 클래스

 

chap.02 변수와 타입

02-1 변수

02-2 기본 타입

02-3 타입 변환

 


 

01. 변수와 타입

1) 변수

    : 값을 지정할 수 있는 메모리의 특정 번지에 붙이는 이름

 

ㆍ변수 선언

: 어떤 타입의 데이터를 저장할 것인지, 변수 이름이 무엇인지를 결정

- 변수이름으로 예약어 사용불가

 

ㆍ변수 초기화

: 변수에 최초로 값이 저장되는 것 (변수에 값이 저장되어야 변수가 생성됨)

- 대입 연산자(=)를 사용해 값을 저장

- 하나의 변수에는 하나의 값만 저장할 수 있음

- 변수 선언 시 사용한 타입의 값만 저장할 수 있음

int score; //변수 선언
score = 90; //변수 초기화

int score = 90; //한 줄로 작성 가능

 

 

ㆍ변수 사용

: 변수의 값을 읽거나 변경하는 것.

- 출력문이나 연산식 내부에서 변수에 저장된 값을 출력하거나 연산할 때 사용

// 값 복사
int x = 10;
int y = x;
//값 교환
int x = 3;
int y = 5;

int temp = x; //새로운 변수 선언
x = y;
y = temp;

 

ㆍ변수 사용범위

: 변수는 변수가 선언된 중괄호{} 안에서만 사용 가능

※ 선언 위치에 따라 사용가능한 범위가 다름

 - 메소드 블록 전체에서 사용하고 싶다면 메소드 블록 첫머리에,

 - 특정 블록 내부에서만 사용하고 싶다면 해당 블록 내에 선언

 

 

2) 기본 타입

- 정수타입: byte, short, char, int, long

- 실수타입: float, double

- 논리타입: boolean

 

ㆍ 정수타입

타입 메모리 사용크기 저장되는 값의 허용 범위
byte 1byte 8bit -2^7 ~ (2^7-1) -128 ~ 127
short 2byte 16bit -2^15 ~ (2^15-1) -32.768 ~ 32.767
char 2byte 16bit 0 ~ (2^16-1) 0 ~ 65535(유니코드* 음수x
int 4byte 32bit -2^31 ~ (2^31-1) -2,147,483,648 ~ 2.147.483,647
long 8byte 64bit -2^63 ~ (2^63-1) -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

+ 진수입력도 자바가 정수로 인식함

2진수 0B 또는 0b로 시작하고 0과 1로 구성 0b1011 11
8진수 0으로 시작하고 1~7로 구성 013 11
10진수 소수점이 없는 0~9로 구성 11 11
16진수 0X 또는 0x로 시작하고 0~9와 a~f로 구성 0xB3 179

 

<int와 long 타입>

- 기본적으로 컴파일러는 정수 리터럴을 int 타입으로 간주함

- 타입의 범위를 초과하면 컴파일 에러가 발생함

- 허용범위 초과할 경우 long타입임을 컴파일러에게 알려줘야 함(대문자 L 붙이기)

long var1 = 10; // int타입의 허용범위 이내 L붙이지 않아도 됨
long var2 = 20L;

//long car3 = 100000000000; ← 컴파일 에러
long var4 = 1000000000000L; //컴파일러에서 정수 리터럴을 int타입으로 간주 허용범위 넘어가면 L붙여줘

 

<char 타입>

- 작은 따옴표(')로 감싼 문자 리터럴은 유니코드로 변환되어 저장됨

- 10진수 또는 16진수 형태로도 유니코드 저장 가능

- 유니코드: 세계 각국의 문자를 2byte로 표현할 수 있는 숫자로 매핑한 국제 표준 규약

char c1 = 'A';	//문자를 직접 저장
char c2 = 65;	//10진수로 저장
char c3 = '\u0041';	//16진수로 저장
		
char c4 = '가';	//문자를 직접 저장
char c5 = 44032; //10진수로 저장
char c6 = '\uac00';	//16진수로 저장
char var1 = 'A';
int var2 = 'A'; //유니코드는 정수 int타입 변수에도 저장 가능

System.out.println(var1); //A를 출력
System.out.println(var2); //65를 출력 유니코드 자체가 출력됨

 

※ 참고

String 타입 - 클래스 타입

- 큰따옴표(")로 감싼 문자들

- 이스케이프 문자

이스케이프 문자 출력 용도
\t 탭만큼 띄움
\n 줄 바꿈
\r 캐리지리턴
\" "출력
\' '출력
\\ \출력
\u16진수 16진수 유니코드에 해당하는 문자 출력

 

ㆍ 실수타입

타입 메모리 사용크기 저장되는 값의 허용 범위 정밀도
float 4byte 32bit (1.4*10^-45) ~ (4.3*10^38) 7자리
double 8byte 64bit (4.9*10^-324) ~ (1.8*10^308) 15자리

- 실수 리터럴을 기본적으로 double 타입으로 해석

- float 타입으로 저장하기 위해서 f 또는 F 붙여야 함

- double 타입 float타입 보다 2배 정밀도가 높아 더 정확한 데이터 저장 가능

- 특별한 이유가 없는 한 double타입으로 저장하는 것이 좋음

 

ㆍ 논리타입

- boolean 타입변수 1byte 크기

- 논리 리터럴로  true와 false를 사용

boolean stop = true;
boolean state = false;

 

03. 타입 변환

 

1) 자동 타입 변환

: 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생

 

ㆍ 타입의 크기

byte <  short < int < long < float < double

큰 허용 범위 타입 = 작은 허용 범위 타입
byte byteValue = 10;
int intValue = byteValue;
// 정수 타입이 실수 타입으로 자동 타입 변환
long longValue = 5000000000L;
float floatValue = longValue; //5.0E9f로 저장
double doubleValue = longValue; //5.0E9로 저장

 

2) 강제 타입 변환(casting)

: 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장

- 캐스팅 연산자 괄호()를 사용

작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입
double doubleValue = 3.14;
int intValue = (int) doubleValue; //정수 부분인 3만 저장

 

3) 연산에서 타입 변환

 

ㆍ 정수 연산에서 자동 타입변환

- int타입보다 작은 byte, short 타입은 int 타입으로 자동 변환 (연산 결과 int 변수에 저장해야 함)

- 두 피연산자 중 허용 범위가 큰 타입으로 변환되어 연산을 수행

byte result1 = 10 + 20; //연산을 먼저해 30을 만들고 변수에 30을 저장 
//피연산자가 변수가 아니므로 int타입 변환 필요없음
		
byte x = 10;
byte y = 20;
int result2 = x + y; //int타입 변환 필요

 

ㆍ 실수 연산에서 타입변환

- 피연산자 연산 시 허용범위가 큰 타입으로 변환

int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue; //int타입의 피연산자가 double타입으로 자동 변환

 

- 정수 연산을 실수 연산으로 강제 변경 

int x = 1;
int y = 2;
double result = x / y; //정수 연산의 결과는 정수이므로 0.5가 아닌 0이 저장됨
System.out.println(result);
>>> 0.0

int x = 1;
int y = 2;
double result = (double) x / y; //x,y 중 하나 이상을 타입 변환
System.out.println(result);
>>> 0.0

 

4) 문자열 타입 변환

 

ㆍ + 연산에서 문자열의 자동 타입변환

※ +연산자

- 피연산자가 모두 숫자일 경우에는 덧셈연산

- 하나가 문자열일 경우 나머지 피연산자도 문자열로 자동 변환 (결합연산)

- 앞에서분터 순차적으로 + 연산을 수행, 수행된 연산이 결합연산이라면 이후 +연산은 모두 결합연산

- 괄호()는 최우선으로 연산을 수행

int value = 1 + 2 + 3
> int value = 6;

String str1 = 1 + 2 + "3";
> String str1 = "33"

String str2 = 1 + "2" + 3;
> String str2 = "123";

String str3 = "1" + 2 + 3;
> String str3 = "123";

String str4 = "1" + (2 + 3);
> String str4 = "15"

 

ㆍ 문자열을 기본 타입으로 강제 타입변환

- Integer.psrseInt() / Double.parseDouble() 등 메소드 사용

- 숫자로 되어있는 문자열을 기본 타입으로 변환

- 숫자가 아닌 한글, 알파벳, 특수문자 등이 포함되어있을 경우 숫자 형식 예외 발생

- char타입은 강제 타입변환 불가능

String str = "300000";
int value = Integer.parseInt(str);

 

ㆍ 기본타입을 문자열로 강제 타입변환

String str = String.vlaueof(기본타입값);
String.vlaueof(3)
> "3"