2-1 다음 표의 빈 칸에 8개의 기본형(primitive type)을 알맞은 자리에 넣으시오

  1 byte 2 byte 4 byte 8 byte
논리형 boolean      
문자형   char    
정수형 byte short int long
실수형     float double

 

2-2 주민등록번호를 숫자로 저장하고자 한다. 이 값을 저장하기 위해서는 어떤 자료형(data type)을 선택해야 할까? regNo라는 이름의 변수를 선언하고 자신의 주민등록번호로 초기화 하는 한 줄의 코드를 적으시오.

Long regNo = 6807211072338L;

 

2-3 다음의 문장에서 리터럴, 변수, 상수, 키워드를 적으시오.

int i = 100;
long l =100L;
final float PI = 3.14f;
- 리터럴 : 100, 100L, 3.14f
- 변수 : i,l
- 키워드 : int, long, final, float
- 상수 : PI

 

2-4 다음 중 기본형(primitive type)이 아닌 것은? (b)
a. int
b. Byte
c. double
d. boolean

 

2-5 다음 문장들의 출력결과를 적으세요. 오류가 있는 문장의 경우, 괄호 안에 ‘오류’라고 적으시오.
System.out.println(“1” + “2”) → (12 )
System.out.println(true + “”) → (true )
System.out.println(‘A' + 'B') → (131 )
System.out.println('1' + 2) → (51 )
System.out.println('1' + '2') → (99 )
System.out.println('J' + “ava”) → (Java )
System.out.println(true + null) → (오류 )

 

2-6 다음 중 키워드가 아닌 것은?(모두 고르시오) (b, c, d, e)
a. if
b. True
c. NULL
d. Class
e. System

 

2-7 다음 중 변수의 이름으로 사용할 수 있는 것은? (모두 고르시오)
a. $ystem
b. channel#5 - # 사용불가
c. 7eleven - 숫자로 시작함.
d. If
e. 자바
f. new - 예약어
g. $MAX_NUM
h. hello@com - @ 사용불가

 

2-8 참조형 변수(reference type)와 같은 크기의 기본형(primitive type)은? (모두 고르시오) a, d
a. int
b. long
c. short
d. float
e. double

 

2-9 다음 중 형변환을 생략할 수 있는 것은? (모두 고르시오) d, e
byte b = 10;
char ch = 'A';
int i = 100;
long l = 1000L;

 

2-10 char타입의 변수에 저장될 수 있는 정수 값의 범위는? (10진수로 적으시오)
0~65535

 

2-11 다음중 변수를 잘못 초기화 한 것은? (모두 고르시오) a,b,c,d
a. byte b = 256; 
b. char c = ''; 
c. char answer = 
d. float f = 3.14 
e. double d = 1.4e3f; 

 

2-12 다음 중 main메서드의 선언부로 알맞은 것은? (모두 고르시오) a,b,c,e
a. public static void main(String[] args)
b. public static void main(String args[])
c. public static void main(String[] arv) 
d. public void static main(String[] args) 
e. static public void main(String[] args) 

 

2-13 다음 중 타입과 기본값이 잘못 연결된 것은? (모두 고르시오) c, e, f
a. boolean - false
b. char - '\u0000'
c. float - 0.0 
d. int - 0
e. long - 0 
f. String - "" 

 

 

 

Exception in thread "main" java.lang.NullPointerException at package.class.main(class.java:24)
nullPointException : null 객체(초기화가 진행되지 않은)의 멤버를 접근할 때 나오는 에러
Launch Error
editor does not contain a main type
1. 자바 class 파일이 src폴더 밖에 있다.
2. 클래스 파일을 감싸는 패키지가 아예 없다.
3. build path를 빼먹었을 때 (ojdbc6.jar) : STS3.0 등 스프링에서 열었을 때
4. 프로젝트를 다른 데서 불러왔을 경우
5. 메인함수가 없거나 오타가 있다. public static void main(String[] args)
Rename Compilation Unit
클래스의 이름을 변경 시 뜨는 알림창이다.
이걸 바꾸면 메서드를 참조하는 다른 클래스가 작동을 안할 수 있다는 뜻이다.
Multiple markers at this line
 -The static field 클래스.변수 should be accessed in a static way
이렇게 뜬다면 클래스.변수로 변경해주면 해결된다.
The value of the local variable 변수 is not used
1. 변수를 사용한다.
2. 변수를 지운다.
3. 누락된 부분을 찾는다.
Workspace Unavailable
The default workspace 'D:/Eclips_Workspace' is in use or cannot be created. Please choose a different one.
1. 프로세스에서 이클립스를 종료한다.
2. Workspace>metadata의 .lock을 지운다.
The public type 클래스이름 must be defined in its own file
public static void main{String args[])는 class파일의 이름을 가진public clases에 들어가야한다.
The type 클래스이름 is already defined
같은패키지 어딘가에 class 매서드가 이미 정의되어 있을때 나온다 이름을 바꿔주면 된다.
오버로딩 시 매개변수의 타입과 개수를 확인해서 같다면 매개변수의 타입이나 개수를 바꿔줘야한다.
Exception in thread "main" java.lang.StackOverflowError
at 패키지이름.클래스이름.main(클래스이름.java:5)
자기자신을 재귀함수로 무한히 불러낼 때 발생하는 에러 재귀함수를 쓰지 않으면 된다.
어쩔 수 없이 재귀함수를 써야하는 경우 break문을 따로 만든다.
클래스이름.java:5: error reference to concatenate is ambiguos
System.out.println();
both method concatenate(String,String...) in 클래스이름 and method 1 error
두 오버로딩된 메서드가 구분되지 않아서 발생하는것이다
가변인자를 선언한 메서드를 오버로딩하면 메서드를 호출했을 때 이와 같이 구별되지 못하는 경우가 발생하기 때문에 주의해야한다.

비트 연산자(bitwise operator)

비트 연산자는 피연산자를 비트단위로 논리 연산한다. 

그런데 쓸 일이 거의 없으니 그냥 교양 정도로 보면 된다.

|(OR연산자) 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
&(AND연산자) 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
^(XOR연산자) 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.
x y x|y x&y x^y
1 1 1 1 0
1 0 1 0 1
0 1 1 0 1
0 0 0 0 0

연산자 ^는 배타적 XOR(eXclusive OR)라고 하며, 피연산자의 값이 서로 다른 경우, 즉 배타적인 경우에만 참(1)을 결과로 얻는다.

 

비트 연산자    
0xAB | 0xF = 0xAF
1 0 1 0 1 0 1 1
|)        0 0 0 0 1 1 1 1

