21.7.27

최준영·2021년 7월 28일
0

TIL

목록 보기
3/95

Chap 3. 연산자


1. 연산자와 연산식

1) 연산자의 종류

  • 연산자는 반드시 하나의 값을 산출한다.
  • 연산식은 다른 연산식의 피연산자 위치에 올 수 있다. boolean result = (x + y) < 5

(1) 단항 연산자

  • 부호 연산자(+, -)

    • boolean 타입과 char 타입을 제외한 나머지 기본 타입에 사용할 수 있다.
    • byte 타입을 연산하면 int 타입이 된다.
  • 증감 연산자(++, --)

    • boolean 타입을 제외한 모든 기본 타입의 피연산자에 사용 가능하다.

    • ++/--피연산자 : 다른 연산을 수행하기 전에 피연산자 값을 처리함.

    • 피연산자++/-- : 다른 연산을 수행한 후에 피연산자의 값을 처리함.

    • ++i와 i = i + 1의 연산 속도는 차이가 없다.

  • 논리 부정 연산자(!)

    • boolean 타입에만 사용 가능하다.

    • !true == false, !false == true

(2) 이항 연산자

  • 산술 연산자(+, -, *, /, %)

    • boolean 타입을 제외한 모든 기본 타입에 사용할 수 있다.

    • 피연산자들이 byte, short, char 타입일 경우 모두 int 타입으로 변환된다.

    • int 보다 허용범위가 큰 타입이 존재한다면, 모든 피연산자는 해당 타입으로 변환된다.

    • 문자열 결합 연산자(+) : 피연산자 중에 문자열이 존재할 경우 해당된다.

 "JDK" + 3 + 3.0 -> "JDK33.0"
 3 + 3.0 + "JDK" -> "6.0JDK"
 
 char c1 = 'A' + 1; // char c1 = 66으로 컴파일 됨.
 char c2 = c1 + 1; // char 변수가 산술 연산에 사용되면 int 타입으로 변환되므로 연산 결과는 int 타입이 되어 에러 발생.
  • 비교 연산자(<, <=, >, >=, ==, !=)

    • 대소 연산자는 boolean을 제외한 기본타입에 사용 가능하며, 동등 연산자는 모든 타입에 사용 가능하다.

    • 연산 결과는 boolean 타입이다.

    • 0.1 == 0.1f의 연산 결과는 false이다. 0.1f는 0.1000000014901112이기 때문이다. true로 출력하려면, 피연산자를 모두 float로 변환하거나 정수타입으로 변환해야한다.

  • 논리연산자(&&, ||, &, |, ^, !)

    • boolean 타입만 사용 가능하다.

    • && or & : 피연산자 모두가 true일 경우에만 연산 결과가 true이다. &&는 앞의 피연산자가 false일 경우 연산 종료하기 때문에 &보다 효율적으로 동작한다.

    • || or | : 피연산자중 하나만 true이면 연산 결과는 true이다. 마찬가지로 ||가 더 효율적이다.

    • ^ : 피연산자간에 true나 false가 서로 다르면 true이고 서로 같으면 false이다.

    • ! : 피연산자의 논리 값을 바꾼다.

  • 대입 연산자(=, +=, -=, *=, /=, %=)

    • 오른쪽 피연산자 값을 왼쪽 피연산자인 변수에 저장한다.

(3) 삼항 연산자(?:)

Chap 4. 조건문과 반복문


1. 조건문

  • if문(if문, if-else문, if-else if-else문)은 조건식의 결과가 true, false이냐에 따라, switch문은 변수의 값에 따라 실행문이 결정된다.
  • if문에서 중괄호 {} 블록은 조건식 문장이 하나밖에 없다면 생략 가능하지만, 가독성을 위해 생략하지 않는 것을 권장한다.
  • switch문에서 default 역할은 if문에서 else 역할과 유사하다.
  • switch문에서 case 끝에 break가 없다면, 다음 case가 연달아 실행된다.

2. 반복문

  • for문, while문, do-while문이 있다.
  • for문은 반복 횟수를 알고 있을 때 주로 사용하고, while문은 조건에 따라 반복할 때 주로 사용한다. 서로 변환 가능하다.
  • for문을 작성할 때 주의할 점은 초기화식에서 루프 카운터 변수를 선언할 때 부동 소수점을 쓰는 float 타입을 사용하지 말아야한다.

3. break문

  • 반복문의 실행을 중지할 때 사용한다. switch에서도 사용 된다.
  • 중첩된 반복문에서 바깥 반복문을 종료시키려면, break 이름;을 사용하면 된다.
Outter : for(char upper='A'; upper<='Z'; upper++) {
    for(char lower='a'; lower<= 'z'; lower++) {
    	System.out.println(upper + "-" + lower);
        if(lower=='g') {
            break Outter;
        }
    }
}

continue문

  • 반복문에서 내부에서 실행되면 증감식 또는 조건식으로 돌아간다. 즉, continue 아래의 코드는 실행되지 않고 다음 반복으로 넘어간다.

Chap 5. 참조타임


1. 참조 타입과 참조 변수

1) 참조타입

  • 자바의 타입은 크게 기본 타입과 참조 타입으로 분류된다.

  • 기본 타입인 byte, char, short, int, long, float, double, boolean 변수는 실제 값을 변수 안에 저장한다.

  • 참조 타입인 배열, 열거, 클래스, 인터페이스 변수는 메모리의 번지를 변수 안에 저장한다.

