1.Scanner(데이터 입력)
사용자 입력을 받기위한 클래스. 키보드, 파일, 문자열 등 다양한 입력 소스를 읽을 수 있다.
사용자가 입력하는 값을 (1)공백, (2)탭, (3)띄어쓰기 등으로 구분하여 입력받는다.
후술하겠지만 다른 nextㅇㅇ은 스페이스로 구분하지만 nextLine은 반드시 Enter(\n포함)으로 입력을 마친다.
1.1 형식 및 설명
import java.util.Scanner;
자바에서 제공하는 구성요소를 불러온다.
Scanner 객체명A = new Scanner(System.in);
System.in : 키보드로 입력받는다
int num = 객체명A.nextInt();
엔터키 이전까지 입력된 문자열을 읽는다. 입력받은 값을 int형으로 반환한다.
scanner.close();
Scanner 객체를 닫아 메모리를 해제한다.
--------------------
위는 변수의 자료형과 함께 변수값을 대입하는 경우이고,
이미 선언된 변수의 경우
import java.util.Scanner;
public class Example_01_re2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num;
System.out.println("입력하세요");
num = sc.nextInt();
}
}
이런식으로 하기도 한다.(그냥 학원에서는 선언+대입만 했는데, 책에서는 선언 대입 따로 하길래..)
1.2 종류
-정수형
byte nextByte() / short nextShort(); / int nextInt(); / long nextLong();
-실수형
float nextFloat(); / double nextDouble();
-문자형 : 얘만 형식이 조금 다르다.
String next(); : 입력받은 값을 문자열 타입으로 반환. '띄어쓰기'로 구분.
String nextLine(); : 입력받은 '라인 전체'를 문자열 타입으로 반환. '엔터키'로 구분한다.
만약 "빛나는 개발자"라고 입력시,
next();는 '빛나는'으로, nextLine();은 '빛나는 개발자'로 출력된다.
교과서에서 의도한 부분은 아니지만, 예제를 보다가 문자열을 엔터키로 구분받나, 스페이스로 구분받나는 출력이 다를 뿐만 아니라, 큰 차이가 있음을 알게 되었다.
nextLine();은 '개행문자를 읽고 버린다.'
만약 정수형이나 실수형, 그리고 next(); 같은 경우 여러 값을 입력받을 때 공백으로 구분해 엔터없이 한줄로 입력받을 수 있다.
ex. 이름-나이-직업을 입력받는다면?
"홍길동 30 도적 "으로 입력하면 된다.
그런데, 이름-나이-주소(문장)-직업을 입력받는다면?
"홍길동 30 부산 진구
도적"
으로 입력받아야 한다.
예시가 적절한 예시인지는 모르겠지만 여튼, 이런 점에서 nextLine은 차이가 있다. 엔터로 구분받는 차이뿐만 아니라, 오류가 뜨기도하고 공백이 추가돼서 출력되기도한다. ChatGPT에서는 '변수.nextLine();' 한줄을 추가해 개행문자를 소비하라고 한다.
다른 함수와 nextLine의 차이점을 알아보려고 여러 테스트를 해봤는데.. 간결하게 뭐라 쓰기가 어렵다. 스캐너는 일단 여기까지.
2.연산자(Operator)
연산 = 데이터를 처리, 산출하는 작업으로 연산에 사용되는 값인 항(Operand)과 연산기호인 연산자(Operator)로 이루어짐. 연산과정은 연산식(Expression).
Ex, a + b = c에서, a,b는 항 / +는 연산자 / a + b = c 연산식
2.1 단항 연산자 (Unary Operators)
:피연산자가 1개
2.1.1 부호 연산자 (Sign Operators):
양수인지 음수인지 부호를 나타냄.
기본자료형 중 정수형, 실수형에서만 사용 가능.
int a = 10;
int result1 = +a;
int result2 = -a;
System.out.println(result1);
System.out.println(result2);
출력하면?
+10
-10
2.1.2 증감 연산자 ( Increment/Decrement Operators):
피연산자 값을 1씩 증가 or 감소시키는 연산자.
++는 1증가, --는 1감소.
증감연산자가 앞에 붙으면 즉시 반영되고 (전위형)
뒤에 붙으면 코드 실행 후 반영된다.
ex.
public class Example_05 {
public static void main(String[] args) {
int a = 10;
System.out.println(++a);
System.out.println(a++);
System.out.println(++a)
System.out.println(a);
++a;
System.out.println(a);
}
}
이면 11 11 13 13 14이 출력된다.
보다시피, 증감연산자는 피연산자가 사용되는 어디서도 적용할 수 있다.
(println에 들어가도되고, 단독으로 실행문을 작성해도 된다)
또한, 문자형이기 전에 정수형이라고 부르는 char형도 증감연산자를 사용할 수 있다.
ex.
char x = 'x';
System.out.printf("유니코드 %d = '%c'\n",(int)x,x++);
System.out.printf("유니코드 %d = '%c'",(int)x, x);
라면
첫 줄엔 x 값이 그대로 출력되고, x++이 실행 된 이후에는 x에 1이 더해져 121과 y로 출력되는 모습을 볼 수 있다.
2.1.3 논리 부정 연산자 (Logical Negation Operator):
논리연산자 중 유일한 단항연산자. 불리언(boolean)값을 가지는 피연산자 앞에 '!'를 붙여 값을 반대로, 즉 true를 false로, false를 true로 바꾼다.
boolean am_i_pig = true;
System.out.println(!am_i_pig);
System.out.println(am_i_pig);
특이한 점은, 이 연산자를 사용한 곳에서만 적용될 뿐 진짜 변수 값이 바뀌지는 않는다. 앞선 증감연산자에서는 변수값이 바뀌는 모습과는 상반된다. (am_i_pig가 true인건 결국 변하지 않았다.)
2.2 이항 연산자 (Binary Operators)
:피연산자가 2개. 연산자가 중앙에 있고 그 좌우에 피연산자가 위치한다. 즉 2 + 3과 같은 형식.
2.2.1 산술 연산자 (Arithmetic Operators):
+, -, *, /, %(나머지)
연산의 결과값은 피연산자의 자료형 범위안에 있어야한다.
ex,
//int
int result= 100000 * 1000000;
System.out.println(result);
//long
long result2 = 1000000l * 1000000l;
System.out.println(result2);
long에서는 정확한 수가 출력된 반 int형에선 엉뚱한 수가 출력되었다. 아마 int 범위를 초과한 수부터 다시 세었을 것. 실수형이라면 0이나 Infinity가 출력될것.
float f1 = 10e30f;
System.out.println(f1);
float result3 = 10e30f * 9e30f;
double result4 = 10e30 * 9e30;
System.out.println(result3);
System.out.println(result4);
10^30자체는 float의 자료형이 담을 수 있지만(3.4e38보다 작다), 대략 이 두개를 곱한 값은 flaot의 범위를 넘기에 발산한다.
마찬가지로 Double형에서는 담을 수 있기때문에 정상적으로 출력이된다.
2.2.2 대입 연산자 (Assignment Operators)
:대입과 연산을 한번에!
=, +=, -+, *=, /=, %=
'x = x+y' 라는 식을 'x += y;' 로 축약해서 쓸 수 있다.
대입연산자를 사용하면 소스코드가 깔끔해지지만, 가독성이 떨어지기때문에 실무에서는 그냥 전자처럼 풀어쓴다고 한다.
2.2.3 관계 연산자 (Relational Operators)
-대소 연산자 : <, <=, >, >=
-등가 연산자 : ==, !=
설명이 필요한 부분은 ==와 !=.
==는 일반 수식의 '='와 같고, !=는
'≠'와 같은 의미.대소연산자는 그 특성상 '숫자'의 크고 작음을 비교하기 때문에 기본자료(boolean 제외)에서만 사용가능하다.(단, char형은 int타입으로 변환되어 연산된다.)등가 연산자는 문자열이 일치하는지, 일치하지 않는지도 비교할 수 있기때문에 모든 자료형에서 사용이 가능하다.
print문에서 사용하면 표현이 맞냐, 아니냐로 판단해 true 또는 false값을 출력한다.
int x = 10;
int y = 11;
System.out.println(++x <= y);
이 경우 ++x =11, y=11이므로 'true'를 출력한다.
2.2.4 논리 연산자 (Logical Operators):
단항연산자의 논리부정연산자와 마찬가지로 boolean형에서만 사용가능한 연산자.
&& (Logical AND)
|| (Logical OR)
! (Logical NOT)
2.2.5 비트 연산자 (Bitwise Operators):
2.3 삼항 연산자 (Ternary Operator)
:피연산자가 3개
2.3.1조건 연산자 (Conditional/Ternary Operator):
2.4 연산순서와 방향
우리가 덧셈보다는 곱셈을 먼저 하듯, 자바의 연산에도 순서가 있다.
예를들어 1+2*3(4+5)라는 식이 있으면 괄호먼저 -> 곱셈먼저 ->덧셈먼저와 같은 아주 기본적인 식이다.
그런데 자바에서는 이보다 많은 연산자가 있고 그만큼 연산순서를 손쉽게 알아차리기 힘들다.
Ex, a | 4+c >> b & 7 이란 식이 있다면? 쉽게 순서를 알아차리기 힘들기에 가독성이 떨어진다.
따라서, a| (( (4+c) >> b) & 7) 과 같이 계산 순서에 맞게 괄호를 추가해 적으면 누가 읽더라도 쉽게 이해할 수 있다.
아래는 중요한 연산 순서를 간략하게 정리
- 단항>이항>삼항 연산자 순
-이항연산자는 산술 - 비교 - 논리 - 대입 순
-단항과 대입만 오른쪽에서 왼쪽, 나머지는 왼쪽에서 오른쪽.
'Back-End > Java' 카테고리의 다른 글
자바 Servlet 기초 예제(doGet : 데이터 조회) (0) | 2023.08.31 |
---|---|
JDBC 사용하기(Java + MySQL) 쿼리날려보자! (0) | 2023.07.27 |
mySQL과 Java 연결하기(JDBC 라이브러리) (0) | 2023.07.26 |
for문, if문만 이용해 소수 찾는 프로그램 만들기 (기록용) (0) | 2023.05.27 |
변수 초기화, 자료형, 형변환 (0) | 2023.05.23 |
실행문, 출력문, 변수 (0) | 2023.05.14 |