IT 면접족보/자바 면접족보

자바 면접 족보 정리(4일 차 )

낙산암 2020. 12. 4. 17:13

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 typeboolean으로 나온다. (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.07의 연산을위해 int7double로 자동형변환

System.out.println("7.0 != 7 : " + (7.0 != 7));

//7.07의 연산을위해 int7double로 자동형변환

 

 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. 둘 중 하나만 truetrue) %연산을(나눠서 값은 버리고 나머지 사용)이용했다.

 

//배수는? 그 수에 의해 나누어 떨어지는 수

 

//배수 구하기

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): 모두 treutrue

A && B : A, B모두 true면 결과값은 true

- || (논리 OR): 둘 중 하나만 truetrue

A || B : A, B 둘 중 하나만 true면 결과값은 true

- ! (논리 NOT): 연산결과가 truefalse, falsetrue

Afalse면 결과값은 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);

//둘중 하나만tt니까 앞에서 이미true결정되어 뒤에 연산안함

 

하지만 연산한 결과는 변수에 반영 된다. 그러므로 다음 연산시에 변한 값이 다시 반영된다. (주의!)

 

6. 아래가 에러가 나는 이유를 설명하고, 수정 하시오.

short num1;

short num = -num;

 

num은 원래 short이지만 -"부호연산자"로 하나의 연산이고 그래서 int형으로 자동형변환이 일어난다.

-1 *num 의 연산이 일어난다고 볼 수 있으며, int(4byte)형으로 변환된 numshort(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. 아래의 쉬프트 연산자에 대하여 설명하시오.

<<

좌측으로 한 칸 비트 이동 (2n승 만큼 값 변함 - 2배 증가) : 제일 앞 비트는 버리고 뒤는 0으로 채움

 

>>

우측으로 한 칸 비트 이동 (2n승 혹은 2n승분의 1- 값을 2로 나눈 결과) : 제일 뒤 비트 버리고, 남는 앞 비트는 양수면0, 음수면 1을 채운다.

 

- 음수-양수 바뀌면 안되니까, 부호비트는 보존해준다. 01음수 .

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의 대입 연산의 결과, num2num3의 값인 30을 대입한다.

2. 변수 num1num2의 값인 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를 반환함: returnfalse로 전달

*/

 

//현재 num1=10, num2=10인 상태임

num1 += 10; //num1 = num1 + 10; 과 같아 num120이 들어감

num2 += 10; //num2 = num2 + 10; 과 같아 num220이 들어감

 

result = (num1 > 0) || (num2 > 0);

/*

위의 result와 유사함

num1(20) > 0 : true , num2(20) > 0 : true

&&연산의 결과 returnfalse 전달

*/

 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연산의 결과값인 9result로 반환됨. 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" 출력