variable
변수의 초기화
- 변수에 값을 저장하는 것
- 특정 Data type값을 저장하는 저장소를 메모리에 생성
- 초기화된 변수만 출력, 연산 등에 사용할 수 있다.
- 멤버변수(필드)는 초기화 값을 지정하지 않는 경우 해당 데이터타입의 기본값으로 초기화된다.
ex) 변수의 생성 및 초기화
public class Main { int mathScore; // mathScore == 0 public static void main(String[] args) { int subScore = 100; // int subScore; [에러] } }
mathScore - 저장소의 이름을 지정함
Data type
-
주로 쓰이는 type
boolean 1byte
char 2byte
short 2byte
int 4byte
long 8byte
float 4byte
double 8byte
type마다 range값이 있다.
Number type 🔢
- DataType
- byte
- short
- int
- long
- DataType
- float
- double
정수형 타입의 유의사항
정수는 무조건 int형이다.
- byte, short 타입의 변수는 사용하는 경우가 극히 제한적이다.
- byte는 바이너리 데이터를 다루거나, 입출력 등의 작업에서만 제한적으로 사용된다.
- short는 정보시스템용 애플리케이션에서 거의 사용되지 않는다.
-
국어점수, 수학점수 등의 값이 0~100 사이의 값이기 때문에 byte 타입의 범위(-128 ~ 127)
내에 속하지만 절대로 byte 타입의 변수를 사용해서 국어점수, 수학점수를 저장하지 말자
- long은 int의 범위를 초과하는 정수를 다룰 때만 선택한다.
- int타입의 범위에 해당하는 정수값만 표현할 수 있다.
- int형의 범위를 넘어 오류가 생김
- 범위를 넘는 숫자는 뒤에 L를 붙여야 한다.
long value = ~~10_000_000_000~~ //**int의 최대값을 넘기므로 전혀 다른 값이 나온다.(오버 플로우)**
//**따라서 제대로된** **값을 얻기 위해서 L을 붙여 형변환해야 100억 값이 나온다.**
long value = 10_000_000_000L //100억
Overflow 🌊
타입이 표현할 수 있는 값의 범위를 넘어서는 것
실수형 타입의 유의사항
실수는 무조건 double형이다.
- float는 정보시스템용 애플리케이션에서 거의 사용되지 않는다.
- double형의 실수값을 float형의 변수에 저장할 수 없다.
- float형의 실수값으로 판단하도록 숫자 뒤에 F나 f를 붙인다. ex) 3.14f
실수형 변수에 저장된 값으로 사칙연산을 수행하면 작은 오차가 발생할 수 있다.
Variable 📦
숫자의 DataType 결정
- 숫자로 표현하는 것 : 사칙연산, 비교연산 가능
- 문자열로 표현하는 것 : 사칙연산 안하는것
int age = 25;
String postCode = "03302";
Text type 🔡
String
-
문자열(여러 글자)를 저장하는 변수 static
자바는 문자열을 저장하는 데이터타입을 제공하지 않는다.
“A”는 String 타입의 변수에만 저장할 수 있다.
1. String value7 = "";
2. String value10 = " ";
- 빈 문자도 저장할 수 있다.
- 한개 이상의 공백도 저장할 수 있다.
-
Primitive_기본자료형 타입의 변수 선언 및 초기화
변수(저장소)에 실제값이 저장되어있다.
int score = 100;
double weight = 65.8;
char gender = 'F';
-
non Primitive_참조자료형 타입의 변수 선언 및 초기화
변수에 주소값이 저장되어 있다.
참조변수: 주소값을 저장하고 있는 변수
주소값: 실제값을 가지고있는 객체의 위치를 나타내는 값
String name = "홍길동";
char
-
한 글자를 저장하는 변수의 datatype
정보시스템용 애플리케이션에서 한 글자로된 값은 거의 존재하지 않기 때문에, char는 거의 사용되지 않는다.
‘A’는 char 타입의 변수에만 저장할 수 있다.
char value1 = 'A';
2. char value2 = 65;
3. char value3 = '\u0041';
- 아스키코드표에서 65번째 글자가 저장
- 유니코드문자표에서 0x0041번째 글자가 변수에 저장된다.
- 오류
- 두 글자 이상을 저장할 수 없다.
- 빈 문자를 저장할 수 없다. 공백이 아니다.
- 공백 한 개는 저장할 수 있다. 공백도 글자기 때문에 공백 2개를 저장할 수 없다.
Boolean type 🌗
논리값
-
두 가지 상태만을 가지는 값을 표현할 때 사용되는 값
ex) 합격/불합격, 성공/실패, 미혼/기혼, 유/무 …
true/false : 참/거짓으르 표현하는 자바의 예약어.
true/false 둘 중 하나의 값만 저장.
Casting 🔁
기본자료형 타입의 형변환
definition
-
값을 다른 타입의 값으로 변환하는 것
숫자, char만 해당
정수 → 실수
double x = 10;
정수 10이 실수 10.0으로 형변환된 후 x에 대입
실수 → 정수
int x = (int)3.14;
형변환 연산자가 실수 3.14를 정수 3으로 형변환하고, x에 대입
정수 → 정수
int x = 10; byte y = (byte)x;
4byte크기의 정수 10을 1byte크기의 변수 y에 대입하기 위해서 byte로 형변환한다.
실수 → 실수
double x = 3.14; float y = (float)x;
8byte크기의 실수 3.14를 4byte크기의 변수 y에 대입하기 위해서 float로 형변환한다.
문자 → 정수
int x = 'A';
문자 ‘A’의 아스키코드값 65가 정수 x에 대입된다.
정수 → 문자
char x = 65;
아스키코드 65에 해당하는 문자 ‘A’가 x에 대입된다.
type
-
자동형변환
프로그램 실행시 JVM이 자동으로 처리.
서로다른 type의 수 계산 시.
- 크기가 작은 타입의 값을 크기가 큰 타입의 값으로 변환
- 정밀도가 낮은 타입의 값을 정밀도가 높은 타입의 값으로 변환
- process
- 크기가 큰 타입 or 정밀도가 높은 데이터 타입으로 형 변환
- 연산이 수행
- 변수에 저장
-
ex)
1️⃣100 → 2️⃣ 100.0 → 3️⃣ value1에 저장
100이 double형으로 형변환 후 value1에 저장
int num = 100; double value1 = num; //100.0
3.0/10 → 1️⃣ 3.0/10.0 → 2️⃣ 0.3 → 3️⃣ value = 0.3
double value = 3.0/10; System.out.println(value);
-
수동형변환
데이터의 손실이 발생하는 방향으로의 형변환
JVM이 자동으로 형변환을 수행하지 않음
개발자가 데이터 손실이 발생하더라도 형변환하겠다는 의사표시를 반드시 해야 한다.
- 크기가 큰 타입의 값을 크기가 작은 타입의 값으로 변환
- 정밀도가 높은 타입의 값을 정밀도가 낮은 타입의 값으로 변환
- 위의 경우를 제외한 다른 경우도 가능
-
ex)
int korScore = 100; int engScore = 80; int mathScore = 70; int subjectCount = 3; int totalScore = korScore + engScore + mathScore;
⬇️ 250/3 → 83 → 83.0 //정수와 정수끼리 나누면 소수점을 삭제
double averageScore1 = totalScore/subjectCount;
⬇️ (double)250/3 →
수동형
→ 250.0/3 →자동형
→ 250.0/3.0 → 83.3333double averageScore3 = **(double) totalScore/subjectCount;**
⬇️ (double)(250/3) → (double)(83) →
자동형
→ 83.0// 정확한 실수값을 알기 위해서는 하나의 정수를 먼저 형변환 해야 한다.
double averageScore3 = **~~(double) (totalScore/subjectCount;)~~**
-
해당 데이터 범위를 초과하는 값을 해당 타입으로 수동형변환하는 것은 잘못된 형변환
int value1 = ~~(int) 10_000_000_000L~~; System.out.println(value1); // value1에는 1410065408이 들어있음. 아무 상관관계가 없는 값이다.
Extra
-
문자와 정수간 형 변환
문자열은 해당되지 않음
-
ex)
char value1 = 65; // 문자타입의 변수에는 아스키코드표 65번째 **문자**가 대입된다. int value2 = 'B'; // 정수타입의 변수에는 아스키코드표에서 문자 'B'의 **순번**이 대입된다.
-
-
유용한 메소드
“3”.charAt(0); → ‘3’
문자열을 문자로 변환
‘3’ - ‘0’; → 3
문자를 숫자로 변환
char(3 + ‘0’) → ‘3’
숫자를 문자로 변환
16진수/8진수
-
ex)
int value8 = 012;
→ 8진수 12 : 18^1 + 28^0 = 10int value9 = 0x12;
→ 16진수 12 : 116^1 + 216^0 = 16+2 = 18
변수의 범위
변수가 최초로 선언된 { }(블록) 이 자신의 범위이다.
자신과 같은 블록 범위내에 같은 이름의 변수가 중복 정의될 수 없다.
범위 밖에서 사용 불가
- 주소값을 갖는 다는것은 참조한다는 뜻이다.
- 변수는 초기값을 설정해야 연산가능
-
참조변수는 기본값이 저절로 설정됨
- ex)
- orderPrice 변수는 정의된 파란 배경 범위 내에서 사용될 수 있다.
- 외부 { } 인 빨간 배경 범위에서는 사용불가
- { } 내부에 있는 다른{ }에서도 사용가능 하나 중복 정의될 수 없다.
- if 문 안에 있는 point 변수의 경우 정의된 회색 배경 범위 내에서 사용가능
- point는 orderPrice 변수가 선언된 { } 어서는 사용불가
이를 이용하여 더 코드를 생략
public class Sample4 {
public static void main(String[] args) {
int orderPrice = 1_800_000;
if (orderPrice >= 1_000_000) {
int point = (int)(orderPrice*0.05);
System.out.println("적립포인트: " + point);
} else if (orderPrice >= 500_000) {
int point = (int)(orderPrice*0.02);
System.out.println("적립포인트: " + point);
} else if (orderPrice >= 300_000) {
int point = (int)(orderPrice*0.01);
System.out.println("적립포인트: " + point);
}
}
}
public void test(){
system.out.println(orderPrice);
}
public class Sample4 {
public static void main(String[] args) {
int orderPrice = 1_800_000;
int point = 0; // 0 가 저장
if (orderPrice >= 1_000_000) { ↓
point = (int)(orderPrice*0.05); //90000가 저장
} else if (orderPrice >= 500_000) { ↓
point = (int)(orderPrice*0.02);
} else if (orderPrice >= 300_000) { ↓
point = (int)(orderPrice*0.01); ←
} ↓
System.out.println("적립포인트: " + point);
} // 90000이 출력
}