✏️ 클래스 멤버: 필드, 메소드
인스턴스 멤버 : 객체마다 가지고 있는 멤버
정적 멤버 : 클래스에 위치시키고 객체들이 공유하는 멤버
✓ 인스턴스 멤버
객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드. 인스턴스 필드, 인스턴스 메소드라고 부른다.
인스턴스 필드는 객체마다 따로 존재하고 인스턴스 메소드는 메소드 영역에 저장되고 공유된다.
사용할 때는, 우선 객체(인스턴스)를 생성한 후 참조 변수로 접근한다.
public class Car {
// 필드
String model = "현대";
int speed = 40;
// 생성자
Car(String model){
this.model = model;
}
// 메소드
void setSpeed(int speed) {
this.speed = speed;
}
void run() {
for(int i=10; i <= 50; i+= 10) {
this.setSpeed(i);
System.out.println(this.model + "가 달립니다.(시속:" + this.speed + "km/h)");
}
}
}
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car("포르쉐");
Car yourCar = new Car("벤츠");
myCar.run();
yourCar.run();
}
}
✓ 정적 멤버와 static
클래스에 고정된 멤버. 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.
필드와 메소드 선언 시 static 키워드를 붙인다.
❗️ 필드 구분
객체마다 가지고 있어야 할 데이터 = 인스턴스 필드
객체마다 가지고 있는 필요가 없는 공용 데이터 = 정적 필드
❗️메소드 구분
인스턴스 필드를 포함하고 있다면 = 인스턴스 메소드
인스턴스 필드를 포함하지 않는다면 = 정적 메소드
클래스 이름과 함께 도트 연산자로 접근하여 사용할 수 있다.
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(10, 5);
System.out.println("result1 : " + result1);
System.out.println("result2 : " + result2);
System.out.println("result3 : " + result3);
}
}
❗️ 주의사항
- this 키워드 사용 불가
- 정적 메소드 내부에서는 인스턴스 필드, 인스턴스 메소드를 사용할 수 없다.
- 정적 메소드에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근해야 한다.
stati void method3() {
ClassName obj = new ClassName();
obj.field1 = 10;
obj.method1();
}
✓ 싱글톤
단 하나의 객체만 만들도록 보장해야하는 경우.
싱글톤을 만들려면 private을 붙여주어 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다.
그리고 자신의 타입인 정적 필드(private)를 하나 선언하고 자신의 객체를 생성해 초기화한다.
public class 클래스 {
private static 클래스 singleton = new 클래스();
private 클래스() {}
static 클래스 getInstance() {
return singleton;
}
}
✓ final 필드와 상수
final 필드는 초기값이 저장되면 이것이 최종값이 되어 프로그램 실행 도중 수정할 수 없다.
final 타입 필드 [=초기값];
final 필드는 상수와 달리 객체마다 저장되고 생성자의 매개값을 통해 여러가지 값을 가질 수 있다.
상수는 객체마다 저장할 필요가 없는 공용성을 띠고 있으며 여러 가지 값으로 초기화될 수 없다 (static이면서 final)
static final 필드는 객체마다 존재하지 않고 클래스에만 존재한다.
static final 타입 상수 = 초기값;
'컴퓨터 & 코딩 > Java' 카테고리의 다른 글
[혼공학습단 10기][혼공자] 인터페이스 (0) | 2023.07.07 |
---|---|
[혼공학습단 10기][혼공자] 2주차 미션 (0) | 2023.07.06 |
[혼공학습단 10기][혼공자] 객체 지향 프로그래밍 (0) | 2023.07.05 |
[혼공학습단 10기][혼공자] 참조 타입과 참조 변수, 배열, 열거타입 (0) | 2023.06.30 |
[혼공학습단 10기][혼공자] switch 조건문과 반복문 (0) | 2023.06.29 |