2023-12-19 (9일차) - String 불변성, Scanner, Stream, for each

민짱·2024년 1월 7일
post-thumbnail

📅2023. 12. 19 9일차


🎨 Java

String 불변성

  • String은 기본 타입(Primitive Type)이 아닌 참조 타입(Reference Type)이다. 즉 String은 클래스이다.
  • int 변수 num은 변수에 할당된 메모리에 값을 바로 저장하고 있기 때문에 10에서 20으로 값을 변경할 경우 변수가 갖고 있는 메모리에서 값을 변경한다. 10이라는 값이 할당되어 있던 메모리 내에 값을 20으로 변경한 것이기 때문에 가변이라고 한다.

  • 반면에 String 변수 str의 경우는 다르다. 문자열 데이터는 스택 메모리에 직접 저장되는 것이 아니라 Heap영역 중에서 String constant pool이라는 곳에 메모리를 할당받아 거기에 값을 저장하고, str은 바로 그 주소 값을 참조하게 된다.

  • 따라서, str = "abc" 후에 str = "def"가 실행되어 str이라는 변수가 갖는 참조 값이 0x 11에서 0x22로 바뀐다 하더라도 그건 str 변수가 갖는 참조값이 변경된 것이지 실제 "abc"가 저장되어 있는 0x11주소의 데이터가 바뀌는 것이 아니다.

  • java에서 String은 이렇게 불변성을 띈다.

Scanner

  • 키보드로 입력받기 위해 Scanner 라는 클래스를 쓴다.

Scanner 클래스 특징

1.기본적인 데이터 타입들을 Scanner 의 메소드를 사용하여 입력받을 수 있다.

  • 예로 들어 100을 입력하고자 할 때, String(문자열)로 입력받고 싶으면 next() 나 nextLine() 을, int(정수)로 입력받고 싶다면 nextInt() 를 사용하여 입력받으면 알아서 해당 타입으로 입력된다.

2.Scanner 을 사용할 시 util 패키지를 경로의 Scanner 클래스를 호출해야 한다.

  • 자바에서 쓰이는 대부분의 클래스는 lang 패키지가 아니라면 import 을 통해 호출해주어야 한다.
    Scanner 의 경우는 java.util 패키지에 있다.

3.공백(띄어쓰기) 또는 개행(줄 바꿈)을 기준으로 읽는다.

Scanner 객체 생성

  • 클래스이름 객체이름 = new 클래스_이름();
    (대체로 Scanner 의 경우 객체이름은 in, input, sc, scan 이렇게 4가지가 가장 많이 쓰인다.)
  • Scanner in = new Scanner(System.in); // Scanner 객체 생성
  • 주의할 것은 Scanner 을 생성할 때 System.in 이 들어간다는 점이다.
  • System.in 은 사용자로부터 입력을 받기 위한 입력 스트림이다.
Scanner sc = new Scanner(System.in); // Scanner 객체 생성
String str = sc.nextLine(); // 입력받은 문자열을 str에 저장

for each란?

  • 기존의 for문과는 달리, for-each문은 배열의 크기만큼 루프를 돌면서 각 원소를 순차적으로 접근할 수 있다.

for each문 활용

  • int num의 값은 n[0] -> n[1] -> n[2] -> n[3] -> n[4] 순으로 순차적으로 바뀐다.
public class Main {
    public static void main(String[] args) {
        int [] n = {1, 2, 3, 4, 5};
        int sum = 0;
        
        for(int num : n) {
            sum += num;
        }
        
        System.out.println(sum);
    }
}

문자열 배열에서의 활용

public class Main {
    public static void main(String[] args) {
        String names[] = {"사과", "바나나", "딸기", "포도", "수박", "복숭아"};
        for(String fruits : names) {
            System.out.print(fruits+" ");
        }
    }
}

나열에서의 활용

public class Main {
    enum Week {,,,,,,};
    public static void main(String[] args) {
        for(Week day : Week.values()) {
            System.out.print(day+"요일 ");
        }
    }
}

stream (단축표현, 줄임말)

  • 어떤 로직을 줄일 수 있다.
  • 스트림(Stream)은 자바 8 API에 새로 추가된 기능이다. 스트림을 이용하면 선언형(더 간결하고 가독성이 좋도록)으로 컬렉션 데이터를 처리할 수 있다.

🔔 TODO

  • 자바에서의 한글, char 비교, String 비교, equals, 메모리 절약
  • toString, equals, Object 영상 보기
  • Scanner 한 번 try 해보기

0개의 댓글