티스토리 뷰

JAVA

산술 연산자 / 연결 연산자

태로미 2023. 2. 2. 13:37

 

 

 

▶▶   산술 연산자 (+   -   *   /   %)

–   일반적인 사칙연산과 동일
–   % 연산자 : 나머지 연산자(또는 퍼센트 연산자)라고 하며, 나눗셈 결과에 대한 나머지를 계산하는 연산자
–    / 연산자  : 나눗셈 결과에 대한 몫을 계산하는 연산자


EX   )   숫자 & 변수 입력으로 연산하기

→  직접 숫자를 넣어 계산함.

→   int형 변수a에 10을 저장하고, b에 2를 저장하여 변수를 이용해 계산함.

→   변수를 만들 때 콤마로 구분하면 같은 데이터타입은 한 번에 여러개 선언할 수 있음.

   결과 모두 동일하게 잘 나옴.

 

 

EX2   )  연산 결과를 변수에 저장 후 출력하기

→   연산 결과를 저장할 변수 c를 선언하고, a와b의 덧셈 결과를 변수 c에 저장함.

✓   println() 메소드와 printf() 메소드 둘 다 출력해 봄. 확실히 printf() 매소드가 출력결과에 대해 한 눈에 보임.

 

→   이어서 뺄셈, 곱셈, 나눗셈(몫), 나눗셈(나머지) 연산도 실행함.

→   나머지 연산자를 사용하기 위해 '%'를 사용하는데, 이클립스에서는 이를 형식 지정 문자의 '%'로 인식함.

       따라서 나머지 연사자의 '%'를 사용하기 위해서 '%%' 이렇게 두 번 입력하면 나머지 연산자의 '%'로 인식함.

 

 

 

 

 

▸   산술 연산 시 자동 형변환

– 연산 수행 전, 피연산자끼리의 데이터타입을 일치 시킨 후 연산을 수행

규칙 1 )

int타입보다 작은 타입(byte, short, char)끼리의 연산은 모두 int타입으로 자동 형변환 후 연산을 수행
→   즉, 결과값이 무조건 int타입이 됨
     ex   )    byte + byte   =    (int)byte + (int)byte  =   int + int   =  int
     ex2 )    char + int      =    (int)char + int           =   int + int   =  int

 

규칙 2 )

int타입보다 큰 타입과의 연산은 큰 타입으로 변환 후 수행
→   즉, 결과값이 무조건 큰 타입이 됨
     ex   )     int + long    =    (long)int + long    =     long + long    = long
     ex2 )     int + float    =    (float)int + float    =     float + float    = float

                   1  + 3.14    =     4.14


EX1   )   byte + byte 

byte b1 = 10, b2 = 20, b3;

b3 = b1 + b2;				// 오류 발생! byte + byte = (int)byte + (int)byte = int

→   byte타입인 b1과 b2를 더하면 int타입으로 자동 형변환 됨.

      그러나 저장하려는 변수의 데이터타입이 byte라서 오류 발생,  int타입을 byte타입으로 강제 형변환 해야 함.

 

b3 = (byte)b1 + (byte)b2;		// 오류 발생!

→   byte타입으로 강제 형변환 하기 위해 형변환 연산(byte)을 입력했지만, 다시 각각 int로 변환되므로 오류 발생함.

 

b3 = (byte)(b1+b2);

    연산 결과에 형변환 연산자를 적용하여 byte타입으로 변환해야하므 괄호를 사용하여 연산의 순서를 정해줌

 

 

EX2   )   byte + byte

byte b1 = 10, b2 = 20

short s = b1 + b2;			// 오류 발생! byte + byte = int + int = int

→   byte + bytae = int 이므로 short타입의 변수에 저장하려면 강제 형변환 필요함.

 

short s = short(b1+b2);

 

 

EX3   )   char + int

char ch = 'A';
char ch2 = ch + 2;			// 오류 발생! char + int = int + int = int

→   char타입 변수 ch2에, ch값에 2를 더한 결과를 저장하려했으나 오류 발생함.

→   char타입 + int타입 = int타입이기 때문에 왼쪽 char타입의 변수인 ch2에 저장 불가하므로 강제 형변환 필요함.

 

char ch2 = (char)(ch + 2);

→   char타입의 ch변수 값인 'A'는 정수 65로 표현함.

   (char+int=int),  ch + 2 = 67 이 되고, 이를 다시 char타입으로 표현하면 67에 해당하는 문자 'C'가 저장됨.

 

 

EX4   )   int + long

int i = 100;
long l = 200;

int i2 = i + l;

→   i + l (int + long)의 결과값은 long타입이므로 int타입인 i2에 저장 불가, 강제 형변환 필요함.

 

int i2 = int(i + l);

 

 

EX5   )   float + long

