연산자부터 조건·반복문까지

Eunjeogn Kim
9 min readApr 4, 2018

--

이것이 자바다 | 신용권의 Java 프로그래밍 정복_1
2018.04.04.수

자바 가상 머신(JVM)

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 찾아보는 습관을 가져야한다.

PrintStream 찾아보기
Printf

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)

주말에 코드 정리해서 올리기

--

--