1. 결합방향과 우선순위에 대하여 설명하시오.

: 결합방향은 한 라인에서 동등한 레벨의 연산자들이 있을 때 진행하는 연산방향으로 예를 들어 num1 = num2 = num3인 경우 오른쪽에서 왼쪽으로 대입하여 진행한다. 우선순위는 한 라인에서 다른 레벨의 연산자들이 있을 때 진행하는 연산으로 방식의 순위는 다음과 같다.

  1. 최우선 연산자 … [], ()
  2. 단항 연산자 … !, ~, +, -, ++, –
  3. 산술 연산자 … +, -, *, /, &
  4. 시프트 연산자 … «, »
  5. 관계 연산자 … <, >, <=, >=, ==, !=
  6. 비트 연산자 ... &, ^
  7. 논리 연산자 ... &&
  8. 삼항 연산자 ... 조건항(조건 ? 항1 : 항2)
  9. 대입 연산자 ... =, +=, -+, *=, /=, %=, <=, >=, ^=, &=
  10. 증감연산자 ... ++, --
  11. 순차 연산자 ... ,(comma)

 

2. 1 초과 100 미만인가? 를 코딩을 하게 되면?

public class Main { 
	public static void main(String [] args) { 
    	int n = 10 ; boolean result = (n > 1) && (n < 100); 
        System.out.println(result); 
    } 
}

 

3. 2의 배수 또는 3의 배수? 를 코딩을 하게 되면?

public class Main { 
	public static void main(String []args) { 
    	int n = 10 ; boolean result = (n % 2 == 0) || (n % 3 == 0); 
        System.out.println(result); 
	} 
}

 

4. && 와 || 설명하시오.

: &&의 경우 AND(논리적 곱연산)을 의미하는 연산자이고, ||의 경우 OR(논리적 합연산)을 의미하는 연산자이다.

 

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); 
	} 
}

5-1.

int 타입 num1, num2를 선언 후 0으로 초기화하고 boolean 타입 result를 선언했을때 
result = ((num1 += 10) < 0) && ((num2 += 10) > 0);에서 
(num1 += 10) < 0은 (num1 = num + 10) < 0의 조건을 만족하지 않아 false이고 
(num2 += 10) > 0은 (num2 = num + 10) > 0의 조건을 만족해 true가 되므로 
중앙의 &&(AND) 연산에 의해 false로 초기화 된다. 

따라서 첫 번째 출력에 의해 
System.out.println(“result = “ + result); 
… false System.out.println(“num1 = “ + num1);
… 10 System.out.println(“num2 = “ + num2 + ‘\n’);
… 10 으로 출력이 될 것이다.

5-2.

이 후 result = ((num1 += 10) > 0) || ((num2 += 10) > 0);에서 
(num1 += 10) > 0은 (num1 += 10) > 0의 조건을 만족해 true가 되고 
(num2 += 10) > 0은 (num2 += 10) > 0의 조건을 만족해 true가 되므로 
중앙의 ||(OR) 연산에 의해 true로 초기화 된다. 

따라서 두 번째 출력에 의해 System.out.println(“result = “ + result); 
… true System.out.println(“num1 = “ + num1); 
… 20 System.out.println(“num2 = “ + num2 + ‘\n’); 
… 20 으로 출력이 될 것이다.

5-3.

그러나 예상과는 달리 콘솔에서는 다음과 같은 결과가 나왔다.

result = false 
num1 = 10 
num2 = 0 
result = true 
num1 = 20 
num2 = 0


여기서 보았을때 num1은 대입 연산자에 의해 더해져 정상적으로 20이 된 반면 
num2는 동일하게 대입 연산을 거쳤지만 단락회로평가에 의해 
result문의 앞에 있던 num1값만 반영이 되어 0으로 출력된 것을 알 수 있다.

 

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

short num1; 
short num = -num;

