ThinkInJava4 독서노트의 제3장 제어 절차

3921 단어 java
Java 연산자
거의 모든 연산자는 주 유형(Primitives)만 조작할 수 있습니다.유일한 예외는 "=", "==", "!="이며 모든 대상을 조작할 수 있다(대상이 헷갈리기 쉬운 곳).이외에도 String 클래스는 "+"및 "+="를 지원합니다.
할당액
주 데이터 형식에 대한 부여는 매우 직접적이다.주 유형은 실제 값을 수용하고 대상을 가리키는 핸들이 아니기 때문에 값을 부여할 때 한 곳에서 온 내용을 다른 곳으로 복사할 수 있다.예를 들어, 주 유형에 "A=B"를 사용한다고 가정하면 B의 컨텐트가 A로 복사됩니다.만약 이어서 A를 수정했다면 B는 이런 수정의 영향을 전혀 받지 않았을 것이다.프로그래머로서 상식이 되어야 한다.
그러나 대상에게 값을 부여할 때 상황은 달라졌다.대상을 조작할 때, 우리가 진정으로 조작하는 것은 그것의 문맥이다.그래서 만약에'한 대상에서 다른 대상으로'의 값을 부여한다면 실제로는 핸들을 한 곳에서 다른 곳으로 복사하는 것이다.이것은 만약에 대상에게'C=D'를 사용한다면 C와 D는 결국 처음에 D만 가리키는 그 대상을 가리킨다는 것을 의미한다.
class Number {
int i;
}

public class Assignment {
  public static void main(String[] args) {
     Number n1 = new Number();
     Number n2 = new Number();
     n1.i = 9;
     n2.i = 47;
     System.out.println("1: n1.i: " + n1.i + ", n2.i: " + n2.i);
     n1 = n2;
     System.out.println("2: n1.i: " + n1.i + ", n2.i: " + n2.i);
     n1.i = 27;
     System.out.println("3: n1.i: " + n1.i + ", n2.i: " + n2.i);
  }
} // 

실행 결과:
1: n1.i: 9, n2.i: 472: n1.i: 47, n2.i: 473: n1.i: 27, n2.n1을 바꾸는 동시에 n2도 바꾼다.이것은 n1이든 n2든 모두 같은 손잡이를 포함하기 때문에 같은 대상을 가리킨다. (최초의 손잡이는 n1 내부에 위치하고 9의 값을 수용한 대상을 가리킨다. 값을 부여하는 과정에서 그 손잡이는 실제로 잃어버렸고, 그 대상은 쓰레기 수집기에서 자동으로 제거된다.)
객체가 동일한지 확인
관계 연산자 = 및!=모든 대상에도 적용되지만, 자바 분야에 처음 진출한 사람들은 북쪽을 찾을 수 없게 된다.다음 예는 다음과 같습니다.
class Value {
  int i;
}

public class Equivalence {
    public static void main(String[] args) {
        Integer n1 = new Integer(47);
        Integer n2 = new Integer(47);
        System.out.println(n1 == n2);
        System.out.println(n1 != n2);
        System.out.println(n1.equals(n2));
        Value v1 = new Value();
        Value v2 = new Value();
       v1.i = v2.i = 100;
       System.out.println(v1.equals(v2));
    }
}

실행 결과:
falsetruetruefalse
여기서 표현식 System.out.println(n1==n2)은 내부의 볼 비교 결과를 출력할 수 있습니다.일반적으로 사람들은 출력 결과가 먼저true,false라고 생각한다. 왜냐하면 두 Integer 대상은 모두 같기 때문이다.그러나 대상의 내용은 같지만 문맥은 다르다. ==와!=비교가 딱 대상 문맥이야.그래서 출력 결과는 실제로는false, 그리고true이다.두 대상의 실제 내용이 같은지 비교하려면 모든 대상이 적용되는 특수한 방법인 equals()를 사용해야 한다.그러나 이 방법은'주유형'에 적용되지 않으며 그 유형들은 ==과!=됐습니다.equals () 의 기본 동작이 비교 문맥이기 때문입니다.따라서 자신의 새로운 유형에서 equals () 를 바꾸지 않으면 우리가 원하는 행동을 나타낼 수 없다.대부분의 자바 라이브러리는 equals () 를 실현하기 때문에, 실제적으로 대상의 내용을 비교하는 것이지, 문맥이 아니다.
스타일 연산자
void casts() {

  int i = 200;

  long l = (long)i;

  long l2 = (long)200;

}

Java에서 스타일링은 비교적 안전한 조작이다.그러나 축소 변환(Narrowing Conversion)이라는 작업(즉, 스크립트가 더 많은 정보를 수용할 수 있는 데이터 유형으로 용량이 작은 유형으로 변환하는 경우)을 수행하면 정보 손실의 위험에 직면할 수 있습니다.이때 컴파일러는 우리에게 조형을 강요하지만, '확대 변환' (Widening conversion) 에는 명확한 조형을 할 필요가 없다. 왜냐하면 새로운 유형은 원래 유형의 정보를 수용할 수 있기 때문에 어떠한 정보도 잃어버리지 않기 때문이다.
자바는 모든 주 유형 '조형' 을 다른 어떤 주 유형으로 할 수 있지만, 볼 값 (bollean) 은 제외하고, 후자는 어떠한 조형 처리도 허용하지 않는다.클래스에서는 스타일을 허용하지 않습니다.한 종류를 다른 종류로 바꾸기 위해서는 반드시 특수한 방법을 채택해야 한다.
char,byte,short에서 산술 연산자는'변환'효과가 있다.이 유형의 모든 것을 산술 연산하면 int 결과를 얻을 수 있습니다.값을 해당 유형으로 되돌릴 수 있도록 스타일을 원래 유형으로 명시적으로 되돌려야 합니다(축소 변환으로 인해 정보가 손실될 수 있음).그러나 int 값에 대해서는 조형 처리를 할 필요가 없습니다. 모든 데이터가 int 형식에 속하기 때문입니다.그러나 모든 것이 안전하다고 경각심을 늦추지 마라.만약 두 개의 충분한 int 값에 대해 곱셈 연산을 실행한다면, 결과 값은 넘칠 것이다.
실행 제어
자바는 C의 모든 제어 문장을 사용합니다. 자바에서 관련된 키워드는if-else,while,do-while, for, 그리고 switch라는 선택 문장을 포함합니다.그러나 자바는 유해한 goto를 지원하지 않고 보존 키워드로 사용합니다.
스위치
switch(정수 선택 계수) {
case 정수 값 1: 문장; break;
case 정수치 2: 문장; break;
//..
default: 문장;
}
switch는 선택 인자를 사용하고 int나char와 같은 정수 값을 사용해야 합니다.예를 들어, 만약 한 문자열이나 부동점수를 선택 인자로 사용한다면, 그것들은 switch 문장에서 작동하지 않을 것이다.

좋은 웹페이지 즐겨찾기