본문 바로가기
Study/Java

02. <타입변환, 형변환, 연산자> ~자바의 정석 summary ~

by 하구땡 2023. 1. 9.
반응형

1. 타입 변환

String str=”3”;

 [1] 숫자->문자 - 숫자에 ‘0’을 더한다.

           System.our.println((char)(3+’ 0’));           // 3(문자)

 [2]문자->숫자 - 문자에서 ‘0’을 뺀다.

           System.our.println(’ 3’-’ 0’+1);                      // 4

 [3]숫자->문자열 -숫자에 빈 문자열(””)을 더한다.

           System.our.println(3+” ”);                      // 3(공백)

 [4]문자열->숫자 -정수형:Integer.parseInt(), 실수형:Double.parseDouble()

           System.our.println(Interger.parseInt”3”+1);           // 4

 [5]문자열->문자 -”3”. charAt(0)=>’3’

 [6] 문자열->문자 -’ 3’+”” => “3”

 

[더하기 개념]

System.out.println(’A’+’B’);
System.out.println(’1’+2);
System.out.println(’1’+’2’);
131
51
99

*char+char의 덧셈 연산의 경우 int+int로 변환된다.

*int(4) 형보다 작은 타입(byte, char, short)은 int형으로 변환한 후 

 덧셈연산이 진행된다.

*A의 아스키코드는 65, B의 아스키 코드는 66이므로 답은 131

*1의 아스키 코드는 49, 2의 아스키 코드는 50이므로 답은 99

 

2. 연산자

*연산자:연산을 수행하는 기호(+, -, *, %, /)

*피연산자:연산자의 대상이 되는 것

*평가:식을 계산하여 결과를 얻는 것

*피연산자의 개수에 따라 단항연산자, 이항연산자, 삼항연산자로 구분

산술연산자 +,-,*,%,/,<<,>> 사칙 연산, 나머지 연산
비교연산자 >,<,<=,>=,==,!= 크고 작음, 같고 다름
논리연산자 &&, ||,!,&,|,^,~ 그리고와 또는으로 연결
대입연산자 = 우변의 값을 좌변에 저장
기타 (type)?:instanceof 형변환, 삼항, instanceof

 

[더하기 개념]

-x+5

=> x앞의 -는 부호 연산자(=단항 연산자)로 -x를 의미하며

  ‘+’만이 산술 연산자(=이항 연산자)이다.

=>’-’의 피연산자는 x, 1개. ‘+’의 피연산자는 x와 5, 2개.

=> 피연산자가 정수인 경우, 나누는 수로 0 사용불가(에러발생)

 

           2-1. 연산자의 결합 규칙

ex9.

(a) 연산자의 결합규칙이 왼쪽에서 오른쪽인 경우

3+4-5=2  : 단항 연산자, 대입 연산자를 제외한 모든 연산의 진행방

             향은 왼쪽에서 오른쪽이다.

(b) 연산자의 결합규칙이 오른쪽에서 왼쪽인 경우

x=y=3     : 대입 연산자는 우변의 값을 좌변에 저장한다.

 

3. 증감 연산자 ++, --

[1] 증가 연산자(++) : 피연산자의 값을 1 증가시킨다.

[2] 감소 연산자(--) : 피연산자의 값을 1 감소시킨다.

=> 피연산자의 왼쪽에 위치하면 전위형(prefix)으로 값이 참조되기 전에 1 증가시킨다.  ex) j=++i

=> 피연산자의 오른쪽에 위치하면 후위형(postfix)으로 값이 참조된 후에 1 증가시킨다.  ex) j=i++

=> 증감 연산자의 피연산자로 정수, 실수 모두 가능하지만 값이 고정된 상수에는 적용할 수 없다.

=> 수식이나 메서드에 포함되지 않고 독립적인 하나의 문장으로 쓰인 경우에는 전위형과 후위형의 차이가 없다.

ex10.

int i=5; j=5;
System.out.println(i++);              
System.out.println(++j);    
System.out.println(”i=”+i+”j=”+j);  
5
6
i=5 j=6

 

4. 형변환 연산자

*형변환(casting):변수나 리터럴의 타입을 다른 타입으로 변환하는 것

*기본 방법:형변환하고자 하는 변수, 리터럴 앞에 변환하고자 하는 타입을 괄호와 함께 붙여준다.

   ->변환하고자 하는 타입을 캐스트 연산자, 형변환 연산자라고 한다.

*형변환 이후에 기존 피연산자값은 아무런 변화가 없다.

ex11.

double d=85.4;
int score=(int)d;
   System.out.println(”score=”+score);
   System.out.println(”d=”+d);
85
d=85.4

 

5. 자동 변환(=산술 변환)

 : 서로 다른 타입 간의 대입이나 연산을 할 때, 먼저 형변환으로 타입을 일치시키는 것이 원칙이지만 

   기존의 값보다 변환하려는 값의 타입이 더 클 경우 자동 형변환된다.

[1] 큰 타입에서 작은 값으로의 형변환은 값손실이 발생하지만, 

   명시 후 형변환 할 경우 에러를 발생하지 않음

   byte b=(byte) 1000;           // 에러 발생하지 않음

