자바 콘솔에서 데이터를 입력하고 출력하는 방법에 대해 알아보자.

 

사용자로부터 데이터를 입력받기 위해서는 Scanner 객체가 필요하다.

Scanner sc = new Scanner(System.in);

 

new 연산자를 통해 Scanner 객체를 생성한 뒤, System.in을 통해 사용자의 디바이스에 입력장치(키보드 등)를 연결한다.

사용자가 어떤 데이터를 입력해야하는지 쉽게 식별할 수 있도록 알려준다.

 

그리고 실제로 사용자로부터 입력받은 데이터를 어느 변수에 넣을 것인지 만들어준다.

System.out.println("아이디를 입력해주세요. >>");
String username = sc.nextLine();

nextLine 함수는 사용자로부터 String 형태의 데이터를 입력받는다.

 

그렇다면 숫자 데이터는 어떻게 입력받을까?

System.out.println("생년월일을 입력해주세요. >>");
int birthDate = sc.nextInt();

nextInt 함수는 정수형 데이터를 입력받을 때 사용한다.

 

마지막으로 위에서 입력받은 데이터를 println()을 통해 연속적으로 출력할 수 있지만 printf를 통해 형식에 맞춰 출력할 수 있다.

System.out.printf("%s\t%d", username, birthDate);

 

입력창이 프롬프트 바로 뒤에 나오게 하고 싶다면 println을 print로 수정하면 된다. 또한 데이터를 출력할 때 줄을 바꾸고 싶다면 %s와 %d 사이에 \n을 넣으면 새로운 줄로 출력이 되고, \t를 넣으면 개행문자가 된다.

 

import java.util.Scanner;

public class ConsoleIO {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.print("아이디를 입력해주세요. >>");
        String username = sc.nextLine();

        System.out.print("생년월일을 입력해주세요. >>");
        int birthDate = sc.nextInt();


        System.out.printf("%s\t%d", username, birthDate);
    }
}

 

 

'Back-End > Java' 카테고리의 다른 글

제어문 - 조건문과 반복문  (0) 2023.05.11
연산자  (0) 2023.05.10
String 문자열  (2) 2023.05.09
형변환  (0) 2023.05.08
변수와 자료형, 그리고 상수  (0) 2023.05.08
String

문자열 객체

 

객체 => 힙 메모리 영역

변수 => 힙 메모리 영역의 주소

String str = "안녕하세요!"; // 문자열 리터럴

"안녕하세요!"라는 값 자체는 힙 메모리 영역에 저장되고 str 변수에는 힙 메모리 영역의 주소가 할당된다.

String의 경우, 자바에서 값 자체를 할당할 수 있도록 지원해주기 때문에 위처럼 사용이 가능하다. 그러나 일반적으로 자바의 객체는 리터럴(Literal), 값 자체를 대입 할 수 없다.

String str_2 = new String(original: "안녕하세요!"); // 생성자

원칙적으로는 new 연산자를 이용하여 새로운 객체를 생성하겠다고 선언한 뒤, 객체의 종류, 파라미터 영역에 어떤 데이터를 만들지 적어야한다.

이전의 변수와 자료형, 그리고 상수 포스팅의 참조형에서 말했다시피 변수에 직접 대입한 값과 생성자를 이용하여 만든 값은 값이 같아도 같은 주소를 공유하지 않는다.

그렇다면 주소가 아니라 값 자체는 동일하다고 받아들일까?

if (str.equals(str_2)) {
    System.out.println("str.equals(str_2)");
}

결과는 참이다. 즉, 주소가 아닌 값 자체를 비교할 때에는 equals 메소드를 통해 비교하면 된다.

 

 

문자열 병합

1. '+' 연산자 활용

String str_1 = "Hello,";
String str_2 = "World!";

System.out.println(str_1 + " " + str_2);

공백은 str_1 변수나 str_2 변수에 넣어도 된다.

'+' 연산자는 하나를 합칠 때마다 임시로 String 객체를 만들어서 붙여서 반환하는 형태이다. 그런데 임시로 객체를 할당한다는 것은 힙 메모리를 사용한다는 것이다. 용량은 작지만 메모리에 영향이 있는 것은 사실이다.

 

