자바 기본 문법

Sirius·2023년 10월 29일
post-thumbnail

1. 자바의 키 입력

1) Scanner

System.in은 키보드 장치와 직접 연결되는 표준 입력 스트림 객체이다.(low-level) 따라서 입력에 System.in을 사용하면 읽은 바이트 정보를 응용프로그램이 문자나 숫자로 변환해야 하는 번거로움이 있음
-> 그래서 (high-level)의 스트림 클래스 Scanner를 사용한다.

import java.util.Scanner; //Scanner 클래스 코드가 어디있는지 알려줌
Scanner scanner = new Scanner(System.in);

scanner.close(); // Scanner 사용종료

키보드입력 -> System.in ->바이트 스트림(0 1 1 0)-> Scanner -> 'a', 3.5, "hello" -> 자바응용프로그램

scanner.next()는 입력을 공백으로 구분한다.

  • 입력: Kim Seoul Tony -> "Kim", "Seoul", "Tony"
String name1 = scanner.next(); // "Kim"
String name2 = scanner.next(); // "Seoul"
String name3 = scanner.next(); // "Tony"

scanner.nextLine();은 enter를 기준으로 구분한다.

2. 연산자

1) Sign Operator(+,-)

  • byte 연산 실수
byte b = 100;
byte result = -b;

b라는거 만들고 할당함, -를쓰면 똑같이 operation임 따라서 타입이 int로 바뀐다. 따라서 int result = -b; 이렇게 써야한다.

byte a;
byte b;
a+b = type(integer)

a라는 바이트 타입만들고 할당, b라는 바이트 타입만들고 할당
+로 연산하면 a와 b가 int로 타입변환함 a(int) + b(int) = (int)가 된다.

2) Increment and Decrement Operators

int x=1;
int y=1;
++x // 2
y++ // 2

int result1 = ++x + 10 // 12
int result2 = y++ + 10; // 11, y++는 나중에 2가됨

3) Arithmetic Operators

byte a=10;
byte b=4;
long c= 10L; // integer로 알아먹는거 방지위해 L붙임
a+b = type(int)
a+b-c = type(long) // 타입중에 하나만 long이어도 long이 됨

byte(1) < short(2) < int(4) < long(8)

4) Overflow & Underflow

uint8_t ->  (0~255)
byte -> (-128 ~ 127)

byte value = 127;
value++;
System.out.println(value) // 답은 -128(오버플로우)

5) Integer Operation

int apple=1;
double pieceUnit = 0.1
int number = 7;

double result = apple - number * pieceUnit;
System.out.println(result);//답은 0.3이 나와야하지만 0.2999로 나옴

floating 포인트가 정확하지 않을 수 있음, floating 포인트 타입이 사용된 부분은 pieceUnit임(여기서 에러가난다)
floating에서 바이너리로 바꿀때 에러가 생김.
0.1은 floating 포인트로 정확하게 나타낼 수 없음.
따라서 pieceUnit을 integer로 바꾸면 된다.

int apple=1;
int totalPieces = apple*10;
int number = 7;
double result = totalPieces - number*apple;
System.out.println(result);//3로 나옴

6) Preventing Exceptions in Division Operations

가) Arithmetic Exception(정수 / 0, 정수 % 0)

int x = 5;
int y = 0;
System.out,println(x/y); // arithmatic exeception 발생하고 프로그램이 멈춘다.

나) No Exception(실수 / 0.0, 실수 % 0.0)

int x = 5;
double y = 0.0;
System.out,println(x/y); // infinity 출력
System.out,println(x%y); // NAN 출력

이런게 왜 문제가 될까? (어떤 상황에서)
문제를 모르고 지나칠 수 있다...
앞부분에서 피자 5판을 시킴 학생수대로 나눠주려고함 아무도 안옴(0명)
그러면 피자가 한명당 몇개씩 돌아가는거에 대해서 계산이 되면 안됨.

5/ 0.0 = infinity * 300kcal = infinity

다) How to solve No Exception?

따라서 Double.isInfinite() and Double.isNaN() 를사용해야함

