1. 클래스와 객체란 무엇인가
비유로 시작해 봅시다. 자동차의 청사진을 떠올려 보세요. 청사진에는 차에 바퀴가 네 개 있고, 엔진, 색상, 좌석 등이 있다고 적혀 있습니다. 하지만 청사진 자체는 도로를 달리지도, 엔진 소리를 내지도, 연료를 요구하지도 않습니다. 그저 차가 어떻게 구성되는지에 대한 설명일 뿐입니다.
클래스는 프로그래밍에서 같은 “청사진”(또는 템플릿)과 같아서, 그 인스턴스들이 어떤 데이터(필드)와 어떤 동작(메서드)을 가질지 정의합니다.
객체는 그 청사진에 따라 조립된 “실제” 자동차, 즉 구체적인 인스턴스입니다. 각 객체는 자신만의 상태를 가지며(예: 어떤 차는 빨간색, 다른 차는 파란색), 클래스에서 정의한 동작을 수행할 수 있습니다(예: 달리기, 제동, 경적 울리기).
생활 속 예시
- 클래스: Chelovek (Person) — 사람에게는 이름, 나이, 키가 있고, 말을 하거나 달릴 수 있다는 설명.
- 객체: Vasya, Petya, Katya — 구체적인 사람들로, 각자 이름과 나이가 다릅니다.
| 클래스 | 객체 1 | 객체 2 |
|---|---|---|
|
|
|
왜 클래스가 중요한가?
- 관련된 변수와 메서드를 함께 묶을 수 있습니다.
- 같은 구조이지만 다른 데이터를 가진 객체를 원하는 만큼 만들 수 있습니다.
- 복잡한 개체를 쉽게 표현할 수 있습니다: 예를 들어, “은행 계좌”, “상품”, “책”, “사용자”.
2. 클래스 선언 문법
Java에서 클래스는 키워드 class로 선언합니다. 그 뒤에 클래스 이름(관례상 대문자로 시작)이 오고, 이어서 중괄호를 열어 그 안에 필드와 메서드를 작성합니다.
가장 간단한 예
public class Person {
// 여기에 필드와 메서드가 들어갑니다
}
설명:
- public — 접근 제어자.
- class — 컴파일러에게 “클래스를 선언한다”는 뜻.
- Person — 클래스 이름(직접 정하지만, 대문자로 시작).
클래스 이름 규칙(중요)
- 클래스 이름은 대문자로 시작해야 합니다(예: Car, Account, Book).
- 클래스 이름에는 공백과 특수문자를 사용할 수 없습니다. 예외는 밑줄(_)과 $이지만 거의 쓰지 않습니다.
- 이름이 여러 단어로 이루어지면 CamelCase 스타일을 사용하세요: BankAccount, BookStore.
클래스는 어디에 작성하나요?
클래스는 별도의 파일에 선언할 수 있습니다(보통 그렇게 합니다: 파일 하나에 클래스 하나). 또는 다른 클래스 안에 선언할 수도 있습니다(중첩 클래스는 나중에 다룹니다).
예: 파일 Person.java:
public class Person {
// 필드와 메서드
}
3. 클래스의 필드와 메서드(간단히)
지금은 클래스를 선언만 했고 비어 있습니다 — 내용물이 없는 상자와 같습니다. 여기에 “속성”(필드)과 “동작”(메서드)을 추가해 봅시다.
필드(클래스 내부의 변수)
필드는 이 클래스의 각 객체가 어떤 데이터를 가질지 설명합니다.
public class Person {
String name; // 사람의 이름
int age; // 나이
}
메서드(클래스 내부의 함수)
메서드는 객체가 할 수 있는 일을 설명합니다.
public class Person {
String name;
int age;
void sayHello() {
System.out.println("안녕하세요, 제 이름은 " + name + "입니다!");
}
}
설명:
- void — 메서드가 아무 값도 반환하지 않습니다(반환값은 나중에 다룹니다).
- sayHello() — 메서드 이름이며, 괄호는 필수입니다.
- 메서드 내부에서는 클래스의 필드에 접근할 수 있습니다(예: name).
4. 객체 생성
이제 — 마법의 순간입니다! 청사진에서 “진짜 자동차”를 어떻게 만들까요? 이를 위해 키워드 new를 사용합니다.
객체 생성 문법
Person vasya = new Person();
- Person — 변수의 타입(우리의 클래스).
- vasya — 변수 이름(원하는 대로 지을 수 있음).
- new Person() — Person 타입의 새 객체를 생성합니다.
이제 vasya 변수는 Person 클래스의 객체를 참조합니다. 이 객체에는 고유의 필드와 메서드가 있습니다.
필드와 메서드에 접근하기
점(.) 연산자로 필드와 메서드에 접근합니다:
vasya.name = "Vasya";
vasya.age = 25;
vasya.sayHello(); // 출력: 안녕하세요, 제 이름은 Vasya입니다!
원하는 만큼 객체를 만들 수 있습니다
Person petya = new Person();
petya.name = "Petya";
petya.age = 30;
petya.sayHello(); // 안녕하세요, 제 이름은 Petya입니다!
각 객체는 자체 데이터를 가진 독립적인 “복사본”입니다.
5. 이전 주제와의 연결
지금까지는 모든 변수와 메서드를 main 메서드가 있는 클래스 안에 직접 선언했고, 자체 타입을 만드는 것에 대해 깊이 생각하지 않았습니다. 이제는 자신만의 데이터와 함수 “컨테이너”를 만들 수 있습니다.
이는 엄청난 가능성을 열어 줍니다! 이제 여러분은 문제에서 등장하는 어떤 개체든 표현할 수 있습니다: 고객, 상품, 계좌, 주문, 동물, 자동차 — 무엇이든 가능합니다. 프로그램은 더 구조화되고, 읽기 쉬우며, 확장 가능해집니다.
예시: 첫 번째 사용자 정의 클래스
간단한 클래스를 작성해 봅시다 — 예를 들어, “BankovskiySchet”(BankAccount). 이 예시는 과정을 진행하면서 점차 발전시킬 것입니다.
public class BankAccount {
String owner; // 계좌 소유자
int balance; // 계좌 잔액
void printInfo() {
System.out.println("소유자: " + owner + ", 잔액: " + balance + " 유로.");
}
}
이제 여전히 프로그램 실행에 필요한 main 메서드에서 이 클래스의 객체를 만들 수 있습니다:
public class Main {
public static void main(String[] args) {
BankAccount account1 = new BankAccount();
account1.owner = "Ivan";
account1.balance = 1000;
account1.printInfo(); // 소유자: Ivan, 잔액: 1000 유로.
BankAccount account2 = new BankAccount();
account2.owner = "Mariya";
account2.balance = 2000;
account2.printInfo(); // 소유자: Mariya, 잔액: 2000 유로.
}
}
유의하세요: 각 객체에는 자기만의 필드 값이 있습니다. account1의 잔액을 변경해도 account2에는 아무 영향이 없습니다.
시각적 도식: 클래스와 객체
graph TD
subgraph Class
Person["Class Person | name:String | age:int | sayHello()"]
end
subgraph Objects
vasya["vasya : Person | name = 'Vasya' | age = 20"]
petya["petya : Person | name = 'Petya' | age = 25"]
end
vasya --> Person
petya --> Person
설명:
- Person — 클래스(템플릿)입니다.
- vasya와 petya — 이 템플릿으로 생성된 객체(인스턴스)입니다.
6. 클래스 선언과 객체 생성에서 흔한 실수
오류 № 1: 클래스 이름을 소문자로 시작함.
Java에서는 클래스 이름을 대문자로 시작하는 것이 관례입니다(컴파일러는 오류를 내지 않지만, 숙련된 프로그래머들은 — 모두 지적합니다!). class person이 아니라 class Person으로 작성하세요.
오류 № 2: 중괄호가 없음.
클래스의 본문은 항상 중괄호로 감싸야 합니다.
public class Person // 오류!
String name;
올바른 예:
public class Person {
String name;
}
오류 № 3: 객체를 생성하지 않고 클래스의 필드와 메서드에 접근하려 함.
메서드나 필드가 static으로 선언되지 않았다면, 객체를 통해서만 접근할 수 있습니다:
Person.sayHello(); // 오류!
올바른 예:
Person vasya = new Person();
vasya.sayHello();
오류 № 4: public 클래스의 경우 파일 이름과 클래스 이름이 일치하지 않음.
클래스가 public으로 선언되었다면, 파일 이름은 클래스 이름과 같아야 합니다:
// 파일 Person.java
public class Person { ... }
파일 이름이 다르면 컴파일러가 오류를 보고합니다.
오류 № 5: 객체를 초기화하지 않고 클래스의 필드를 사용함.
클래스의 필드(비 static)는 클래스 자체가 아니라 객체에 속합니다.
GO TO FULL VERSION