⭐JAVA 연산자/형변환⭐

p_chan.log·2022년 8월 5일
0

JAVA

목록 보기
6/17

🔴연산자

💠연산자란

  • 프로그램에게 연산을 수행하기 위하여 사용되는 특수기호들

1-2. 종류

  • 대입연산자
    : 변수에 숫자나 문자열 등의 자료를 입력하거나 연산 결과를 다른 변수에 할당한다.
  • 사칙연산자
    : 더하기(+), 빼기(-), 곱하기(*), 나눗셈의 몫(/), 나머지(%)
  • 단항연산자
    : 변수에 대한 연산 결과를 다시 자기 자신에게 적용하는 경우 사용한다.
  • 증감연산자
    : 특정 변수에 저장되어 있는 값을 1씩 증가, 감소 시킬 경우 사용한다.
  • 비교연산자
    : 두 개의 변수값 간의 관계를 비교하여 참(true), 거짓(false)의 결과를 반환한다.
  • 논리연산자
    : 좌변과 우변을 논리연산하고, 참일때는 true, 거짓일때는 false값을 반환한다.

1-3. 사칙연산자

  • 일반적인 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/,%)을 수행한다.
  • 사칙연산의 결과는 대입연산자를 통하여 다른 변수에 대입될 수 있다.
  • 정수(byte, short, int long)와 실수(float, double)의 연산시에는 정수가
    실수 형태로 자동 변환되어 처리되기 때문에, 결과는 실수가 된다.

1-4. 나눗셈에 있어서의 주의사항

  • 10 나누기 3일 계산할 때, 수학에서는 몫이 3, 나머지가 1 이라고 계산되지만,
    java에서는 나눗셈에 대해 두 개의 연산자로 구분된다.

10/3 : 몫만을 취하여 결과값은 "3"
10%3 : 나머지만을 취하여 결과값은 "1"이 된다.

  • 프로그램에서의 연산은 2진수로 변화되어 이루어진다. 실수는 2진수로의 변환이 되지 않기 때문에,
    실수의 나눗셈은 오차가 발생한다.
  • 모든 수는 0으로 나눌수 없다.

1-5.단항 연산자

  • 어떤 변수(x)의 값에 대한 계산 결과를 다시 자기 자신에게 대입하고 하는 경우의 약식 표현이다.

    int x = 100;
    x = x + 5; // 105
    x += 5; // 105

  • 단항 연산자는 모든 사칙 연산자에 표현 가능하다.

    +=, -=, *=, /=, %=

1-6. 증감연산자

  • 단항 연산자로 표현할 수 있는 식에서 계산 대상 값이 1인 경우, 덧셈과 뺄셈에 대해서는
    다시 한번 축약할 수 있다.

  • 덧셈의 경우

    x = x + 1;
    x += 1;
    x++;
    ++x;

  • 뺄셈의경우

    x = x - 1;
    x -= 1;
    x--;
    --x;

1-7. "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

💠비교연산자

2-1. 비교연산자

  • 같다(==), 다르다(!=), 초과(>), 이상(>=), 미만(<), 이하(<=)

  • 주어진 식이 참인지 거짓인지만 판별 가능하므로, 연산 결과는 boolean 값으로 생성된다.

    int x = 100;
    int y = 1;
    boolean r = x 비교연산자 y;

💠논리연산자

3-1. 논리연산자

  • 두개 이상의 비교연산자의 결과나 boolean 값에 대해 추가로 "AND""OR"연산을
    수행하여 결과를 얻는다.
  • 3-2. AND의 의미를 갖는 &&
    "&&"연산자는 두 개의 boolean값을 비교하여 모두 true인 경우만 결과값이 true가 된다.
  • 3-3. OR의미를 갖는 ||
    "||"연산자는 두 개의 boolean값을 비교하여 둘 중 하나라도 true인 경우 결과가 true이다.

🔴형변환

💠1. 형변환

  • 변수의 자료형이 변화되는 것을 의미한다.
  • 특정 자료형의 값을 다른 자료형의 변수에 대입할 수 있다.
  • 암묵적 형변환과 명시적 형변환의 두 종류가 있다.

