덧셈(+)
, 뺄셈(-)
, 곱셈(*)
, 나눗셈(/,%)
을 수행한다.10/3 : 몫만을 취하여 결과값은 "3"
10%3 : 나머지만을 취하여 결과값은 "1"이 된다.
어떤 변수(x)의 값에 대한 계산 결과를 다시 자기 자신에게 대입하고 하는 경우의 약식 표현이다.
int x = 100;
x = x + 5; // 105
x += 5; // 105
단항 연산자는 모든 사칙 연산자에 표현 가능하다.
+=, -=, *=, /=, %=
단항 연산자로 표현할 수 있는 식에서 계산 대상 값이 1인 경우, 덧셈과 뺄셈에 대해서는
다시 한번 축약할 수 있다.
덧셈의 경우
x = x + 1;
x += 1;
x++;
++x;
뺄셈의경우
x = x - 1;
x -= 1;
x--;
--x;
증감연산자의 표시 위치에 따라 결과가 서로 다르게 적용된다.
x++
-> 증감연산자가 뒤에 표시되는 경우, 현재 x의 값을 먼저 수식에 적용하고,
나중에 x에 대한 1증가를 처리한다.
int a = 100;
int x = 1;
int y = a + x++;
y = 100 + 1;이 먼저 계산된다.
y에 101이라는 값이 대임된 후에 x++가 계산된다.
결과 : y = 101, x = 2
++x
-> 증감연산자가 앞에 표시되는 경우 먼저 현재 x의 값을 1증가 시킨 후,
그 결과를 수식에 적용한다.
int a = 100;
int x = 1;
int y = a + ++x;
++x가 먼저 계산되므로 x는 2가된다.
y = 100 + 2;
결과 : y = 102, x = 2
같다(==)
, 다르다(!=)
, 초과(>)
, 이상(>=)
, 미만(<)
, 이하(<=)
주어진 식이 참인지 거짓인지만 판별 가능하므로, 연산 결과는 boolean 값으로 생성된다.
int x = 100;
int y = 1;
boolean r = x 비교연산자 y;
"AND"
나 "OR"
연산을
- 3-2. AND의 의미를 갖는 &&
"&&"연산자는 두 개의 boolean값을 비교하여 모두 true인 경우만 결과값이 true가 된다.
- 3-3. OR의미를 갖는 ||
"||"연산자는 두 개의 boolean값을 비교하여 둘 중 하나라도 true인 경우 결과가 true이다.
서로 다른 자료형을 연산 혹은 대입하는 경우, java컴파일러가 자료형을 통일한다
이 과정에서 발생하는 형변환을 암묵적 형변환이라고 한다.
int a = 100; // 정수형
float b = a; // 정수형을 실수형에 대입
-> 암묵적 형변환은 어떤 변수가 더 큰 범위의 변수로 대입 가능함을 의미한다.
데이터의 손실을 감수하더라도, 강제로 형변환 시키는 형태
자료형 b = (변환할 자료형)a;
실수형을 정수형으로 변환하는 경우, 소수점 이하 자리는 버려진다.
double a = 3.14d;
int b = (int)a; // 결과는 3
- java 기본 유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(casting)이
이루어 진다.- 서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의 대입에는
일정한 규칙이 있다.
Parent parent = new Child();
- 왼쪽 항(부모 클래스)과 오른쪽 항(자식 클래스)의 객체 유형이 서로 다른 경우,
두 유형이 서로 상속 관계에 있고 왼쪽 객체(부모 클래스)가 오른쪽 객체(자식클래스)
의 상위 클래스인 경우에만 암묵적 형변환이 일어난다.- 하위 클래스에서 상위클래스 유형으로 할당하는 것은 가능하나 그 반대의 경우에는
명시적 형변환을 해야한다.
-> 그러나 상위 클래스 유형을 하위 클래스 유형으로 강제 형 변환하는
경우에는 할당되는 객체의 유형에 따라서 실행 오류가 발생할 수 있다.
A a1 = new B(); A a2 = new X(); ------------------ A a3 = new C(); A a4 = new Y(); ------------------ B b1 = new C(); X x1 = new Y(); ------------------ C c = new C(); B b2 = c; ------------------ Y y = new Y(); X x2 = y;
- 암묵적 형변환은 부모를 상속받는 자식객체의 기능을 부모에게
물려받은기능만 사용하도록 제한한다.- 그러므로 암묵적 형변환이 발생하게 되면 오버라이드된 기능만 사용가능
하고, 추가적으로 구현한 기능은 사용할 수 없다.- 주의할 점은 기능의 제한이지 기능의 변경은 아니다.
Unit u1 = new Army(); Unit u2 = new Navy(); Unit u3 = new AirForce(); u1.attack(); u2.attack(); u3.attack();
- 상속관계의 객체를 부모형태로 변환하면 클래스의 종류를 구분하지 않고
일관된 기능을 호출할 수 있다.- 객체가 상위클래스형태로 형변환 되더라도 Override된 자신의 기능은
잃지 않는다.- 하지만, 추가적으로 구현했던 기능은 사용할 수 없게 되므로
원래의 기능을 다시 사용할 수 있는 방법이 필요해졌다.
- 부모 클래스의 객체를 자식 클래스 형태로 변환하는 것
- 형변환을 위해서는 변환할 클래스 이름을 명시적으로 지정해 주어야 한다.
ChildClass child = (ChildClass)parent;
- 객체가 최초 생성될 때 자식 클래스 형태로 생성되고,
부모 형태로 암묵적 형변환이 된 상태를 다시 원래 자식 클래스 형태로
되돌릴 경우에만 가능하다.
ChildClass child1 = new ChildClass(); ParentClass parent = child1; // 암묵적 형변환 ChildClass child2 = (ChildClass)parent;
Army army1 = new Army(); Unit u = army1; Army army2 = (Army)u; ---------------------- Unit u = new Navy(); Navy navy = (Navy)u;
-> 최초 객체 생성이 부모 형태로 만들어진 경우 불가능하다. Unit u = new Unit(); Army army = (Army)u; ------------------------------- -> 최초 생성된 것과 다른 형식으로 변환하는 것은 불가능 하다. Army army = new Army(); Unit u = army; Navy navy = (Navy)u;
=> 위의 두 경우 모두 문법적인 오류는 없기 때문에,
이클립스에서는 에러를 검출하지 못한다. 하지만 프로그램을 실행
시켰을 경우에는 에러가 발생한다.