Java에서 초기화 뜻은?
자바에서 초기화 하는 이유는?
//변수의 선언과 초기화 예시
int a = 1; //변수의 선언과 동시에 초기화
char ch = 'a'; //변수의 선언과 동시에 초기화
int b; //변수의 선언
b = 5; //초기화
//상수의 선언과 초기화 예시
final int MAX_SIZE = 100; //상수의 선언과 동시에 초기화
final char CONST_CHAR = '상'; //상수의 선언과 동시에 초기화
final int CONST_ASSIGNED; //상수의 선언
CONST_ASSIGNED = 12; //상수의 초기화
CONST_ASSIGNED = 30; //에러. 상수는 한번만 값을 할당할 수 있다.
리터럴(literal)
변하지 않는 데이터 그 자체
자료형을 기반으로 표현이 되는 상수
int num = 5 + 7; //5와 7은 '정수형 리터럴'
double num2 = 3.3 + 4.5; //- 3.3 4.5는 '실수형 리터럴'
char ch = 'A' //A는 '문자형 리터럴'
System.out.println(3147483647 + 3147483648); //에러남
정수 리터럴은(3147483647 : 이것도 리터럴) 기본적으로 int형이다.
여기서는 이미 연산 전의 정수 리터럴이 int의 범위를 넘어서 오류가 난다.
리터럴 상수에서 숫자 뒤에 L(소문자l도 상관없음)붙이면 long형(8byte)으로 인식해서 long형 상수로 표현해 달라고 요청 하는 것이다.
//이렇게 해야 오류 안남.
System.out.println(3147483647L + 3147483648L);
형 변환(casting)
int num1 = 50;
long num2 = 3147483647L //<-21억넘음
sysout(num1+num2); //num1에 저장된 값이 long형으로 형 변환된다. (자동형변환)
/*두 피연산자 자료형이 일치하지 않을 때 형 변환으로 일치 시켜야 한다.
자동으로 오류 없이 컴파일 된다면 어느 한쪽으로 자동 형 변환이 일어난 것이다.
정수와 정수의 연산 에서는 데이터 타입이 큰 쪽으로 맞춘다.
(int 보다 작은 데이터 타입은 다 int로 바뀐다.)
강제 형 변환을 하게 될 경우에는 값을 자른다.
자를 때는 앞 부분을 삭제하고 뒤에 있는 바이트가 사용된다.*/
자동형변환(Implicit Conversion)
규칙
long num1 = 3; //4 byte
float num2 = 22.1f; //8byte
Sytem.out.print(num1+num2);
//float형으로 자동형변환
// 소수점을 보존과 적은 메모리에 더 많은 수를 표현 가능(범위가 더 넓다) 해서 float로 형변환
명시적형변환(Explicit Conversion) : 강제적 형변환
//명시적 형변환 예시
double pi = 3.12415;
int wholeNumber = (int)pi; //정수형 소수점 버리고 결과값은 3
short num1 = 1;
short num2 = 3;
short num3 = (short) (num1 +num2); //num1과 num2 int로 계산될건데 short로 강제 형변환
int num4 = (int)num1;
int a = 3;
int b = 4;
double c = a / b;
System.out.println(c); //결과 : 0.0
/*
int 연산 결과는 int인데(소수점 날림) 그 값을 num3으로 대입 하면서 double로 대입해서 .0이 붙게 된다.
원하는 결과값 0.75를 얻기 위해서는 num1, num2의 자료형 중 하나는 double로 선언해야 한다.*/
double result = a/ (double)b
System.out.println(c); //결과 : 0.75
System.out.println('A'); //char형으로 인식, 메모리에 올라갈 때 65값이 들어감
System.out.println('A' + 'A'); //char형으로 65메모리에 올리고, int형으로 자동
//결과 : A 와 130이 나옴.
/*'A'(리터럴)를 뿌리기 위해 메모리에 방을 잡아야 한다.
이때 데이터 타입이 필요하고 A에 대한 데이터 타입은 char,
메모리에는 아스키코드 값 65가 들어간다. 그래서 65+65 = 130이 출력된다.*/
int num;
boolean result;
result = (num > 1) && (num < 100);
int num;
boolean result;
result = (num % 2 == 0 ) || (num % 3) == 0);
class SCE {
public static void main(String[] args) {
int num1 = 0;
int num2 = 0;
boolean result;
result = ((num1 += 10) < 0) && ((num2 += 10) > 0);
System.out.println("result = " + result); //false
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2 + '\\n');
result = ((num1 += 10) > 0) || ((num2 += 10) > 0);
System.out.println("result = " + result); //true
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
}
//이유 (논리 연산자 사용시 주의점)
result = ((num += 10 < 0)) && ((num2 += 10) >0);
//둘다 t여야 t이니까 앞에서 이미 false결정되어 뒤에 연산 안함
//num = 10; num2 = 0;
result = ((num += 10 < 0)) || ((num2 += 10) >0);
//둘중 하나만t면 t니까 앞에서 이미true결정되어 뒤에 연산안함
//num = 20; num2 = 0;
//하지만 연산한 결과는 변수에 반영 된다. 그러므로 다음 연산시에 변한 값이 다시 반영된다._
short num1;
short num = -num;
/*원래 short이지만 -도 "부호연산자"로 하나의 연산이고 그래서 int형으로 자동형변환이 일어난다.
즉, -1 *num 의 연산이 일어난다고 볼 수 있으며,
int(4byte)형으로 변환된 num을 short(2byte)형 num으로 대입하려 했기 때문에
(더 작은 타입으로는 자동형변환이 불가능하다.)에러가 난다.
*/
//수정
short num = 100;
num = (short)(-num); //강제 형변환을 해줘야한다.
class AssignSteResult {
public static void main(String[] args) {
int num1 = 10, num2 = 20, num3 = 30;
num1 = num2 = num3;
예상결과 30, 30, 30
class SCE {
public static void main(String[] args) {
int num1 = 0;
int num2 = 0;
boolean result;
num1 += 10;
num2 += 10;
result = (num1 < 0) && (num2 > 0);
System.out.println("result = " + result); // false
System.out.println("num1 = " + num1); //num1 = 10;
System.out.println("num2 = " + num2 + '\\n'); //num2 = 10;
num1 += 10;
num2 += 10;
result = (num1 > 0) || (num2 > 0);
System.out.println("result = " + result); //true
System.out.println("num1 = " + num1); //num1 = 20
System.out.println("num2 = " + num2); //num2 = 20
}
}
class AddNum {
public static void main(String[] args) {
int result = 3 + 6;
System.out.println("3 + 6 = " + result); //9
result += 9;
System.out.println("3 + 6 + 9 = " + result); // 18 (9+9)
result += 12;
System.out.println("3 + 6 + 9 + 12 = " + result); //30 (18+12)
}
}
int kor = 90;
int math = 70;
int eng = 80;
int total = kor + math + eng;
double avg = total / 3.0; //소수점 표시하기위해 3.0으로 한다.
System.out.println("국어 : " + kor + "\n수학 : " + math + "\n영어: " + eng
+ "\n총점 : " + total + "\n평균 : " + avg);
//출력값
국어 : 90
수학 : 70
영어: 80
총점 : 240
평균 : 80.0