Learn in 10 minutes

Learn in 10 minutes

10분 만에 Java 배우기

Java는 “한 번 작성하면 어디서든 실행"이라는 원칙으로 유명한 고수준 객체 지향 프로그래밍 언어입니다. 이 튜토리얼은 Java 21+ 기능을 다루며, Java 기초를 빠르게 학습할 수 있도록 도와줍니다.

1. 첫 번째 Java 프로그램 작성하기

Java 프로그램은 클래스로 구성됩니다. 간단한 프로그램부터 시작해보겠습니다. HelloWorld.java라는 이름의 파일을 만들어주세요:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

프로그램을 컴파일하고 실행합니다:

javac HelloWorld.java
java HelloWorld

출력은 다음과 같습니다:

Hello, World!

이 간단한 프로그램은 Java의 기본 구조를 보여줍니다. 모든 Java 프로그램은 최소한 하나의 클래스가 있어야 하며, main 메서드가 진입점입니다.

2. 기본 구문

Java 구문은 구조화되어 있으며 특정 규칙을 따릅니다:

// 이것은 단일 행 주석입니다
/* 이것은
   다중 행 주석입니다 */

public class BasicSyntax {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}

Java의 기본 구문 규칙:

  • 대소문자 구분: Java는 대소문자를 구분합니다. Variablevariable은 서로 다릅니다.
  • 클래스 이름: 대문자로 시작하고 카멜케이스 규칙을 따라야 합니다.
  • 메서드 이름: 소문자로 시작하고 카멜케이스 규칙을 따라야 합니다.
  • 세미콜론: 모든 명령문은 세미콜론 ;으로 끝나야 합니다.
  • 중괄호: 코드 블록은 중괄호 {}로 정의됩니다.
  • 주석: 단일 행 주석은 //, 다중 행 주석은 /* */를 사용합니다.

3. 변수와 데이터 타입

Java는 정적 타입 언어입니다. 즉, 변수 타입을 명시적으로 선언해야 합니다.

변수 명명 규칙:

  • 문자, 밑줄 _, 또는 달러 기호 $로 시작해야 합니다.
  • 문자, 숫자, 밑줄, 달러 기호를 포함할 수 있습니다.
  • Java 키워드가 될 수 없습니다.
  • 카멜케이스 규칙을 따라야 합니다.

Java의 기본 데이터 타입:

  • byte: 8비트 부호 있는 정수 (-128 ~ 127)
  • short: 16비트 부호 있는 정수 (-32,768 ~ 32,767)
  • int: 32비트 부호 있는 정수 (-2^31 ~ 2^31-1)
  • long: 64비트 부호 있는 정수 (-2^63 ~ 2^63-1)
  • float: 32비트 부동소수점
  • double: 64비트 부동소수점
  • boolean: true 또는 false
  • char: 16비트 유니코드 문자
