자바의정석 - 자바(연산자,조건문, 반복문, 배열)

연산자

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

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

아래는 공부하면서 주로 사용하지 않았고, 개념이 잡히지 않았던 연산자만 정리해볼 예정이다.
그 외의 기본적인 사칙연산, 대입연산, 증감연산과 같은 것은 생략!

등가비교 연산==, !=은 기본적으로 if문을 사용할때 많이 쓴다.

int a = 0;

// case 1
if(a == 0) {
    //... true
}

// case 2
if(a != 1 ) {
    //... true
}

위와 같인 등가비교 true | false로 return 받을 수 가 있다.
단, 문자열은 ==, != 을 사용하면 안된다.

String a = "abc";
// case 1
if(a.equals("abc")) {
    //... true
}

// case 2
if(a.equals("ABC")) {
    //... false
}

// case 3
if(a.equalsIgnoreCase("ABC")){
    //... false
}

문자열의 비교의 경우 3가지 경우만 알면 보편적으로 사용할 수 있다.
같은 문자이지만 서로 다른 객체라서 ==, !=연산을 사용 시 false를 반환한다.

  1. ==, !=이 아닌 equlas("stinrg...")을 통하여 비교를 하면 된다.
  2. equlas("stinrg...")은 대,소문자 구분이 되기에 비교대상이 대,소문자가 상이할 경우 false를 return 한다.
  3. a.equalsIgnoreCase("STRING...") 대, 소문자를 구분하지 않고 문자열을 비교하기 위해서는 equalsIgnoreCase를 사용하면 된다.

비트 연산자
피연산자를 비트단위로 논리 연산한다. 피연산자로 실수는 허용하지 않으며, 오로지 정수만 허용한다.

  1. (OR연산자) 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻으며, 그 외에는 0을 얻는다.
  2. & (AND연산자) 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻으며, 그 외에는 0을 얻는다.
  3. ^ (XOR연산자) 피연산자 값이 서로 다를 때만 1을 결과로 얻으며, 같을 때는 0을 얻는다.
  4. ~ 피연산자를 2진수로 표현했을 때, 0은 1로 1은 0으로 바꾼다.

비트연산자 중에 " ~ " 연산자의 경우 개념을 알면 보수의 전환이 편하다.

int a = 1;
System.out.println(a);
System.out.println(Integer.toBinaryString(a));
System.out.println(~a);
System.out.println(Integer.toBinaryString(~a));
System.out.println(~a+1);

// 출력 값
1 // 10진수 a
1 // 2진수 a  00000000000000000000000000000001 의 값이다.
-2 // 10진수 a의 반전
11111111111111111111111111111110 // 2진수 a의 반전
-1 // ~a+1으로 처리를 하게되면 a 값의 보수 처리가 된다.

**쉬프트 연산자 ** “” « » “” 을 사용하여 2진수로 자리수가 왼쪽, 오른쪽으로 이동을하여 이동된 자리는 “ 0 “으로 넣어준다.

int a = 1;
System.out.println(a << 1);
System.out.println(a << 2);
System.out.println(a << 3);

System.out.println(Integer.toBinaryString(a << 1));
System.out.println(Integer.toBinaryString(a << 2));
System.out.println(Integer.toBinaryString(a << 3));

// 출력 값
// 10진수로 출력 시
2 
4 
8 

// 2진수로 출력 시
10   // 10진수 1을 2진수 자리로 1개 이동처리 된 상태
100  // 10진수 1을 2진수 자리로 2개 이동처리 된 상태
1000 // 10진수 1을 2진수 자리로 3개 이동처리 된 상태

쉬프트 연산의 경우 활용 처는 2진수의 값을 10 진수로 변환처리 할 때 사용하면 적합해 보인다.
1의 정수 값을 N만큼 이동 처리 시 2의 N승 의 10진수 값이 return 된다.
만일, 2진수의 값을 10진수로 변환해야할 경우 2진수를 String으로 Array or List에 담아 자리수 별로 곱해주면 10진수 변환이 된다.

int a = 100;
String b = Integer.toBinaryString(a);

System.out.println(a);
System.out.println(b);

