1. 결합 방향과 우선순위에 대하여 설명하시오.
기본적으로 연산을 할 때는 우선 순위와 결합 방향에 따라 다르게 연산이 이루어진다.
기본 원칙
1) 연산자 우선순위가 높은 것을 먼저 계산한다.
2) 우선순위가 같다면 결합 방향에 따라 연산된다.
- 기본적으로 연산자 우선순위에서 가장 높은 것은 괄호이다.
int a = 6+ 7;
/*
+연산의 우선순위가 =연산의 우선순위보다 높다.
1. +연산을 먼저하고
2. a에 대입한다.
*/
참고: 연산자 우선순위와 결합방향
2. "1초과 100미만인가?" 를 코딩 하면?
boolean result = (num > 1) && (num < 100);
논리연산자 &&(AND. 둘 다 참이어야 true) 와 관계연산자 (< 보다 크다, > 보다 작다)를 이용했다.
1 <= num1 < 100 이런식으로 쓰지 않도록 주의하자.
참고: 관계연산자 (<, >, <=, <=, ==, !=)
관계연산자로 연산한 결과값의 date type은 boolean으로 나온다. (true or false)
(cpu에 물어보고 돌아오는 값이 boolean인것)
System.out.println("3 >= 2 : " + (3 >= 2));
System.out.println("3 <= 2 : " + (3 <= 2));
System.out.println("7.0 == 7 : " + (7.0 == 7));
//7.0과 7의 연산을위해 int형 7을 double로 자동형변환
System.out.println("7.0 != 7 : " + (7.0 != 7));
//7.0과 7의 연산을위해 int형 7을 double로 자동형변환
3. "2의 배수 또는 3의 배수?" 를 코딩 하면?
public class Hello {
public static void main(String[] args) {
int num;
num = 7;
boolean result = (num % 2 == 0) || (num % 3 ==0);
System.out.println(result);
}
}
**결과**
false
논리연산자 ||(OR. 둘 중 하나만 true면 true) 와 %연산을(나눠서 값은 버리고 나머지 사용)이용했다.
//배수는? 그 수에 의해 나누어 떨어지는 수
//배수 구하기
num % 2 == 0 //2로 나눠서 나누어 떨어지면 (나머지가 0이면) 2의 배수
num % 3 == 0 //3으로 나눠서 나누어 떨어지면 (나머지가 0이면) 3의 배수
//홀수, 짝수 구하기
num % 2 == o //2로 나누어 나머지가 0이면 짝수, 1이면 홀수
num % 2 == 1 //2로 나누어 나머지가 1이면 홀수
num % 2 != 0 //2로 나누어 나머지가 0이면 짝수, 1이면 홀수
4. && 와 || 설명하시오.
&&와 ||는 논리 연산자이다.
논리연산자의 리턴값은 boolean으로 항상 true 아니면 false의 결과값을 얻는다.
- && (논리 AND): 모두 treu면 true
A && B : A, B모두 true면 결과값은 true
- || (논리 OR): 둘 중 하나만 true면 true
A || B : A, B 둘 중 하나만 true면 결과값은 true
- ! (논리 NOT): 연산결과가 true면 false, false면 true
A가 false면 결과값은 true
5. 아래의 프린트 결과를 예측해 보고, 코딩 후 결과를 확인 하시오.
class SCE {
public static void main(String[] args) {
int num1 = 0;
int num2 = 0;
boolean result;
result = ((num1 += 10) < 0) && ((num2 += 10) > 0);
System.out.println("result = " + result);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2 + '\\n'); // "
result = ((num1 += 10) > 0) || ((num2 += 10) > 0);
System.out.println("result = " + result);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
}
이유 (논리 연산자 사용시 주의점)
result = ((num += 10 < 0)) && ((num2 += 10) >0);
//둘다 t여야 t이니까 앞에서 이미 false결정되어 뒤에 연산 안함
result = ((num += 10 < 0)) || ((num2 += 10) >0);
//둘중 하나만t면 t니까 앞에서 이미true결정되어 뒤에 연산안함
하지만 연산한 결과는 변수에 반영 된다. 그러므로 다음 연산시에 변한 값이 다시 반영된다. (주의!)
6. 아래가 에러가 나는 이유를 설명하고, 수정 하시오.
short num1;
short num = -num;
num은 원래 short이지만 -도 "부호연산자"로 하나의 연산이고 그래서 int형으로 자동형변환이 일어난다.
즉 -1 *num 의 연산이 일어난다고 볼 수 있으며, int(4byte)형으로 변환된 num을 short(2byte)형 num으로 대입하려 했기 때문에 (더 작은 타입으로는 자동형변환이 불가능하다.)에러가 난다.
**수정**
short num = 100;
num = (short)(-num);
그래서 강제 형변환을 해줘야한다.
double e1 = 3.5;
double e2 = -e1; // e1에 저장되는 값은 -3.5
부호 연산자 –는 변수에 저장된 값의 부호를 바꾸어 반환한다.
+, - 가 붙는 것도 연산임을 기억하자. (정수는 2의 보수법으로, 실수는 복잡한 방법으로 연산되어 나오는 것임)
short num1 = 5;
System.out.println(+num1); //+5(+는 불필요한 부호)//형변환 필요없이 short로 받음
System.out.println(-num1); //부호를 바꿔 얻은 결과 출력
short num2 =7;
short num3 = (short)(+num2); // 1*num2 라서 연산시 int로 변환됨//형변환 안하면 오류
short num4 = (short)(-num2); //-1*num2 라서 연산시 int로 변환됨//형변환 안하면 오류
System.out.println(num3);
System.out.println(num4);
**연산의 결과가 변수에 반영이 된 것인지 아닌지 주의해서 보자!**
int num =1;
boolean result;
System.out.println(-num); //-1 * num
System.out.println(num); //연산 결과를 저장한것이 아니기때문에 1이 나온다.
7. 전위 증가 연산자와 후위 증가 연산자의 차이는?
num++, ++num 은 둘 다 num = num +1 와 같은 의미이다. 하지만 연산의 방법이 다르기 때문에 주의해야한다. 언제 증가와 감소값이 반영되는지 확인 해야하는 것이 중요하다.
### 전위 연산자 (prefix) : ++n / --n
먼저 1증가 시킨 후 연산에 사용한다.
### 후위 연산자 (postfix): n++ / n--
값을 먼저 연산에 사용 후 1을 증가시킨다. : **하나의 실행 단위가 끝나고 난 뒤** 하나 증가 혹은 감소 값을 대입한다.
8. 아래의 비트 연산자 4가지를 설명하시오.
각각의 비트를 대상으로 연산을 진행하고, 각 비트를 대상으로 진행된 연산 결과를 묶어서 하나의 연산 결과 반환한다.
& : 비트 단위 and 연산(똑같은 것 1로 출력 나머지는 0)
| : 비트 단위 or 연산(둘 중 하나만 1이면 1 나머지는 0)
^ : 비트 단위 xor 연산(둘이 서로 다르면 1, 같으면 0)
~ : 비트 반전(NOT)(결과값과 반대되는 수 출력)
9. 아래의 쉬프트 연산자에 대하여 설명하시오.
<<
좌측으로 한 칸 비트 이동 (2의n승 만큼 값 변함 - 값 2배 증가) : 제일 앞 비트는 버리고 뒤는 0으로 채움
>>
우측으로 한 칸 비트 이동 (2의n승 혹은 2의 n승분의 1- 값을 2로 나눈 결과) : 제일 뒤 비트 버리고, 남는 앞 비트는 양수면0, 음수면 1을 채운다.
- 음수-양수 바뀌면 안되니까, 부호비트는 보존해준다. 0양1음수 .
10. 아래의 출력값을 예측하시오.
class AssignSteResult {
public static void main(String[] args) {
int num1 = 10, num2 = 20, num3 = 30;
num1 = num2 = num3;
/*
= 연산자는 결합 방향이 오른쪽에서 왼쪽으로 진행된다.
따라서 위의 문장은 다음과 같다.
num1 = (num2 = num3);
*/
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
}
}
```
**예측결과**
30
30
30
= (대입 연산자)의 결합 방향은 오른쪽에서 왼쪽 방향으로 이동한다.
그 순서에 따라
1 . 변수 num2 와 num3의 대입 연산의 결과, num2에 num3의 값인 30을 대입한다.
2. 변수 num1에 num2의 값인 30을 대입한다.
결국, num1, num2, num3에는 모두 같은 값인 30이 들어간다.
11. 아래의 출력값을 예측하시오.
class SCE {
public static void main(String[] args) {
int num1 = 0;
int num2 = 0;
boolean result;
num1 += 10;
num2 += 10;
result = (num1 < 0) && (num2 > 0);
System.out.println("result = " + result);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2 + '\\n'); //+ "\n"??
num1 += 10;
num2 += 10;
result = (num1 > 0) || (num2 > 0);
System.out.println("result = " + result);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
}
**예측결과**
result = false
num1 = 10
num2 = 10
result = true
num1 = 20
num2 = 20
**예측 과정 설명**
num1 += 10; // num1 = num1 + 10; 과 같아 num1에는 10이 들어감
num2 += 10; // num2 = num2 + 10; 과 같아 num2에도 10이 들어감
result = (num1 < 0) && (num2 > 0);
/*
<, > 연산은 true or false 를 반환한다.
num1(10) < 0 : false , num2(10) > 0 : true
여기서는 <,> 연산의 결과가 결과값에 저장이 안되었다.(변수의 값 변화에 영향 주지 않음)
&&연산은 boolean타입으로 둘다 true여야 true를 반환함: return에 false로 전달
*/
//현재 num1=10, num2=10인 상태임
num1 += 10; //num1 = num1 + 10; 과 같아 num1에 20이 들어감
num2 += 10; //num2 = num2 + 10; 과 같아 num2에 20이 들어감
result = (num1 > 0) || (num2 > 0);
/*
위의 result와 유사함
num1(20) > 0 : true , num2(20) > 0 : true
&&연산의 결과 return에 false 전달
*/
12. 아래의 출력값을 예측하시오.
class AddNum {
public static void main(String[] args) {
int result = 3 + 6;
System.out.println("3 + 6 = " + result);
result += 9;
System.out.println("3 + 6 + 9 = " + result);
result += 12;
System.out.println("3 + 6 + 9 + 12 = " + result);
}
}
**예측결과**
3 + 6 = 9
3 + 6 + 9 = 18
3 + 6 + 9 +12 = 30
**예측 과정 설명**
int result = 3 + 6;
//+연산이 = 연산보다 먼저임
//3+6연산의 결과값인 9가 result로 반환됨. result의 현재 값은 9
//"3 + 6 = 9" 출력
result += 9;
//result = result + 9; 와 같고, result값이 9였으므로 9+9=18이 됨
//"3 + 6 + 9 = 18" 출력
result += 12;
//result = result + 12; 와 같고, result값이 18이었으므로 18+12=30이 됨
//"3 + 6 + 9 +12 = 30" 출력
'IT 면접족보 > 자바 면접족보' 카테고리의 다른 글
자바 면접 족보 정리(6일 차 ) (0) | 2020.12.05 |
---|---|
자바 면접 족보 정리(5일 차 ) (0) | 2020.12.05 |
자바 면접 족보 정리(3일 차 ) (0) | 2020.12.04 |
자바 면접 족보 정리(2일 차) (0) | 2020.12.03 |
자바 면접 족보 정리(1일 차) (0) | 2020.10.30 |