본문 바로가기

전체 글 보기

반응형

✅ 1. 클래스 상속 기본 (ch07.sec02)

📌 Phone → SmartPhone 클래스 상속

  • SmartPhone은 Phone의 모든 필드/메서드를 상속받음
  • this.model, this.color 직접 초기화 가능
public class SmartPhone extends Phone {
    boolean wifi;
    void setWifi(...) {...}
    void internet() {...}
}

📌 사용 예

phone.bell();  // 상속받은 메서드
phone.internet();  // SmartPhone 메서드

✅ 2. 부모 생성자 호출 (super) (ch07.sec03.exam01)

  • 부모 클래스에 매개변수 생성자만 존재할 경우, 자식 클래스에서 super(...)로 반드시 호출해야 함
public class SmartPhone extends Phone {
    public SmartPhone(String model, String color) {
        super(model, color);  // 부모 생성자 호출
    }
}
  • 출력 순서:
Phone() 생성자 실행
SmartPhone() 생성자 실행됨

✅ 3. 메서드 오버라이딩 (ch07.sec04.exam01)

📌 부모 메서드를 자식이 재정의

public class Computer extends Calculator {
    @Override
    public double areaCircle(double r) {
        return Math.PI * r * r;
    }
}
  • 부모 객체로 호출 시 → 부모 메서드 실행
  • 자식 객체로 호출 시 → 자식 메서드 실행

✅ 4. super 키워드 활용 & 비행기 예제 (ch07.sec04.exam02)

  • Airplane → SupersonicAirplane 클래스 상속
  • fly() 메서드를 오버라이딩하여 조건 분기
public void fly() {
    if (flyMode == SUPERSONIC)
        System.out.println("초음속 비행합니다.");
    else
        super.fly();  // 부모 메서드 호출
}

📌 실행 결과 예시

이륙합니다.
일반 비행합니다.
초음속 비행합니다.
일반 비행합니다.
착륙합니다.

📌 15일차 핵심 요약

개념 설명
상속 (extends) 부모 클래스의 필드와 메서드를 자식이 물려받음
super() 부모 생성자 호출 시 사용 (생성자 첫 줄 필수)
메서드 오버라이딩 부모 메서드를 자식이 재정의
super.메서드() 오버라이딩된 메서드 내부에서 부모의 원본 메서드 호출
상속 예제 스마트폰, 컴퓨터, 초음속 비행기 등 실습 포함

 

댓글
반응형

이번 글에서는 자식 클래스에서 오버라이딩한 메서드 내부에서
super 키워드를 사용해 부모 클래스의 메서드를 호출하는 방법을 학습합니다.
이 기법은 조건에 따라 부모 메서드를 그대로 유지하거나,
자식 메서드의 동작을 선택적으로 확장/대체할 때 유용합니다.


📦 부모 클래스 코드 (Airplane.java)

package ch07.sec04.exam02;

public class Airplane {
	public void land() {
		System.out.println("착륙합니다.");
	}

	public void fly() {
		System.out.println("일반 비행합니다.");
	}

	public void takeOff() {
		System.out.println("이륙합니다.");
	}
}

📦 자식 클래스 코드 (SupersonicAirplane.java)

package ch07.sec04.exam02;

public class SupersonicAirplane extends Airplane {
	public static final int NORMAL = 1;
	public static final int SUPERSONIC = 2;
	public int flyMode = NORMAL;

	public void fly() {
		if (flyMode == SUPERSONIC)
			System.out.println("초음속 비행합니다.");
		else
			super.fly(); // 부모의 fly() 호출
	}
}

📌 실행 코드 (SupersonicAirplaneExample.java)

package ch07.sec04.exam02;

public class SupersonicAirplaneExample {
	public static void main(String[] args) {
		SupersonicAirplane sa = new SupersonicAirplane();
		sa.takeOff(); // 부모 메서드
		sa.fly();     // 일반 비행
		sa.flyMode = SupersonicAirplane.SUPERSONIC;
		sa.fly();     // 초음속 비행
		sa.flyMode = SupersonicAirplane.NORMAL;
		sa.fly();     // 다시 일반 비행
		sa.land();    // 부모 메서드
	}
}

💬 코드 설명

  • fly() 메서드 오버라이딩
    → flyMode 값에 따라 다르게 동작
  • flyMode == NORMAL
    → super.fly()로 부모의 일반 비행 호출
  • flyMode == SUPERSONIC
    → 자식 클래스에서 새로운 메시지 출력 (초음속 비행)
  • 나머지 메서드(takeOff(), land())는 부모 메서드 그대로 사용