Double.isInfinite(5/ 0.0) = infinity * 300kcal = infinity

7) Comparison Operators

  • Q String은 어떤타입?
    A: strings -> reference type이다.

When comparing strings, use the equals() and !equals() methods instead of the equality (==, !=) operators

  • Why use equals()?
    JVM memory
    1) stack
    s1(힙의 pool 안의 "cat" 가리킴),
    s2(힙의 pool안의 "cat" 가리킴),
    s3(힙의 객체 "cat"을 가리킴),
    s4(힙의 객체 "cat"을 가리킴)
    2) heap
    String constant pool : "cat"
    "cat" (힙에 계속 생김)
    "cat" (힙에 계속 생김)
String s1 = "cat"; // 리터럴(pool에 저장)
String s2 = "cat"; // 이미 pool에 저장된거 s2가 가리킴
String s3 = new String("cat"); // String이라는 새로운 객체를 만들었다.
String s4 = new String("cat");// String이라는 새로운 객체를 만들었다.

리터럴로 하면 pool안에 만든거를 스택에서의 변수가 가리킨다. 오브젝트로 만들면 값이 힙에 계속 만들어진다. 이러면 힙의 메모리를 계속 잡아먹을 수 있다.

만약 s1 == s2비교하면 True가 나온다.
그렇다면 s1 == s3 비교하면 False가 나온다.
다른거를 가리키기 때문임.
우리는 string안에 있는 내용을 비교하고 싶은 것임.
그러나 서로 다른거를 가리키고 있기에 false가 나옴

따라서 string비교하려면 s1.equals(s3)이렇게 해주어야함 이러면 내용을 비교해줌

8) Bitwise Logical Operators

byte, short, int, long만 피연산자가 될 수 있고 float 및 double 은 피연산자가 될 수 없다.

45 & 25 = ?

	00101101(2)
	00011001(2)
&---------------
	00001001(2) -> 9

c --------data-----> Java
uint8_t Byte
(0~255) (-128~127)
136--------------------> -120
10001000 (10001000)

첫번째 value가 1이면 마이너스(2의 보수)

  • 2의 보수 계산법(10001000 -> -120)
    1) 10001000을 전부 뒤집는다. -> 01110111
    2) +1 한다. 01111000(2) = 120
    3) -를 붙인다. -> -120
  • 2의 보수에서 다시 2진수로 바꾸는법 (-120 -> 10001000)
    1) -120을 2진수로 바꾼다. -> 01111000
    2) 전부 뒤집는다. -> 10000111
    2) +1한다. -> 10001000(2)

원래 c에서 의도한 136으로 변환하려면 자료형을 int로 변환함과 동시에 bitwiselogicaloperation 써야함

  • 부호 확장(Sign Extension)
    b의 최상위 비트(가장 왼쪽 비트)는 1이고, 이는 음수를 의미합니다. byte에서 int로 변환 시, Java는 부호를 유지하기 위해 상위 비트들을 최상위 비트(1)로 채웁니다:
byte b = -120; //-120으로 변해버린 상태 -> 다시 2진수로 바꾸면 10001000(2)
int i = b & 0xFF; //b를 0xFF와 bitwiseLogical Operation
	11111111 11111111 1111111 10001000
& 	00000000 00000000 0000000 10001000
	00000000 00000000 0000000 10001000 = 136
    

9) Bitwise Shift Operators

가. a << b

a의 각 비트를 b만큼 왼쪽으로 이동(오른쪽 빈자리는 0으로 채움)
= a x 2^b

나. a >> b

a의 각 비트를 b만큼 오른쪽으로 이동(왼쪽 빈자리는 최상위 부호비트와 같은값으로 채움)
= a / 2^b

다. a >>> b

a의 각 비트를 b만큼 오른쪽으로 이동(왼쪽 빈자리는 0으로 채움)

10) Compound Assignment Operators

+=, -=, *=, /=, <<=, >>=

">>="과 "<<="은 비트 시프트 연산자이다.

11) Ternary Operator

operand0 ? operand1 : operand2

operand0의 조건이 참이면 operand1실행(true) 아니면 operand2(false)실행

0개의 댓글