출시·고도화 중
Java 안내서 · 2/6
Java는 정적 타입 언어이며 모든 코드가 클래스 안에 들어갑니다. 문장은 세미콜론으로 끝나고, 블록은 중괄호로 묶습니다. 이 장에서는 클래스와 main 메서드, 변수와 var, 메서드, 조건문과 반복문, switch 식, 그리고 문자열 다루기를 차례로 살펴봅니다.
클래스는 데이터(필드)와 동작(메서드)을 묶는 단위입니다. 실행할 프로그램에는 main 메서드를 가진 클래스가 하나 있어야 합니다. static 은 객체를 만들지 않고 클래스 이름으로 호출할 수 있다는 뜻입니다.
package com.example.basics;
public class Greeter {
private final String greeting; // 필드
public Greeter(String greeting) { // 생성자
this.greeting = greeting;
}
public String greet(String name) { // 인스턴스 메서드
return greeting + ", " + name;
}
public static void main(String[] args) {
Greeter greeter = new Greeter("안녕하세요");
System.out.println(greeter.greet("자바"));
}
}접근 제어자는 public(어디서나), protected(같은 패키지와 하위 클래스), 아무것도 적지 않은 패키지 전용, private(같은 클래스 안)의 네 가지가 있습니다. 필드는 보통 private 으로 감추고 필요한 메서드만 공개합니다.
변수는 타입과 이름으로 선언합니다. 지역 변수는 var 를 쓰면 컴파일러가 오른쪽 값에서 타입을 추론합니다. var 는 동적 타입이 아니며, 한 번 정해진 타입은 바뀌지 않습니다. final 을 붙이면 다시 대입할 수 없습니다.
int count = 10;
double ratio = 0.75;
boolean done = false;
String title = "Java";
var names = new java.util.ArrayList<String>(); // ArrayList<String> 으로 추론
names.add("Duke");
final int max = 100;
// max = 200; // 컴파일 오류: final 변수에 다시 대입할 수 없음var 는 지역 변수에만 쓸 수 있고 필드나 메서드 매개변수에는 쓸 수 없습니다. 타입이 길고 오른쪽에서 분명히 드러날 때 쓰면 코드가 읽기 쉬워집니다.
메서드는 반환 타입, 이름, 매개변수 목록으로 선언합니다. 반환값이 없으면 void 를 씁니다. 이름이 같고 매개변수가 다른 메서드를 여러 개 두는 오버로딩도 가능합니다. Java는 항상 값으로 인자를 전달하며, 객체의 경우에는 참조값이 복사됩니다.
public class MathUtil {
static int add(int a, int b) {
return a + b;
}
static double add(double a, double b) { // 오버로딩
return a + b;
}
static int sum(int... values) { // 가변 인자
int total = 0;
for (int v : values) total += v;
return total;
}
}if/else, for, 향상된 for(for-each), while, do-while 을 씁니다. break 는 반복을 끝내고 continue 는 다음 반복으로 넘어갑니다.
int score = 82;
if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else {
System.out.println("C");
}
for (int i = 0; i < 3; i++) {
System.out.println("i = " + i);
}
for (String lang : java.util.List.of("Java", "Kotlin", "Scala")) {
if (lang.equals("Kotlin")) continue;
System.out.println(lang);
}
int n = 3;
while (n > 0) {
n--;
}전통적인 switch 문은 break 를 빠뜨리면 다음 case로 넘어가는 문제가 있었습니다. 화살표(->)를 쓰는 switch 식은 넘어감이 없고, 값을 돌려주므로 변수에 바로 대입할 수 있습니다. 여러 줄이 필요하면 블록 안에서 yield 로 값을 돌려줍니다.
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
static String kind(Day day) {
return switch (day) {
case SAT, SUN -> "주말";
case MON, TUE, WED, THU, FRI -> "평일";
};
}
static int length(Object value) {
return switch (value) {
case String s -> s.length();
case java.util.List<?> list -> list.size();
case null -> 0;
default -> {
String text = value.toString();
yield text.length();
}
};
}열거형의 모든 값을 다루면 default 가 없어도 됩니다. 두 번째 예처럼 타입 패턴을 쓰면 값의 타입에 따라 분기하면서 동시에 변수에 꺼내 쓸 수 있습니다.
String 은 변경할 수 없는(immutable) 객체입니다. 문자열을 바꾸는 메서드는 모두 새 문자열을 돌려줍니다. 내용 비교에는 == 가 아니라 equals 를 써야 합니다. == 는 같은 객체인지를 비교하기 때문입니다.
String s = " Hello, Java ";
String trimmed = s.strip(); // "Hello, Java"
boolean same = trimmed.equals("Hello, Java"); // true
String upper = trimmed.toUpperCase();
String[] parts = trimmed.split(", "); // ["Hello", "Java"]
String message = "%s has %d chars".formatted(trimmed, trimmed.length());
String json = """
{
"name": "Duke",
"lang": "Java"
}
"""; // 텍스트 블록
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 3; i++) sb.append(i).append(',');
System.out.println(sb); // 0,1,2,반복문 안에서 문자열을 많이 이어 붙일 때는 StringBuilder 를 쓰면 불필요한 객체 생성을 줄일 수 있습니다. 여러 줄 문자열은 큰따옴표 세 개로 감싸는 텍스트 블록으로 쓰면 이스케이프 없이 읽기 쉽게 적을 수 있습니다.
main 메서드에서 시작합니다.var 로 타입 추론을 할 수 있지만 타입은 여전히 정적입니다.equals 를, 많은 연결에는 StringBuilder 를 씁니다.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.