💻 실행 결과

이륙합니다.
일반 비행합니다.
초음속 비행합니다.
일반 비행합니다.
착륙합니다.

📌 간단 정리

flyMode 값 fly() 출력 결과
NORMAL 일반 비행합니다. (super.fly())
SUPERSONIC 초음속 비행합니다.

💡 포인트 정리

  • 오버라이딩한 메서드 내부에서 super.메서드()를 사용하면
    부모 클래스의 원래 메서드를 직접 호출할 수 있음
  • 조건문과 결합하면 기존 동작 유지 + 확장된 동작 구현이 가능
  • 코드 재사용성과 가독성이 향상되고, 유연한 구조 설계 가능
  • super는 부모의 필드나 메서드를 명시적으로 호출할 때 사용
댓글
반응형

이번 글에서는 자식 클래스에서 부모 클래스의 메서드를 재정의(overriding) 하여
동일한 이름의 메서드를 다른 방식으로 실행하는 구조를 학습합니다.
오버라이딩은 객체의 다형성을 지원하는 핵심 개념입니다.


📦 부모 클래스 코드 (Calculator.java)

package ch07.sec04.exam01;

public class Calculator {
	public double areaCircle(double r) {
		System.out.println("Calculator 객체의 areaCircle() 실행");
		return 3.14159 * r * r;
	}
}

📦 자식 클래스 코드 (Computer.java)

package ch07.sec04.exam01;

public class Computer extends Calculator {
	public double areaCircle(double r) {
		System.out.println("Computer 객체의 areaCircle() 실행");
		return Math.PI * r * r;
	}
}

📌 실행 코드 (ComputerExample.java)

package ch07.sec04.exam01;

public class ComputerExample {
	public static void main(String[] args) {
		int r = 10;

		Calculator cal = new Calculator();
		System.out.println("원 면적 : " + cal.areaCircle(r) + "\n");

		Computer com = new Computer();
		System.out.println("원 면적 : " + com.areaCircle(r));
	}
}

💬 코드 설명

  • Calculator.areaCircle(double r)
    → 원의 넓이를 계산하는 기본 메서드
    → π 대신 3.14159 사용
  • Computer.areaCircle(double r)
    오버라이딩된 메서드
    → Math.PI를 사용하여 더 정밀하게 계산
    → 동일한 메서드명 + 시그니처로 부모 메서드를 덮어씀
  • com.areaCircle(10) 호출 시 → 자식 클래스의 오버라이딩 메서드가 실행됨

🖥 실행 결과

Calculator 객체의 areaCircle() 실행
원 면적 : 314.159

Computer 객체의 areaCircle() 실행
원 면적 : 314.1592653589793

📌 간단 정리

클래스 실행 메서드 결과
Calculator areaCircle() 3.14159 * r²
Computer areaCircle() (오버라이딩) Math.PI * r²

💡 포인트 정리

  • 오버라이딩은 부모 메서드를 자식 클래스에서 재정의하는 것
  • 메서드 이름, 매개변수, 반환 타입이 완전히 동일해야 함
  • 자식 클래스 객체를 사용하면 오버라이딩된 메서드가 호출됨
  • 오버라이딩은 동일한 동작을 다른 방식으로 구현할 때 유용
  • 메서드 오버라이딩을 통해 다형성(polymorphism)을 실현할 수 있음
댓글
반응형

이번 글에서는 상속받은 자식 클래스의 생성자에서
부모 클래스의 생성자를 호출하는 방법
을 학습합니다.
자바에서는 부모 클래스에 매개변수가 있는 생성자가 있을 경우
자식 클래스에서 반드시 super(...)로 명시적으로 호출해야 합니다.


📦 부모 클래스 코드 (Phone.java)

package ch07.sec03.exam01;

public class Phone {
	public String model, color;

	public Phone(String model, String color) {
		this.model = model;
		this.color = color;
		System.out.println("Phone() 생성자 실행");
	}
}

📦 자식 클래스 코드 (SmartPhone.java)

package ch07.sec03.exam01;

public class SmartPhone extends Phone {
	public SmartPhone(String model, String color) {
		super(model, color);
		System.out.println("SmartPhone(String model, String color) 생성자 실행됨");
	}
}

📌 실행 코드 (SmartPhoneExample.java)

package ch07.sec03.exam01;

