카테고리 없음

자바의 정석(chapter 3 ~4)

DinggoP 2022. 4. 9. 22:22

Chapter 3. 연산자

  • 모든 연산자는 항상 연산 결과를 반환한다
  • 연산자의 종류
    • 산술, 비교, 논리, 대입, 기타 연산자
    종류연산자설명
    산술 연산자 + - * / % << >> 사칙연산과 나머지 연산(%)
    비교 연산자 > < >= <= == != 크고 작음과 같고 다름을 비교
    논리 연산자 &&  
    대입 연산자 = 우변의 값을 좌변에 저장
    기타 (type) ?: instanceof 형변환 연산자, 삼항 연산자, instanceof연산자
  • 연산자의 우선순위는 특정 원하는 우선순위를 ‘()’로 정해 주면 된다
  • (상관 없으면 ‘()’ 생략해도 됨)
  • 연산자의 결합규칙
    1. 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
    2. 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
    3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
  • 증감 연산자
    • 전위형, 후위형
    • 전위형, 후위형은 독립적인 하나의 문장으로 쓰인 경우에는 차이가 없다.
    타입설명사용예
    전위형(앞) 값이 참조되기 전에 증가시킨다. j = ++i
    후위형(뒤) 값이 참조된 후에 증가시킨다. j = I++
  • 형변환 연산자
    • 형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
    • (타입)피연산자
    • 형변환으로 타입을 일치시키는 것이 원칙, 경우에 따라 편의상의 이유로 형변환을 생략할 수 있다
    • 컴파일러가 생략된 형변환을 자동적으로 추가해준다.
    • “기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다”
  • 산술 변환
    1. 두 피연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)float + int → float + float → float
    2. double + float → double + double → double
    3. long + int → long + long → long
    4. 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.char + short → int + int → int
      • char, short는 표현범위가 좁아서 연산중에 오버플로우(overflow)가 발생할 가능성이 높기 때문에 int 타입으로 바뀐다.
    5. byte + short → int + int → int
    class Ex3_5 {
        public static void main(String[] args){
                double d = 85.4;
                int score =(int) d;
                System.out.println("score=" + score);
                System.out.println("d=" + d);
            }  //결과 : score=85
    }.     //      d=85.4    <- 형변환 후에도 피연산자에는 아무런 변화가 없다.
  • Math.round()는 소수점 첫째 자리에서 반올림 한 결과를 정수로 반환한다.
  • 두 문자열을 비교할 때는, 비교 연산자 ‘==’ 대신 ‘equals()’ 라는 메서드를 사용해야 한다.
    • 대소문자를 구멸하지 않고 비교하고 싶으면 → equalsIgnoreCase()
  • 대입 연산자
    • lvalue와 rvalue→ rvalue(right value)는 변수뿐만 아니라 식이나 상수 등이 모두 가능.
    • → lvalue(left value)는 반드시 변수처럼 값을 변경할 수 있는 것이어야 한다, 리터럴이나 상수같이 값을 저장할 수 없는 것들은 lvalue가 될 수 없다.(저장공간- 변수, 배열)

Chapter 4. 조건문 반복문

  • 조건문 : 조건에 따라 다른 문장이 수행
  • 반복문 : 특정 문장들을 반복해서 수행
  • if문
    • ‘만일(if) 조건식이 참(true)이면 괄호 {} 안의 문장들을 수행하라’
    조건식조건식이 참일 조건
    90 <= x && x <= 100 정수 x가 90이상 100이하일 때
    x < 0  
    x%3 == 0 && x%2! = 0 정수 x가 3의 배수지만, 2의 배수는 아닐 때
    ch == ‘y’  
    ch == ‘ ‘  
    ‘A’ <= ch && ch <= ‘Z’ 문자 ch가 대문자일 때
    ‘a’ <= ch && ch <= ‘z’ 문자 ch가 소문자일 때
    ‘0’ <= ch && ch <= ‘9’ 문자 ch가 숫자일 때
    str.equals(”yes”) 문자열 str의 내용이 “yes” 일 때(대소문자 구분)
    str.equalsIgnoreCase(”yes”) 문자열 str의 내용이 “yes” 일 때(대소문자 구분안함)
  • if - else문
    • if - else문은 두 가지 경우 하나가 수행되는 구조
    • 조건식의 결과가 참이 아닐 때, 즉 거짓일 때 else블럭의 문장을 수행하라는 뜻
