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는 대소문자를 구분합니다.
Variable
과variable
은 서로 다릅니다. - 클래스 이름: 대문자로 시작하고 카멜케이스 규칙을 따라야 합니다.
- 메서드 이름: 소문자로 시작하고 카멜케이스 규칙을 따라야 합니다.
- 세미콜론: 모든 명령문은 세미콜론
;
으로 끝나야 합니다. - 중괄호: 코드 블록은 중괄호
{}
로 정의됩니다. - 주석: 단일 행 주석은
//
, 다중 행 주석은/* */
를 사용합니다.
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 프로그래밍 개념에 대한 이해를 깊게 하세요.