public class SmartPhoneExample {
	public static void main(String[] args) {
		SmartPhone phone = new SmartPhone("갤", "은");

		System.out.println("모델 : " + phone.model);
		System.out.println("색상 : " + phone.color);
	}
}

💬 코드 설명

  • Phone(String model, String color)
    → 부모 클래스의 생성자. 모델명과 색상을 초기화함.
  • SmartPhone(String model, String color)
    → 자식 클래스 생성자에서 super(...)를 호출하여
    부모 클래스 생성자가 먼저 실행됨
  • super(model, color)
    → 부모 생성자를 명시적으로 호출해야 오류 없이 정상 실행됨
  • 출력 결과 순서를 보면
    부모 생성자가 먼저 실행되고 → 자식 생성자가 실행됨

💻 실행 결과

Phone() 생성자 실행
SmartPhone(String model, String color) 생성자 실행됨
모델 : 갤
색상 : 은

📌 간단 정리

키워드 설명
super(...) 부모 클래스의 생성자를 호출
생성자 실행 순서 부모 → 자식 순으로 실행됨
생략 가능 여부 부모에 기본 생성자 없으면 생략 불가

💡 포인트 정리

  • 부모 클래스에 **기본 생성자(매개변수 없는 생성자)**가 없으면
    자식 클래스에서 super(...) 호출이 필수
  • super(...)는 자식 생성자의 첫 줄에 있어야 함
  • 부모 생성자가 먼저 실행되고, 이후 자식 생성자가 실행됨
  • 생성자 체인을 통해 필드 초기화 순서를 제어할 수 있음
  • 상속 관계에서 객체 초기화 시 필드/구조를 안전하게 세팅 가능
댓글
반응형

이번 글에서는 자바의 클래스 상속(Inheritance) 개념을 학습합니다.
상속을 통해 부모 클래스의 필드와 메서드를 자식 클래스에서 재사용하고,
필요한 기능은 추가 또는 수정(오버라이딩) 할 수 있습니다.


📦 부모 클래스 코드 (Phone.java)

package ch07.sec02;

public class Phone {
	public String model, color;

	public void bell() {
		System.out.println("벨이 울립니다.");
	}

	public void sendVoice(String message) {
		System.out.println("자신 : " + message);
	}

	public void receiveVoice(String message) {
		System.out.println("상대 : " + message);
	}

	public void hangUp() {
		System.out.println("전화를 끊습니다.");
	}
}

📦 자식 클래스 코드 (SmartPhone.java)

package ch07.sec02;

public class SmartPhone extends Phone {
	public boolean wifi;

	public SmartPhone(String model, String color) {
		this.model = model;
		this.color = color;
	}

	public void setWifi(boolean wifi) {
		this.wifi = wifi;
		System.out.println("와이파이 상태를 변경했습니다.");
	}

	public void internet() {
		System.out.println("인터넷을 연결합니다.");
	}
}

📌 실행 코드 (SmartPhoneExample.java)

package ch07.sec02;

public class SmartPhoneExample {
	public static void main(String[] args) {
		SmartPhone phone = new SmartPhone("갤럭시", "은색");

		System.out.println("모델 : " + phone.model);
		System.out.println("색상 : " + phone.color);
		System.out.println("와이파이 상태 : " + phone.wifi);

		phone.bell();
		phone.sendVoice("Hello?");
		phone.receiveVoice("Hi!");
		phone.sendVoice("Oh!");
		phone.hangUp();

		phone.setWifi(true);
		phone.internet();
	}
}

💬 코드 설명

  • Phone 클래스
    → 전화 기능을 가진 부모 클래스
  • SmartPhone extends Phone
    → Phone을 상속받은 자식 클래스
  • SmartPhone 생성자
    → 부모의 model, color 필드를 직접 초기화
  • bell(), sendVoice(), receiveVoice(), hangUp()
    부모 클래스에서 상속받은 기능
  • setWifi(), internet()
    → 자식 클래스에서 새로 정의한 추가 기능

💻 실행 결과

모델 : 갤럭시
색상 : 은색
와이파이 상태 : false
벨이 울립니다.
자신 : Hello?
상대 : Hi!
자신 : Oh!
전화를 끊습니다.
와이파이 상태를 변경했습니다.
인터넷을 연결합니다.

📌 간단 정리

클래스 역할
Phone 전화의 기본 기능 제공 (벨, 통화 등)
SmartPhone Phone을 상속받아 와이파이와 인터넷 기능 추가

