com.eomcs.lang.ex05

com.eomcs.lang.ex05.Exam0610.java
증감 연산자 : 후위(post-fix) 증가 연산자

전위 연산자 (+, -, ++, --)

int a = 100;
++a; ← 컴파일 할 때 변환

C로 프로그램을 짜더라도 결국에는 기계어로 바ㄲ
C++
Python
Java
C나 C++나 Python이나 Java나

C에는 없는 문법이 C++에 있음
C++에 없는 문법이 Java에 있음
컴파일하게 되면 그 문법에 맞게끔 색다른 아니라
결국에는 기계어로 바뀜
프로그래밍 언어 문법 특징
결국 컴파일하면 기계어
기계어는 같음
물론 자바는 중간에 바이트코드가 있지

컴파일하기 전에 어떤 명령문이냐
++a;
a = a + 1;
a? => 101

  a  =  a + 1;
  ↓       ↓
메모리    값

assignment operator(할당 연산자, 배정 연산자, 대입 연산자)
왼편에 있는 값을 오른편에

주의!
항상 r-value가 모두 실행된 후 마지막으로 = 연산자가 실행된다.

후위 연산자 (++, --)

int a = 100;
a++;
---------------
int temp = a;
a = a + 1;
a? => 101

먼저 임시 변수가 만들어진다.
임시 변수에 a 값을 저장한다.
그 다음 기존의 a 값을 1 증가시킨다.

int a = 100;
a--;
--------------
int temp = a;
a = a - 1;
a? => 99

단독적으로 쓰일 때는 전위 연산자랑 별 차이가 없음
할당연산자와 함께 쓰이거나 어떤 문장 속에서 사용될 때는 완전히 다름

임시 변수 temp는 언제 씁니까?

int a = 100;
int b;
b = ++a;
-------------    
a = a + 1;
b = a;

a? 101
b? 101

int a = 100;
int b;
b = a++;
--------------     
int temp = a;
a = a + 1;
b = temp;

a? 101
b? 100

현재 a 값을 먼저 집어 넣는다 ← 이거는 말이 안 됨!
할당 연산자는 제일 마지막에
임시 변수에 보관시킨 값을 b에 저장한다.

630번

int i = 7;
int j = i++;
System.out.println(j); // 7
System.out.println(i); // 8
----------------------------
int temp = i;
i = i + 1;
int j = temp;
int a = 100;
a = a++;
System.out.println(a); // 100
------------------------------
int temp = a; 
a = a + 1; 
a = temp; 

// a는 101에서 100으로 다시 바뀌었다.

↑ 631번 참고

lang.ex05.Exam0610.java

int i = 100;
System.out.println(i++);

① i++
② println
메소드 호출 전에 파라미터로 주어진 표현식을 먼저 실행한다.

위의 코드는 컴파일 할 때 다음의 코드로 바뀐다.

int temp = i;
i = i + 1;
System.out.println(temp);

실행순서 잘 보기

640번
lang.ex05.Exam0640.java

int i = 2;
int result = i++ + i++ * i++;

곱하기보다 후위연산자가 우선 순위가 더 높음

곱하기 연산자를 제일 먼저 수행하는 게 아니라
후위연산자를 앞에서부터 순서대로 수행하고
곱하기 수행하고 더하기 수행

pre-fix 연산자나 post-fix 연산자를 리터럴에 적용할 수 없다.
변수에 대해서만 가능!
전위 연산자와 후위 연산자를 동시에 적용할 수 없다.

610 ~ 710

com.eomcs.lang.ex99

com.eomcs.lang.ex99.Exam0110.java
System.out.print('\n');

System.out.printf("안녕하세요! %s입니다.\n");
→ 에러 뜸

System.out.printf("%d %x %c %b\n", 65, 65, 65, true);
65 41 A true
출력될 때는 0x 안 붙음

문자 번호라고 안 하고 character code 라고 함

System.out.printf("%d %x %c %b\n", 65, 65, 65, false);

false만 false로 나옴
나머지는 다 true로 나옴
그냥 안전하게 true, false만 입력하기

System.out.printf("%d %x %c\n", 65);
→ 에러

System.out.printf("%d %1$x %1$c\n", 65);

System.out.printf("%3$d %1$x %2$c\n", 65, 66, 67);

+는 숫자 앞에 부호를 붙인다.

특정 조건이 만족이 될 때 실행되는

if (age >= 19); // if 문에 빈 문장을 넣을 수 있다.

