Javajungsuk3, Javajungsuk3_10
package javajungsuk3;
public class Ch03_1a2 {
public static void main(String[] args) {
// 3-1, 3-2 연산자와 피연산자, 연산자의 종류
// 연산자: 연산을 수행하는 기호 + - * /
// 피연산자: 연산자의 연산 수행 대상
// 식 : Expression
// 연산자의 종류는 5가지
int x = 5;
int y = 4 * x + 3;
System.out.println("모든 연산자는 연산결과를 반환한다.");
System.out.println(4 * x + 3); // x = 5 / 연산결과인 23이 출련된다.
System.out.println(y); // 대부분의 경우 연산결과를 대입 연산자(=)로 변수에 저장하여 사용한다.
System.out.println("1. 산술 연산자 - + - * / "); // 사칙연산
System.out.println("2. 비교 연산자 - > < >= <= == !="); // 크고 작음과 같고 다름을 비교
System.out.println("3. 논리 연산자 - && || ! "); // AND, OR, NOT
System.out.println("4. 대입 연산자 - ="); // 같다는 의미가 아닌 대입
System.out.println("5. 기타 - (type)? : intanceof"); // 형변환 연산자, 삼항(조건) 연산자, instanceof 연산자
}
}
package javajungsuk3;
public class Ch03_3a4 {
public static void main(String[] args) {
// 3-3, 3-4 연산자의 우선순위와 결합규칙
// 연산자 우선순위 표는 강의에서 보기
// 1항(단항): 피연산자 1개
// 우선순위 : 연산자가 둘 이상있을 때 어떤 연산자를 먼저 수행할지 자동 결정하는 것
// 결합규칙 : 같은 순위의 연산자가 있을 때 어떤 것을 먼저 수행할지 결정하는 것
// 산술 > 비교 > 논리 > 대입
System.out.println("수동으로 우선순위를 바꾸려면 괄호()를 사용한다."); // 3 + 5 * 6 = 33 >> ( 3 + 5 ) * 6 = 48
System.out.println("1항(단항) > 2항"); // -x + 3 / 부호연산자 -x는 1항
System.out.println("덧셈 < 곱셈"); // x + 3 * y
System.out.println("산술 > 비교"); // 2 + 8 > 10 -1 / 10 > 9 / 비교
System.out.println("비교 > 논리"); // x > 3 && x < 5 / x는 3보다 크고 5보다 작다.
System.out.println("대입 연산자는 모든 연산과정이 끝나야 대입을 할 수 있기때문에 우선순위가 가장 낮다."); // y = 3 + 5 >> y에 대입
System.out.println("결합규칙은 대입과 단항을 제외하면 모두 왼쪽에서 오른쪽으로 수행한다."); // 대입과 단항 >> 오른쪽에서 왼쪽
}
}
package javajungsuk3;
public class Ch03_5a6 {
public static void main(String[] args) {
// 3-5, 3-6 증감 연산자, 부호 연산자
// 증가 ++ / 감소-- : 1을 증가, 1을 감소
// 전위형(앞) - 값이 참조되기 전 수행 / x = ++i / 값이 먼저 증가
// 후위형(뒤) - 값이 참조된 후 수행 / x = i++ / 나중에 증가
// 증감 연산자가 독립적으로 사용된 경우 전위, 후위의 차이가 없다. / ++i; , i++;
int i = 5, j = 0;
j = ++i; // 전위형
System.out.println("j = ++i; 실행 후, i =" + i + ", j=" + j);
i = 5;
j = 0;
// 결과를 비교하기 위해, i와 j를 다시 변경하고 후위형 결과보기
j = i++; // 후위형
System.out.println("j = i++; 실행 후, i =" + i + ", j=" + j);
}
}
package javajungsuk3;
public class Ch03_7a8 {
public static void main(String[] args) {
// 3-7, 3-8 형변환 연산자, 자동 형변환
// 형변환 : 변수 or 상수의 타입을 다른 타입으로 변환 / (타입)피연산자
// 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환
// byte < short < int < long < flaot < double
// 값손실이 있는 경우에만 직접 형변환을 해줘야 한다.
System.out.println("float f = 1234;"); // int < float, 타입이 불일치하지만 컴파일러가 자동으로 변환해준다.
System.out.println("int i = 3.14f"); // 에러
System.out.println("3.14f >> 3 : 값손실 발생");
System.out.println("float는 int보다 범위가 크고 값손실이 발생하기 때문에 수동으로 변환해줘야 한다.");
System.out.println("int i = (int)3.14f;"); // 3으로 저장이 된다.
System.out.println("short와 char는 서로 범위가 다르기 때문에 직접 형변환을 해줘야 한다.");// short - +-3만 / char - 0~6만
System.out.println("byte로 봤을 때 long > float이지만 실수형의 표현할 수 있는 범위가 더 넓다. "); // 10의 19제곱 < 10의 38제곱
System.out.println("byte b = 100;"); // 예외다. byte의 범위 -128~127 / 자동 형변환
int i = 100; // byte b = i;
byte b = (byte)i;
System.out.println(b);// 에러 : 100은 범위안에 있지만 i는 변수다. 변수는 컴파일러가 값을 확신할 수 없기때문에 자동으로 변환해주지 않는다.
// byte b2 = 1000; / 에러 : 범위를 넘어섰기 때문이다.
byte b2 = (byte)1000;
System.out.println(b2); // 값손실로 -24 출력
}
}
package javajungsuk3;
public class Ch03_9a10 {
public static void main(String[] args) {
// 3-9, 3-10 사칙 연산자, 산술 변환
// 같은 타입끼리만 계산이 가능하다.
// 결과를 실수형으로 하려면 서로 같은 실수형 타입으로 바꿔서 계산한다.
// 산술변환 : 연산 전에 피연산자의 타입을 일치시키는 것 (자동 변환)
System.out.println(10/4); // 정수끼리 나눴을 때 값도 정수가 나온다. 출력은 2 / 소수점 이하는 버려진다.
System.out.println(10/4.0f); // 10/4.0f >> 10.0f/4.0f >> 2.5(타입은 출력되지 않음)
System.out.println("값손실이 적은 쪽으로 int가 float로 바뀐다."); // int < float
// 산술변환의 규칙 2가지
System.out.println("1. 보다 큰 타입으로 일치시킨다."); // 큰 쪽으로 일치시켜야 값손실이 일어나지 않도록 할 수 있다.
System.out.println("2. int보다 작은 타입이면 int로 변환된다."); // byte short char >> 각 크기 - 1 / 2 / 2
// byte : -128~127 / char : 0~6만 / short : +-3만
// int로 바꾸는 이유 : 이 세 타입은 범위가 좁아서 300 * 300과 같은 작은 계산을 해도 범위를 넘어서기 때문에 오버플로우가 발생해 잘못된 결과가 나올 수 있다.
System.out.println("byte + short >> int + int");
System.out.println("char + short >> int + int");
System.out.println('2' - '0'); // 유니코드인 50 - 48 = 2 / 숫자 2가 출력 된다.
System.out.println("char - char >> int - int로 변환되어 계산된다.");
int a = 1_000_000; // 1백만 = 10의 6제곱
int b = 2_000_000; // 2백만 = 10의 6제곱
// long c = a * b;
long c = (long)a * b; // 1백만 * 2백만 = 10의 12제곱 / int의 범위는 10의 9제곱 / int +-20억 범위를 벗어났다.
System.out.println(c); // 오버플로우 발생 : long에 저장했지만 a * b 는 결과가 int이기 때문에 타입을 변환해줘야 한다.
}
}
package javajungsuk3_10;
public class Ch03_11a12 {
public static void main(String[] args) {
// 3-11, 3-12 반올림 Math.round(), 나머지 연산자
// Math.round() : 소수 첫 째자리에서 반올림한 정수를 반환
// 나머지 연산자 % : 오늘쪽 피연산자로 나누고 남은 나머지를 반환
long l = Math.round(4.52);
System.out.println(l); // 4.52 >> 5
// 첫 째자리가 아닌 다른 자리를 반올림하고 싶은 경우
double pi = 3.141592; // 소수 점에서 넷 째자리인 5에서 반올림을 한 결과인 3.142로 나오게 하고 싶은 경우
double shortpi = Math.round(pi * 1000) / 1000.0; // 3141.592 >> 3142/1000.0 >> 3142.0/1000.0
System.out.println(Math.round(pi * 1000)/1000); // int/int = int / 1000.0(실수)을 나눠야 한다.
System.out.println(shortpi); // 3.142(double)
// pi에서 반올림을 하지 않은 3.141을 얻으려면?
System.out.println((int)(pi * 1000)/1000.0); // 3141.592 >> 3141 >> 3.141
// 값손실을 이용하여 정수로 변환하고 소수점을 옮겨준다. 실수형의 값을 나타내기 위해 1000.0으로 나눈다.
int x = 10;
int y = 8;
System.out.println(x/y); // 몫 = 1
System.out.println(10/8); // 몫 = 1
System.out.println(10%8); // 나머지 = 2
System.out.println(10%-8); // 나머지 = 2와 같은 결과를 얻는다.
System.out.println("정수만 허용, 부호는 무시");
}
}
package javajungsuk3_10;
public class Ch03_13a14 {
public static void main(String[] args) {
// 3-13, 3-14 비교 연산자, 문자열의 비교
// 비교 연산자 : 두 피연산자를 비교하여 true or flase를 반환
// =>, =< (x) / <=, >= (o) / 반드시 앞에 부등호를 먼저
// 문자 비교
System.out.println('A' > 'B'); // 65 > 66 = false
// 문자열 비교 : == 대신 equals()를 사용해야 한다.
// 1번 방법
String str = "abc";
String str2 = "abc";
System.out.println(str == str2); // true
System.out.println(str.equals(str2)); // true
// 2번 방법
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str3 == str4); // false
System.out.println(str3.equals(str4)); // true
System.out.println("보통은 1번 방식을 쓴다. 왜 false가 나오는지는 6장, 9장에서 설명"); // 2번 방식을 써야할 때가 있다.
}
}
package javajungsuk3_10;
public class Ch03_15a16 {
public static void main(String[] args) {
// 3-15, 3-16 논리 연산자, 논리 부정 연산자
// 논리 연산자 : 조건식을 연결할 때 사용하는 연산자
int x = 10, y = 3 * 3;
System.out.println(x == 10 || x < y); // true / OR : 어느 한 쪽이 참이면 true로 결과가 나온다.
System.out.println(x % 2 == 0 || x % 3 == 0); // true / 10은 2의 배수이므로 참이다.
System.out.println(x > y && x == y); // false / AND : 양 쪽 모두 참이여야 true로 결과가 나온다.
System.out.println(x > y && (x * y) > x); // true / 10 > 9, 30 > 10 : 양 쪽 모두 참이다.
System.out.println((x + y)!=10); // true / 9 + 9 = 18이므로 10이 아닌 것이 참이다.
System.out.println("x >= 10 && x < 20");// x는 10보다 크거나 같고 20보다 작다.
System.out.println("보통은 변수를 왼쪽에 쓰지만 이런 경우 가독성 측면에서는 10 <= x && x < 20이 나을 수도 있다.");
System.out.println("AND와 OR가 조건에 같이 있다면 AND가 우선순위가 더 높다."); // 순서를 바꾸려면 OR에 괄호를 한다.
char ch = '5';
System.out.println('0' <= ch && ch <= '9'); // 유니코드가 연속적으로 나열되어있기 때문에 가능한 식이다. / 48~57
System.out.println("대문자인지 소문자인지 확인하는 조건문도 이와 비슷하다."); // 'a'~'z', 'A'~'Z'
boolean b = true;
System.out.println(!b); // true의 반대인 false
System.out.println(!!b); // 단항 연산자와 대입 연산자는 오른쪽에서 왼쪽으로 계산된다. / !false >> true
}
}
package javajungsuk3_10;
public class Ch03_17a19 {
public static void main(String[] args) {
// 3-17 ~ 3-19 조건 연산자, 대입 연산자
// 조건 연산자 : 조건식의 결과에 따라 연산결과를 달리한다,
// 조건식 ? 식1 : 식2 >> 결과가 참이면 1식의 결과가 되고, 거짓이면 2식의 결과가 된다.
// lvalue : 대입 연산자의 왼쪽(left) 피연산자 / rvalue : 대입 연산자의 오른쪽(right) 피연산자
System.out.println("result = (x > y) ? x : y; 이런 조건 연산자는 if문의 형태를 간단하게 만든 것이다.");
System.out.println("lvalue는 변수와 배열같은 저장공간이여야 한다."); // 오른쪽 값을 대입하기 위한 저장공간
final int max = 3;
System.out.println(max);
System.out.println("max = 10; >> 에러발생"); // 키워드 final을 붙이면 상수가 된다. (상수 : 값을 한번 저장하면 변경 불가)
}
}
Comments