1. 클래스의 구성 요소
1.1 멤버변수 (Fields)
- 인스턴스 변수 (Non-static): 각 객체마다 독립적으로 존재하는 변수. 객체가 생성될 때마다 메모리에 할당.
- 클래스 변수 (Static): 클래스가 메모리에 로드될 때 한 번만 생성되고 모든 객체가 이를 공유하는 변수. static 키워드를 사용하여 선언.
1.2 생성자 (Constructor)
- 생성자는 객체가 생성될 때 호출되는 특수한 메서드로, 객체의 초기화를 담당.
- 기본 생성자: 매개변수가 없는 생성자.
- 매개변수가 있는 생성자: 객체 생성 시 초기화할 값을 전달받아 설정.
- 생성자는 객체 생성 시 자동 호출되며, 리턴값이 없다.
- 자바는 소멸자가 없고, 메모리 관리는 JVM에서 자동으로 한다.
생성자 예시:
class Person {
String name;
int age;
// 기본 생성자
Person() {
this.name = "Unknown";
this.age = 0;
}
// 매개변수 있는 생성자
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
1.3 메서드 (Methods)
- 메서드는 객체의 행동을 정의하는 함수로, 객체 사이에서 데이터를 주고받기 위해 사용된다.
- 메서드 오버로딩: 동일한 이름의 메서드를 매개변수의 개수나 타입으로 구분하여 여러 번 정의할 수 있다.
메서드 예시:
class Calculator {
// 덧셈
int add(int a, int b) {
return a + b;
}
// 메서드 오버로딩: 다른 매개변수 타입
double add(double a, double b) {
return a + b;
}
}
1.4 this 키워드
- this는 현재 객체를 참조하는 예약어로, 동일한 이름의 인스턴스 변수와 메서드 매개변수를 구분할 때 사용된다.
- this()는 다른 생성자를 호출할 때 사용된다.
예시:
class A {
int x;
A() {
this(10); // 다른 생성자 호출
}
A(int x) {
this.x = x;
}
}
2. 객체와 클래스
2.1 클래스와 객체의 차이
- 클래스: 객체를 생성하기 위한 틀(청사진)
- 객체: 클래스로부터 생성된 실체로, 메모리에 저장된다.
객체 생성 예시:
// 클래스 선언
class Car {
String model;
int year;
Car(String model, int year) {
this.model = model;
this.year = year;
}
}
// 객체 생성
Car myCar = new Car("Tesla", 2023);
3. JVM 메모리 구조
| |
|
|
| |
탑재시점 |
소멸시점 |
| static 변수 |
클래스 로드 시 자동 초기화 |
클래스 언로드 시 |
| 지역 변수 |
메서드 호출 시 |
메서드 종료 시 |
| 객체 |
객체 생성 시 |
GC(가비지 컬렉션)에 의해 소멸 |
| 인스턴스 변수 |
객체 생성 시 자동 초기화 |
객체 소멸 시 |
- static 변수는 클래스 로드 시 메모리에 할당되어 모든 객체가 공유한다.
- 인스턴스 변수는 객체가 생성될 때마다 고유한 값으로 초기화된다.
- 기본자료형은 0, 0.0, false, '\u0000' 참조형은 null값으로 자동초기화됨
4. static 키워드
- static은 객체와 관계없이 클래스 단위로 동작하는 변수와 메서드를 정의한다.
- static 변수는 클래스가 메모리에 로드될 때 한 번만 생성되고 모든 객체가 이를 공유한다.
- static 메서드는 객체를 생성하지 않고도 호출할 수 있으며, this를 사용할 수 없다.
static 예시:
class Counter {
static int count = 0; // static 변수
Counter() {
count++;
}
static void displayCount() {
System.out.println("Count: " + count); // static 메서드
}
}
5. final 키워드
- final은 값을 변경할 수 없다는 의미를 갖는다.
- final class: 상속 불가
- final method: 오버라이드 불가
- final variable: 값 변경 불가
예시:
final class FinalClass {
// 상속 불가
}
class Example {
final int MAX_VALUE = 100; // 값 변경 불가
}
6. 패키지 (Package)
- 패키지는 클래스의 이름 충돌을 피하기 위해 사용된다.
- 패키지 선언을 통해 클래스가 속한 그룹을 정의하고, import를 통해 외부 패키지 클래스를 사용할 수 있다.
패키지 사용 예시:
package com.example.utility;
public class MathUtil {
public static int add(int a, int b) {
return a + b;
}
}
7. 접근 제어자 (Access Modifiers)
- 접근 제어자는 클래스, 멤버 변수, 메서드, 생성자의 접근 범위를 제어한다.
- public: 어디서나 접근 가능
- private: 클래스 내부에서만 접근 가능
- protected: 동일 패키지 및 상속받은 클래스에서 접근 가능
- default (지정하지 않으면): 동일 패키지 내에서만 접근 가능
예시:
class Person {
public String name; // 누구나 접근 가능
private int age; // 클래스 내부에서만 접근 가능
}