💡 포인트 정리

  • class 자식 extends 부모 → 상속 선언
  • 부모 클래스의 필드와 메서드는 자식 클래스에서 그대로 사용 가능
  • 자식 클래스는 기능을 확장하거나 필요 시 오버라이딩할 수 있음
  • 상속을 통해 코드 재사용성 증가, 중복 감소
  • 생성자에서는 this.필드명으로 부모 필드를 직접 초기화 가능
댓글
반응형

13일차 - 연습 문제 풀이를 위하여 자습

14일차 - 앞에서 수업한 내용을 한번 되짚으며 복습 진행하여 새로운 정보가 없어서 패스합니다.

댓글
반응형

✅ 오전 수업 요약

1. final 필드 (Korean 클래스)

  • final은 한 번 값이 설정되면 변경 불가
  • 생성자 또는 선언 시 초기화 가능

2. static final 상수 (Earth 클래스)

  • static final로 고정값(상수) 선언
  • 관례적으로 대문자로 작성
  • 클래스명으로 접근

3. 접근 제한자 (A, B, C 클래스)

  • public : 어디서나 접근 가능
  • (default) : 같은 패키지 내에서만 접근 가능
  • private : 클래스 내부에서만 접근 가능
  • 다른 패키지에서 default, private 접근 시 컴파일 에러

✅ 오후 수업 요약

1. Getter / Setter 메서드 (Car 클래스)

  • private 필드 값을 안전하게 다루기 위해 Getter/Setter 사용
  • 유효성 검사(예: 음수 속도 입력 시 보정) 포함
  • isStop() 메서드는 boolean형 필드 getter로 활용

✅ 자습 내용 요약

1. Member 클래스 생성 및 사용 (mission14)

package ch06.sec99.mission14;

public class Member {
	String name;
	String id;
	String password;
	int age;
	
	Member(String name, String id){
		this.name = name;
		this.id = id;
	}
}
package ch06.sec99.mission14;

public class MemberExample {
	public static void main(String[] args) {
		Member m1 = new Member("홍길동", "hong");
		
		System.out.println("name : " + m1.name + " / id : " + m1.id);
	}
}
  • name, id 필드 설정
  • 생성자를 통해 필드 초기화

2. MemberService 로그인 기능 (mission15)

package ch06.sec99.mission15;

public class MemberService {
	boolean login(String id, String password) {
		if (id.equals("hong") && password.equals("12345"))
			return true;
		else
			return false;
	}

	void logout(String id) {
		System.out.println(id + "님이 로그아웃 되었습니다");
	}
}
package ch06.sec99.mission15;

public class MemberServiceExample {
	public static void main(String[] args) {
		MemberService memberService = new MemberService();
		boolean result = memberService.login("hong", "12345");
		if (result) {
			System.out.println("로그인 되었습니다.");
			memberService.logout("hong");
		} else {
			System.out.println("id 또는 password가 올바르지 않습니다.");
		}
	}
}
  • 로그인 검증 메서드 login()
  • 로그아웃 메서드 logout()

3. Printer 클래스 (mission16, mission17)

  • instance 메서드 버전 (mission16)
package ch06.sec99.mission16;

public class Printer {
	void println(String value){
		System.out.println(value);
	}
	
	void println(int value) {
		System.out.println(value);
	}
	
	void println(boolean value) {
		System.out.println(value);
	}
	
	void println(double value) {
		System.out.println(value);
	}
}
package ch06.sec99.mission16;

public class PrinterExample {
	public static void main(String[] args) {
		Printer printer = new Printer();
		printer.println(10);
		printer.println(true);
		printer.println(5.7);
		printer.println("홍길동");
	}
}
  • static 메서드 버전 (mission17)
package ch06.sec99.mission17;

public class Printer {
	static void println(String value) {
		System.out.println(value);
	}

	static void println(int value) {
		System.out.println(value);
	}

	static void println(boolean value) {
		System.out.println(value);
	}

	static void println(double value) {
		System.out.println(value);
	}
}
package ch06.sec99.mission17;

public class PrinterExample {
	public static void main(String[] args) {
		Printer.println(10);
		Printer.println(true);
		Printer.println(5.7);
		Printer.println("홍길동");
	}
}
  • 다양한 타입(String, int, boolean, double) 출력 가능

4. ShopService 싱글톤 패턴 (mission18)

package ch06.sec99.mission18;

public class ShopService {
	private static ShopService singleton = new ShopService();
	private ShopService() {
	}
	
	public static ShopService getInstance() {
		return singleton;
	}
}
package ch06.sec99.mission18;

