2023-12-19 (9일차) - String, 객체비교, Scanner, Stream

·2023년 12월 19일

📅 2023-12-19, 9일차

자바 개념정리

아스키코드

a : 97
A : 65

그렇다면 한글은 아스키 코드로 어떻게 나올까?

  System.out.println((int) '가'); // 아스키코드 번호 출력됨
  System.out.println((int) '힣');
  • 출력결과는 -> '가' = 44032 '힣' = 55203
    모든 한글은 그럼 44032 ~ 55203 사이에 들어있다!

'안'은 한글인지 확인해보자

public static void main(String[] args) {
		System.out.println(isHanguel('안')); // isHanguel 메서드실행문 '안'이라는 인자
}

static boolean isHanguel(char c) { // (char c)는 매개변수 // static 메서드. 왜? 객체 생성없이 실행하니까
	 return c >= '가' && c <= '힣';
	// return c >= 44032 && c <= 55203; '가' '힣' 대신 아스키코드를 직접 넣어 비교 할 수 있다

객체와의 비교

  • 객체끼리 == 비교를 할 수 없음
  • 객체끼리는 비교를 할때는 .equals을 사용 (동등성을 비교한다)
    String s1 = "하";
    s1 += "하";

    String s2 = "하하";

    System.out.println(s1 == s2);
    System.out.println(s1.equals(s2));

String

String은 클래스다

1번예시

String s1 = "하하";  // ->  	System.out.println(s1 == s2); true
String s2 = "하하";

2번예시

String s1 = new String("하하");  // -> 	System.out.println(s1 == s2); false
String s2 = new String("하하");
  • == 는 객체끼리 비교가 아니라, 값끼리 비교하는거다
  • 1번예시에선 s1과 s2를 비교를 했을 때 둘이 같다고 나옴
  • 2번예시에선 new를 사용하지 않으면 같지 않다고 한다 왜냐하면 new를 사용해서 아예 새로 하나를 만든거고 메모리 영역을 차지한다.
  • 1번예시처럼 new 없이 비교를 했을 땐 같은 크기라고 해서 재활용을 한다.
  • 객체하나를 새로 만들면 메모리를 그만큼 사용하는거니까 이런 방법으로도 메모리 절약을 할 수 있다!
// 자바에서 문장은 왠만하면 아껴쓰자 주의다

String s = "*";
String k = "*";

// s값 증가 전에는 s와 k는 한문장 "*"을 바라본다. 결국 "*"이라는 문장이 두개 생성되는게 아니라 하나를 가지고 재활용해서 메모리를 아껴쓴다라는 뜻이다

s += "*";
s += "*";
s += "*";

System.out.println("s");
System.out.println("k");

// 그러나 s값 증가 후엔 s -> "*" "**" "***" "****"
// k는 -> "*" 

// 이렇게 되면 메모리를 많이 사용하게 된다

// 이런 특징을 String 불변성이라고하는데 
// 이걸 해결위해선 StringBuilder를 사용해서 메모리를 아끼면 된다.

StringBuilder sb = new StringBuilder();
sb.append("*");
sb.append("*");
sb.append("*");
sb.append("*");

// 문장을 이렇게 만드는 것이 성능이 더 좋다. 메모리를 아끼기 때문에.

동등성

  • 둘의 스펙이 같은가?

동치성

  • 둘이 같은 존재인가? == 같은 위치에 있어? 같은 주소야?

instance of

  • 객체 타입을 확인하는 연산자이다
  • 형변환 가능 여부를 확인하며 true / false로 결과를 반환한다

Scanner

Scanner는 자바에 이미 있는 클래스이다 그래서 사용할 때
java.util의 Scanner 클래스에서 import해야지만 사용할 수 있다.

import java.util.Scanner;

이클립스에서는 Scanner객체생성 후 Ctrl+Shift+O를 누르면 자동 import가 된다.

   Scanner sc = new Scanner(System.in); // Scanner 객체 생성

   String str = sc.nextLine(); // 입력받은 문자열을 str에 저장

.nextLine() 뿐만 아니라
.next()
.nextInt()
.nextDouble()
등등 다양한 메서드가 존재하고, 입력하는 값에 따라 알맞게 사용해야한다.
그렇게하지 않으면 InputMismatchException이 발생한다.

  • .nextInt() 처럼 타입이 지정 되어있는 메소드에 타입이 맞지 않은 값들을 넣어주면 생기는 에러메세지

split()

  • .split(" ") <- 구분자. 공백으로 쪼갠다
  • .split(",") <- 콤마로 쪼갠다
  • split 사용 예시와, 사용시 주의 할 점 ↓
String inputDiv = input;
// inputDiv 라는 변수에 문자인 input값을 넣겠다

String inputDiv = input.split(" ");
// 문자인 input값을 공백을 기준으로 쪼갠다
// 에러가 발생할거다
// 쪼개지면 하나의 값이 아닌 복수개의 값이 되어 inputDiv 변수에 담을 수 없기때문이다. 변수엔 하나의 값만 들어 갈 수 있으니까.

String[] inputDiv = input.split(" ");
// 배열을 사용해서 여러개의 값을 넣을 수 있게 해주면 된다

Integer.parseInt()

  • 스트링타입에 들어간 문자인 숫자 (우리눈엔 숫자이지만 자바에서는 문자로 취급 된 숫자. 예: "5") 를 정수로 변환해준다
int n1 = Integer.parseInt(변수명[0]);

입력: 1 2

  • String 배열에 들어있는 문자인 "1"과 "2"를 Integer.parseInt()를 사용해서 정수로 변환하면 산술연산이 가능하다!

출력: 3

		Scanner sc = new Scanner(System.in);
		String input = sc.nextLine();
		
		String[] inputDiv = input.split(" ");
		
		int n1 = Integer.parseInt(inputDiv[0]);
		int n2 = Integer.parseInt(inputDiv[1]);
		
		System.out.println(n1 + n2);

		sc.close();

stream 반복문

  • 단축표현
  • 어떤 로직을 줄일 수 있다

👩‍💻 TO DO

  • 위키 수정, 인력관리사무소 문제에서 코드 줄이고 키워드만 넣기
  • instance of
    • toString, equals, Object 영상
  • for each 복습
  • 백준 하는법 영상 먼저 보고
    • parseInt 복습
    • stream 복습
  • 피보나치수열 문제 다시 해보기
  • 별찍기 거꾸로 피라미드 다시 해보기
    • 공백 증가시키기 못함 ㅠㅠ
  • 시간날때 : 점핏 (이직사이트) 구경
profile
hello world

0개의 댓글