💡 캡슐화, 상속, 추상화, 다형성
📘 데이터의 보호
캡슐화의 특징
접근제어자
클래스, 변수, 메서드, 생성자의 접근 범위를 제한하는 키워드
접근 영역 : public > protected > default > private
| 한정자 | 클래스 내부 | 동일 패키지 | 하위 클래스 | 그 외의 영역 |
|---|---|---|---|---|
| public | O | O | O | O |
| protected | O | O | O | X |
| default | O | O | X | X |
| private | O | X | X | X |
Getter / Setter
public class Person {
private String secret;
//Getter 메서드
public String getSecret() {
return this.secret; // ✅ 객체의 secret 속성 반환
}
//Setter 메서드
public void setSecret(String secret) {
this.secret = secret; // ✅ secret 속성 설정 및 변경
}
}
public class Main {
public static void main(String[] args) {
//생성자 생성
Person p1 = new Person();
//Getter 활용해 데이터 Get
p1.secret; // ❌ 직접 접근 불가능
String newSecret = p1.getSecret(); // ✅ 게터를 활용해 접근가능
//Setter 사용해 데이터 Set
p1.secret = "password"; // ❌ 직접접근, 변경 불가능
p1.setSecret("newPassword"); // ✅ 세터를 활용해 접근, 변경가능
}
}
📘 재사용성과 확장
상속의 특징
// 부모 클래스
class Animal {
String name;
Animal(String name) {
this.name = name;
}
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
void showName() {
System.out.println("이 동물의 이름은 " + name + "입니다.");
}
}
// 자식 클래스
class Dog extends Animal {
String breed;
Dog(String name, String breed) {
super(name); // 부모 클래스의 생성자 호출
this.breed = breed;
}
@Override //상속 관계 표시
void sound() {
super.sound(); // super 키워드로 부모생성자 메서드 접근
System.out.println("강아지가 멍멍 짖습니다.");
}
//자식클래스에서 기능 확장
void showBreed() {
System.out.println("견종: " + breed);
}
}
// 실행 클래스
public class TestInheritance {
public static void main(String[] args) {
Dog dog = new Dog("바둑이", "진돗개");
dog.showName(); // 부모의 메서드 재사용
dog.sound(); // 자식에서 오버라이드 + super로 부모 호출
dog.showBreed(); // 자식만의 메서드(확장)
}
}
//출력
//이 동물의 이름은 바둑이입니다.
//동물이 소리를 냅니다. -> super 로 부모 호출
//강아지가 멍멍 짖습니다.
//견종: 진돗개
📘 데이터의 계층적 표현
추상화의 특징
추상 클래스
// 부모 클래스 (추상클래스) - 상속 전용
abstract class Animal {
String name;
Animal(String name) {
this.name = name;
}
// 추상 메서드 (구현은 자식에게 맡김)
abstract void sound();
// 일반 메서드
void showName() {
System.out.println("이 동물의 이름은 " + name);
}
}
//자식 클래스
class Dog extends Animal {
Dog(String name) {
super(name); //부모의 생성자 호출
}
// 자식 클래스에서 구현
@Override
void sound() {
System.out.println("멍멍!");
}
}
인터페이스
//인터페이스 선언
interface Movable {
void move(); //반드시 구현해야 하는 메서드
}
//인터페이스로 각각의 기능 구현
class Car implements Movable {
public void move() {
System.out.println("자동차가 달립니다.");
}
}
class Person implements Movable {
public void move() {
System.out.println("사람이 걷습니다.");
}
}
📘 여러 형태를 가질 수 있는 특성
다형성의 특징
업캐스팅
// 부모 클래스
class Animal {
void makeSound() {
System.out.println("Some animal sound");
}
}
// 자식 클래스
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
// 업캐스팅: 자식 클래스(Dog)의 객체를 부모 클래스(Animal) 타입으로 참조
Animal animal = dog; // 업캐스팅은 자동으로 이루어짐
// 다형성: 부모 클래스 타입의 변수로 자식 클래스 메서드 호출
animal.makeSound(); // "Bark" 출력
}
}
다운캐스팅
// 부모 클래스
class Animal {
void makeSound() {
System.out.println("Some animal sound");
}
}
// 자식 클래스
class Dog extends Animal {
void bark() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 업캐스팅: Dog 객체를 Animal 타입으로 참조
// 다운캐스팅: Animal 타입의 변수를 Dog 타입으로 변환
Dog dog = (Dog) animal; // 명시적으로 다운캐스팅
// 자식 클래스에서만 사용할 수 있는 메서드 호출
dog.bark(); // "Bark" 출력
}
}