[2] 산술 변환의 규칙

   (1) 두 피연산자의 타입을 같게 일치시킨다. (둘 중 큰 타입으로 일치)

           long+int->long+long->long

           float+int->float+float->float

           double+float->double+double->double

   (2) 피연산자의 타입이 int보다 작으면 int로 변환된다.

           byte+short->int+int->int

           char+short->int+int->int

   (3) byte+byte와 같은 경우 산술 변환으로 그 값이 int로 도출되는데

        이때, int는 4byte 값이므로 명시적 형변환이 필요하다. (에러 발생)

   (4) 피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다.(ArithmeticException) 발생 

        (0.0f, 0.0d의 실수형은 가능하지만 결괏값으로 infinity를 얻는다.)

           ex12.

byte a=10;
byte b=30;
byte c=a+b;
    System.out.println(c);
       =>
        byte c=(byte)(a+b);
        System.out.println(c);
(Error)
44

           ex13.

int a=1_000_000;
int b=2_000_000;
   long c=a*b;
   System.out.println(c)
-1454759936

=> 위와 같은 예제의 경우 int타입과 int타입의 연산결과는 int타입이고

     이것이 long형으로 자동 형변환되어도 값은 변하지 않는다.

=> 아래와 같이 long으로 형변환 필요

           int a=1_000_000;

           int b=2_000_000;

           long c=(long)(a*b);

System.out.println(c);=2x10의 12승

           ex14.

long a=1_000_000*1_000_000
long b=1_000_000*1_000_000L;
   System.out.println(”a=”+a);
   System.out.println(”b=”+b);
a=-727379968
b=1000000000000

 

[더하기 개념]

<1.Math.round()= 소수점 첫 번째 자리에서 반올림 후 정수 추출>

=> long result=Math.round(4.52);           //5

=> double pi=3.141592;

  double shortpi=math.round(pi*1000)/1000.0;

  System.out.println(shortpi);           //3.142

*위 과정에서 1000.0이 아니라 1000으로 나누었으면 결과는 3이다.

->int와 int의 나눗셈 결과는 int이기 때문이다. (주의)

<2./(몫) %(나머지) 연산자 사용 시 부호는 왼쪽 피연산자와 동일>

*비교 연산자에서도 산술변환이 적용된다. ex) 10 == 10.0f // 10이 float로 변환

ex15.

System.out.println(-10%/8);
System.out.println(10%/-8);
System.out.println(-10%/-8);
-2
2
-2

 

6. 논리 연산자  =>&&(and), ||(or)

[1] x는 10보다 크고, 20보다 작다. (and)

        10 <=x && x <=20

[2] x는 2의 배수 또는 3의 배수이다. (or)

           x%2==0||x%3==0

[3] x는 2의 배수 또는 3의 배수지만, 6의 배수는 아니다.

           (x%2==0||x%3==0)&&x%6!=0

           ->&&가 ||보다 먼저 연산되므로 괄호 필요

 

7. 논리 부정 연산자  =>!

*true와 false를 반대로 바꾼다.

ex16.

boolean b=true;
   System.out.println(”b=%b%n”, b);
   System.out.println(”!b=%b%n”, !b);
   System.out.println(”!!b=%b%n”, !!b);
   System.out.println(”!!!b=%b%n”, !!!b);
b=true
!b=false
!!b=true
!!!b=false

8. 비트 연산자

: & | ^ ~ << >>

- 피연산자를 비트단위로 논리 연산하며 피연산자로 정수형, 문자형만 허용.

 - 쉬프트 연산자는 나눗셈/곱셈 연산자를 사용하는 것보다 빠르게 작동하지만 코드의 가독성이 떨어지므로, 

    곱셈 나눗셈 연산자를 주로 사용하고, 보다 빠른 실행속도가 요구되는 곳에만 사용하는 것이 좋다.

 

[1]  | (or연산자) : 피연산자 중 한쪽의 값이 1이면, 1을 결과로 얻고 그 외에는 0을 얻는다.

[2] & (and연산자) : 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.

[3] ^ (xor연산자) : 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.

[4] ~ (비트전환연산자) : 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다. 논리부정 연산자 ‘!’와 비슷하다.

- 비트전환이 되고 나면 부호 있는 타입의 피연산자는 부호가 반대로 변경.

- 따라서 1의 보수 연산자라고도 한다.

[5] <<, >> (쉬프트 연산자) : 2진수로 표현된 비트를 해당하는 방향(>>, <<)으로 이동시키는 연산자

  (1) x << n : x * 2의 n승 값을 얻는다.

  (2) x >> n : x / 2의 n승 값을 얻는다.

 

9. 조건 연산자(=삼항 연산자)

result=(조건)? 참일 경우 출력될 문구:거짓일 경우 출력될 문구;

=>두 문구의 타입이 다를 경우 자동 형변환 적용됨

 

10. 대입 연산자

[1] 대입 연산자의 왼쪽 피연산자 = lvalue(left value)

           ->리터럴이 올 수 없다.

[2] 대입 연산자의 오른쪽 피연산자 = rvalue(right value)

           *대입 연산자의 진행방향은 오른쪽에서 왼쪽

*대입 연산자는 식의 제일 마지막에서 평가된다.

 

반응형

댓글