if(input==0) {
    System.out.println("0입니다");
}
if(input!=0) {
    System.out.println("0이 아닙니다");
}
                 * 두개의 if문 사용했고 두개의 조건식을 계산해야 되는데 가독성이 좋은 코드를 연구 할 필요가 있다
if(input==0) {
    System.out.println("0입니다");
} else {
    System.out.println("0이 아닙니다");
}
               * 하나의 if - else문으로 변경했다 하나의 조건식만 계산하면 되므로 더 효율적이고 간단하다. 

            단, 두개의 if문을 if - else문으로 항상 바꿀 수 있는 것은 아니다. 
  • if - else if문
    • 처리해야 할 경우의 수가 셋 이상인 경우, 한 문장에 여러 개의 조건식을 쓸 수 있는 if - else if문을 사용하면 된다.
    import java.util.Scanner;
    
    class Ex4_4 {
        public static void main(String[] args) {
            int score = 0;    // 점수를 저장하기 위한 변수
            char grade = ' '; // 학점을 저장하기 위한 변수. 공백으로 초기화한다.
    
            System.out.print("점수를 입력하세요>");
            Scanner scanner = new Scanner(System.in);
            score = scanner.nextInt();
    
            if (score >= 90) {
                    grade = 'A';
            } else if (score >= 80) {
                    grade = 'B';
            } else if (score >= 70) {
                    grade = 'C';
            } else {
                    grade = 'D';
            }
            System.out.println("당신의 학점은" + grade + "입니다");
        }
    }
                 * 아래와 같이 코드를 작성하면, 마지막 else는 생략 가능하다. → 가독성 있는 코드 연구 중요
    import java.util.Scanner;
    
    class Ex4_4 {
        public static void main(String[] args) {
            int score = 0;    // 점수를 저장하기 위한 변수
            char grade = 'D'; // 학점을 저장하기 위한 변수. 공백으로 초기화한다.
    
            System.out.print("점수를 입력하세요>");
            Scanner scanner = new Scanner(System.in);
            score = scanner.nextInt(); // 화면을 통해 입력받은 숫자를 score에 저장
    
            if (score >= 90) {  // score가 90보다 같거나 크면 A학점
                    grade = 'A';
            } else if (score >= 80) {  // score가 90보다 같거나 크면 B학점
                    grade = 'B';
            } else if (score >= 70) {  // score가 90보다 같거나 크면 C학점
                    grade = 'C';
            } /* else {   
                    grade = 'D';
            }*/ // 나머지는 D학점 -> grade에 기본값으로 D로 지정 해줌으로써 생략 가능한 문장
            System.out.println("당신의 학점은" + grade + "입니다");
        }
    }
  • 중첩 if문에서는 블럭 {}의 생략에 더욱 조심해야 된다. 바깥쪽의 if문과 안쪽의 if문이 서로 엉켜서 if문과 else블럭의 관계가 의도한 바와 다르게 형성될 수도 있기 때문이다.
  • switch문
    • 처리할 경우의 수가 많은 경우에는 if문 보다 switch문으로 작성하는 것이 좋다.
    • 단, switch문은 제약조건이 있기 때문에, 경우의 수가 많아도 어쩔 수 없이 if문으로 작성해야 하는 겨우가 있다.
    • switch문의 제약조건
      1. switch문의 조건식 결과는 정수 또는 문자역이어야 한다.
      2. case문의 값은 정수 상수(문자 포함), 문자열(JDK 1.7부터 지원)만 가능하며, 중복되지 않아야 한다
      • 스터디장님의 switch문 자주 사용하는 예시.(참고)
      • //메인페이지로 넘어가는 메소드 public String getMainPage(String userID, String userPassword){ //여기서 DB에 연결하여 유저 정보가 맞는지 확인하고 맞으면 유저 접근권한을 가져옴. UserType userType = null; /* switch (userType){ case MEMBERS: return "mainPage"; case ADMIN: return "mainPageForAdmin"; case SYSTEM: return "systemPage"; default: return "errorPage"; }*/ if(userType == UserType.MEMBERS || userType == UserType.ADMIN){ return "mainPage"; }else if(userType == UserType.SYSTEM){ return "systemPage"; }else{ return "errorPage"; } } } public class User { public String ID; public String Password; public boolean Gender; public int Age; //UserType 사용 //COMPANY : 기업 회원 //NORMAL : 일반 회원 //PREMIUM : 프리미엄 회원 public UserType Type; }
  • 난수(임의의 수) → 어떤 수가 나올지 모름
    • Math.random()을 사용→ 왜 0.0 <= Math.random() <= 1.0 으로 사용 하면 안되나?예로 1~3사이의 정수를 구한다면,
    • //각 변에 3을 곱한다. 0.0 *3 <= Math.random() *3 < 1.0 *3 // 각 3을 *준다. -> 0.0 <= Math.random() *3 < 3.0 // *원하는 개별값의 갯수 //각 변을 int형으로 형변환한다. (int)0.0 <= (int)(Math.random() *3) < (int)3.0 -> 0 <= (int)(Math.random() *3) < 3 // 02의 수를 구할 수 있게 됨. //각 변에 1을 더한다. 0 +1 <= (int)(Math.random() *3)+1 < 3 +1 -> 1 <= (int)(Math.random() *3)+1 < 4 //13의 수를 구할 수 있게 됨.
    • →처음부터 정해져 있는 값.
    • 0.0 <= Math.random() < 1.0
  • for문은 반복 횟수를 알고 있을 때 사용. ↔ while문은 반복횟수를 모를 때 주로 사용
  • for (초기화; 조건식; 증감식;) { /* 'for(초기화; 조건식; 증감식;)'의 '(초기화; 조건식; 증감식;)'은 생략 가능하다. */ // 조건식이 참(true)인 동안 수행될 문장들을 작성한다. } // 조건식이 거짓이 되면, for문 전체를 빠져나간다.
  • → for문의 구조
  • while문
    • 조건식이 ‘참(true)인 동안’, 즉 조건식이 거짓이 될 때까지 블럭{} 내의 문장을 반복한다.
    • for문과 while문은 항상 서로 변환이 가능하다.
    • while문은 조건식의 결과에 따라 블럭{}이 한 번도 수행되지 않을 수 있다.→ while문의 구조
  • while(조건식) { // 'while(조건식)'의 '(조건식)은 생략불가능 하다 반드시 작성. // 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 작성한다.
  • do - while문
    • 최소 한번은 수행될 것을 보장한다.
    • 반복적으로 사용자의 입력을 받아서 처리할 때 유용하다.
    • do - while 구조
    do {
                // 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.(처음 한 번은 무조건 실행)
    } while (조건식); // <- 끝에 ';'을 잊지 않도록 주의
  • break문
    • break문은 자신이 포함된 가장 가까운 반복문을 벗어난다.
  • continue문
    • 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다.
  • 중첩 반복문 앞에 이름을 붙이고 break문과 contiune문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복문을 건너뛸 수 있다.

 

ps> 이번주 공부 방향은 최대한 많이 강의를 보는 것과 책을 읽는 것이 목표였다 

 강의는 3강, 4강 각각 5번 이상 봤으며, 책은 3번 이상 읽은 거 같다.