조건문(Conditional)

if 문

int a = 1;
int b = 100;

if (a == b) {
    System.out.println("a == b");
} else if (a < b) {
    System.out.println("a < b");
} else if (a <= b) {
    System.out.println("a <= b");
} else {
    System.out.println("else");
} // a < b

if가 참일 때, 코드를 실행한다. if가 거짓이라면 else를 실행한다.

조건을 여러 개 하고 싶다면 else if를 사용한다. 다중 조건문일 경우, 조건을 만족하는 다른 조건문이 있어도 최초의 분기만 실행한다.

 

switch 문

int a = 10;

switch (a + 1) {

    case 9:
        System.out.println("a + 1 == 9");
    case 10:
        System.out.println("a + 1 == 10");
    case 11:
        System.out.println("a + 1 == 11");;
}

switch의 값이 일치하는 case인 "a + 1 == 11"가 출력된다. 그렇다면 거꾸로 나열하면 어떻게 될까?

int a = 10;

switch (a + 1) {

    case 11:
        System.out.println("a + 1 == 11");
    case 10:
        System.out.println("a + 1 == 10");
    case 9:
        System.out.println("a + 1 == 9");;
}

황당하게도 "a + 1 == 11", "a + 1 == 10", "a + 1 == 9" 모두 출력된다. case 같은 경우에는 조건을 만족했다고 조건문을 끝내지 않는다. 조건을 끝내고 싶다면 아래처럼 break라는 키워드를 작성해야 빠져나갈 수 있다.

int a = 10;

switch (a + 1) {

    case 11:
        System.out.println("a + 1 == 11");
        break;
    case 10:
        System.out.println("a + 1 == 10");
        break;
    case 9:
        System.out.println("a + 1 == 9");
         break;
    default:
        System.out.println("default");
}

default는 모든 case에 만족하지 않을 경우 실행되는 코드이다.

 

 

반복문(Loops)

어떠한 작업을 반복적으로 수행할 수 있도록 하는 형식

 

for 문

for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

for 문을 만들려면 괄호( ) 안에 먼저 int 형태의 초기화된 변수를 만들어준다. 그리고 변수의 범위를 정해준다. 조건식이 없으면 반복문이 계속 수행되어 무한루프에 빠지게 된다. i가 1씩 늘어나도록 ++ 증감식을 붙여준다. 이렇게하면 i가 10보다 작을 때까지 1씩 커지며 반복한다.

즉, 정리하면 for 문에는 초기화된 변수, 조건식, 증감식이 있어야한다.

 

while 문, do-while 문

int b = 10;

while (b > 0) {
System.out.println(b);
b--;
}

for 문은 초기화된 변수를 내부에서 만들지만 while 문은 보통 외부에서 만든다.

int b = 0;

do {
	System.out.println(b);
    b--;
} while (b > 0);

do-while 문은 일단 do로 조건없이 실행을 시킨 뒤, 중괄호{} 뒤에 while을 붙여 실행한다. do-while 문은 while 문과 다르게 먼저 실행 후, 조건문을 반복한다. 즉, while 문에 있는 조건과 무관하게 최초 한 번은 무조건 실행하는 반복문이다.

 

 

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

함수  (0) 2023.05.15
자료구조 - 배열, 리스트, 맵  (0) 2023.05.12
연산자  (0) 2023.05.10
콘솔 입출력  (0) 2023.05.09
String 문자열  (2) 2023.05.09
연산자(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

+ Recent posts