객체를 만들기 위한 설계도 (ex. 자동차 설계도)
public class Car {
private String color; // 색상
private String Model; // 모델명
private int cc; // 배기량
private int speed; // 속도
// 가속 메서드
public void accelerate() { ... }
// 감속 메서드
public void decelerate() { ... }
// 시동 메서드
public void start() { ... }
// 정지 메서드
public void stop() { ... }
...
}
변수 선언으로 표현
public class Car {
// ✅ 속성
private String color; // 색상
private String Model; // 모델명
private int cc; // 배기량
private int speed; // 속도
}
public class Car {
...
// ✅ 생성자
public Car(){
...
}
}
public class Car {
...
// 가속 메서드
public void accelerate() { ... }
// 감속 메서드
public void decelerate() { ... }
// 시동 메서드
public void start() { ... }
// 정지 메서드
public void stop() { ... }
...
}
new
라는 키워드를 사용한다.Car gv70 = new Car();
Car g80 = new Car();
gv70.start();
g80.starT();
...
JVM 메모리 구조는 3가지이다.
*.class
파일의 데이터가 저장되는 공간static
으로 선언된 변수와 메서드들의 저장공간new
키워드로 생성된 객체들의 정보가 저장되는 공간객체의 주소값
이 이 곳에 저장됨기본 자료형을 감싸고 있는 클래스
참조형 변수
라고 한다.new
키워드 없이 사용이 가능하다.Integer num = 10;
Integer num = 10;
int number = num;
MethodArea
에 저장되기 때문!class Person {
// ✅ 인스턴스 변수
String name;
// ✅ 인스턴스 메서드
void printName() {
System.out.println("나의 이름은 " + this.name + "입니다.");
}
}
static
키워드를 사용해서 생성class Person {
// ✅ 클래스 변수
static int population = 0;
}
public class Main {
public static void main(String[] args) {
// ✅ 객체 생성 전에도 클래스 레벨에서 직접 접근가능
System.out.println("현재 인구 수: " + Person.population);
Person p1 = new Person();
Person p2 = new Person();
// ✅ 모든 객체가 하나의 값을 공유
System.out.println("현재 인구 수: " + Person.population);
}
}
공유가 필요한 곳에서만 사용해야 한다
→ MethodArea
에 공유되므로 불필요한 메모리 차지하지 않게 하기 위해
static 메서드에서 인스턴스 변수 접근시 접근할 수 없음
public class Person {
String name;
public static void staticMethod() {
System.out.println(this.name); // ❌ 접근할 수 없음 !!!!
}
}
final int a = 100;
a = 200; // ❌ 오류 발생!
변하지 않고 일정한 값을 갖는 수
Java에서는 대문자로 표현
실행중 변경되면 안되므로 static final
키워드 사용
public class Circle {
final static double PI = 3.14159; // ✅ 상수 선언
}
내부 상태를 변경할 수 없는 객체
속성을 final
로 선언해야 함
setter
없이 설계
변경이 필요한 경우에는 새로운 객체를 생성해야 함
public final class Circle {
final static double PI = 3.14159;
final double radius; // ✅ final 로 선언해서 값이 변경되지 않도록 합니다.
public Circle(double radius) {
this.radius = radius;
}
// ✅ 반지름이 다른 새로운 Circle 생성 (불변 객체 유지)
public Circle changeRadius(double newRadius) {
// 생성자 호출: 기존 객체 변경 X, 새 객체 생성
return new Circle(newRadius);
}
}
public class Main {
public static void main(String[] args) {
circle c2 = new Circle(20);
circle c3 = c2.changeRadius(30); // 보기엔 불변객체가 아닌 것처럼 보임
}
}
출처
스파르타 코딩클럽 자바 문법 종합반 2주차