(회사 키보드 키감이 나빠 오타 있을 수 있습니다.)
소스파일을 작성한 후에는 컴파일을 해야한다. javac 명령어는 소스 파일을
컴파일 하는데, 컴파일 결과는 확장명이 .class인 바이트코드 파일로 생성된다.
어떤 운영체재라 하더라도 동일한 소스 파일을 javac로 컴파일하면 모두 동일한 바이트코드 파일로 생성이 된다.
바이트코드 파일을 특정 운영체재가 이해하는 기계어로 번역하고 실행시키는 명령어는 java이며 java 명령어는 JDK와 함께 설치된 자바 가상머신을 구동시켜 바이트코드 파일을 완전한 기계어로 번역하고 실행시킨다.
하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름. 정수형 변수는 정수만, 실수형 변수는 실수만 저장이 가능하다.
어떤 타입의 데이터를 저장할 것인지 그리고 변수 이름이 무엇인지를 결정하는 것이다.
int value; 에서 int는 타입, value 이름 이다.
(캐멀 스타일을 사용하며 이름이 길어도 되지만 한글을 포함하지 않는 것이 관례이다.)
변수에 최초로 값을 대입하는 것이 초기화. 이때 값을 초기값.
선언과 동시에 대입이 가능하다. > int score = 90;
잘못된 예
int value;
int result = value + 10; // 변수 value가 초기화 되지 않아 메모리 값을 읽을 수 없다.
public class VariableExchangeExample {
public static void main(String[] args) {
int x = 3;
int y = 5;
int temp = x; // x값을에 temp을 저장.
x = y; // y값을를 x에 저장
y = temp; // temp값을 y에 저장
} //
}
temp 라는 변수를 선언해 x와 y의 값을 서로 교환한다.
타입 | 메모리 크기 | 저장되는 값의 허용 범위 | 저장되는 값의 허용 범위 |
---|---|---|---|
byte | 1byte / 8bit | -2⁷ ~ (2⁷-1) | -128~ 127 |
short | 2byte / 16bit | -2¹⁵ ~ (2¹⁵-1) | -32,768 ~ 32,767 |
char | 2byte / 16bit | 0 ~ (2¹⁶-1) | 0 ~ 65535 (유니코드) |
int | 4byte / 32bit | -2³¹ ~ (2³¹-1) | -2,147,483,648 ~ 2,147,483,647 |
long | 8byte / 64bit | -2⁶³ ~ (2⁶³-1) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
유니코드가 정수이므로 char 타입도 정수 타입에 속한다 그렇기에 char 변수에 작은따옴표로 감싼 문자가 아니라 유니코드 숫자를 직접 대입할 수도 있다. 하지만 char c = ''; 작은 따옴표 안에 공백을 넣지 않으면 컴파일 오류가 나니 주의해야 한다.
타입 | 메모리 크기 | 저장되는 값의 허용 범위 | 유효 소수 이하 자리 |
---|---|---|---|
float | 4byte / 32bit | 1.4x10-⁴⁵ ~ 3.4x10³⁸ | 7자리 |
double | 8byte / 64bit | 4.9x10-³²⁴ ~ 1.8x10³⁰⁸ | 15자리 |
double이 0에 더 가까운 실수를 저장할 수 있고 정밀도 또한 높다.
자바는 IEEE 754 표준에 근거하여 float , double 타입의 값을 부동 소수점 방식으로 메모리에 저장.
[ float ] 부호(1bit) + 지수(8bit) + 가수(23bit) = 32bit
[ double ] 부호(1bit) + 지수(8bit) + 가수(52bit) = 62bit
float 사용시 리터럴 뒤에 f, F를 붙여 컴파일러가 float 타입임을 알 수 있도록 해야한다.
int > byte 로 강제 타입 변환시 끝 1byte가 저장되어 byte 타입으로 저장
강제 타입 변환을 캐스팅이라고 하기도 한다.
byte result = 10 + 20;
byte x = 10;
byte y = 20;
int result = x + y; //byte result = x + y; 컴파일 에러
int x = 10;
int y = 20;
int result = x + y; //이런식으로 타입 변환을 먼저 해주면 실행 성능에 도움이 된다.
int와 마찬가지로 int타입 보다 허용 범위가 더 큰 long, float, double 타입 같은 경우도 위와 같이 변환되어 연산된다.
int타입으로 연산을 해야 한다면 반대로 double 타입을 int타입으로 강제 변환하고 연산을 수행하면 된다.
int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue; // 10+5
피연산자가 모두 숫자일 경우에는 덧셈 연산을 수행하고, 피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 수행한다. 예를 들어
String str = "3" + 7;
String str = "3" + "7";
String str = "37";
String str = 1 + "2" + 3;
String str = "12" + "3"
String str = "123" //특정 부분 연산을 먼저하고 싶다면 () 사용
String --> | 사용 예 |
---|---|
byte | Byte.parseByte(str) |
short | Short.parseShort(str) |
int | Integer.parseInt(str) |
long | Long.parseLong(str) |
float | Float.parseFloat(str) |
double | Double.parseDouble(str) |
boolean | Boolean.parseBoolean(str) |
int 타입만 Integer.parseInt 이다.
public static void main(String[] args) {
int var1;
if(...) {
int var2; //var1 ,var2 만 사용가능
}
}
println, print 설명은 제외하고 prinf만.
System.out.printf("이름 : %s", "김자바"); // 이름: 김자바
System.out.printf("나이 : %d", 25 ); // 나이: 25
System.out.printf("이름: %1$s, 나이: %2$d", "김자바", 25); // 이름: 김자바 , 나이: 25
Scanner scanner = new Scanner(Sytem.in);
System.out.print("A의 값을 입력해라");
String inputData = scanner.nextLine();
연산식 | 연산식 | 설명 |
---|---|---|
+ | 피연산자 | 피연산자의 부호 유지 |
- | 피연산자 | 피연산자의 부호 변경 |
++ | 피연산자 | 피연산자의 값을 1 증가시킴 |
-- | 피연산자 | 피연산자의 값을 1 감소시킴 |
피연산자 | -- | 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴 |
피연산자 | ++ | 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴 |
byte b = 100;
int result = -b;
연산식 | 연산식 | 연산식 | 설명 |
---|---|---|---|
피연산자 | + | 피연산자 | 덧셈 연산 |
피연산자 | - | 피연산자 | 뺄셈 연산 |
피연산자 | * | 피연산자 | 곱셈 연산 |
피연산자 | / | 피연산자 | 나눗셈 연산 |
피연산자 | % | 피연산자 | 나눗셈의 나머지를 산출하는 연산 |
byte value = 127;
value++; // 127에 1을 더함
System.out.println(value); // -128
int apple = 1;
double pieceUnit = 0.1;
int number = 7;
double result = apple - number*pieceUnit;
System.out.println("apple : " + result); // 0.2999999999~~
출력된 결과를 보면 정확히 0.3이 되지않는다. 부동 소수점 방식을 사용하는 실수 타입에서 흔히 일어나며 정확한 계산이 필요하다면 정수 연산으로 변경해 계산하는 것이 좋다.
int apple = 1;
int totalPieces = apple * 10;
int number = 7;
int result = totalPieces - number;
System.out.println("10조각에서 남은 조각: " + result); // 3
System.out.println("사과 1개에서 남은 양: "+ result/10.0); //0.3
이렇게.
int x = 5;
int y = 0;
int result = x / y; // 예외 발생
boolean result = Double.isInfinity(변수);
boolean result = Double.isNaN(변수); // Infinity , NaN 일경우 true 아니면 false를 산출
구분 | 연산식 | 연산식 | 연산식 | 설명 |
---|---|---|---|---|
동등비교 | 피연산자1 | == | 피연산자2 | 두 피연산자의 값이 같은지를 검사 |
동등비교 | 피연산자1 | != | 피연산자2 | 두 피연산자의 값이 다른지를 검사 |
크기비교 | 피연산자1 | > | 피연산자2 | 피연산자1이 큰지를 검사 |
크기비교 | 피연산자1 | >= | 피연산자2 | 피연산자1이 크거나 같은지를 검사 |
크기비교 | 피연산자1 | < | 피연산자2 | 피연산자1이 작은지를 검사 |
크기비교 | 피연산자1 | <= | 피연산자2 | 피연산자1이 작거나 같은지를 검사 |
'A' == 65 //true
3 == 3.0 //true
0.1f == 0.1 //false
0.1f == (float) 0.1 // true
문자열을 비교 할 때는 equals()와 !equals()를 사용한다.
구분 | 연산식 | 연산식 | 연산식 | 결과 | 설명 |
---|---|---|---|---|---|
AND (논리곱) | true | && 또는 & | true | true | 피연산자 모두 true일 경우에만 true |
AND (논리곱) | true | && 또는 & | false | false | 피연산자 모두 true일 경우에만 true |
AND (논리곱) | false | && 또는 & | true | false | 피연산자 모두 true일 경우에만 true |
AND (논리곱) | false | && 또는 & | false | false | 피연산자 모두 true일 경우에만 true |
OR (논리합) | true | || 또는 | | true | false | 피연산자 중 하나만 true이면 연산결과는 true |
OR (논리합) | true | || 또는 | | false | false | 피연산자 중 하나만 true이면 연산결과는 true |
OR (논리합) | false | || 또는 | | true | false | 피연산자 중 하나만 true이면 연산결과는 true |
OR (논리합) | false | || 또는 | | false | false | 피연산자 중 하나만 true이면 연산결과는 true |
XOR(배타적 논리합) | true | || 또는 | | true | false | 피연산자가 하나는 true이고 다른하나가 false일 경우에만 true |
XOR(배타적 논리합) | true | || 또는 | | false | true | 피연산자가 하나는 true이고 다른하나가 false일 경우에만 true |
XOR(배타적 논리합) | false | || 또는 | | true | ture | 피연산자가 하나는 true이고 다른하나가 false일 경우에만 true |
XOR(배타적 논리합) | false | || 또는 | | false | false | 피연산자가 하나는 true이고 다른하나가 false일 경우에만 true |
NOT(논리 부정) | ! | true | false | 피연산자의 논리값을 바꿈 | |
NOT(논리 부정) | ! | false | ture | 피연산자의 논리값을 바꿈 |
근데 이거 표 어지러우면 true = 🔵, false = 🚨 바꿔서 아래에 만들어둠
마크다운 행, 열 병합 아시는 분 ? 찾아도 안나오던데? 나중에 html로 수정해서 바꿔둠
&&는 피연산자 모두 true일 경우에만 true
||은 피연산자 중 하나만 true이면 true
^는 피연산자가 하나는 true이고 다른 하나가 false일 경우에만 true
!는 피연산자의 논리값을 바꿈
&는 두비트 모두 1일 경우에만 연산 결과가 1
|는 두 비트 중 하나만 1이면 연산 결과는 1
^는 두 비트 중 하나는 1이고 다른하나가 0일 경우 연산 결과는 1
~는 보수이다.
byte num1 = 45;
byte num2 = 25;
int result = num1 & num2; //byte result = num1 & num2; 는 컴파일 에러
100 * 2 /3 % 5 // 200 , 66 , 1 결과값은 1이 나온다.
증감, 부호, 비트, 논리, 대입은 연산 방향이 우측에서 좌측으로 연산한다.
우선 순위를 숙지했더라고 해도 여러가지 연산자가 섞여있다면 혼란스러울 수 있으니 괄호()로 묶는 것을 추천한다.
public class Example {
public static void main(String[] args) {
System.out.println("개발자가 되기 위한 필수 개발 언어 Java");
}
}