2. StringBuilder 활용

StringBuilder strBdr_1 = new StringBuilder("Hello,");

strBdr_1.append(" ");
strBdr_1.append("World!");

String str_new = strBdr_1.toString();
System.out.println(str_new);

'+' 연산자를 사용할 때는 임시 객체를 만들어서 문자열을 붙였다. StringBuilder를 활용하면 임시 객체를 만들지 않고 사용하던 "Hello," 객체를 그대로 "World!" 객체와 붙이는 형식이다. 속도가 빠르고 메모리면에서 조금 더 효율적인 작업이 가능하다.

StringBuilder를 활용하면 데이터를 추가로 붙이거나 일부를 변경하는 작업이 가능하기 때문에 상황에 따라 필요한 방법을 활용하면 된다.

 

 

문자열 슬라이스

String str_1 = "이름: 김자바";

위의 코드에서 "김자바"라는 값만 사용하고 싶다고 가정해보자.

String은 값의 각각 하나하나에 순서, 즉 인덱스(index)를 붙여 관리하고 있다. 아래의 코드를 활용하여 인덱스 값을 확인해보자.

System.out.println(str_1.indexOf("이"));
System.out.println(str_1.indexOf("름"));

각각 0과 1이 나왔다. 이번에는 substring 함수를 통해 원하는 부분만 잘라보자.

String str_name = str_1.substring(4, 7);
System.out.println(str_name);

substring 함수로 인덱스의 시작과 끝(시작, 끝-1)을 정해 원하는 값인 "김자바"를 얻었다.

 

 

문자열 대소문자 변환

String str_1 = "abc";
String str_2 = "ABC";

str_1 = str_1.toUpperCase();
str_2 = str_2.toLowerCase();

System.out.println(str_1);
System.out.println(str_2);

위의 코드는 소문자를 대문자로, 대문자를 소문자로 변환하는 코드이다.

우리가 대소문자를 굳이 맞춰주는 이유는 사용자가 대소문자를 섞어 입력했을 때, 올바르게 판단하기 위함, 혹은 입력된 값에 대해 통일된 형식을 맞춰서 저장해야하는 경우 등이 있다.

자바에는 대소문자를 동일한 값의 데이터로 인식하게 하는 함수가 있다.

if (str_1.equalsIgnoreCase(str_2)) {
    System.out.println("str_1.equalsIgnoreCase(str_2)");
}

우리가 굳이 대문자 또는 소문자로 변환하지 않아도 대소문자를 무시하고 값을 비교한다.

 

 

공백 제거

1. 양쪽 끝에 공백이 있는 경우

trim()

String str_1 = "      Hello   ";
str_1 = str_1.trim();
System.out.println(str_1);

 

2.  문자열 중간에 공백이 있는 경우

replace()

String str_2 = "Hel   lo";
str_2 = str_2.replace(" ", "");
System.out.println(str_2);

 

 

'Back-End > Java' 카테고리의 다른 글

연산자  (0) 2023.05.10
콘솔 입출력  (0) 2023.05.09
형변환  (0) 2023.05.08
변수와 자료형, 그리고 상수  (0) 2023.05.08
Java란?  (0) 2023.05.02

오늘의 단어

congregate / influx / riot / dozens of / several

 

 

congregate

모이다

 

예문

The entire hip-hop genre was born from urban disenfranchisement, kids in the most derelict sections of the Bronx, in New York, congregating at block parties in the street because they were too young or poor to get into discos.

온 힙합 장르는 뉴욕 브롱크스의 가장 황폐한 구역에, 디스코텍에 가기에는 너무 어리거나 가난한 아이들이 거리의 각 블록마다 모여 도시 시민권이 박탈되면서 탄생했다.

 

Young peaple often congregate in the main square in the evening.

젋은이들은 주로 저녁에 메인 광장에 모인다.

 

 

influx

유입, 밀어닥침

 

예문

