국비/Java

2023.02.17 17일차 Java

춘핑이 2023. 2. 17. 17:03

Java 연산자

3.6 비교 연산자

같냐 안같냐 등 을 연산하면 boolean타입의 리턴값이 나온다.
==, !=, < ,<=, >, >=

//연산결과는 boolean
int x = 3;
int y = 5;

boolean r1 = x == y; //false
boolean r2 = x != y; //true

boolean r3 = x < y; //true
boolean r4 = x <= y; //true

boolean r5 = x > y; //false
boolean r6 = x >= y; //false

주의할점
자바는 변수를 선언할때 타입이 정해져서 타입이 같은지를 비교하는 연산자가 없다.
자바스크립트처럼 === !== 같은것들이 없다.

// 왠만하면 같은 타입끼리 비교해야함
int a = 30;
String b = "50";
boolean c = true;

// boolean r7 = a < b; 다른타입 비교 불가
// boolean r8 = a< c;

// 정수, 실수는 가능
// 하지만 타입을 맞춘 후 비교 권장

int num1 = 30;
double num2 = 30.0;
boolean r9 = num1 == num2;
System.out.println(r9); // true

0.1f == 0.1 에서 0.1f가 double타입으로 변환되면 0.1 == 0.1이 되어 true가 산출되어야 하지만 false가 산출된다.
부동소수점 방식을 사용하는 실수타입은 0.1을 정확히 표현할 수 없고 float와 double타입의 정밀도 차이때문이다.

문자열 같은지 비교 == 사용하지 말자
equals 메소드 사용해라 왜 그런지는 5장에서 나온다.
다른지 비교도 != 사용하지 말자.
equals의 연산결과를 반전(!)시키면된다.

String str1 = "java";
String str2 = "java";

boolean r1 = str1 == str2;
System.out.println(r1); // true

String str3 = "ja";
String str4 = "va";
String str5 = str3 + str4;

System.out.println(str1); //"java"
System.out.println(str5); //"java"

boolean r2 = str1 == str5;
System.out.println(r2); // false

//equals메소드 사용
boolean r3 = str1.equals(str2); // 객체.메소드(파라미터로 다른객체)
System.out.println(r3); //true

boolean r4 = str1.equals(str5);
System.out.println(r4); //true

boolean r5 = !str1.equals(str5);
System.out.println(r5); //false 

3.7 논리 연산자

&&, ||, | ^, &, |
피연산자:boolesan / 연산결과:boolean

3.7.1 &&(and) == &(and)

두항이 모두 true일때만 결과 true 나머지 결과는 false

System.out.println(true && true); //true
System.out.println(false && true); // false
System.out.println(true && false); // false
System.out.println(false && false); // false

3.7.2 ||(or) == |(or)

두항이 모두 false일때만 false 나머지는 모두 true

System.out.println(true && true); //true
System.out.println(false && true); //true
System.out.println(true && false); //true
System.out.println(false && false); // false

3.7.3 !(not)

하나의 피연산자 결과는 피연산자가 false면 true ture면 false

System.out.println(!true); //false
System.out.println(!false); //true

3.7.4 ^(xor)

exclusive or 배타적 논리합 피연산자가 다르면 결과 true 같으면 false

System.out.println(true ^ true); //false
System.out.println(false ^ true); //true
System.out.println(true ^ false); //true
System.out.println(false ^ false); // false

&&와 & / ||와 | 기능이 같은데 왜 따로있나?
&&와 ||는 Short circuit(합선)연산이 일어날 수있다. 그래서 더 효율적이다.

true && true : true / true && false : false
false && true : false / false && false : false
앞이 true이면 뒤까지보고 연산하고
앞에가 false이면 뒤를 보지않고 false라고 연산결과를 리턴한다.

x = 10;
if (x++ < 0 && x++ < 100) { //false / true
    System.out.println("실행됨1");
}
System.out.println(x); //x = 11