: short 타입의 num 변수를 음의 값으로 초기화 하고자 -num을 할 때 에러가 뜬 이유는 마이너스(-) 연산 자체 과정에서 int 타입의 정수연산을 하여 데이터 타입이 맞지 않았기 때문이다. 왜냐하면, CPU에서는 기본적으로 32bit 크기의 연산으로 시작하기에 이에 적합한 정수 연산인 int가 적용되어서이다. 따라서 -num에 short 타입으로 명시적 형변환을 하여 short num = (short) -num;의 형태로 바꾸면 에러가 나지 않는다. (CPU의 32비트 아키텍쳐 참조: https://ko.wikipedia.org/wiki/X86)

 

7. 전위증가 연산자와 후위증가 연산자의 차이는?

: 전위증가 연산의 경우 다음과 같은 방식을 따르고

var = var + 1; 
return var;

후위증가 연산의 경우엔 다음과 같은 방식을 따른다.

final int temp = var; 
var = var + 1; 
return temp;

따라서 이를 보았을때 전위증가 연산의 경우 자기 자신을 먼저 더한 뒤 연산을 진행하지만 후위증가 연산의 경우 연산을 먼저 진행한 뒤 자기 자신을 더하는 것으로 볼 수 있다.

 

8. 비트연산자 4가지를 설명하시오.

  • &은 AND 연산으로 두 변수의 값이 있을 때 이를 2진수로 각각 변환하여 논리적 곱연산을 한 뒤 다시 10진수로 변환하는 비트연산자다.
  • ^은 XOR 연산으로 두 변수의 값이 있을 때 이를 2진수로 각각 변환하여 배타적 합연산을 한 뒤 다시 10진수로 변환하는 비트연산자다.
  • |은 OR 연산으로 두 변수의 값이 있을 때 이를 2진수로 각각 변환하여 논리적 합연산을 한 뒤 다시 10진수로 변환하는 비트연산자다.
  • ~은 NOT 연산으로 한 변수의 값이 있을 때 이를 2진수로 변환하여 값을 부정한 뒤 다시 10진수로 변환하는 비트연산자다.

 

9. 아래의 쉬프트 연산자에 대하여 설명하시오.

« , »

: «은 레프트 쉬프트(LSH) 연산자로 변수 값을 2진수로 바꾸어 해당 비트 값을 왼쪽으로 이동 시키는 연산자다. 예를 들어 2 « 3의 경우 2^3 = 8과 같은 값이 나오게 된다.

 

10. 전위연산자와 후위연산자에 대하여 설명하시오.

: 전위증가 연산자의 경우 변수 앞에 ++var처럼 1씩 더하는 형태를 지녔고 후위증가 연산자 또한 변수 앞에 var++처럼 1씩 더하는 형태를 지녔다. 전위증가 연산의 경우 자기 자신을 먼저 더한 뒤 연산을 진행하고 후위증가 연산의 경우 연산을 먼저 진행한 뒤 자기 자신을 더한다.

 

11. 아래의 출력값을 예측하시오.

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); 
	} 
}

: 동등한 레벨의 연산에서 대입 연산자(=)가 있을 때 기본적으로 오른쪽에서 왼쪽으로 진행한다. 따라서 num3의 값 30은 num2에 대입되어 num2는 30이 되고 30이 된 num2는 num1 값에 대입이 되므로 최종적으로 num1, num2, num3 모두 30으로 출력되는 것을 볼 수 있다.

 

12. 아래의 출력값을 예측하시오.

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'); 
        
        num1 += 10; 
        num2 += 10; 
        result = (num1 > 0) || (num2 > 0); 
        
        System.out.println("result = " + result); 
        System.out.println("num1 = " + num1); 
        System.out.println("num2 = " + num2); 
	} 
}

12-1.

+= 대입 연산에 의해 num1과 num2의 값은 서로 10이 되고 
boolean 타입인 result는 result = (num1 < 0) && (num2 > 0);에 의해 
num1 < 0는 false, num2 > 0은 true, &&(AND) 과정을 거쳐 

System.out.println(“result = “ + result); 
… false System.out.println(“num1 = “ + num1); 
… 10 System.out.println(“num2 = “ + num2 + ‘\n’); 
… 10이 될 것이다.

12-2.

+= 대입 연산에 의해 num1과 num2의 값은 서로 20이 되고 
boolean 타입인 result는 result = (num1 > 0) || (num2 > 0);에 의해 
num1 > 0는 true, num2 > 0도 true, ||(OR) 과정을 거쳐 

System.out.println(“result = “ + result); 
… true System.out.println(“num1 = “ + num1); 
… 20 System.out.println(“num2 = “ + num2 + ‘\n’); 
… 20이 될 것이다.

 

13. 아래의 출력값을 예측하시오.

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); 
	} 
}

13-1.

int result = 3 + 6;에 의해 
result는 9로 초기화가 되므로 

System.out.println(“3 + 6 = “ + result); 
… 9가 된다.

13-2.

result += 9;에서 += 대입 연산자에 의해 
result = 9 + 9가 되므로 

System.out.println(“3 + 6 + 9 = “ + result); 
… 18이 된다.

13-3.

result += 12;에서 += 대입 연산자에 의해 
result = 18 + 12가 되므로 

System.out.println(“3 + 6 + 9 + 12 = “ + result); 
… 30이 된다.

'WebDev > 본과정' 카테고리의 다른 글

반복문 심화 및 메소드 기초  (0) 2021.04.30
조건문과 반복문  (0) 2021.04.30
데이터 타입과 연산  (0) 2021.04.30
변수와 주석  (0) 2021.04.30
자바의 개념과 출력문  (0) 2021.04.30