Unlike the days preceding the Capitol riot in 2021 by Trump supporters, New York officials say they have not seen any influx of protesters to the city in recent days.

뉴욕 공무원들은 트럼프 지지자들이 이전의 2021년 국회의사당 폭동과 달리 도시에 시위대가 유입하는 것을 본 적이 없다 말했다.

 

The sudden influx of visitors is straining hotels in the town to the limit.

갑작스러운 관광객들의 밀어닥침에 도시의 호텔이 한계에 도달했다.

 

 

throng

1. 인파, 군중

2. 모여들다

 

예문

We pushed our way through the throng.

우리는 인파 사이를 뚫고 길을 나아갔다.

 

People thronged to hear the little girl.

사람들은 그 어린 소녀의 말을 듣기 위해 모여들었다.

 

 

riot

1. 폭동

2. 모임, 집합

 

run riot

1. 마구 날뛰다 2. 빠르게 퍼지다, 제멋대로 뻗어나가다

 

예문

They let their kids run riot.

그들은 그들의 아이들이 마구 날뛰게 냅뒀다.

 

The weeds run riot my garden.

잡초가 내 정원에서 제멋대로 자라났다.

 

 

dozens of

수십의, 많은

 

예문

On Tuesday morning, dozens of police and court officers, as well as Secret Service agents, are expected to escort Mr Trump through the streets of New York to the Lower Manhattan court complex.

화요일 아침, 수십의 경찰과 비밀 경호요원들 뿐만 아니라 법원 관계자들이 뉴욕거리부터 로어맨헤튼 단지까지 트럼프를 경호할 것이라 예상된다.

 

Dozens of villages have been razed.

수십 개의 마을이 파괴되었다.

 

 

several

몇몇의, 각각의

 

예문

But on Monday night, Judge Merchan ruled that some press photographers will be allowed to take pictures for several minutes before the arraignment formally starts.

그러나 월요일 밤, 재판장 메르한은 기소가 공식적으로 시작하기 전에 일부 언론 사진사들은 몇 분 동안 사진을 찍을 수 있도록 허가했다.

 

Several students were lounging aroundreading newspapers.

몇몇의 학생들이 느긋하게 둘레에서 신문을 읽고 있었다.

 

 

형변환

자료형들을 강제로, 혹은 자동으로 변환하는 경우가 있다. 같은 형식의 데이터 타입을 변환하기도 하고, 다른 형식의 데이터 타입 간의 변환이 이루어지기도 한다.

 

형변환의 포함관계

byte < short < int < long <<< float < double

 

용량 순서로 기억하면 편하며 정수보다는 실수가 큰 범위이다.

 

강제 형변환(명시적 형변환)

int a = 128;
short b = (short) a;
byte c = (byte) a; // -128 ~ 127

큰 데이터 타입을 작은 데이터 타입으로 변환하거나, 두 가지 데이터 타입이 자동 변환될 수 없을 때 직접 지정하여 변환하는 것이다.

변수 c처럼 -128이라는 뜬금 없는 값이 나온 이유는 byte 타입이 128이라는 숫자를 포용할 수 없기 때문에 오버플로우가 일어난 것이다.

 

자동 형변환(암시적 형변환)

int m = 80;
double n = m;

처음에 대입한 변수 m은 80이라는 정수형으로 출력되고, n은 80.0은 실수형으로 출력된다.

m에 있는 정수형 값이 n에 대입되기 전에 double로 형변환이 되기 때문에 실수형으로 출력된 것이다.

 

int e = 10;
short f = 20;

short g = (short) (e + f);

연산이 일어날 떄는 큰 범위를 따라간다. 연산에 대해서 형변환를 하고 싶다면 연산이 포함된 표현식에도 괄호()를 하여 결과물에 대해 전체를 형변환 하는 코드를 작성해야한다.

'Back-End > Java' 카테고리의 다른 글

연산자  (0) 2023.05.10
콘솔 입출력  (0) 2023.05.09
String 문자열  (2) 2023.05.09
변수와 자료형, 그리고 상수  (0) 2023.05.08
Java란?  (0) 2023.05.02

+ Recent posts