long l = 200;
float f = 3.14f;

long l2 = l + f;		// long + float = = float
long l2 = (long)(l+f);

→   원래라면 연산 값이 203.14가 나와야 하지만, long타입이 되면서 결과값으로 소수점 아래자리는 버림.

 

 

EX6   )   나눗셈 연산

System.out.println(3 / 2);

→   나눗셈 연산(/)은 몫을 계산하며, int / int = int가 되어 3을 2로 나눈 결과는 정수 1이 출력됨.
→   만약 3/2 결과를 1.5의 결과값으로 얻고 싶을 경우, 정수가 아닌 실수 형태의 나눗셈 연산으로 연산을 수행해야 함.
       따라서 , 최소한 피연산자 중 하나를 실수로 변환 후 연산을 수행.

 

System.out.println((double)3 / 2);		// 		double /  int     =  double
System.out.println(3 / 2.0);			// 		int    /  double  =  double
System.out.println(3 / 2.0f);			// 		int    /  float   =  float

   모두 1.5로 출력됨.

 

 

 

 

 

▸   실수끼리의 연산 ( floatdouble간의 연산 ) 


EX   )

→   f1 + d1 (float + double) = double

       0.1f + 0.1 = 0.1 + 0.1 = 0.2인데, 위 처럼 실수의 근사치 표현에 의해 잘못된 결과가 발생할 수 있음.

→  0.2처럼 딱 떨어지는 결과를 가지려면, double → float타입으로 강제 변환 후 연산을 수행하거나,
      두 실수 모두 정수로 변환하여 연산을 수행 후 다시 실수로 변환해야 함.

 

   (double)f1 + d1   →   double타입으로 바꾸면 0.20000000149011612가 출력됨.(8byte)

      f1 + (float)d1       →   float타입으로 바꾸면 깔끔하게 0.2로 출력됨.(4byte)

   f1과 d1을 정수로 바꾸기 위해 각 10을 곱해주고, 이를 int타입으로 변환한 뒤, 다시 10.0이라는 실수로 나눠줌.

     그냥 10으로 나눠버리면 실수로 인식하지 않기 때문에 결과가 0으로 출력됨.

 

 

 

 

 

▸   리터럴끼리의 연산

– 리터럴끼리 연산시에는 자동 형변환이 발생하지 않음.

– 단, 리터럴끼리의 연산이라도 표현 가능한 범위를 초과하면 오류 발생함.


EX1   )   

byte b4 = 10 + 20;

→  byte타입 범위(-128 ~ +127) 내의 정수는 byte타입 그대로 연산 가능.

 

byte b5 = 10 + 200;		// 오류 발생!

→  byte의 범위를 초과하므로 int로 취급되어 오류 발생함. 억지로 바꾸면 overflow로 인해 정확한 값이 안 나올 수 있음.

 

   억지로 byte타입으로 변환한 결과,  210이 아닌 -46이라는 이상한 값이 나옴. (overflow 발생)

 

 

 

 

 

 

 


 

 

 

 

 

 

 

▶▶   연결(결합) 연산자

–  문자열에 대한 덧셈연산자(+)
–  어떤 데이터를 문자열과 덧셈연산자로 연산할 경우, 산술연산의 덧셈이 아닌 단순 문자열 결합(연결)으로 사용됨.
    이 때, 어떤 데이터를 문자열 타입으로 변환하여 두 문자열을 연결함.
      ex  )   "문자열" + "문자열"     =      "문자열문자열"
                int + "문자열"      =      "int" + "문자열"      =      "int문자열"


EX1   )   문자열 + 정수

  "b = " + 20   →   "문자열" + 정수 = "문자열정수"  →   b = 20

 

 

EX2   )   산술 연산자(+) & 연결연산자(+)

  a + "+" 를 수행하여 "10 +" 문자열 생성.
  "10 +" 문자열과 + b를 수행하여 "10+20" 문자열 생성.
✓   "10 + 20" 문자열과 + "=" 를 수행하여 "10+20=" 문자열 생성.
✓   "10+20=" 문자열과 + c를 수행하여 "10+20=30" 문자열 생성.

 

 

EX3   )   정수 + 정수   /   문자열 + 정수

   마지막 출력문 → 10+20 덧셈 먼저 수행하여 정수 30이 되고, 정수 10과 문자열 "30"을 결합하여 "3030" 문자열이 됨.

 

 

 

 

 


 

 

 

comment

연산자 공부는 생각보다 재밌다...?!!
데이터 녀석들..요래조래 잘도 바뀌는구나ㅎㅎㅎㅎ
확실히 예제를 통해  개념에 접근하니 비교적 수월하게 문법들이 이해가고 좋다
이제는 그냥 byte+int하면 바로 머릿속에 int가 떠다님ㅋ

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함