1. 인스턴스(Instance) member
객체에 소속되어 있으며, New를 통해 객체 생성 후 사용할 수 있는 필드와 메소드이다. 객체 내부의 인스턴스 멤버에 접근하려면 this를 통해 가능하다.
public class Car {
// 인스턴스 필드 선언
int gas;
// 인스턴스 메소드 선언
void setSpeed(int speed) {...}
}
gas 필드는 객체에 소속된 멤버지만 setSpeed() 메소드는 객체에 포함되지 않는다.
메소드를 객체마다 저장 시 중복 저장으로 메모리 효율이 떨어지기에 메소드 코드는 메소드 영역에 있지만 공유하여 사용하고 객체 없이는 사용 불가하게 제한이 걸려있다.
1-1. this 키워드
객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용한다. 생성자와 메소드의 매개변수명이 인스턴스 멤버인 필드명과 동일한 경우, 인스턴스 필드임을 강조할 때 this를 주로 사용한다.
예제 코드
public class Car {
// 필드 선언
String model;
int speed;
// 생성자 선언
Car(String model) {
// 매개변수를 필드에 대입
this.model = model;
}
void setSpeed(int speed) {
this.speed = speed;
}
void run() {
System.out.println("this.model = " + this.model + ", this.speed = " + this.speed);
}
}
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car("my");
Car yourCar = new Car("your");
myCar.setSpeed(130);
yourCar.setSpeed(120);
myCar.run();
yourCar.run();
}
}
2. 정적(Static) member
클래스에 고정되어 있으며, 객체를 생성하지 않고 사용할 수 있는 필드와 메소드이다. 각각 정적 필드, 정적 메소드라 부른다.
메소드 영역의 클래스에 고정적으로 위치하였기 때문에 객체를 생성할 필요 없이 클래스를 통해 바로 사용 가능하다.
public class 클래스 {
// 정적 필드 선언
static 타입 필드 [=초기값];
// 정적 메소드
static 리턴타입 메소드(매개변수, ...) {...}
}
필드와 메소드는 모두 정적 멤버가 될 수 있다. 객체마다 가지고 있을 필요성이 없는 공용적인 필드는 정적 필드로 선언한다. 인스턴스 필드를 이용하지 않는 메소드도 정적 메소드로 선언한다.
2-1. 정적 멤버 사용
클래스가 메모리로 로딩되면 사용 가능하며, 클래스 이름과 함께 도트(.) 연산자로 접근한다.
예제 코드
public class Calculator {
static double pi = 3.14159;
static int plus(int x, int y) {
return x + y;
}
static int minus(int x, int y) {
return x - y;
}
}
public class CalculatorExample {
public static void main(String[] args) {
double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(10, 5);
int result3 = Calculator.minus(8, 2);
System.out.println("result1 = " + result1);
System.out.println("result2 = " + result2);
System.out.println("result3 = " + result3);
}
}
2-2. 정적 블록(static block)
정적 필드는 필드 선언과 동시에 초기값을 주지만 복잡한 초기화 작업이 필요할 때 정적 블록을 이용한다.
static {
...
}
클래스가 메모리로 로딩될 때 자동 실행되며, 정적 블록이 클래스 내부에 여러개가 선언되었을 경우 선언된 순서로 실행된다.
예제 코드
public class Television {
static String company = "My Company"; // 선언 시 초기값
static String model = "LCD"; // 선언 시 초기값
static String info; // 정적 블록
static {
info = company + " - " + model;
}
}
public class TelevisionExample {
public static void main(String[] args) {
System.out.println(Television.info);
}
}
2-3. 인스턴스 멤버 사용 불가
정적 메소드와 정적 블록은 객체 없이도 실행 가능하여 내부에 인스턴스 필드나 인스턴스 메소드 사용이 불가능하다. 객체 자신의 참조인 this도 사용할 수 없다. 정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근하여 사용해야 한다. main() 메소드도 정적 메소드로 객체 생성 없이 인스턴스 필드와 인스턴스 메소드를 바로 사용 불가능하여 동일한 규칙이 적용된다.
예제 코드
public class Car {
int speed; // 인스턴스 필드 선언
void run() { // 인스턴스 메소드 선언
System.out.println("현재 속도 : " + speed);
}
static void simulate() {
// 객체 생성
Car myCar = new Car();
// 인스턴스 멤버 사용
myCar.speed = 200;
myCar.run();
}
public static void main(String[] args) {
simulate(); // 정적 메소드 호출
Car myCar = new Car();
myCar.speed = 60;
myCar.run();
}
}
'IT > Java' 카테고리의 다른 글
[Java] 접근 제한자 (0) | 2024.03.05 |
---|---|
[Java] final 필드와 상수 (0) | 2024.03.05 |
[Java] 메소드 선언과 호출 (0) | 2024.03.04 |
[Java] 생성자 선언과 호출 (0) | 2024.02.29 |
[Java] 클래스 필드 선언과 사용 (0) | 2024.02.29 |