2) 메모리 사용 영역

  • JVM은 운영체제에서 할당받은 메모리 영역을 메소드 영역, 힙 영역, JVM 스택으로 구분해서 사용한다.
    1) 메소드 영역 : JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다. 메소드 영역에는 코드에서 사용되는 클래스(.class)들을 클래스 로더로 읽어 클래스별로 정적 필드, 상수, 메소드 코드, 생성자 코드 등을 분류해서 저장한다.

    2) 힙 영역 : 객체와 배열이 생성되는 영역이다. JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 참조하는 변수나 필드가 없다면 자동으로 제거된다. 참고로 자바에서는 배열을 객체로 취급한다.

    3) JVM 스택 : 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행한다. 프레임 내부에는 로컬 변수 스택이 있으며, 기본 타입 변수와 참조 타입 변수가 추가되거나 제거된다. 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.

3) 참조 변수의 ==, != 연산

  • 참조 타입의 변수들 간의 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다.

4) null과 NullPointerException

  • 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있다.
  • null로 초기화된 참조 변수는 스택 영역에 생성된다.
  • 참조 변수가 null 상태일 때, 객체의 데이터나 메소드를 사용하는 코드를 실행하면 NullPointerException이 발생한다.

5) String 타입

  • String name = "최준영" 에서 "최준영"은 힙 영역에서 String 객체로 생성되고 변수 name은 String 객체인 "최준영"의 번지 값을 저장한다.
  • 자바는 문자열 리터럴이 동일하다면 String 객체를 공유한다.
    • 이럴 때 new 연산자를 사용해서 힙 영역에 새로운 객체를 만들 수 있다.
  • 문자열 간 == 연산은 번지 값을 비교하기 때문에, 내부 문자열을 비교하고 싶다면 equals() 메소드를 사용해야 한다.

2. 배열

  • 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조이다.
  • scores[인덱스], 인덱스는 0부터 시작한다.
  • 배열은 같은 타입의 데이터만 저장할 수 있다.
  • 한번 생성된 배열은 길이를 조절할 수 없다. 새로운 배열을 생성한 후 복사해야한다.

1) 배열 선언

  • 형식
    1. 타입[] 변수;
    2. 타입 변수[];
  • 참조할 배열 객체가 없다면 null 값으로 초기화 가능

2) 배열 생성

  • 값 목록을 이용하거나 new 연산자를 이용하는 방법이 있다.
  1. 값 목록으로 배열 생성 : 타입[] 변수 = { 값0, 값1, 값2, 값3, ...};
    • 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않음.
    타입[] 변수;
    변수 = {0,1,2,3...}; // 컴파일 에러
    변수 = new 타입[] {0,1,2,3...}; // 정상 실행
  1. new 연산자로 배열 생성 : 타입[] 변수 = new 타입[길이];
    • 배열 변수를 선언한 후 new 연산자를 사용하여 값 목록을 지정할 수 있음.
    • new 연산자로 배열을 처음 생성할 경우 배열은 자동적으로 기본값을 초기화된다.
    • 배열이 생성되고 나서 특정 인덱스 위치에 새로운 값을 저장하려면 다음처럼 한다.
    변수[인덱스] =

3) 배열 길이

  • 배열에 저장할 수 있는 전체 항목의 개수를 말한다.
  • 배열변수.length 를 이용해 배열 길이를 구할 수 있다.
  • 인덱스 범위는 0 ~ (길이-1)이다.

4) 객체를 참조하는 배열

  • String[] 배열은 힙 영역에 있는 String 타입 배열 객체를 참조하며, String 타입 배열 객체는 또다시 힙 영역에 있는 String 타입 객체를 참조한다.
  • String[] 배열 항목간 문자열 비교는 equals() 메소드를 사용한다.

5) 배열 복사

  • for문을 사용하거나 System.arraycopy() 메소드를 사용한다.
  • System.arraycopy() 호출 방법
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
  • src는 원본배열, scrPos는 원본 배열에서 복사할 항목의 시작 인덱스, dest는 새 배열, destPost는 새 배열에서 붙여넣을 시작 인덱스, length는 복사할 개수이다.
  • 참조 타입 배열이 복사되면 복사되는 값이 객체의 번지이므로 새 배열의 항목은 이전 배열의 항복이 참조하는 객체와 동일하다.

6) 향상된 for문

for (타입변수 : 배열) {
    실행문
}
  • 배열의 항목 개수만큼 반복하고, 자동적으로 for문을 빠져나간다.
  • 반복할 때마다 변수에는 배열에서 가져온 항목이 저장된다.

3. 열거 타입

  • 한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 참조 타입이다.
  • 열거 타입 선언 : enum 변수명 { 상수, 상수, ... } 형태로 선언한다. 예를 들어 enum Week { MONDAY, ..., SUNDAY } 형태를 가진다.
  • 열거 상수 : 열거 타입 선언 때 주어진 상수를 말하며 타입.상수 형태로 사용한다. 예를 들어 Week.MONDAY로 사용한다.
  • 열거 타입 변수 : 열거 타입으로 선언된 변수를 말한다. 예를 들어 Week today = Week.FRIDAY;에서 today가 열거 타입 변수이다.
    • 여기서 today는 스택 영역에서 생성된다. today가 저장되는 값은 Week.FRIDAY 열거 상수가 참조하는 객체의 번지이다.
profile
do for me

0개의 댓글