정적 필드와 메서드
public class YalcoChicken {
// ⭐️ 클래스/정적 필드와 메소드들 : 본사의 정보와 기능
// 인스턴스마다 따로 갖고 있을 필요가 없는 것들에 사용
static String brand = "얄코치킨";
static String contact () {
// ⚠️ 정적 메소드에서는 인스턴스 프로퍼티 사용 불가
// System.out.println(name);
return "%s입니다. 무엇을 도와드릴까요?".formatted(brand);
}
int no;
String name;
YalcoChicken(int no, String name) {
this.no = no;
this.name = name;
}
String intro () {
// 💡 인스턴스 메소드에서는 정적 프로퍼티 사용 가능
return "안녕하세요, %s %d호 %s점입니다."
.formatted(brand, no, name);
}
}
// 💡 클래스 필드와 메소드는 인스턴스를 생성하지 않고 사용
String ycBrand = YalcoChicken.brand;
String ycContact = YalcoChicken.contact();
// ⚠️ 인스턴스 메소드는 불가
// String ycName = YalcoChicken.name;
// String ycIntro = YalcoChicken.intro();
YalcoChicken store1 = new YalcoChicken(3, "판교");
String st1Intro = store1.intro();
// 인스턴스에서는 클래스의 필드와 메소드 사용 가능
// ⚠️ 편의상 기능일 뿐, 권장하지 않음 (혼란 초래. IDE에서 자동완성 안 됨 주목)
String st1Brand = store1.brand;
String st1Contact = store1.contact();
- 클래스(정적) 요소 :
- 메모리중 한곳만 차지한다. (method area)
- 본사의 정보라고 생각하면 편하다.(본사는 1곳만 있으므로)
- 인스턴스 요소 : 각각 메모리에 자리를 차지하고, 각각 자신만의 프로퍼티값이 존재.
정적필드, 메서드 생성없이 사용 가능.
정적 필드와 메서드는 인스턴스 생성없이 바로 사용이 가능하다.
인스턴스 필드, 메서드에 생성전 바로 접근은 불가
인스턴스의 메서드나 필드는 바로 접근은 불가능하다.(인스턴스가 생성되어야 값이 할당되서 접근이 되는 것이기 때문이다.
인스턴스 메서드에서는 정적필드 활용 가능
매장(인스턴스)에서 본사(정적 필드,메서드) 직접 호출
편의상 제공은 되나, static 변수에서 가져오라고 권장하고 있다.
매장 번호 자동 생성하기
chap03/ex02/ YalcoChichken.java
public class YalcoChicken {
static String brand = "얄코치킨";
static String contact () {
return "%s입니다. 무엇을 도와드릴까요?".formatted(brand);
}
static int lastNo = 0; // ⭐️
int no;
//int no = ++lastNo; // 이렇게 해도 됨
String name;
YalcoChicken(String name) {
// 클래스 변수를 활용하여 생성마다 새 번호 부여 (또는 위처럼)
no = ++lastNo;
this.name = name;
}
String intro () {
return "안녕하세요, %s %d호 %s호점입니다." // 🔴
.formatted(brand, no, name);
}
}
Main.java
YalcoChicken store1 = new YalcoChicken("판교");
YalcoChicken store2 = new YalcoChicken("강남");
YalcoChicken store3 = new YalcoChicken("제주");
정적필드로 자동증가되는 모습
인스턴스가 생성될 때마다 생성자에서 1개씩 올려주고, 정적필드는 공통으로 사용하니 가능
생성자에서 증가 OR 변수에서 초기화시 바로 증가도 가능.
본문 제목
public class Main {
public static void main(String[] args) {
Button button1 = new Button('1', 1);
Button buttonPlus = new Button('+', 3);
Button buttonClear = new Button('C', 2);
Button[] buttons = {button1, buttonPlus, buttonClear};
System.out.println(Button.mode);
for (Button button : buttons) { button.place(); }
// 연속으로 붙여넣어 실행해볼 것
Button.switchMode();
System.out.println(Button.mode);
for (Button button : buttons) { button.place(); }
}
}
public class Button {
static String mode = "LIGHT";
static void switchMode () {
mode = mode.equals("LIGHT") ? "DARK" : "LIGHT";
}
char print;
int space;
Button (char print, int space) {
this.print = print;
this.space = space;
}
void place () {
System.out.printf(
"표시: %c, 공간: %d, 모드: %s%n",
print, space, mode
);
}
}
정적 필드라서 모든 인스턴스의 해당 필드가 다같이 바뀌는 모습
출처
- 사이트, 검색명 (날짜)
'얄코의 제대로 파는 자바 > 섹션5 객체지향 프로그래밍' 카테고리의 다른 글
다형성 (0) | 2024.03.17 |
---|---|
상속 (0) | 2024.03.16 |
접근 제어자 (0) | 2024.03.14 |
기초 활용예제들 (0) | 2024.03.10 |
클래스 기초 (0) | 2024.03.06 |