클래스를 객체 즉 실제로 사용할 수 있도록 생성하는 것을 의미
클래스의 모든 인스턴스에서 공유되는 변수
Car car1 = new Car();
Car car2 = new Car();
car1.run();
car2.run();
System.out.printf("car1.speed: %d\ncar2.speed: %d\n car1.wheels: %d\ncar2.wheels: %d", car1.speed, car2.speed, car1.wheels, car2.wheels)
// 출력
// car1.speed: 101
// car2.speed: 101
// car1.wheels: 3
// car2.wheels: 3
class Car {
int speed = 100;
static int wheels = 1;
void plus_wheels() {
speed++;
wheels++;
}
}
스태틱 변수는 따로 삽입된 객체여도 항상 공유되는 변수이기 때문에, speed는 각각 1번씩만 1씩 더해졌지만 스태틱 변수인 wheels는 두 번 더해진 값이 나온다. 즉, car1에서 wheels를 변경하면 car2에서도 wheels가 변경된다는 뜻이다.
위의 이유로 스태틱 변수는 선언이 따로 된(인스턴스) 객체에서도 항상 공유되기 때문에 클래스에 직접 접근이 가능하다.
Car car1 = new Car();
car1.speed = 10; // 인스턴스 객체를 통한 접근
Car.wheels = 4; // 클래스에 직접 접근
스태틱 메소드는 스태틱 필드와 파라미터만 접근가능하다.
일반 메소드는 일반 필드와 스태틱 필드 모두 접근가능하다.
class Car {
int speed;
static String name;
void run() {
speed = 100;
name = "venz";
}
static void run() {
speed = 120; //오류
name = "venz";
}
타 클래스의 필드와 메소드 모두 상속받는다.
class 오리() {
void 날다() {
System.out.println("날 수 있어");
}
}
class 고무오리 extends 오리 {}
-------main
고무오리 오리2 = new 고무오리();
오리2.날다();
// 출력: "날 수 있어"
오버라이드: 상속자 클래스의 메소드를 피상속자 클래스가 재정의하는 것
만약 상속하는 클래스에 있는 메소드를 상속받는 클래스가 재정의를 했다면 상속받는 클래스에 있는 메소드를 사용한다.
class 오리() {
void 날다() {
System.out.println("날 수 있어");
}
}
class 고무오리 extends 오리 {
void 날다() {
System.out.println("저는 날 수 없어요..");
}
}
-------main
고무오리 오리2 = new 고무오리();
오리2.날다();
// 출력: "저는 날 수 없어요.."