0xAB
0xF
1 0 1 0 1 1 1 1 0xAF

|(OR)는 주로 특정 비트의 값을 변경할 때 사용한다.

 

 

비트 연산자    
0xAB & 0xF = 0xB
1 0 1 0 1 0 1 1
&)     0 0 0 0 1 1 1 1
0xAB
0xF
0 0 0 0 1 0 1 1 0xB

&(AND)는 주로 특정 비트의 값을 뽑아낼 때 사용한다.

 

 

비트 연산자    
0xA4 ^ 0xF = 0xAB
1 0 1 0 0 1 0 0
 ^)    0 0 0 0 1 1 1 1
0xA4
0xF
1 0 1 0 1 0 1 1 0xAB

^(XOR)는 두 피연산자의 비트가 다를 때만 1이 된다.

 

 

비트 전환 연산자 ~

x ~x
1 0
0 1

~는 주로 특정 비트의 값을 뽑아낼 때 사용한다.

주의할 점은 비트 연산자 '~'에 의해 '비트 전환'되고 나면, 부호가 있는 타입의 피연산자는 부호가 반대로 변경된다.

 

쉬프트 연산자 << >>

이 연산자는 피연산자의 각 자리를 이동한다고해서 쉬프트 연산자(shift operator)라고 이름 붙여졌다.

 

