Java | 객체 지향 프로그래밍(1) - 접근 제어자, 상속

설탕·2023년 9월 20일
0

Java

목록 보기
3/4
post-thumbnail

🥊 이 글은 제대로 파는 자바 - Java 끝.장.내.기 (얄팍한 코딩사전) 강의 내용을 정리한 글입니다.

접근 제어자

접근 가능publicprotecteddefaultprivate
해당 클래스 안에서
동일 패키지 안에서
동일 패키지 또는 자손 클래스 안에서
다른 패키지 포함 어느 곳에서든

상속 inheritance

🍗 부모 클래스 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으로 바꾸면?
    • 상속은 되지만 자식 클래스의 코드에서 직접 접근할 수 없음

메소드 오버라이딩 method overriding

  • 부모가 가진 이름의 메소드를 자식이 다르게 정의 저는 제 방식대로 하겠습니다.
// 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는 부모 클래스의 인스턴스를 가리킴
profile
공부 기록

0개의 댓글