x = 10;
if (x++ < 0 & x++ < 100) { //false / true
    System.out.println("실행됨2");
}
System.out.println(x); //x = 12

증감연산자++을 변수뒤에 붙이면 연산후에 증가된다.
앞이 false인 연산이라면 뒤 까지 연산을 하지 않고 값을 return한다.
&&와 &의 차이점을 여기서 볼 수 있다. 의도에 따라 사용하면 될것 같다.

3.10 대입연산자

단순 대입연산자 = 우측 피연산자를 변수에 저장
복합 대입연산자 +=, -=, *=, /=, %= 등등

int x = 10;

x += 30; // x = x + 30
System.out.println(x); //40

x -= 20; //x = x - 20
System.out.println(x); //20

x *= 3; //x = x * 3;
System.out.println(x); //60

x /= 7; //x = x / 7;
System.out.println(x); //8

x %= 3; // x = x % 3;
System.out.println(x); //2

3.11 상항(조건) 연산자

조건(conditional), ? 연산자라고도 불린다.
삼항 연산산자는 3개의 연산자를 가진다 피연산자 ? 피연산자 : 피연산자
1항 ? 2항 : 3항
연산결과 : 1항이 true면 2항 1항이 false면 3항이 리턴된다.

public class ConditionalOperationExample {
    public static void main(String[] args) {
        int score = 85;
        char grade = (score > 90) ? 'A' : ( (score > 80)? 'B' : 'C');
        System.out.println(score + "점은 " + grade + "등급입니다.");
    }
}

-> 85점은 B등급입니다.
(score > 90) ? 'A' : ( (score > 80)? 'B' : 'C')
85점이라서 거짓이라 : 뒤의 ( (score > 80)? 'B' : 'C') 실행
안에 또 삼항연산자가 있는데 참이라 ?뒤의 'B' 출력

3.12 String의 메소드

참조타입이라 나중에 나오지만 알아보자.

3.12.1 equals()

두 문자열이 같은지 확인하는 메소드이다.
return type : boolean

String a = "java";
String b = "ja";
String c = "va";

boolean res1 = a == (b+c);
System.out.println(res1); //false

boolean res2 = a.equals(b+c);
System.out.println(res2); //true

3.12.2 length()

문자열의 길이 확인할 때 사용하는 메소드이다.
retrun type : int

public class C02Length {
    public static void main(String[] args) {
        String str1 = "java";
        String str2 = "spring";
        String str3 = "hello world";
        String str4 = """
                동해물과 백두산이
                마르고 닳도록""";

        int len1 = str1.length();
        System.out.println(len1); //4
        System.out.println(str2.length()); //6
        System.out.println(str3.length()); //11
        System.out.println(str4.length()); //17(엔터포함)
    }
}

3.12.3 charAt();

특정 위치 (index)에 있는 문자 확인 index는 0부터 시작한다.
return type : char

public class C03CharAt {
    public static void main(String[] args) {
        String str1 = "spring";

        System.out.println("길이: " + str1.length()); // 6

        char c1 = str1.charAt(0);
        System.out.println(c1);// 's'
        System.out.println(str1.charAt(1)); // 'p'
        System.out.println(str1.charAt(2)); // 'r'
        System.out.println(str1.charAt(5)); // 'g'
        System.out.println(str1.charAt(str1.length() - 1)); 
    }
}

3.12.4 indexOf()

특정문자(열)가 처음 나타나는 위치(index)를 확인한다.
return type : int 없으면 -1을 리턴한다.

public class C04IndexOf {
    public static void main(String[] args) {
        String str1 = "spring";

        int i1 = str1.indexOf("ring");
        System.out.println(i1); //2

        int i2 = str1.indexOf('i');
        System.out.println(i2); //3

        String str2 = "java";
        System.out.println(str2.indexOf('a')); //1 처음 나오는 것을 알려주기때문

        String str3 = "html";
        System.out.println(str3.indexOf("tm")); //1
        System.out.println(str3.indexOf("mt")); //-1
    }
}