에디터에 auto indent 기능

if 무조건 중괄호 사용하기

boolean b;
if (b = true) System.out.println("된다!");

java google style guide 검색

https://google.github.io/styleguide/javaguide.html

아무 문장이 없어도 중괄호 쓰기
한 문장이어도 중괄호 쓰기

2칸 들여쓰기

com.eomcs.lang.ex06.Exam0150.java

else는 가장 가까운 if에 소속된다.
들여쓰기에 속지 말라!

키보드 입력 다루기

com.eomcs.lang.ex99.Exam0210.java
키보드 입력 받기 - System.in 과 java.util.Scanner

java.io.InputStream keyboard = System.in;
System.in : 키보드를 가리킨다.

read() : int
리턴 타입이 int
실제 리턴하는 것은 1 byte

read(byte[] b) : int
바이트 배열을 주면 바이트 배열을 왕창 읽어 온다

InputStream은 바이트 단위로 읽는 기능이 있다.
바이트 단위로 읽어서 int나 문자열로 바꾸려면 또 코딩해야 하는 불편함이 있다.

키보드에 스캐너를 장착한다.
java.util.Scanner keyboardScanner = new java.util.Scanner(keyboard);

아까보다 메소드가 많음

nextByte()
nextDouble()
nextFloat()
nextInt()

다 있음
사용자가 입력하는 건 문자열
그 문자열을 해당 타입으로 바꿔서 리턴해준다.

nextLine()
사용자가 엔터 칠 때까지 기다림

내장 함수 중에 close가 있으면
아 이거는 닫아줘야 되는구나

키보드 입력 다루기

12시 46분
45분

System.in : 키보드 입력 도구
.read()
.read(byte[])

System.out : 콘솔 출력 도구
.print()
.println()
.printf()

System.out.println(keyboardScanner.nextLine());
keyboardScanner.nextLine() 실행이 끝나야 System.out.println() 실행됨

keyboardScanner.close(); 습관 들이기

boolean b = keyScan.nextBoolean();
대소문자 상관없이 true, false는 되는데 숫자는 안 됨

230번

아직 읽어들일 값이 남았으면 사용자를 기다리지 않는다.
기다리지 않고 바로 실행

그 다음 공백을 만날 때까지
공백을 만나는 순간

아직 읽을 게 있네?
공백은 버린다

nextInt()는 한 개의 토큰(token)을 읽을 때가지 기다린다.

token?
⟹ 공백으로 구분되는 단어
공백(whitespace) : 스페이스, 탭, 줄바꿈

context : 상황

상황 인지 시스템 : context intelligence system

받고 싶으면 받는 거고 안 받아도 되는 상황이면 안 받아도 되는 거
남아 있는 찌끄러기

읽을 게 없어요~ 입력하세요~

com.eomcs.lang.ex06

자바에는 else if 라는 문법은 없다

222번
일부러 break 생략한 거

223번
break 문을 쓰지 않으면 계속 이어서 실행된다.
case 100:
case 90:
90 ~ 100 사이 그런 의미 아님
그렇게 하고 싶으면 if문 써야 됨

230번
char c = 'A'; // A문자의 유니코드 값(UTF-16) 0x41(65)을 c에 저장한다.
싱글 쿼테이션이라는 연산자가 하는 일임

int 정수(byte, short, int, char), 문자열, 특별한 상수 Enum 타입
4바이트를 넘어가는 정수는 사용할 수 없다.
case 값으로 변수를 사용할 수 없다. 리터럴만 가능하다.

case에는 리터럴만 올 수 있다.

case 1 * 300: // OK

case 1 * y: // 컴파일 오류!

241번
상수는 사용할 수 있다.

241번은 다른 값을 넣어버릴 수도 있음
242번은 실수를 최소한으로 줄일 수 있음. 안전성까지 가지고 있음.
이 문법이 존재하는 이유를 항상 설명

2진수 맨 끝이 0이면 짝수. 1이면 홀수
& 1 : 맨 끝에 비트만 뽑아내는 거
비트 연산이 속도가 훨씬 더 빠르다.

330번
break는 자신이 소속된 가장 가까운 반복문을 나간다.

331번
중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.
myloop 라벨에 소속된 문장을 나간다.

310 ~ 331
39분 시작
20분

while, do ~ while

라벨
중첩 반복문을 한 번에 빠져나오고 싶을 때

610번부터 430번까지

내일은 메소드!!!

0개의 댓글