01. 문자열 (String)
1. String 객체의 불변성
문자열이란 기본적으로 큰따옴표("")로 감싸진 데이터로, 연산이 수행될 때마다 내부적으로 주소값이 변화하는 불변 객체이다. 이는 문자열이 기본 타입 변수가 아닌, 참조 타입 변수이기 때문이다. 즉, String 타입은 실제 문자열의 내용을 값으로 가지는 것이 아니라 문자열이 존재하는 공간 상의 주소값을 저장한다.
// 문자열 리터럴을 String 타입의 변수 name에 할당
String name1 = "Kim Coding";
// String 클래스의 인스턴스 생성
String name2 = new String("Kim Coding");
// 불변성 객체 예제
// (1) 문자열 리터럴을 직접 할당 = 같은 문자열의 공간을 참조
String name1 = "Kim Coding";
String name2 = "Kim Coding";
// (2) String 클래스의 인스턴스 생성 = 별개의 인스턴스 생성
String name3 = new String("Kim Coding");
String name4 = new String("Kim Coding");
boolean comparison1 = name1 == "Kim Coding"; // true
boolean comparison2 = name1 == name2; // true
boolean comparison3 = name1 == name3; // false
boolean comparison4 = name3 == name4; // false
boolean comparison5 = name1.equals("Kim Coding"); // true
boolean comparison6 = name1.equals(name3); // true
boolean comparison7 = name3.equals(name4); // true
2. 문자열 주요 메서드
| 주요 메서드 | |
| int length() | 문자열의 길이를 반환 >> 반복문에서 빈번하게 사용 |
| char chatAt() | 해당 문자열의 특정 인덱스에 해당하는 문자를 반환 >> 문자열 길이보다 긴 인덱스(문자열 - 1) / 음수 전달 시 오류 발생 |
| int compareTo() | 해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교 >> 대소문자 구분 없이 하려면, compareToIgnoreCase() |
| String concat() | 해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열 반환 |
| index indexOf() | 해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스 반환 |
| String trim() | 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자 제거 |
| String toLowerCase() | 해당 문자열의 모든 문자를 소문자로 변환 |
| String toUpperCase() | 해당 문자열의 모든 문자를 대문자로 변환 |
// 1. length() 메서드
String str = "java";
System.out.println(str.length()); // 4
// 2. chatAt() 메서드
String str = new String("Java");
System.out.println(str.charAt(0)); // 'J'
System.out.println(str.charAt(1)); // 'a'
System.out.println(str.charAt(2)); // 'v'
System.out.println(str.charAt(3)); // 'a'
// 3. compareTo() 메서드
String str = new String("abcd");
System.out.println("문자열 : " + str);
System.out.println(str.compareTo("bcef")); // 양수
System.out.println(str.compareTo("abcd") + "\n"); // 0
System.out.println(str.compareTo("Abcd")); // 음수 (대문자 우선)
System.out.println(str.compareToIgnoreCase("Abcd")); // 0
// 4. concat() 메서드
String str = new String("Java");
System.out.println("문자열 : " + str);
System.out.println(str.concat("수업")); // Java 수업
System.out.println("concat() 메서드 호출 후 문자열 : " + str); // 변화없음
// 5. indexOf() 메서드
String str = new String("Oracle Java");
System.out.println(str.indexOf('o')); // -1
System.out.println(str.indexOf('a')); // 2
System.out.println(str.indexOf("Java")); // 7
System.out.println("indexOf() 메서드 호출 후 원본 문자열 : " + str); // 변화없음
// 6. toLowerCase() 및 toUpperCase() 메서드
String str = new String("Java");
System.out.println(str.toLowerCase()); // java
System.out.println(str.toUpperCase()); // JAVA
System.out.println("두 메서드 호출 후 문자열 : " + str); // 변화없음
3. (Optional) StringTokenizer
StringTokenizer 클래스는 문자열을 우리가 지정한 구분자로 쪼개주는 클래스이다. 그렇게 쪼개어진 문자열 조각 하나를 토큰(token)이라고 부르는데, 이를 사용하기 위해서는 코드 최상단에 import java.util.StringTokenizer을 선언해야 한다.
| 주요 메서드 | |
| int countToken() | 남아있는 토큰의 개수를 반환 |
| boolean hasMoreElements() / boolean hasMoreTokens() | 현재 위치 뒤에 있는 문자열에서 하나 이상의 토큰 사용 가능 여부 반환 |
| Object nextElement() / String nextToken() | 다음 토큰 반환 |
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args){
String str = "This is a string example using StringTokenizer";
StringTokenizer tokenizer = new StringTokenizer(str);
System.out.println(str);
System.out.println();
System.out.println("total tokens:"+tokenizer.countTokens());
while(tokenizer.hasMoreTokens()){
System.out.println(tokenizer.nextToken());
}
System.out.println("total tokens:"+tokenizer.countTokens());
}
}
4. (Optional) StringBuilder
StringBuilder 클래스는 append() 함수를 통해 해당 문자열에 인자로 들어온 문자열을 덧붙여주는 클래스이다. 이렇게 연결된 문자열 객체는 toString() 함수를 통해 출력할 수 있다.
public class Main {
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("문자열 ").append("연결");
String str = stringBuilder.toString();
System.out.println(stringBuilder); // 문자열 연결
System.out.println(str); // 문자열 연결
}
}
5. (Optional) StringButter
StringButter 클래스는 String 클래스 인스턴스 값의 유연한 변경 / 추가를 지원하는 클래스이다. 이를 구현하기 위해 StringBuffer 클래스는 내부적으로 버퍼(buffer), 즉 독립적인 저장 공간을 갖는다.
| 주요 메서드 | |
| String append() | 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가 >> concat()과 동일한 결과를 반환하지만 훨씬 성능이 좋음 |
| int capacity() | StringBuffer 인스턴스의 현재 버퍼 크기를 반환 >> 기본 생성 여유 크기(16) + 인수로 전달된 문자열 크기 |
| String delete() | 인수로 전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거 |
| String deleteAt() | 인수로 전달된 인덱스에 해당하는 문자 한 개를 해당 문자열에서 제거 |
| String insert() | 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 지정된 인덱스 위치에 추가 >> 인수 = 현재 문자열의 길이인 경우, append()와 동일한 결과 반환 |
// 1. append()
StringBuffer str = new StringBuffer("Java");
System.out.println("문자열 : " + str);
System.out.println(str.append(" programming"));
System.out.println("append() 메서드 호출 후 문자열 : " + str); // Java programming
// 2. capacity()
StringBuffer str01 = new StringBuffer();
StringBuffer str02 = new StringBuffer("Java");
System.out.println(str01.capacity()); // 16
System.out.println(str02.capacity()); // 20
// 3. delete()
StringBuffer str = new StringBuffer("Java Oracle");
System.out.println("문자열 : " + str);
System.out.println(str.delete(4, 8));
System.out.println(str.deleteCharAt(1));
System.out.println("deleteCharAt() 메소드 호출 후 문자열 : " + str); // Jvale
// 4. insert()
StringBuffer str = new StringBuffer("Java Programming!!");
System.out.println("문자열 : " + str);
System.out.println(str.insert(4, "Script"));
System.out.println("insert() 메서드 호출 후 문자열 : " + str); // Java Script Programming!!
02. 연산자 (Operator)
1. 산술 연산자
산술 연산자란 사칙연산에 사용되는 연산자(+, -, *, /)와 나머지 연산자(%)를 뜻한다. 산술 연산자의 동작은 우리가 알고 있는 일반적인 수학 연산과 거의 동일하다. 일반적인 사칙연산과 마찬가지로 나누는 수는 절대 0이 될 수 없으며, 만약 나눗셈 연산자의 피연산자 두 개가 모두 정수형이라면 결과값 또한 정수형이 반환된다.
| 연산자 | 기호 | 예시 | 결과 | |
| 덧셈 연산자 | + | 두 항의 값을 더한 값을 반환 | 7 + 3 | 10 |
| 뺄셈 연산자 | - | 좌항의 값에서 우항의 값을 뺀 값을 반환 | 7 - 3 | 4 |
| 곱셈 연산자 | * | 두 항의 값을 곱한 값을 반환 | 7 * 3 | 21 |
| 나눗셈 연산자 | / | 좌항을 우항으로 나눈 값을 반환 | 7 / 3 | 2 |
| 나머지 연산자 또는 모듈로 연산자 | % | 좌항의 값을 우항의 값으로 나눈 나머지를 반환 | 7 % 3 | 1 |
| 나눗셈 연산 결과값 | 좌항 | 우항 |
| 정수 | 정수 | 정수 |
| 실수 | 정수 | 실수 |
| 실수 | 실수 | 정수 |
| 실수 | 실수 | 실수 |
int num1 = 9 / 2; // 4
double num2 = 9.0 / 2; // 4.5
2. 증감 연산자
증감 연산자란 변수의 값을 1씩 증가시키거나 감소시키는 연산자를 뜻한다. 증감 연산의 위치에 따라 증감 연산자의 연산 순위가 결정된다.
| 증감 연산자 종류 | 표현 | |
| 전위형 증감 연산자 | 증감 연산을 먼저 수행한 후, 결과값 적용 | ++n / --n |
| 후위형 증감 연산자 | 기존 값 먼저 적용한 후, 증감 연산 수행 | n++ / n-- |
int num1 = 1;
int prefix = ++num1; // prefix = 2
int num2 = 1;
int postfix = num2++; // postfix = 1
3. 복합 대입 연산자
복합 대입 연산자란 대입 연산자와 사칙 연산자를 함께 조합하여 사용하는 연산자로, 사칙연산을 적용한 결과를 좌측의 변수에 대입한다.
// num1~5 = 10
num1 += 3;
num2 -= 3;
num3 *= 3;
num4 /= 3;
num5 %= 3;
4. 비교 연산자
비교 연산자는 boolean 타입으로 평가될 수 있는 조건식에 사용되며, 크게 대소 비교 연산자(>, < , <=, >=)와 등가 비교(==. !=)로 분류된다.
| 비교 연산자 종류 | 결과값 | |
| 대소 비교 연산자 | 5 > 3 | true |
| 3 <= 3 | true | |
| 3 > 2 | true | |
| 2 >= 3 | false | |
| 등가 비교 연산자 | 5 == 3 | false |
| 5 == 5 | true | |
| 3 != 2 | true | |
| 3 != 3 | false |
5. 논리 연산자
논리 연산자란 공통적으로 boolean 값을 반환하는 연산자로, AND 연산자(&&), OR 연산자(||), NOT 연산자(!)를 포함한다.
| 논리 연산자 종류 | 기호 | |
| AND 연산자 | && | 피연산자가 모두 true인지 확인 |
| OR 연산자 | || | 피연산자 중 true가 포함되어있는지 확인 |
| NOT 연산자 | ! | true와 false를 반대로 바꿈 |
| X | Y | X && Y | X || Y | !X | !Y |
| false(0) | false | false | false | true | true |
| false | true | false | true | ||
| true(1) | false | fasle | true | false | false |
| true | true | true | true |
4. 연산자 우선순위
| 우선 순위 | 연산자 | |
| 1 | (), [] | 괄호 / 대괄호 |
| 2 | !, ~, ++, -- | 부정 / 증감 연산자 |
| 3 | *, /, % | 곱셈 / 나눗셈 연산자 |
| 4 | <, <=, >, >= | 대소 비교 연산자 |
| 5 | && | AND 연산자 |
| 6 | ||
| 7 | ? : | 조건 연산자 |
| 8 | =, +=, -=, /=, %= | 대입 / 할당 연산자 |
03. 제어문 (Control Flow Statement) - 조건문
1. if 문
if 문은 소괄호 안에 boolean 값으로 평가될 수 있는 조건식을 넣고, 중괄호 안에 조건식이 참일 때 실행할 코드를 넣어 표현한다. 이렇게 중괄호({})를 이용하여 여러 문장을 하나의 단위로 묶는 것을 블록(block)이라고 한다.
if (조건식) {
//조건식이 참이라면 실행되는 블록입니다.
}
2. if - else 문
if - else문은 조건식의 결과에 따라 실행할 블록을 선택한다. if 문의 조건식이 true면 해당 블록을 실행하지만, 조건식이 false면 다음 else - if 문의 조건식을 검사한다. 또한 만약 모든 조건식의 값이 false라면 else의 블록을 실행한다.