1-1. 암묵적 형변환

  • 서로 다른 자료형을 연산 혹은 대입하는 경우, java컴파일러가 자료형을 통일한다

  • 이 과정에서 발생하는 형변환을 암묵적 형변환이라고 한다.

    int a = 100; // 정수형
    float b = a; // 정수형을 실수형에 대입
    -> 암묵적 형변환은 어떤 변수가 더 큰 범위의 변수로 대입 가능함을 의미한다.

1-2. 암묵적 형변환이 허용되는 범위

  • 암묵적 형변환은 데이터의 손실이 발생하기 않는 점위 내에서만 이루어진다.

1-3. 명시적 형변환

  • 데이터의 손실을 감수하더라도, 강제로 형변환 시키는 형태

    자료형 b = (변환할 자료형)a;

  • 실수형을 정수형으로 변환하는 경우, 소수점 이하 자리는 버려진다.

    double a = 3.14d;
    int b = (int)a; // 결과는 3

💠2. 객체 형변환

2-1. 객체 형변환

  • java 기본 유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(casting)이
    이루어 진다.
  • 서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의 대입에는
    일정한 규칙이 있다.
Parent parent = new Child();
  • 왼쪽 항(부모 클래스)과 오른쪽 항(자식 클래스)의 객체 유형이 서로 다른 경우,
    두 유형이 서로 상속 관계에 있고 왼쪽 객체(부모 클래스)가 오른쪽 객체(자식클래스)
    의 상위 클래스인 경우에만 암묵적 형변환이 일어난다.
  • 하위 클래스에서 상위클래스 유형으로 할당하는 것은 가능하나 그 반대의 경우에는
    명시적 형변환을 해야한다.
    -> 그러나 상위 클래스 유형을 하위 클래스 유형으로 강제 형 변환하는
    경우에는 할당되는 객체의 유형에 따라서 실행 오류가 발생할 수 있다.

2-2. 객체간의 암묵적 형변환

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;

2-3. 암묵적 형변환과 메서드 오버라이드

  • 암묵적 형변환은 부모를 상속받는 자식객체의 기능을 부모에게
    물려받은기능만 사용하도록 제한한다.
  • 그러므로 암묵적 형변환이 발생하게 되면 오버라이드된 기능만 사용가능
    하고, 추가적으로 구현한 기능은 사용할 수 없다.
  • 주의할 점은 기능의 제한이지 기능의 변경은 아니다.
Unit u1 = new Army();
Unit u2 = new Navy();
Unit u3 = new AirForce();	
u1.attack();
u2.attack();
u3.attack();
  • 상속관계의 객체를 부모형태로 변환하면 클래스의 종류를 구분하지 않고
    일관된 기능을 호출할 수 있다.
  • 객체가 상위클래스형태로 형변환 되더라도 Override된 자신의 기능은
    잃지 않는다.
  • 하지만, 추가적으로 구현했던 기능은 사용할 수 없게 되므로
    원래의 기능을 다시 사용할 수 있는 방법이 필요해졌다.

2-4. 명시적 형변환

  • 부모 클래스의 객체를 자식 클래스 형태로 변환하는 것
  • 형변환을 위해서는 변환할 클래스 이름을 명시적으로 지정해 주어야 한다.
ChildClass child = (ChildClass)parent;

2-5. 명시적 형변환의 조건

  • 객체가 최초 생성될 때 자식 클래스 형태로 생성되고,
    부모 형태로 암묵적 형변환이 된 상태를 다시 원래 자식 클래스 형태로
    되돌릴 경우에만 가능하다.
ChildClass child1 = new ChildClass();
ParentClass parent = child1;		// 암묵적 형변환
ChildClass child2 = (ChildClass)parent;

2-6. 명시적 형변환이 가능한 경우

Army army1 = new Army();
Unit u = army1;
Army army2 = (Army)u;
----------------------
Unit u = new Navy();
Navy navy = (Navy)u;

2-7. 불가능한 경우

-> 최초 객체 생성이 부모 형태로 만들어진 경우 불가능하다.
Unit u = new Unit();
Army army = (Army)u;
-------------------------------
-> 최초 생성된 것과 다른 형식으로 변환하는 것은 불가능 하다.
Army army = new Army();
Unit u = army;
Navy navy = (Navy)u;

=> 위의 두 경우 모두 문법적인 오류는 없기 때문에,
이클립스에서는 에러를 검출하지 못한다. 하지만 프로그램을 실행
시켰을 경우에는 에러가 발생한다.

profile
개발자 박찬의 노트

0개의 댓글