public class ShopServiceExample {
	public static void main(String[] args) {
		ShopService obj1 = ShopService.getInstance();
		ShopService obj2 = ShopService.getInstance();
		
		if(obj1 == obj2)
			System.out.println("같은 ShopService 객체입니다.");
		else
			System.out.println("다른 ShopService 객체입니다.");
	}
}
  • 객체를 단 하나만 생성하는 패턴
private static ShopService singleton = new ShopService();
private ShopService() { }
public static ShopService getInstance() { return singleton; }
  • == 비교로 동일 객체 확인

5. Account 클래스 (mission19)

package ch06.sec99.mission19;

public class Account {
	private int balance = 0;
	final private int MIN_BALANCE = 0;
	final private int MAX_BALANCE = 1000000;

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) {
		if (MIN_BALANCE <= balance && balance <= MAX_BALANCE) {
			this.balance = balance;
		}
	}
}
package ch06.sec99.mission19;

public class AccountExample {
	public static void main(String[] args) {
		Account account = new Account();
		
		account.setBalance(10000);
		System.out.println("현재 잔고 : " + account.getBalance());
		
		account.setBalance(-100);
		System.out.println("현재 잔고 : " + account.getBalance());
		
		account.setBalance(2000000);
		System.out.println("현재 잔고 : " + account.getBalance());
		
		account.setBalance(30000);
		System.out.println("현재 잔고 : " + account.getBalance());
	}
}
  • 잔액 제한 (MIN_BALANCE, MAX_BALANCE)
  • Setter에서 유효한 범위 내일 때만 설정

6. BankApplication - 계좌 관리 프로그램 (mission20)

package ch06.sec99.mission20;

public class Account {
	private String num = null;
	private String name = null;
	private int balance = 0;
	final private int MIN_BALANCE = 0;
	final private int MAX_BALANCE = 1000000;

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) {
		if (MIN_BALANCE <= balance && balance <= MAX_BALANCE) {
			this.balance = balance;
		}
	}
	
	public void plusBalance(int balance) {
		this.balance += balance;
	}
	
	public void minusBalance(int balance) {
		this.balance -= balance;
	}

	public String getNum() {
		return num;
	}

	public void setNum(String num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public static void main(String[] args) {
		
	}
}
package ch06.sec99.mission20;

import java.util.Scanner;

public class BankApplication {
	Scanner sc = new Scanner(System.in);
	Account account[] = new Account[100];

	public static void main(String[] args) {
		BankApplication ba = new BankApplication();
		ba.start();
		System.out.println("프로그램 종료");
	}

	void start() {
		String input;

		while (true) {
			System.out.println("-".repeat(50));
			System.out.println("1.계좌생성 | 2.계좌목록 | 3.예금 | 4.출금 | 5. 종료");
			System.out.println("-".repeat(50));
			System.out.print("선택> ");

			input = sc.nextLine();
			if (input.equals("1"))
				createAccount();
			else if (input.equals("2"))
				accountList();
			else if (input.equals("3"))
				moneyPlue();
			else if (input.equals("4"))
				moneyMinus();
			else
				break;

		}
	}

	void createAccount() {
		String input;
		Account acc = new Account();

		System.out.println("-".repeat(10));
		System.out.println("계좌생성");
		System.out.println("-".repeat(10));

		System.out.print("계좌번호 : ");
		input = sc.nextLine();
		acc.setNum(input);

		System.out.print("계좌주 : ");
		input = sc.nextLine();
		acc.setName(input);

		System.out.print("초기입금액 : ");
		input = sc.nextLine();
		acc.setBalance(Integer.parseInt(input));

		for (int i = 0; i < account.length; i++)
			if (account[i] == null) {
				account[i] = acc;
				break;
			}

		System.out.println("결과: 계좌가 생성되었습니다.");
	}

	void accountList() {
		System.out.println("-".repeat(10));
		System.out.println("계좌목록");
		System.out.println("-".repeat(10));

		for (int i = 0; i < account.length; i++) {
			if (account[i] == null)
				break;
			System.out.println(account[i].getNum() + "\t" + account[i].getName() + "\t" + account[i].getBalance());
		}
	}

	void moneyPlue() {
		String input;
		int money;

		System.out.println("-".repeat(10));
		System.out.println("예금");
		System.out.println("-".repeat(10));

		System.out.print("계좌번호 : ");
		input = sc.nextLine();

		for (int i = 0; i < account.length; i++)
			if (account[i] == null)
				break;
			else if (account[i].getNum().equals(input)) {
				System.out.print("예금액 : ");
				money = Integer.parseInt(sc.nextLine());
				account[i].plusBalance(money);
			}

	}