3.12.5 contains()

특정 문자열이 있는지 확인하는 메소드이다.
return type : boolean

public class C05contains {
    public static void main(String[] args) {
        String str1 = """
                동해물과 백두산이
                마르고 닳도록
                """;

        boolean res1 = str1.contains("해물");
        System.out.println(res1); //true

        boolean res2 = str1.contains("해산물");
        System.out.println(res2); //false
    }
}

3.12.6 toLowerCase / toUpperCase

toLowerCase : 소문자로 바꾼 문자열 리턴
toUpperCase : 대문자로 바꾼 문자열 리턴
return type : String

public class C06toLowerCase {
    public static void main(String[] args) {
        String str1 = "I'm ironMan";
        String res1 = str1.toLowerCase();
        System.out.println(res1); //i'm ironman

        String res2 = str1.toUpperCase();
        System.out.println(res2); //I'M IRONMAN

        //대소문자 구분없이 다른 메소드확인할때 사용할 수 있음.
        System.out.println(str1.toLowerCase().indexOf("ir")); //메소드체이닝
    }
}

3.12.7 substring();

문자열의 일부(subString)을 리턴한다.
return type : String
첫번째파라미터 시작 index(포함)
두번째파라미터 종료 index(포함안됨)
두번째파라미터를 안넣으면 끝까지 출력된다.
파라미터가 인덱스를 벗어나면 오류를 발생시킨다.

public class C06toLowerCase {
    public static void main(String[] args) {
        String str1 = "중국 재개방이 글로벌 인프레이션 촉발하지 않는 이유";
        String res1 = str1.substring(0,2);
        System.out.println(res1); //중국

        System.out.println(str1.substring(8)); //글~
    }
}

3.12.8 startsWith(); / endsWith

startsWith : 특정 문자열로 시작하는지?
endsWith : 특정문자열로 끝나는지?
return type : boolean

public class C08StartWith {
    public static void main(String[] args) {
        String str1 = "spring";

        System.out.println(str1.startsWith("s")); //true
        System.out.println(str1.startsWith("sp")); //true
        System.out.println(str1.startsWith("pr")); //false

        System.out.println(str1.endsWith("g")); //true
        System.out.println(str1.endsWith("ng")); //true
        System.out.println(str1.endsWith("s")); //false
    }
}

3.12.9 trim()

문자열의 앞, 뒤 공백제거
return type : String

public class C09Trim {
    public static void main(String[] args) {
        String str1 = "    my  spring        ";
        System.out.println(str1.trim()); //my  spring
    }
}

3.12.10 isEmpty()

빈문자열("")인지 확인
return type : boolean

public class C10isEmpty {
    public static void main(String[] args) {
        String str1 = "java";
        String str2 = " ";
        String str3 = "";

        System.out.println(str1.isEmpty()); //false
        System.out.println(str2.isEmpty()); //false
        System.out.println(str3.isEmpty()); //true

        //equals로도 활용가능함
        System.out.println(str1.equals(""));
    }
}

3.12.11 isBlank()

공백 문자로만 빈문자로만 있는지 확인?
return type : boolean

public class C11isBlank {
    public static void main(String[] args) {

        String str1 = "   java   ";
        String str2 = "   ";
        String str3 = "";

        System.out.println(str1.isBlank()); //false
        System.out.println(str2.isBlank()); //true
        System.out.println(str3.isBlank()); //true
    }
}

3.12.12 replace()

특정 문자열을 바꿀때 사용
return type : String

public class C11Replace {
    public static void main(String[] args) {

        String str1 = "설악산, 백두산, 한라산";
        System.out.println(str1.replace("산", "mountain")); //설악mountain...

        String str3 = str1.replace("설악", "지리");
        System.out.println(str3); //지리산, ...
    }
}

3.13 문제풀이 해보기