10진수 8은 2진수로표현한 뒤 쉬프트 연산자를 적용하면,

 

  << >>
연산전 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
연산후 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0

각 각 연산 후 8이 16과 4가 되었다.

또한 쉬프트 연산자의 범위를 벗어난 값은 버려지고, 0이 된다. 이로써 알 수 있는 것은

x << n은 x * 2ⁿ의 결과와 같다.

x >> n은 x / 2ⁿ의 결과와 같다.

논리 연산자(logical operator)

&&(and), ||(or),!(not)

 

&&(AND결합) 피연산자 양쪽 모두 true여야 true를 결과로 얻는다.
||(or결합) 피연산자 중 어느 한 쪽만 true면 true를 결과로 얻는다.

논리 연산자의 피연산자가 참인 경우와 거짓인 경우의 연산 결과를 표(truth table)로나타내면 다음과 같다.

 

x y x||y x&&y
true true true true
true false true false
false true true false
false false false false

 

사용 시 주의해야 할 점을 알아보자

 

 

public class OperatorEx24_0 {
	public static void main(String[] args) {
		int x = 0;
		char ch = ' ';
		
		x = 15;
		System.out.printf("x=%2d, 10 < x && x < 20 = %b%n", x, 10 < x && x < 20);
        
        }
}
x=15, 10 < x && x < 20 = true

 

x=15

&&는 10 < x과 x <20을 만족해야 true > (boolean) true

 

 

public class OperatorEx24_1 {
	public static void main(String[] args) {
		int x = 0;
		char ch = ' ';
		
        		x = 6;
		System.out.printf("x=%2d , x%%2==0 || x%%3==0 && x%%6!=0 = %b%n",x, x%2==0 || x%3==0&&x%6!=0);
		System.out.printf("x=%2d , (x%%2==0 || x%%3==0) && x%%6!=0 = %b%n",x, (x%2==0 || x%3==0)&&x%6!=0);
		}

}
x= 6 , x%2==0 || x%3==0 && x%6!=0 = true
x= 6 , (x%2==0 || x%3==0) && x%6!=0 = false

 

x=6

(X가 3의 배수이고(&&) X가 6의 배수가 아니면 참)이거나(||) X가 2의 배수(x%2==0)

거짓 이거나(||) X가 이의 배수 = 참

&&가(AND) 곱셈 연산자이고 ||(OR)이 덧셈 연산자라 &&가 ||보다 계산이 빠름

 

X가 2의 배수(x%2==0) 거나(||) X가 3의 배수이고(&&) X가 6의 배수가 아니면 참= 참

 

 

public class OperatorEx24_2 {
	public static void main(String[] args) {
		int x = 0;
		char ch = ' ';
				ch='1';
		System.out.printf("ch='%c', '0' <= ch && ch <= '9' =%b%n", ch, '0' <= ch && ch <='9');
      	}

}
ch='1', '0' <= ch && ch <= '9' =true

 

ch는 1 == char 타입 46

45 <=ch <=54가 참이므로 true

 

 

public class OperatorEx24_3 {
	public static void main(String[] args) {
		int x = 0;
		char ch = ' ';
				ch='a';
		System.out.printf("ch='%c', 'a' <= ch && ch <= 'z' =%b%n", ch, 'a' <= ch && ch <='z');
		}

}
ch='a', 'a' <= ch && ch <= 'z' =true

 

ch = 'a' = char타입 97

a <=a <=z 즉 참

 

 

public class OperatorEx24_4 {
	public static void main(String[] args) {
		int x = 0;
		char ch = ' ';
				ch='A';
		System.out.printf("ch='%c', 'A' <= ch && ch <= 'Z' =%b%n", ch, 'A' <= ch && ch <='Z');
       	}

}
ch='A', 'A' <= ch && ch <= 'Z' =true

 

ch = 'A' = char타입 65

A <=A <=Z 즉 참

 

 

