🥊 이 글은 제대로 파는 자바 - Java 끝.장.내.기 (얄팍한 코딩사전) 강의 내용을 정리한 글입니다.
접근 가능 | public | protected | default | private |
---|---|---|---|---|
해당 클래스 안에서 | ✅ | ✅ | ✅ | ✅ |
동일 패키지 안에서 | ✅ | ✅ | ✅ | |
동일 패키지 또는 자손 클래스 안에서 | ✅ | ✅ | ||
다른 패키지 포함 어느 곳에서든 | ✅ |
YalcoChicken
// YalcoChicken.java
public class YalcoChicken {
protected int no;
protected String name;
public YalcoChicken(int no, String name) {
this.no = no;
this.name = name;
}
public void takeHallOrder() {
System.out.printf("%d호 %s점 홀 주문 받음%n", no, name);
}
}
YalcoChicken
의 자식 클래스 YalcoChickenDT
YalcoChicken
클래스의 모든 필드와 메소드 포함 (extends
연산자 사용)// YalcoChickenDT.java
public class YalcoChickenDT extends YalcoChicken {
private boolean driveThruOpen = true;
public YalcoChickenDT(int no, String name) {
super(no, name); // 부모의 생성자 호출
}
public void setDriveThruOpen(boolean driveThruOpen) {
this.driveThruOpen = driveThruOpen;
}
public void takeDTOrder() {
System.out.printf(
"%d호 %s점 드라이브스루 주문 %s%n",
no, name,
(driveThruOpen ? "받음" : "불가")
);
}
}
// Main.java
public class Main {
public static void main(String[] args) {
YalcoChickenDT dtStore = new YalcoChickenDT(108, "철원");
dtStore.takeHallOrder(); // 108호 철원점 홀 주문 받음
dtStore.takeDTOrder(); // 108호 철원점 드라이브스루 주문 받음
dtStore.setDriveThruOpen(fase);
dtStore.takeDTOrder(); // 108호 철원점 드라이브스루 주문 불가
}
}
dtStore
인스턴스는 driveThruOpen
, no
, name
필드를 갖고 있음 - 부모 클래스 상속protected
필드들을 private
으로 바꾸면?저는 제 방식대로 하겠습니다.
// Button.java
public class Button {
private String label;
public Button(String label) {
this.label = label;
}
public void onClick() {
System.out.println(label + " 입력 적용");
}
}
// ShutDownButton.java
public class ShutDownButton extends Button {
public ShutDownButton() {
super("ShutDown"); // 부모의 생성자 호출
}
// 부모의 메소드를 override
@Override
public void onClick() {
Sytstem.out.println("프로그램 종료");
}
}
// ToggleButton.java
public class ToggleButton extends Button {
private boolean on;
public ToggleButton(String label, boolean on) {
super(label);
this.on = on;
}
@Override
public void onClick() {
super.onClick(); // 부모에서 정의한 메소드 호출
this.on = !this.on;
System.out.println(
"대문자입력: " + (this.on ? "ON" : "OFF")
);
}
}
// Main.java
public class Main {
public static void main(String[] args) {
Button enterButton = new Button("Enter");
ShutDownButton shutdownButton = new ShutDownButton();
ToggleButton toggleButton = new ToggleButton("CapsLock", false);
enterButton.onClick(); // Enter 입력 적용
shutdownButton.onClick(); // 프로그램 종료
toggleButton.onClick(); // CapsLock 입력 적용 대문자입력: ON
toggleButton.onClick(); // CapsLock 입력 적용 대문자입력: OFF
toggleButton.onClick(); // CapsLock 입력 적용 대문자입력: ON
}
}
super
: 부모의 생성자/메소드 호출super
를 사용해서 부모의 생성자를 먼저 호출한 후 자식에서 추가로 필요한 내용 작성super.메소드
this
가 해당 클래스의 인스턴스를 가리키듯 super
는 부모 클래스의 인스턴스를 가리킴