https://codingbat.com/java 백준말고 또다른 문제 사이트
연산자 if for문 등 푸는 쉬운 문제들 기본문법관련 문제
범위-숫자인데 숫자가 낮을수록쉬움

3.13.1 extraEnd

마지막 두글자 3번 반복하기

public String extraEnd(String str) {
  String end = str.substring(str.length()-2);
  return end + end + end;
}

3.13.2 firstTwo

앞 두글자 출력하는데 들어오는 문자열이 빈문자열일수도 있음
substring은 파라미터가 인덱스를 벗어나면 오류를 발생시킨다.

내 제출한 답

public String firstTwo(String str) {
  String start = "";
  if (str.length() >= 2){
     start = str.substring(0,2);
  } else {
     start = str;
  }
  return start;
}

뭔가 다른 메소드가 있는 줄 알았는데 똑같은 것이 정답이다.

3.13.3 withoutEnd

앞뒤글자 뺀 문자 출력 2글자 이하라면 공백이될것이다.

public String withoutEnd(String str) {
  if (str.length() >= 3) {
      return str.substring(1,str.length()-1);
  } else {
    return "";
  }
}

문제 많아서 풀어보자.

3.13.4 sumDouble

두수를 더하는데 같으면 두배까지

public int sumDouble(int a, int b) {
  if (a == b){
    return (a + b) * 2;
  } else {
    return a + b;
  }
}

3.13.5 sleepIn

public boolean sleepIn(boolean weekday, boolean vacation) {
  if (weekday == false && vacation == false ){
    return true;
  } else if (weekday == true && vacation == false){
    return false;
  } else if (weekday == false && vacation == true) {
    return true;
  } else {
    return true;
  }
}

3.13.6 monkeyTrouble

둘다 웃거나 둘다 안웃으면 문제상황이다.

public boolean monkeyTrouble(boolean aSmile, boolean bSmile) {
  if (aSmile && bSmile){
    return true;
  } else if (!aSmile && !bSmile) {
    return true;
  } else {
    return false;
  }
}

3.13.7 parrotTrouble

7시이전 20시이전 말하고 있으면 문제상황이다.

public boolean parrotTrouble(boolean talking, int hour) {
  if (talking && (hour<7 ||hour>20)){
    return true;
  } else {
    return false;
  }
}

3.13.8 makes10

합이 10이거나 둘중 하나가 10이면 true

public boolean makes10(int a, int b) {
  if (a + b == 10){
    return true;
  } else if (a ==10 || b==10){
     return true;
  } else{
    return false;
  }
}

3.13.9 nearHundred

숫자의 100혹은 200에서 차이가 10인지

public boolean nearHundred(int n) {
  if (Math.abs(100-n) <= 10) {
    return true;
  } else if (Math.abs(200-n) <= 10){
    return true;
  } else {
    return false;
  }
}

3.13.10 notString

앞에 not이 잇으면 그대로 출력 아니면 not을 붙여서 출력하기

public String notString(String str) {
  if (str.length() >= 3 && str.startsWith("not")){
    return str;
  } else {
    return "not " + str;
  }
}

2023.02.17 후기

&&, & / ||, |의 차이점을 잘 모르고 잇었다. 더 효율적이라고 해서 &&와 ||을 사용하고 있었다.
설명을 통해서 차이점을 알고 Short circuit연산이 일어난다는 것을 알게 되었다.
이 점에 대해서 분명한 차이가 있고 원하는때마다 바꿔서 사용해야함을 알게 되었다.

https://codingbat.com/java 백준말고 또다른 문제 사이트
연산자 if for문 등 푸는 쉬운 문제들 기본문법관련 문제
범위-숫자인데 숫자가 낮을수록쉬움
어려운 문제는 LeetCode / 프로그래머스가서 풀자 나중에 풀것이니 회원가입필요

벌서 2월말이다. 시간이 정말빨리가고 있다. 조금 더 열심히 달려야한다.