public class OperatorEx24_5 {
	public static void main(String[] args) {
		int x = 0;
		char ch = ' ';
        		ch='q';
		System.out.printf("ch='%c', 'q' <= ch && ch <= 'Q' =%b%n", ch, 'q' <= ch && ch <='Q');
        }
}
ch='q', 'q' <= ch && ch <= 'Q' =false

 

ch = 'q' = char 타입 113

'q' <= 'q'이고(&&) 'q'(113) <= 'Q'(71) = 거짓

 

 

효율적인 연산(short circuit evaluation)

논리 연산자의 또 다른 특징은 효율적인 연산을 한다는 것이다.

 

x y x||y
true false true
true false true
false true false
false false false

x가 true면 그대로 연산 종료

 

x y x&&y
true false true
true false true
false true false
false false false

x가 false면 그대로 연산 종료

 

 

논리 부정 연산자

!

이 연산자는 피연산자가 true이면 false를, false이면 true를 결과로 반환하는 연산자이다.

 

x !x
true false
false true

어떤 값에 논리연산자를 중복으로 적용하면 참과 거짓이 차례로반복된다. a가 참이면

!!!!a의 경우 

!!! + !a(거짓)

!! !a'(참)

! !a''(거짓)

!a'''(참)

최종 a=참이 된다.

비교 연산자는 두 피 연산자를 비교하는데 사용되는 연산자다.

연산 결과는 boolean타입인 true와 false로 출력된다.

 

대소 비교 연산자 <, >, <=, >=

boolean과 참조형을 제외한 나머지에 다 사용 가능한 연산자이다.

비교연산자 연산결과
> 좌변 값이 크면, true 아니면 false
< 좌변 값이 작으면 true 아니면 false
>= 좌변값이 크거나 같으면 true 아니면false
<= 좌변 값이 작거나 같으면 true 아니면 false

주의할 점은 <=와 >=의 연산자는 순서를 틀리면 안 된다는 점이다.

 

등가 비교 연산자

두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자이다.

 

비교 연산자도  
   
   

 

public class OperatorEX22 {
	public static void main(String[] args) {
		float f = 0.1f;
		double d = 0.1;
		double d2 = (double) f;

		System.out.printf("10.0==10.0f	%b%n ", 10.0 == 10.0f);
		System.out.printf("0.1==0.1f	%b%n ", 0.1 == 0.1f);
		System.out.printf("f=%19.17f%n ", f);
		System.out.printf("d =%19.17f%n ", d);
		System.out.printf("d2=%19.17f%n ", d2);
		System.out.printf("d==f %b%n ", d == f);
		System.out.printf("d==d2 %b%n ", d == d2);
		System.out.printf("d2==f %b%n ", d2 == f);
		System.out.printf("(float)d==f %b%n ", (float) d == f);
	}
}
10.0==10.0f	true
 0.1==0.1f	false
 f=0.10000000149011612
 d =0.10000000000000000
 d2=0.10000000149011612
 d==f false
 d==d2 false
 d2==f true
 (float)d==f true

이항 연산자이므로 연산을 수행하기 전에 형 변환을 통해 두 피연산자의 타입을 같게 맞춘 다음 피연산자를 비교한다.

 

문자열의 비교

두 문자열을 비교할 때는, 비교 연산자'=='대신 equals()라는 메서드를 사용해야 한다.\비교 연산자는 두 문자열이 완전히 같은 것인지 비교할 뿐이므로, 문자열의 내용이 같은지 비교하기 위해서는 equals()를 사용하는 것이다.

public class OperatorEx23_ {
	public static void main(String[] args) {
		String str1 = "abc";
		String str2 = new String("abc");
		

		System.out.printf("\"abc\"==\"abc\" ? %b%n", "abc"=="abc");
		System.out.printf(" str1==\"abc\" ? %b%n", str1=="abc");
		System.out.printf(" str1==\"abc\" ? %b%n", str2=="abc");
		System.out.printf("str1.equals(\"abc\") ? %b%n", str1.equals("abc"));
		System.out.printf("str2.equals(\"abc\") ? %b%n", str2.equals("abc"));
		System.out.printf("str2.equalsIgnotreCase(\"abc\") ? %b%n", str2.equalsIgnoreCase("abc"));
	}
}
"abc"=="abc" ? true
 str1=="abc" ? true
 str1=="abc" ? false
str1.equals("abc") ? true
str2.equals("abc") ? true
str2.equalsIgnotreCase("abc") ? true

str2와 'abc'의 내용이 같아도 false를 얻는다. 내용이 같지만 서로 다른 객체라서 그렇다.

 

산술 연산자

사칙 연산자는 덧셈(+) 뺄셈(-) 곱셈(*) 나눗셈(/)이다.

주의할 점은 나누기 연산자를 할 때 피연산자가 둘 다 int타입인 경우 소수점을 저장하지 못하므로 정수만 남고 소수점 이하는 버려지며, 반올림도 발생하지 않는다.

public class OperatorEx05 {
	public static void main(String[] args) {
		int a = 10;
		int b = 4;
        
		System.out.printf("%d + %d = %d%n", a, b, a + b);
		System.out.printf("%d - %d = %d%n", a, b, a - b);
		System.out.printf("%d * %d = %d%n", a, b, a * b);
		System.out.printf("%d / %d = %d%n", a, b, a / b);
		System.out.printf("%d / %f = %f%n", a, (float) b, a / (float) b);
	}
}
10 + 4 = 14
10 - 4 = 6
10 * 4 = 40
10 / 4 = 2
10 / 4.000000 = 2.500000

 

 

 

x y x/y x%y
유한수 +-0.0 +-Infinity NaN
유한수 +-Infinity +-0.0 x
+-0.0 +-0.0 NaN NaN
+-Infinity 유한수 +-Infinity NaN
+-Infinity +-Infinity NaN NaN

피연산자가 유한수가 아닐 경우 연산 결과이다.

기본적으로 올바른 연산 결과를 얻기 위해서는 수치가 큰 쪽으로 형 변환하며, 만약 크기가 작다면 int형으로 자동으로 변환되어 계산된다.

또한 기존에 변수를 byte로 정의하더라도, 산술 연산자로 연산을 하면 int로 자동 형 변환(rype conversion, casting)이 되어 계산이 된다.

그리고 큰 자료형에서 작은 자료형으로 변환하거나 논리형이 다르면 데이터 손실이 발생하므로 

같은 논리형의 동일한 크기의 자료 혹은 같은 논리형의 큰 크기의 자료형으로 변경해야 데이터 손실이 적거나 없다.

 

또한 자료형의 범위를 넘어가면 오버플로우나 언더플로우가 발생한다.

 

그리고 일반적인 사칙연산과 다르게 자바 프로그램의 사칙연산은 숫자뿐 아니라 문자로도 사칙연산이 가능하다.

이는 문자가 실제로 문자 그대로 저장되는 것이 아니라 해당 문자의 유니코드로 바뀌어 저장되기 때문이다.

만약 문자에 해당하는 숫자를 보고 싶다면 ch타입의 문자를 int형태로 형 변환하면 된다.

 

문자 코드 문자 코드 문자 코드
0 48 A 65 a 97
1 49 B 66 b 98
2 50 C 67 c 99
3 51 D 68 d 100
4 52 E 69 e 101
5 53 ... ... ... ...
6 54 X 88 x 120
7 55 Y 89 y 121
8 56 Z 90 z 122

숫자랑 문자는 연속적으로 되어있는데 특이하게 영문의 경우 대문자 소문자의 시작 코드 사이에 다른 문자가 있으니 문자 형태로 계산할 시 조심하자. 소문자 a에서 대문자 A를 빼면 32의 값이 차이가 나며 대문자, 소문자, 숫자의 시작 코드와 소문자와 대문자의 코드의 차가 32라는것을 알아두면 좋다.

public class OperatorEx12 {
	public static void main(String[] args) {
		
		char c1 = 'a';	// c1에는 문자 'a'의 코드값인 97이 저장된다.
		char c2 = c1;	// c1에 저장되어 있는 값이 c2에 저장된다.
		char c3 = ' ';	// c3를 공백으로 초기화 한다.
		
		int i = c1 + 1;	// 'a'+1 > 97+1 > 98
		
		c3 = (char)(c1 + 1);	// c1 + 1의 형태가 int 이므로 char로 변환
		c2++;
		c2++;
		
		System.out.println("i=" + i);
		System.out.println("c2=" + c2);
		System.out.println("c3=" + c3);
	}
}
i=98
c2=c
c3=b

c1+1은 int로 바꾼'a'+1=97+1=98이 되어 저장된다,

c2는 형변환 없이 c2에 에 저장된 값에 +2가 되므로 (char)99='c'가되는 것이다.

보통 일부러 뻔한 리터럴 연산을 풀어 쓸 필요가없이 답을 적으면 되지만, 가독성 때문에 그렇게 하는 경우가있다.

예를들어 86400이라는 숫자는 무엇을 의미하는지 선뜻 이해하기 어려울 수 있지만 이것을 60*60*24로 쓰면 초, 분, 시 를곱한값으로 이해하기 쉬워진다. 이렇게 써도 컴파일러에 의해 미리 계산되기 때문에 성능 차이는없다.

 

public class OperatorEx17 {
	public static void main(String[] args) {
		double pi = 3.141592;
		double shortPi = (int)(pi * 1000 + 0.5) / 1000.0;
		System.out.println(shortPi);
	
}
3.142

나눗셈의 경우 주의할 점이 있는데 double타입으로 정의한 변수를 나눈다 하더라도 위의 경우 int형으로 계산이 되며 나머지는 버려진다는 점이다. 반면에 이런 특징을 이용해서 식으로 반올림을 할 수 있다.

증감 연산자(increment operator)

증감 연산자는 피연산자에 저장된 값을 1 증가 또는 감소시킨다.

증가 연산자(++) 피연산자의 값을 1 증가시킨다.
감소 연산자(--) 피연산자의 값을 1 감소시킨다.

일반적으로 단항 연산자는 피연산자의 왼쪽에 위치하지만 증가 연산자'++'와 감소 연산자'--'는 양쪽 모두 가능한다.

피연산자의 왼쪽에 위치하면 '전위형(prefix)', 오른쪽에 위치하면 '후위형(postfix)'이라고 한다.

전위형은 후위형은 얼핏 보기에 같은 연산자처럼 보이지만 차이점이 있다.

 

public class OperatorEx02 {
	public static void main(String[] args) {
		int i = 5, j = 0;

		j = i++;
		System.out.println("j=i++; 실행 후, i=" + i + ", j=" + j);

		i = 5; // 결과를 비교하기 위해, i와 j의 값을 다시 5와 0으로 변경
		j = 0;

		j = ++i;
		System.out.println("j=++i; 실행 후, i=" + i + ", j=" + j);
	}

}
j=i++; 실행 후, i=6, j=5
j=++i; 실행 후, i=6, j=6

실행결과를 보면 i의 값은 두 경우 모두 1이 증가되어 6이 되지만, j의 값을 그렇지 않다.

따라서 코드를 짤 때 증감 연산자의 방식을 한 가지로 통일해서 짜는 쪽이 좋다.

 

부호 연산자 + -

부호 연산자'-'는 피연산자의 부호를 반대로 변경한 결과를 반환한다.

부호 연산자'+'는 거의 쓸 일이 없다.

연산자와 피 연산자

연산자가 연산을 수행하려면 반드시 연산의 대상이 있어야 하는데, 이것을 피 연산자(operand)라고 한다. 피 연산자로 상수, 변수 또는 식 등을 사용할 수 있다.

연산자(operator) 연산을 수행하는 기호(+,-,*,/등)
피 연산자(operand) 연산자의 작업 대상(변수, 상수, 리터럴, 수식)

대부분의 연산자는 두 개의 피연산자를 필요로 하며, 하나 또는 세 개의 피연산자를 필요로 하는 연산자도 있다.

연산자는 피연산자로 연산을 수행하고 나면 항상 결괏값을 반환한다.

식과 대입 연산자

하나의 식을 평가(계산)하면 단 하나의 결과를 얻는다.

 

연산자의 종류

 

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

피연자의 개수에 의한 분류

피연산자의 개수로 연산자를 분류하기도 하는데, 피연산자의 개수가 하나면 단항 연산자, 두 개면 이항 연산자, 세 개면 삼항 연산자라고 부른다.

연산자를 기능별, 피연산자의 개수별로 나누어 분류하는 것은 연산자의 우선순위 때문이다.

 

연산자의 우선순위와 결합 규칙

기본적으로 곱셈과 나눗셈은 덧셈과 뺄셈보다 우선순위가 높다.

설명
-x + 3 단항 연산자가 이항 연산자보다 우선순위가 높다. 그래서 x의 부호를 바꾼 다음 덧셈이 수행된다. 여기서 '-'는 뺄셈 연산자가 아니라 부호 연산자이다.
x + 3 * y 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다.
그래서 '3 * y'가  'x + 3'보다 먼저 계산된다.
x + 3 > y - 2 비교 연산자(>)보다 산술 연산자 +와-가 먼저 수행된다.
그래서x+3과y-2가 먼저 계산된 다음에 '>'가 수행된다.
x > 3 && x < 5 논리 연산자 &&보다 비교 연산자(>,<)가 먼저 수행된다.
그래서x>3와x<5가 먼저 계산된 다음에 &&가 수행된다.
식의 의미는 x가 3보다 크고 5보다 작다이다
result = x + y * 3; 대입 연산자는 연산자 중에서 제일 우선순위가 낮다.
그래서 우변의 최정 연산결과가 변수 result에 저장된다.

 

여기까지는 수학을 공부했다면 어느 정도 이해할 수 있는 연산자이고, 다음에는 프로그램에서 쓰이는 연산자의 우선순위를 알아보자

 

설명
x << 2 + 1 쉬프트 연산자(<<)는 덧셈 연산자보다 우선순위가 낮다.
그래서 왼쪽 식은2+1가 먼저 계산된다.
data & 0xFF == 0 비트연산자(&)는 비교 연산자(==)보다 우선순위가 낮으므로 비교연산 후에 비트연산이 수행된다. 그래서 왼쪽의 식은 0xFF == 0이 먼저 계산된다.
x < -1 || x > 3 && x < 5 논리 연산자 중에서 AND를 의미하는 &와 &&가 OR을 의미하는 |와||보다 우선순위가 높다/ 이처럼 수식에 AND와 OR가 함께 사용되는 경우는 괄호를 사용해서 우선순위를 명확히 하는 것이 좋다.

연산자의 결합 규칙

결합 규칙은 연산자마다 다르지만, 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행하고, 단항 연산자와 대입 연산자만 오른쪽에서 왼쪽의 순서로 연산을 수행한다. 

 

1. 산술> 비교> 논리> 대입. 대입은 제일 마지막에 수행된다.
2. 단항(1)> 이항(2)> 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방식은 왼쪽에서 오른쪽이다.

 

산술 변환(usual arithmetic conversion)

이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르다면 연산 전에 먼저 형 변환 연산자로 타입을 일치시켜야 한다.

int i = 10;
float f = 20.0f;

float result = f + (float)i; //형변환으로 두 피연산자의 타입을 일치
산술 변환이란? 연산 수행 직전에 발생하는 피연산자의 자동 형변환
1 두 피연산자의 타입을 같게 일치시킨다(보다 큰 타입으로 일치).
2 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.

+ Recent posts