연산자부터 조건·반복문까지
이것이 자바다 | 신용권의 Java 프로그래밍 정복_1
2018.04.04.수
1. 연산자와 연산식
- 연산(operations)
프로그램에서 데이터를 처리하여 결과를 산출하는 것 - 연산자(operator)
연산에서 사용되는 표시나 기호 (예) +, — , *, ==…. - 피연산자(operand)
연산되는 데이터 - 연산식(expression)
연산자와 피연산자를 이용하여 연산의 과정을 기술할 것(예) x, y, z, i, j …
연산자는 피연산자(변수)의 수에 따라 단항, 이항, 다항 연산자로 구분한다.
1) 단항 연산자: ++x;
2) 이항 연산자: x +y;
3) 삼항 연산자: (sum > 90) ? "A":"B";
연산식은 반드시 하나의 값만을 산출한다. 연산자 수가 아무리 많아도 두개이상을 산출하지 않는다.
2. 연산의 방향과 우선순위
프로그램에서는 연산자의 연산방향과 연산자 간의 우선순위가 정해져 있다.
&&보다는 >,<가 우선순위가 높기 때문에 x>0이 먼저 처리되고 &&는 이전의 산출값을 가지고 연산한다.
대부분의 연산자는 왼쪽에서 부터 오른쪽으로( →) 연산을 시작한다.
1) 우선순위가 같은 경우
a = b = c = 5; (진행방향: 왼쪽 <-- 오른쪽)2) 우선순위가 다른 경우
100 * 2 / 3 % 5; (진행방향: 왼쪽 --> 오른쪽)
이렇게 우선순위가 정해져 있어도 여러 연산자들이 섞이다보면 혼란스럽다.
괄호( )를 사용해서 먼저 처리해야 할 연산식을 묶는것이 좋다.
2–1.단항연산자
피연산자가 하나뿐인 연산자를 의미하며 부호연산자(+, -),증감연산자(++, — ), 논리부정연산자(!), 비트반전 연산자(~)가 있다.
증감연산자
증감연산자는 변수의 값을 1증가(++) 또는 2감소( — )시키는 연산자이다.
boolean타입을 제외한 모든 기본 타입의 피연산자에서 사용가능하다.
- 전의형: 항의 앞에서 먼저 계산한다.
(++/ — ) 피연산자 : 다른연산 수행 전 피연산자의 값을 1증가/감소시킴. - 후의형 : 항의 뒤에서 먼저 계산한다.
피연산자 (++/ — ) : 다른연산 수행 후 피연산자의 값을 1증가/감소시킴.
1) ++i; i++;은 모두 i = i+1;로 동일하다.
2) --i; i--;은 모두 i = i-1;로 동일하다.
++i가 i=i+1보다 연산 속도가 빠르다!
i = i + 1;은 = 연산자와 +연산자가 있기때문에 두번의 연산이 필요하지만 ++은 하나의 연산만 수행하기 때문이다.
논리 부정 연산자(!)
논리 부정 연산자 True를 False를 True로 변경하기 때문에 boolean타입에만 사용할 수 있다. 논리 부정 연산자는 조건문과 제어문에서 사용되어 조건식의 값을 부정하도록해서 실행흐름을 제어할 때 주로 사용한다.
두가지 상태(True/False)를 번갈아가며 변경하는 Toggle기능 구현 시에도 주로 사용한다.
비트반전 연산자(~)
비트 반전 연산자는 정수 타입(byte, short, int, long)의 피연산자에만 사용된다. 피연산자를 2진수로 표현했을때 비트값인 0 →1로 1 →0으로 반전한다.
연산후, 부호비트인 최상위 비트를 포함해서 모든 비트가 반전됙 때문에 부호가 반대인 새로운 값이 산출된다.
- 비트 반전 연산자 산출타입은 int타입이 된다는 것이다.
- Integer.toBinaryString()메소드를 제공하여 문자열을 리턴한다.
2–2.이항 연산자
피연산자가 두개인 연산자이다. 산술연산자(+,-,*,/,%), 문자열 연결 연산자(+), 대입연산자(=,+=,|= 등), 비교연산자(<, ==, != 등), 논리연산자(&&, ||, ! 등), 비트 논리 연산자(&, |, ^), 비트이동 연산자(<<,>> 등)이 있다.
산술연산자
- 피연산자들이 모두 정수 타입이고, int타입(4byte)보다 크기가 작은 경우 모두 int타입으로 변환후 연산을 수행한다. 연산의 산출 타입은 int이다.
(예) byte + byte → int + int = int - 피연산자들이 모두 정수 타입이고, long타입이 있을 경우 모두 long 타입으로 변환후, 연산을 수행한다. 따라서 연산의 산출타입은 long이다.
(예) int + long → long + long = long - 피연산자 중 실수 타입(float, double)이 있을 경우, 크기가 큰 실수 타입으로 변환 후, 연산을 수행한다. 따라서 연산의 산출타입은 실수 타입이다.
(예) int + double → double + double = double
정수 타입의 연산의 결과가 int타입으로 나온느 이유는 자바가상기계(JVM)이 기본적으로 32bit 단-위로 계산하기 때문이다.
오버플로우 탐지(p.80–81)
ArithmeticException 예외 발생 코드 확인
NaN과 Infinity 연산
/ 또는 % 연산자를 사용할 때도 주의할 점이 있다. Java는 프로그램 실행도중 예외가 발생하면 실행을 즉시 멈추고 프로그램은 종료된다. ArithmeticException 예외 발생했을 경우, 프로그램이 종료되지 않게 하려면 예외처리를 해야한다.
5 / 0 --> ArithmeticException 예외 발생
5 % 0 --> ArithmeticException 예외 발생
- / 연산의 결과 Infinity(무한대)값을 가지며, % 연산의결과는 NaN(Not a Number)을 가진다.
- /와 % 연산의 결과가 Infinity(무한대) 또는 NaN이 나오면 다음 연산을 수행해서는 안된다. 왜냐하면, 이 값과 산술 연산을 하면 어떤 수와 연산하더라도 Infinity(무한대)와 NaN이 산출되어 데이터가 엉망이 된다.
비교 연산자
논리 연산자
비트 이동 연산자
대입 연산자
2–3.삼항 연산자
삼항연산자(?:) 세개의 피연산자를 필요로 한는 연산자를 말한다.
삼항연산자는 ?앞의 조건식에 따라 콜론(:) 앞뒤의 피연산자가 선택된다고 해서 조건 연산식이라고 부른다.
System.out → 표준 출력시 사용 → 표준 출력 장치: stdout(Standard(모니터) Output) → Output Stream(열 맞춰서 간다는 뜻이다.)
Java 기본 패키지 안에 들어간 라이브러리가 많기 때문에위 사이트에 들어가서 document 찾아보는 습관을 가져야한다.
System.in → 표준 입력 시 사용
표준 입력 장치: stdIn(Standard(키보드) In) → Input stream
throws IOException를 입력하고 ctrl+Shift+o를 하면 오류가 사라진다.
<keyboard> → <입력 Buffer(Queue)> Memory에 생성 → <Memory>
소스
연산자 요약
연산자와 연산식
연산자
산술/ 관계/ 논리연산을 수행하기 위한 기호 →연산하는 기능(Method Function)
연산의 방향과 우선순위
- 연산자 기능 이해
- 연산자 우선순위 파악
- 연산자 결합성 파악
연산자
- 단항 연산자(상위 두개)
- 이항 연산자(나머지)
- 삼항 연산자(조건연산자)
→ 다형성 : 상황에 따라 다르게 실행
** print() / println() / printf() 차이점 정리하기
p.88
조건문과 반복문 요약
제어구조:Program의 실행 흐름 제어
- 순차 구조
한번만 실행하는 구조, 하지만 컴퓨터는 반복실행을 하기에 순차구조는 많이 사용되지 않는다. - 선택 구조
가장 대표적인 선택구조가 양자택일이다. 선택구조와 관련된 keyword에는 두가지가 있다.
if~ else와 switch~case가 있다. - 반복 구조
일정 기간을 반복적을 자동화하는 목적으로 하는데 프로그래밍할 때 자주 사용되는 구조이다. 프로그램이 한번만 작동하는 것은 의미가 없다. 반복구조에 해당하는 것은 3가지가 있다.
while, for, do~while이 있다.
1) 선 check 반복구조 (== While, for: 반복 횟수가 명확하지 않을때)
→ 반복 종료 조건 검사 (한번도 반복을 안할 경우가 있다.)
2) 후 check 반복 구조(==do~while: 반복 횟수가 명확할 때)
→반복문의 밑에서 실행하기 때문에 한번은 반드시 실해하기 되있다.
메소드는 C언어의 함수와 같다.
원래 메소드는 클래스에 있는것이다.Public Static은 무조건 class와 무관하다. 자유롭게 사용할 수 있지만 꼭 필요한 경우가 아니라면 메인 메소드 이외에는 static 사용을 추천하지 않는다.
Method도 있을수있고 없을 수도 있다. return도 있을 수 있고 없을 수도 있다.
class에는 기본적으로 static이 안들어간다. //여기까지가 기본 형태이다.
return
1) Method 종료
2) 호출한 측에 결과 반환
실습문제(04.04)
주말에 코드 정리해서 올리기