if(조건식 1) {
// 조건식 1이 참일 떄만 실행
}
else if (조건식 2) {
//조건식 1이 참이 아니면서 조건식 2가 참일 때만 실행
}
else {
// 조건식 1과 조건식 2가 모두 참이 아닐 때만 실행
// else문은 생략 가능
}
import java.util.Scanner;
public class Main {
static Scanner myInput = new Scanner(System.in);
public static void main(String[] args) {
String dice = myInput.nextLine();
if (dice.equals("1")) {
System.out.println("1번");
}
else if (dice.equals("2")) {
System.out.println("2번");
}
else if (dice.equals("3")) {
System.out.println("3번");
}
else if (dice.equals("4")) {
System.out.println("4번");
}
else if (dice.equals("5")) {
System.out.println("5번");
}
else if (dice.equals("6")) {
System.out.println("6번");
}
else {
System.out.println("없는 숫자! " + dice);
}
}
}
3. Switch문
swtich 문도 if 문과 마찬가지로 프로그램의 실행 흐름을 제어하는 조건문이지만, if 문과 다르게 변수가 어떤 값을 갖느냐에 따라 실행할 블록이 달라진다. 특히 if 문은 코드가 복잡해질 경우 조건식의 결과가 true / false 밖에 없어서 if - else 문을 통해 조건을 반복적으로 추가해야 하지만, switch 문은 변수의 값에 따라서 실행할 블록이 결정되기 때문에 같은 코드를 if 문보다 간결하게 작성할 수 있다.
이러한 switch 문은 괄호 안에 값과 동일한 값을 갖는 case의 실행 블록을 실행한다. 하지만 만약 동일한 값을 갖는 case가 없다면, default의 실행 블록을 실행한다. 괄호 안의 변수는 정수형(int) / 문자형(char) / 문자열(String) 변수 등이 올 수 있다. 또한 모든 코드가 실행되는 걸 방지하기 위해 case 실행 블록 하단에 switch 문을 빠져나가는데 필요한 break 문을 필수로 덧붙여야 한다.
import java.util.Scanner;
public class Main {
static Scanner myInput = new Scanner(System.in);
public static void main(String[] args) {
String dice = myInput.nextLine();
switch (dice) {
case "1":
System.out.println("1번");
break;
case "2":
System.out.println("2번");
break;
case "3":
System.out.println("3번");
break;
case "4":
System.out.println("4번");
break;
case "5":
System.out.println("5번");
break;
case "6":
System.out.println("6번");
break;
default: // 생략 가능
System.out.println("없는 숫자! " + dice);
break;
}
}
}
public class Main {
static Scanner userInput = new Scanner(System.in);
public static void main(String[] args) {
String yourPosition = userInput.nextLine();
switch(yourPosition){
case "Senior" : // Senior일 경우
System.out.println("700만원");
break;
case "Junior" : //Junior 또는 Manager일 경우
case "Manager" :
System.out.println("500만원");
break;
default:
System.out.println("300만원");
break;
}
}
}
// 직급별 월급 출력 예제
public class Main {
static Scanner userInput = new Scanner(System.in);
public static void main(String[] args) {
String[] positionList = {"Manager", "Senior", "Junior"};
String yourPosition = userInput.nextLine();
// 향상된 swtich 문
switch (yourPosition) {
case "Senior" -> System.out.println("700만원");
case "Junior", "Manager" -> System.out.println("500만원");
}
}
}
4. 조건문 비교표
| if 문 / if- else 문 | switch 문 | |
| 핵심 개념 | 조건식의 결과(true / false)에 따라 분기 | 변수의 값이 무엇이냐에 따라 분기 |
| 비교 방식 | 크다 / 작다(범위), 같다 / 다르다 등 자유로운 비교 | 특정 값과 일치하는지(동등 비교)만 가능 |
| 결과 타입 | 무조건 boolean (true 또는 false) | 정수(byte, short, int), char, String, enum |
| 가독성 | 경우의 수가 너무 많아지면 코드가 복잡해짐 | 여러 선택지가 있을 때 if보다 간결하고 직관적임 |
| 특이사항 | else 블록은 생략 가능함 | break 누락 시 아래 case까지 실행됨(fall-through) |
03. 제어문 (Control Flow Statement) - 반복문
1. for 문
for 문은 조건식이 참인 동안 주어진 횟수만큼 실행문을 반복한다. 즉, for 문은 조건식을 충족하는 동안 초기화 식부터 시작해서 증감식의 규칙을 따라서 실행하는 반복문이다.
| for 문 구성 요소 | 수행 횟수 | |
| 초기화 | 반복문에서 사용할 변수의 초기값 설정 | 1 번 |
| 조건식 | 반복 여부를 결정 | 반복문 수행 횟수 - 1 |
| 증감식 | 반복 횟수를 결정하는 규칙 | 반복문 수행 횟수 |
public class Main {
public static void main(String[] args) {
int sum = 0;
// for (초기화; 조건식; 증감식)
for(int num = 0; num < 10; num++) {
sum += num;
}
System.out.println(sum);
}
}
2. 향상된 for 문
향상된 for 문은 배열이나 컬렉션 객체에서 연속된 요소에 참조하는 연산을 지원하기 위해 자바에서 제공하는 문법이다. 기존의 for 문과 다르게 카우터 변수와 증감식을 사용하지 않으며, 배열이나 컬렉션 항목의 개수만큼 연산을 반복하고 자동으로 for 문을 빠져나간다.
public class EnhancedForLoop {
public static void main(String[] args) throws Exception {
String[] names = {"kimcoding", "javalee", "choihojea"};
for(String name : names) {
System.out.println(name + "님은 자바를 공부중 입니다.");
}
}
}
3. while 문
while 문은 조건식이 참일 경우 계속해서 실행문을 반복한다. for 문과 while 문은 상호 대체 가능하며, 반복 횟수가 정해져있을 때는 for 문을 조건에 따라 반복할 때는 while 문을 사용하는 것이 일반적이다.
int num = 0, sum = 0;
while(num <= 10) {
sum += num;
num++;
}
System.out.println(sum);
4. do - while 문
do - while은 while 문과 대부분 동일하지만 조건 판단 시작 시점의 차이점을 보이는 반복문이다. while 문은 시작과 동시에 조건식의 참과 거짓을 판별하지만, do - while 문은 실행 블록을 우선 한 번 수행한 이후에 조건식의 참과 거짓을 판별한다.
do {
(1)실행문 // 처음 한 번은 무조건 실행
} while((2)조건식);
import java.util.Scanner;
public class Main {
public static void main(String args[]){
int input = 0, randomNum = 0;
randomNum = (int)(Math.random() * 10) + 1; // 1 ~ 10 범위의 난수 생성
Scanner scanner = new Scanner(System.in);
do{
System.out.println("1과 10 사이의 정수를 입력하세요");
input = scanner.nextInt();
if(input > randomNum) {
System.out.println("더 작은 정수를 입력하세요");
} else if (input < randomNum) {
System.out.println("더 큰 정수를 입력하세요");
}
} while(input != randomNum);
System.out.println(randomNum +" 정답입니다!");
}
}
5. 반복문 제어
| 반복문 제어 종류 | break() | continue() |
| 개념 | 가장 가까운 반복문 실행을 중지할 때 사용 >> 대개 if 문과 같이 사용 |
반복문의 조건식으로 이동할 때 사용 |
| 반복문 종료 여부 | 종료됨 | 종료되지 않음 |
// 1. break 예제
public class Main {
public static void main(String[] args) {
Outer : for (int i = 3; i < 10; i++) {
for (int j = 5; j > 0; j--) {
System.out.println("i " + i + " j "+ j);
if (i == 5) {
break Outer;
}
}
}
}
}
// 2. continue 예제
public class Main {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; //다음 반복으로 넘어간다.
}
System.out.println(i);
}
}
}
6. 반복문 비교표
| 핵심 특징 | 주요 사용 상황 | 구조 (문법) | |
| for문 | 반복 횟수가 명확할 때 유리함 | 리스트 크기만큼 돌릴 때, 1~100까지 더할 때 | for(초기화; 조건식; 증감식) |
| 향상된 for문 | 배열 / 컬렉션을 순회할 때 가장 간결 | 배열의 모든 요소를 하나씩 꺼내서 출력할 때 | for(타입 변수 : 배열 / 컬렉션) |
| while문 | 조건이 맞을 때까지 계속 반복 | 무한 루프, 특정 신호가 올 때까지 대기할 때 | while(조건식) |
| do-while문 | 최소 1번은 무조건 실행한 뒤 조건 검사 | 사용자 입력을 먼저 받고 검사할 때 | do { ... } while(조건식); |
'[Codeit Review] > 자바 (JAVA)' 카테고리의 다른 글
| [03] 배열 (0) | 2026.01.16 |
|---|---|
| [01] Java와 변수 (0) | 2026.01.15 |