JVM을 거쳐서 가기 때문에 JAVA는 한번만 설치하면 된다.
원래는 OS마다 다른 '컴파일러'가 필요하지만. JAVA는 JVM이 0과 1을 OS맞게 번역해 준다.
이 JVM은 인기가 상당해서 JAVA 외에 다른 언어에도 사용하고 있다.
JVM은 똑같은 JAVA 바이트 코드를 OS마다 다르게 해석해주는 친구다.
JDK : Java Development Kit / 자바 개발 도구 : 개발을 위한 도구이다. 컴파일러, 디버그 도구등이 포함되어 있다.
JRE : Java Runtime Environment / 자바 실행 환경 : 자바 프로그램 실행에 필요한 라이브러리 파일 등이 들어있다. JVM실행 환경을 구현.
JVM : Java Virtual Machine / 자바 가상 기계(자바 가상 머신), OS별로 존재한다. 바이너리 코드를 읽고 검즈하고 실행한다. 자바 프로그램이 실행되는 가상 컴퓨터라고 생각하자.
JDK를 설치하면 JRE와 JVM이 같이 설치된다.
실행과정
1. 소스파일 작성
2. jdk가 소스파일을 컴파일(기계어로 번역 : 바이트 코드)
변수의 선언
선언을 하는 이유 : 메모리가 값을 저장할 공간을 만들기 위해서
변수타임 변수이름:
클라스는 어디에 속하는가?
문제1.
프로젝트 폴더에 우클릭 -> New -> Java Class 가 보이지 않을 때 해결방법
해당 위치가 프로젝트 root로 지정이 되어있지 않아서 생기는 문제이다.
우클릭 -> Mark Directory as -> Sources Root 클릭하면 해결 된다.
public class myVariable1_2 {
public static void main(String[] args) {
boolean flag = false; //참,거짓으로 저장 가능
char grade = 'A'; //문자로 저장가능
byte val = 127; // 숫자 127까지 저장 가능
short sval = 128; // 128 이상의 숫자
int num = 32768;
long price = 2_147_483_648L;
float tax = 3.14f;
double score = 3.14159265358979;
System.out.println(flag);
System.out.println(grade);
System.out.println(val);
System.out.println(sval);
System.out.println(num);
System.out.println(price);
System.out.println(tax);
System.out.println(score);
//false
//A
//127
//128
//32768
//2147483648
//3.14
//3.14159265358979
}
}
public class myVariable1_3 {
// public static void main(String[]) args) 아래와 뭐가 다른지 모르겠는데 main에 함수표시가 안뜬다.
public static void main(String[] args) {
int year, age = 23;
year = age + 2000;
System.out.println("year = " + year); //결과 2023
age = age + 1;
System.out.println(age);
System.out.println(year);
//시작할때 age는 23이었지만 끝날때 age는 24가 되었다. 이 말은 age에 부여된 데이터 공간에 23 대신 24가 들어갔다는 말인가
//age값이 바뀌었는데 어째서 year에 영향을 주지 않는 걸까? 위치와 상관없이 year의 값은 2024가 나온다.
//그렇다면 데이터가 바뀐 것은 아니라는 의미?
//year = 2023
//24
//2023
}
}
public class myVariable1_4 {
static int classVal = 100;
int instanceVal = 200;
public static void main(String[] args) {
int num; //지역변수라고 한다. 무슨 의미?
num = 300;
System.out.println("int = " + num);
//인스턴스 변수
myVariable1_4 instance = new myVariable1_4();
System.out.println("instanceVal = " + instance.instanceVal);
//클래스변수
System.out.println("classVal = " + classVal);
System.out.println("Main.classVal = " + myVariable1_4.classVal);
//int = 300
//instanceVal = 200
//classVal = 100
//Main.classVal = 100
}
}
//2-4. 다음 중 변수를 잘못 초기화 한 것은?
//초기화란? 최초 변수의 값을 정하는 것
byte b = 256;
//byte = 8 bit 2^7=128까지 표기 가능. 초기화 할 수 없음
char c = '';
//char는 16bit 2^16=65,536.
// ''안에는 문자가 들어가야 한다. 만약 공백을 표기하고 싶었다면 ""이들어갔어야함
//문자와 문자열의 차이는 ?
char answer = 'no';
//'n';이나 'o';가 들어가는 것은 가능
//"no";로 표기해야한다.
float f = 3.14
// float 32bit(4byte) 까지 표현 가능
//;로 마무리가 되지 않아서 오류가 날 것 같다
double d = 1.4e3f;
//double 은 64bit까지 가능(8byte)
// 어떤 숫자가 도출되는지 모르겠다.
System.out.println(d); // 1400.0
double d = 1.4e3f; 계산 어떻게 하는지 알아보기
//2-7. 다음 문장들의 출력 결과를 적으세요. 오류가 있는 문장의 경우, '오류' 라고 적으세요.
System.out.println("1" + "2");
//출력 : 12 (단순 문자열의 연속) 정답
System.out.println(true+"");
//오류 : 속성이 다르다. 불리언과 문자.
//true도 속성이기 때문에 공백란과 합쳐졌을 때는 그냥 true로 뜬다.
System.out.println('A' + 'B');
//아스키코드 A와 B의 합(대문자) : 65+66 =131
System.out.println('1' + 2);
//아스키코드 1(49)의 값에 +2 = 67
System.out.println('1' + '2');
//아스키코드 1(49),2(50)의 합 = 99
System.out.println('J' +"ava"); //아스키코드 J값에 문자열의 합. 기본형과 참조형의 합은 어떻게 나오는거지? //74ava? //두개의 값중에 더 큰 값으로 통일된다. 문자는 char 2byte 참조형은 4byte이므로 참조형으로 통일 //근데 왜 JAVA가 나오는거지?
System.out.println(true + null); //true (null //true가 뜰 줄 알았는데 오류가 나왔다. null은 아무것도 없음 아닌가.
public static void main(String[] args) {
//2-8. 아래는 변수 x, y, z의 값을 서로 바꾸는 예제이다. 결과와 같이 출력되도록 코드를 넣으세요.
int x = 1;
int y = 2;
int z = 3;
int tmp = x;
x = y;
y = z;
z = tmp;
/*
알맞은 코드를 넣어 완성하세요.
*/
System.out.println("x="+x);
System.out.println("y="+y);
System.out.println("z="+z);
}
public static void main(String[] args) {
byte b = 10;
char ch = 'A';
int i = 100;
long l = 1000L;
//3-1. 다음 중 형변환을 생략할 수 있는 것은? (모두 고르시오)
b = (byte)i;
//형 변환 생략할 수 없음.
//변수 b는 byte타입의 10(2진법), i는 int상수로 100이기 때문에 범위가 다름
ch = (char)b;
//형 변환 생략 불가
//ch는 char이고 b는 byte. 이게 맞나? 아리송
short s = (short)ch;
//형 변환 생략 불가
//short와 char는 같은 2비트이지만 범위가 다르다. 서로 끼워 넣을 수 없다.
float f = (short)ch;
//생략 가능
//boolean,byte(1 bit) < short < char (2 bit) < int < float(4 bit) < long,double (8 bit)
i = (int)ch;
//형 변환 생략 가능
//int는 char보다 범위가 크다.
//다이어그램으로 그려서 생각하면 더 쉬울것 같다.
}
boolean,byte(1 bit) < short < char (2 bit) < int < float(4 bit) < long,double (8 bit)
char ch = '2';
System.out.println((int)ch);
//숫자 2로 바꾸고 싶다면 - '0'을 하면된다. 왜? 문자'0'이 48이기 때문이다.
//개발자처럼 사고 하려면 아키텍 표기에 익숙해질 필요가 있다.
round() : 실수를 소수점 첫 째자리에서 반올림한 정수를 반환합니다.
ceil() : 올림값을 double 형으로 반환합니다.
floor() : 내림값을 double 형으로 반환합니다.
abs() : int, double 기본형 모두 사용 가능하며 절대값을 얻습니다.
long result = Math.round(3.45678);
System.out.println(result);
소수점 4째 자리에서 반올림한 값을 구하라!
double pi = 3.1456789;
pi * 1000 = 3145.6789
Math.round(3145.6789) = 3146
3145 / 1000 = 3.146
double chortPi = Math.round(pi * 1000) / 1000.0;
System.out.println(chortPi);
double pi2 = 3.141592;
pi2 * 1000 = 3141.592
(int)3141.592
System.out.println((int) (pi2 * 1000)/1000.0);
System.out.println((int) ((pi2 * 1000)/1000.0)); //값은 3
// 위에와 뭐가 다른가?
int x = 2;
int y = 5;
char c = 'A'; // 'A'의 문자코드는 65
System.out.println(y >= 5 || x < 0 && x > 2); //true
// System.out.println(y >= 5); //true
// System.out.println(x < 0 ); //false
// System.out.println(x > 2); //false
System.out.println(y += 10 - x++);
//y에 10을 더해서 y에 다시 넣으면 15가 된다. 그 상태에서 x(2)를 빼면 13이 된다.
System.out.println(x += 2);
//x에 2를 더한값을 x에 넣으면 4가 된다.
System.out.println(!('A' <= c && c <= 'Z'));
//ture and true 는 ture 그 상태에서 !로 반대가되면 false
System.out.println('C' - c);
//피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
//둘 다 int보다 작기 때문에 int로 변환된다.
System.out.println('5' - '0');
//int로 변환되어 계산하면 그대로 5가 나온다.
System.out.println(c + 1);
//c가 int로 변환되어 65가되고 +1하면 66
System.out.println(++c);
//단항 연산자는 형변환을 하지 않는다.
//실제로 변수 c에 저장된 값은 문자코드 65이므로 +1을하면 66이 되고
// 66은 문자코드에서 'B'가 된다.
System.out.println(c++);
//후위형은 변수가 출력된 후에 값이 증가하므로 값이 변하지 않은것으로 보인다.
System.out.println(c++);
System.out.println(c);
//하지만 후위형 이후에 c값을 출력해보면 값이 변한것을 알 수 있다.
알맞은 코드를 넣으시오.
int num = 456;
System.out.println(num/100.0); //4.56
//Math.round()함수 이용하기
//4.56 이 값에서 소숫점을 버리고 다시 *100을 하면 111이 되더라고 같은 값이 나올것이다.
//근데 그 방법을 모르겠네
//바보같은 고민이었다
System.out.println(num/100*100);
//단순하게 그냥 나눗셈연산자를 하면 바로 버림을 할 수 있다. 그 값에서 *100을 하면 된다.
//복잡하게 생각하지 않기!
//3-6. 아래는 화씨(Fahrenheit)를 섭씨(Celcius)로 변환하는 코드이다.
//변환 공식이 'C = 5/9*(F-32)'라고 할 때, 빈 칸에 알맞은 코드를 넣으시오.
// 단, 변환값은 소수점 셋째자리에서 반올림하며, Math.round() 함수를 사용하지 않고 처리할 것!
int fahrenheit = 100;
float celcius = (/*빈 칸*/);
System.out.println("Fahrenheit:"+fahrenheit);
System.out.println("Celcius:"+celcius);
//예상 결과 : Fahrenheit:100, Celcius:37.78
//이건 도저히 못풀겠다.
[정답] (int)((5/9f * (fahrenheit - 32))*100 + 0.5) / 100f 다른 표현 방식 float celcius = (int)(((((float)fahrenheit-32)*5/9)*100)+0.5f)/100f;
[해설] 먼저 화씨를 섭씨로 바꾸는 공식은 '5/9f * (fahrenheit - 32)'이다. 5/9의 결과 는 0이기 때문에 두 피연산자 중 어느 한 쪽을 반드시 float나 double로 해야만 실수형태 의 결과를 얻을 수 있다. 그래서 정수형 리터럴인 9대신 float타입의 리터럴인 9f를 사용 하였다. 소수점 셋째자리에서 반올림을 하려면 다음의 과정을 거쳐야한다.
```java