	void moneyMinus() {
		String input;
		int money;

		System.out.println("-".repeat(10));
		System.out.println("출금");
		System.out.println("-".repeat(10));

		System.out.print("계좌번호 : ");
		input = sc.nextLine();

		for (int i = 0; i < account.length; i++)
			if (account[i] == null)
				break;
			else if (account[i].getNum().equals(input)) {
				System.out.print("출금액 : ");
				money = Integer.parseInt(sc.nextLine());
				account[i].minusBalance(money);
				System.out.println("결과: 출금이 성공되었습니다.");
			}
	}
}
  • 기능:
    • 계좌 생성
    • 계좌 목록 출력
    • 예금
    • 출금
  • 계좌는 Account 배열에 저장
  • Scanner로 사용자 입력 받아 처리
  • 배열에 null 체크하여 빈 공간에 새 계좌 저장
  • 예금/출금 시 계좌번호 일치 여부 검사

📌 12일차 핵심 요약

항목 주요 내용
final 필드 한 번 초기화 후 값 변경 불가
static final 상수 클래스 로딩 시 고정, 대문자 명명
접근 제한자 public, default, private 차이 이해
Getter/Setter 필드 보호 및 안전한 값 조작
메서드 오버로딩 이름 같고 매개변수 다르게 여러 메서드 정의
싱글톤 패턴 하나의 인스턴스만 생성 및 공유
실습 프로젝트 계좌 관리 프로그램 구축 (생성, 목록, 예금, 출금)
댓글
반응형

이번 글에서는 private 필드를 외부에서 직접 접근하지 않고,
gettersetter 메서드를 이용해
안전하게 값을 읽고 변경하는 방법을 학습합니다.
이 방식은 캡슐화(Encapsulation) 라고 하며, 객체 지향 프로그래밍의 핵심 원칙 중 하나입니다.


📦 클래스 코드 (Car.java)

package ch06.sec14;

public class Car {
	private int speed;
	private boolean stop;

	public int getSpeed() {
		return speed;
	}

	public void setSpeed(int speed) {
		if (speed < 0)
			this.speed = 0;
		else
			this.speed = speed;
	}

	public boolean isStop() {
		return stop;
	}

	public void setStop(boolean stop) {
		this.stop = stop;
		if (stop)
			this.speed = 0;
	}
}

📌 실행 코드 (CarExample.java)

package ch06.sec14;

public class CarExample {
	public static void main(String[] args) {
		Car car = new Car();
		
		car.setSpeed(-50);
		System.out.println("현재 속도 : " + car.getSpeed());
		
		car.setSpeed(60);
		System.out.println("현재 속도 : " + car.getSpeed());
		
		if (!car.isStop())
			car.setStop(true);
		System.out.println("현재 속도 : " + car.getSpeed());
	}
}

💬 코드 설명

  • private int speed;, private boolean stop;
    → 외부에서 직접 접근할 수 없는 비공개 필드
  • public int getSpeed()
    speed 값을 외부에서 읽을 수 있게 해주는 메서드
  • public void setSpeed(int speed)
    speed 값을 설정하는 메서드
    → 입력 값이 음수면 0으로 강제 조정 (유효성 검사)
  • public boolean isStop()
    stop 상태를 외부에서 읽을 수 있게 해주는 메서드
  • public void setStop(boolean stop)
    stop 상태를 설정하고, 멈추면 speed를 자동으로 0으로 만듦

💻 실행 결과

현재 속도 : 0
현재 속도 : 60
현재 속도 : 0

📌 간단 정리

메서드 역할
getSpeed() 현재 속도를 읽기
setSpeed(int) 속도를 설정 (0 이상만 허용)
isStop() 현재 멈춤 여부 확인
setStop(boolean) 멈춤 설정 (멈추면 속도 0)

💡 포인트 정리

  • private 필드는 객체 외부에서 직접 접근을 차단
  • getter 메서드로 값을 안전하게 읽을 수 있음
  • setter 메서드로 값을 제어하면서 유효성 검사(Validation) 가능
  • 캡슐화는 객체의 무결성을 유지하고, 버그를 예방하는 데 큰 도움이 됨
  • boolean 타입 getter는 is필드명() 형태로 작성하는 것이 관례
댓글