화면으로부터 입력받기 위해서는 Scanner 클래스를 사용해야 한다.
import java.util.Scanner; //Scanner 클래스 사용을 위해 코드에 추가
그 다음 Scanner 클래스의 객체를 생성한다.
nextLine() 메서드를 호출하면, 입력대기 상태에 있다가 입력을 마치고 '엔터(Enter)'를 누르면 입력한 내용이 문자열로 반환된다.
String input = Scanner.nextLine(); //입력받은 내용을 input에 저장
int num = Interger.parseInt(input); //input을 int타입 값으로 변환
위 코드에서는 Interger.parseInt() 메서드를 이용해 문자열을 int타입 정수로 변환했지만 Scanner 클래스의 nextInt()나 nextFloat()와 같이 숫자로 바로 입력받을 수 있는 메서드도 있다.
import java.util.Scanner;
class Ex2_9 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("두자리 정수를 입력해주세요. >");
String input = scanner.nextLine(); //입력내용에 공백이 있으면 오류 발생
int num = Interger.parseInt(input);
System.out.println("입력내용 : "+input);
System.out.printf("num = %d%n", num);
오버플로우(overflow) : 연산 과정에서 해당 타입이 표현할 수 있는 값의 범위를 넘어서는 것.
4bit 2진수는 4자리의 2진수를 저장할 수 있다.
4bit 2진수의 최대값인 '1111'에 1을 더하면 '10000'으로 범위를 벗어나게 된다.
이 경우에는 하위 4bit '0000'만이 저장된다.
오버플로우 자체는 에러가 아니지만 오버플로우가 발생하면 원하는 값을 얻을 수 없게 되므로 충분한 크기의 데이터타입을 선택해서 사용해야 한다.
종류 | 연산자 | 설명 |
---|---|---|
산술 연산자 | + - * / % << >> | 사칙연산와 나머지 연산(%) |
비교 연산자 | > < >= <= == != | 크고 작음과 같고 다름을 비교 |
논리 연산자 | && || ! | | ^ ~ | '그리고(AND)'와 '또는(OR)'으로 조건을 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ?: instanceof | 형변환 연산자, 삼항 연산자, instanceof연산자 |
외에 피연산자의 개수로 연산자를 분류하기도 한다.
피연산자의 개수가 하나면 '단항 연산자', 두개면 '이항 연산자', 세개면 '삼항 연산자'라고 부른다.
대부분의 연산자는 '이항 연산자'이다.
식 | 설명 |
---|---|
- x + 3 | 단항 연산자가 이항 연산자보다 우선순위가 높다.식에서 '-'는 x의 부호를 나타내는 단항 연산자, '+'는 앞의 '- x'와 3을 더하는이항 연산자다. |
x + 3 * y | 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다. |
x + 3 > y - 2 | 비교 연산자(>)보다 산술 연산자의 우선순위가 높다. 'x+3'과 'y-2'가 먼저 계산된 뒤 '>'가 수행된다. |
x > 3 && x < 5 | 논리 연산자 '&&'보다 비교연산자가 먼저 수행된다. 식의 의미는 'x는 3보다 크고 5보다 작다.'이다. |
result = x + y * 3; | 대입 연산자는 연산자 중에서 제일 우선순위가 낮다. |
int i = 10;
i++; // i 값이 1 증가. i = 11
증감 연산자가 수식이나 메서드 호출에 포함되지 않고 독립적으로 쓰일 때는 상관 없지만 그렇지 않은 경우에는 전위형, 후위형의 값이 다르게 나타난다.
int i = 5;
j = ++i; // 전위형 증감 연산자 결과 -> j = 6
// i값이 j에 참조되기 전에 증감 연산을 실행
k = i--; // 후위형 증감 연산자 결과 -> k = 5;
// i값이 j에 참조된 후에 증감 연산을 실행
형변환 방법은 피연산자의 앞에 변환하고자 하는 타입을 괄호와 함께 붙인다.
이때 사용되는 괄호()를 '캐스트 연산자' 또는 '형변환 연산자'라고 한다.
double d = 85.4;
int score = (int)d;
위 코드에서 double 타입인 d를 int타입으로 형변환한 값을 score에 저장했다.
실제로 score에 저장된 값은 소수점아래값을 버림한 85이다.
또한 변환한 값을 score에 저장한 것으로 d값의 변화는 없다.
서로 다른 타입 간의 태입이나 연산을 할 때, 형변환으로 타입을 일치시키는게 원칙이지만 생략하기도 한다.
형변환 없이 실행하는 경우 컴파일러가 생략된 형변환을 자동으로 추가한다.
자동 형변환은 기존의 값을 최대한 보존할 수 있는 타입으로 변환된다.
그래서 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 표현범위가 더 넓은 쪽으로 형변환된다.
long result = Math.round(4.52); // result에 5가 저장됨
나머지 연산자는 나누는 수로 음수도 허용하지만 부호는 무시되므로 음수인 수의 경우 절대값으로 나눈 나머지와 같다.
System.out.println(10 % 8); // 같은 값이 출력된다.
System.out.println(10 % -8);
두 연산자의 값의 크기를 비교하는 대소비교 연산자(>, <, <= 등)와 두 값이 같은지 다른지를 비교하는 등가비교 연산자(==, !=)가 있다.
두 문자열을 비교할 때는 비교 연산자 '=='대신 equals()라는 메서드를 사용해야 한다.
String str1 = "abc" ;
String str2 = new String("abc") ;
System.out.println(str1.equals(str2));
System.out.print(str1==str2);
위의 코드를 실행하면 str1.equals(str2)의 값은 true로, str1==str2의 값은 false로 출력된다.
두 연산자의 내용은 같지만 다른 객체이기 때문이다.
문자열을 비교할 때에는 equals() 메서드를 사용하는 걸 기억하자.
또한 대소문자 구분 없이 문자열을 비교하고 싶을때는 equalsIgnoreCase() 메서드를 사용하면 된다.
||(OR결합) -> 피연산자 중 어느 하나만 true이면 true를 결과로 반환.
&&(AND결합) -> 피연산자 중 어느 하나라도 false이면 false를 결과로 반환.
'x는 20보다 크고 30보다 작다.'
x > 20 && x < 30 // 20보다 크고, 30보다 작음을 둘 다 만족하면 참
20 < x < 30 // 읽히지 않음
'x는 4의 배수이거나 5의 배수이다'
x % 4 == 0 || 4 % 5 == 0 // 배수 검사에서는 나머지 연산을 활용
'x는 2의 배수이거나 3의 배수이지만, 6의 배수는 아니다.'
( x % 2 == 0 || x % 3 == 0 ) && x % 6 != 0
// '&&'연산자가 '||'연산자보다 우선순위가 높으므로 괄호를 사용해야 함
이 연산자는 피연산자가 true이면 false, false이면 true를 반환한다.
System.out.print(!( 4 % 2 == 0 ));
result = ( x > y ) ? x : y ;
조건식 x > y 가 true이면 식1 x를 반환하고, false일 경우엔 식2 y를 반환한다.
대입 연산자의 왼쪽 피연산자를 'lvalue', 오른쪽 피연산자를 'rvalue'라고 한다.
lvalue에 rvalue의 값(연산결과)를 저장하므로 lvalue는 반드시 변수처럼 값을 변경할 수 있는 것이어야 한다.
-> 상수, 리터럴은 lvalue가 될 수 없음.
int i = 0 ;
3 = i + 3 ; // lvalue가 값을 저장할 수 있는 공간이 아님
i + 3 = i ; // lvalue의 연산결과가 리터럴