연산자(Operators)

산술 연산자

수학적인 계산을 하는 연산자

int a = 10;
int b = 20;
String c = "abc";

System.out.println(a + c); // 10abc

double d = 10;
double e = 20;

System.out.println(d / e); // 0.5

System.out.println(a + b); // 30
System.out.println(a - b); // -10
System.out.println(a * b); // 200
System.out.println(a / b); // 0
System.out.println(a % b); // 10

int와 int를 계산 할 때에는 결과가 모두 정수로 출력된다. 결과값을 실수로 얻고 싶다면 double로 계산하면 된다.

'+' 연산자로 문자열 데이터가 아닌 다른 데이터와 연결하면 문자열로 타입을 변경한 뒤, 문자열로 병합된다. 즉, 모두 String으로 취급된다.

 

 

비교 연산자

값이 같다, 다르다 혹은 크다, 작다 등 비교하는 연산자

int a = 5;
int b = 8;

System.out.println(a > b); // false
System.out.println(a < b); // true

System.out.println(a >= b); // false
System.out.println(a <= b); // true

// = 대입연산자, == 비교연산자
System.out.println(a == b); // false
System.out.println(a != b); // true

일반적으로 기본형 데이터는 값을 '=='로 비교할 수 있지만 실제로 비교되는 값이 힙 메모리의 주소값이기 때문에 참조형 데이터는 그럴 수 없다. 그렇기 때문에 String은 equals 함수로 실제 값을 비교한다.

 

 

논리 연산자

int a = 3;
int b = 3;
int c = 5;

// AND(&&) - 교집합
System.out.println(c > a && c > b); // true && true
System.out.println(c > a && c < b);

// OR(||) - 합집합
System.out.println(c > a || c < b); // true || false

// NOT(!) - 여집합
System.out.println(!true);
System.out.println(!false);

AND 연산자는 피연산자들이 모두 참일 때만 true를 반환한다. OR 연산자는 피연산자 중에 단 하나만 참이어도 true를 반환한다. NOT 연산자는 어떠한 조건이 만족하지 않을 때 true를 반환한다.

 

 

대입 연산자

int a = 1;
double price = 12.5;

 

증감 연산자

대입 연산자+ 사칙 연산자

int a = 1;

System.out.println(a++); // 1
System.out.println(a); // 2
System.out.println(++a); // 3

a++는 a = a + 1와 같고 a--는 a = a - 1와 같다. '++'가 a의 뒤로 오는 경우, 기존의 값을 먼저 출력한 뒤에 값이 더해진다. 반대로 '++'가 앞으로 오는 경우에는 증감연산을 먼저 한 후에 출력한다.

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

자료구조 - 배열, 리스트, 맵  (0) 2023.05.12
제어문 - 조건문과 반복문  (0) 2023.05.11
콘솔 입출력  (0) 2023.05.09
String 문자열  (2) 2023.05.09
형변환  (0) 2023.05.08

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

 

사용자로부터 데이터를 입력받기 위해서는 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
형변환

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

 

형변환의 포함관계

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