int c = 1;
int[] binary = {1,1,0,0,1,0,0};
int[] convert = new int[binary.length];

for (int i=0; i<binary.length; i++) {
    convert[i] = c << i;
    System.out.print(convert[i]+"\t");
}

// 출력 값
100
1100100
[1,2,4,8,16,32,64] // 출력된 원소를 활용하여 2진수 자리와 곱셈 처리를하여 합산을 하면 10진수가 나온다.

다른 2진수 -> 10진수 변환 방법도 있겠지만, 위의 방식으로 활용할 수도 있을 것 같다.

조건문과 반복문

조건문에는 IFSwitch가 있다.
처리해야할 경우의 수가 많을 떄는 if문보다 switch문이 효율적이지만, switch문은 if문 보다 제약이 많다.

[제약사항]

switch문의 조건식 결과는 정수 or 문자열이어야 한다.
case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다.

if(조건식) {

} else if (조건식) {

} else {

}

switch (조건식) {
    case 값1 :
        break;
    case 값2 :
        break;
    case 값3 :
        break;
    default :
}

// 참고) switch문의 case 하위에 break가 없다면 조건식 하위의 case는 모두 실행을 한다.

반복문에는 ForWhile, do-While이 있다.

  1. for반복문에는 초기화, 조건식, 증감식이 있다.
  2. while문에는 for와 동일한 형식이다. 하지만 초기화작업은 상단에서 먼저 해야한다.
  3. do-while문에는 do {} 먼저 수행한 후에 조건식을 편가한다. while은 조건이 틀리경우 반복내용이 하나도 없을 수 있지만, do-while의 경우에는 무조건 한번은 실행하고 반복을 하게 된다.
    ```java for(초기화; 조건식; 증감식) { // 조건식이 참일 경우 반복내용.. }

while (조건식) { // 조건식이 참일 경우 반복내용.. }

do { // 조건식이 참일 경우 반복내용.. } while (조건식);


반복문에는 추가적으로 알아야될 사항으로는 **break와 continue**가 있다.  
break의 경우 바로 인접한 반복문을 빠져나가며, continue의 경우 반복문의 끝으로 이동한다. (조건을 skip할때 사용)

```java
for(초기화; 조건식; 증감식) {
    if(조건식) {

    } else {
        break;
    }
}

// 반복문(for) 안의 조건문(if) 가 거짓(false)일 경우 반복문은 중단하게 된다.

for(초기화; 조건식; 증감식) {
    if(조건식1) {
        
    } else if (조건식2) {
        continue;
    } else {

    }
}

// 반복문(for) 안의 조건문(if)의 조건식1이 참일 경우 조건식을 처리하지만, 
// 조건식2가 참일경우 아무런 동작을 하지 않고 반복문의 하단으로 이동하며, 
// 반복문의 조건식이 아직 만족하지 않을경우 loop 수행을 한다.

위에 설명한 break와 continue은 인접한 반복문을 빠져나가고 skip한다고 하였다.
그렇다면, for문이 중첩이 되어있고, 이럴때 break가 있으면 어떻게 될까?

for(초기화; 조건식; 증감식) { // 1번 반복문
    for(초기화; 조건식; 증감식) { // 2번 반복문
        if(조건식) {
            break;
        } 
    }
}

// 위의 경우 두번째 반복문안의 조건문이 "참"일 경우 2번 반복문을 빠져나가며 1번 반복문의 다음이 진행된다.

loop : for(초기화; 조건식; 증감식) { // 1번 반복문
    for(초기화; 조건식; 증감식) { // 2번 반복문
        if(조건식) {
            break loop;
        } 
    }
}

// 위의 경우 두번째 반복문안의 조건문이 "참"일 경우 바로 1번 반복문이 종료가 되게된다.

개인적으로 연산자와 조건문, 반복문에 대해 기본적으로 자주 접하여 다 아는(?) 부분은 생략하며, 오랜만에 보거나 생소한 내용을 위주로 정리를 해보았다.

위의 모든 정리내용은 자바의 정석을 공부하며 복습차 정리한 내용입니다.

Leave a comment