public class DataTypes {
    public static void main(String[] args) {
        // 정수 타입
        byte age = 25;
        short year = 2024;
        int population = 1000000;
        long distance = 93000000L; // long은 L 접미사
        
        // 부동소수점 타입
        float temperature = 36.5f; // float은 f 접미사
        double pi = 3.14159265359;
        
        // 불린과 문자
        boolean isActive = true;
        char grade = 'A';
        
        // 문자열 (참조 타입)
        String name = "Alice";
        
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

3.1 문자열 연산

Java의 문자열은 기본 타입이 아닌 객체입니다:

public class StringExample {
    public static void main(String[] args) {
        String text = "Java Programming";
        
        System.out.println("Length: " + text.length());
        System.out.println("Uppercase: " + text.toUpperCase());
        System.out.println("Lowercase: " + text.toLowerCase());
        System.out.println("Character at index 0: " + text.charAt(0));
        System.out.println("Substring: " + text.substring(0, 4));
        System.out.println("Contains 'Java': " + text.contains("Java"));
        
        // 문자열 연결
        String greeting = "Hello, " + "World!";
        System.out.println(greeting);
        
        // 문자열 형식화
        String formatted = String.format("Pi is approximately %.2f", 3.14159);
        System.out.println(formatted);
    }
}

4. 배열과 컬렉션

4.1 배열

배열은 같은 타입의 여러 값을 저장합니다:

public class ArrayExample {
    public static void main(String[] args) {
        // 배열 선언과 초기화
        int[] numbers = {1, 2, 3, 4, 5};
        String[] fruits = new String[3];
        fruits[0] = "apple";
        fruits[1] = "banana";
        fruits[2] = "orange";
        
        // 배열 요소 접근
        System.out.println("First number: " + numbers[0]);
        System.out.println("Array length: " + numbers.length);
        
        // 배열 반복
        for (int i = 0; i < numbers.length; i++) {
            System.out.println("Number " + i + ": " + numbers[i]);
        }
        
        // 향상된 for 루프 (for-each)
        for (String fruit : fruits) {
            System.out.println("Fruit: " + fruit);
        }
        
        // 다차원 배열
        int[][] matrix = {{1, 2}, {3, 4}, {5, 6}};
        System.out.println("Matrix element [1][1]: " + matrix[1][1]);
    }
}

4.2 컬렉션

Java Collections Framework는 동적 데이터 구조를 제공합니다:

import java.util.*;

public class CollectionsExample {
    public static void main(String[] args) {
        // ArrayList (동적 배열)
        ArrayList<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");
        names.remove("Bob");
        System.out.println("Names: " + names);
        
        // HashMap (키-값 쌍)
        HashMap<String, Integer> ages = new HashMap<>();
        ages.put("Alice", 25);
        ages.put("Bob", 30);
        ages.put("Charlie", 35);
        System.out.println("Alice's age: " + ages.get("Alice"));
        
        // HashSet (고유 요소)
        HashSet<Integer> uniqueNumbers = new HashSet<>();
        uniqueNumbers.add(1);
        uniqueNumbers.add(2);
        uniqueNumbers.add(2); // 중복, 추가되지 않음
        uniqueNumbers.add(3);
        System.out.println("Unique numbers: " + uniqueNumbers);
        
        // 컬렉션 반복
        for (String name : names) {
            System.out.println("Name: " + name);
        }
        
        for (Map.Entry<String, Integer> entry : ages.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

5. 연산과 연산자

Java는 다양한 연산을 위한 여러 연산자를 제공합니다:

  • 산술 연산자: +, -, *, /, % (나머지), ++ (증가), -- (감소)
  • 비교 연산자: ==, !=, >, <, >=, <=
  • 논리 연산자: && (그리고), || (또는), ! (아니다)
  • 비트 연산자: &, |, ^, ~, <<, >>, >>>
  • 할당 연산자: =, +=, -=, *=, /=, %=
public class OperatorsExample {
    public static void main(String[] args) {
        int a = 10, b = 3;
        
        // 산술 연산
        System.out.println("Addition: " + (a + b));
        System.out.println("Subtraction: " + (a - b));
        System.out.println("Multiplication: " + (a * b));
        System.out.println("Division: " + (a / b));
        System.out.println("Modulus: " + (a % b));
        
        // 증가와 감소
        System.out.println("Pre-increment: " + (++a));
        System.out.println("Post-decrement: " + (b--));
        
        // 비교 연산
        System.out.println("Equal: " + (a == b));
        System.out.println("Not equal: " + (a != b));
        System.out.println("Greater than: " + (a > b));
        
        // 논리 연산
        boolean x = true, y = false;
        System.out.println("AND: " + (x && y));
        System.out.println("OR: " + (x || y));
        System.out.println("NOT: " + (!x));
        
        // 할당 연산
        int c = 5;
        c += 3; // c = c + 3
        System.out.println("After += 3: " + c);
    }
}

6. 제어 흐름

6.1 조건문

public class ConditionalExample {
    public static void main(String[] args) {
        int score = 85;
        
        // if-else 문
        if (score >= 90) {
            System.out.println("Grade: A");
        } else if (score >= 80) {
            System.out.println("Grade: B");
        } else if (score >= 70) {
            System.out.println("Grade: C");
        } else {
            System.out.println("Grade: F");
        }
        
        // 삼항 연산자
        String result = (score >= 60) ? "Pass" : "Fail";
        System.out.println("Result: " + result);
        
        // switch 문
        char grade = 'B';
        switch (grade) {
            case 'A':
                System.out.println("Excellent!");
                break;
            case 'B':
                System.out.println("Good!");
                break;
            case 'C':
                System.out.println("Average");
                break;
            default:
                System.out.println("Invalid grade");
        }
    }
}

6.2 반복문

public class LoopExample {
    public static void main(String[] args) {
        // for 루프
        System.out.println("For loop:");
        for (int i = 0; i < 5; i++) {
            System.out.println("Iteration: " + i);
        }
        
        // 향상된 for 루프 (for-each)
        System.out.println("\nFor-each loop:");
        int[] numbers = {1, 2, 3, 4, 5};
        for (int num : numbers) {
            System.out.println("Number: " + num);
        }
        
        // while 루프
        System.out.println("\nWhile loop:");
        int count = 0;
        while (count < 3) {
            System.out.println("Count: " + count);
            count++;
        }
        
        // do-while 루프
        System.out.println("\nDo-while loop:");
        int x = 0;
        do {
            System.out.println("X: " + x);
            x++;
        } while (x < 3);
        
        // break와 continue
        System.out.println("\nBreak and continue:");
        for (int i = 0; i < 10; i++) {
            if (i == 5) {
                break; // 루프 종료
            }
            if (i % 2 == 0) {
                continue; // 짝수 건너뛰기
            }
            System.out.println("Odd number: " + i);
        }
    }
}

7. 메서드 (함수)

Java의 메서드는 클래스에 속하는 함수입니다:

public class MethodExample {
    
    // 매개변수와 반환값이 없는 메서드
    public static void greet() {
        System.out.println("Hello, World!");
    }
    
    // 매개변수와 반환값이 있는 메서드
    public static int add(int a, int b) {
        return a + b;
    }
    
    // 여러 매개변수를 가진 메서드
    public static String formatName(String firstName, String lastName) {
        return firstName + " " + lastName;
    }
    
    // 메서드 오버로딩 (같은 이름, 다른 매개변수)
    public static int multiply(int a, int b) {
        return a * b;
    }
    
    public static double multiply(double a, double b) {
        return a * b;
    }
    
    // 가변 인수 (varargs)
    public static int sum(int... numbers) {
        int total = 0;
        for (int num : numbers) {
            total += num;
        }
        return total;
    }
    
    public static void main(String[] args) {
        greet();
        
        int result = add(5, 3);
        System.out.println("Addition result: " + result);
        
        String fullName = formatName("John", "Doe");
        System.out.println("Full name: " + fullName);
        
        System.out.println("Multiply integers: " + multiply(4, 5));
        System.out.println("Multiply doubles: " + multiply(2.5, 3.0));
        
        System.out.println("Sum of multiple numbers: " + sum(1, 2, 3, 4, 5));
    }
}

8. 객체 지향 프로그래밍

8.1 클래스와 객체

public class Person {
    // 인스턴스 변수 (필드)
    private String name;
    private int age;
    private String email;
    
    // 생성자
    public Person(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    
    // 기본 생성자
    public Person() {
        this("Unknown", 0, "");
    }
    
    // getter 메서드
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
    
    public String getEmail() {
        return email;
    }
    
    // setter 메서드
    public void setName(String name) {
        this.name = name;
    }
    
    public void setAge(int age) {
        if (age >= 0) {
            this.age = age;
        }
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
    
    // 인스턴스 메서드
    public void introduce() {
        System.out.println("Hi, I'm " + name + ", " + age + " years old.");
    }
    
    // 논리가 있는 메서드
    public boolean isAdult() {
        return age >= 18;
    }
    
    // toString 메서드 (Object의 toString 재정의)
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + ", email='" + email + "'}";
    }
    
    public static void main(String[] args) {
        // 객체 생성
        Person person1 = new Person("Alice", 25, "[email protected]");
        Person person2 = new Person();
        
        // 메서드 사용
        person1.introduce();
        System.out.println("Is adult: " + person1.isAdult());
        
        person2.setName("Bob");
        person2.setAge(17);
        person2.setEmail("[email protected]");
        
        System.out.println(person1.toString());
        System.out.println(person2.toString());
    }
}

이 포괄적인 Java 튜토리얼은 Java 프로그래밍을 시작하는 데 필요한 필수 개념들을 다룹니다. 언어의 강력한 타입 시스템, 객체 지향 기능, 그리고 광범위한 표준 라이브러리는 견고한 애플리케이션을 구축하는 데 강력한 도구가 됩니다. 이 예제들을 연습하고 코드를 실험해보며 Java 프로그래밍 개념에 대한 이해를 깊게 하세요.