public class Person { // ✅ 외부에서 접근 불가
public String name; // ✅ 외부에서 접근 불가
private String secret; // ❌ 외부에서 접근 불가
public Person() {} // ✅ 외부에서 접근 불가
public void methodA() {} // ✅ 외부에서 접근 가능
private void methodB() {} // ❌ 외부에서 접근 불가
}
Person person = new Person(); // ✅ 접근가능 생성자가 public
person.name; // ✅ 접근가능 변수가 public
person.secret; // ❌ 접근불가능 변수가 private
person.methodA(); // ✅ 접근가능 메서드가 public
person.methodB(); // ❌ 접근불가능 메서드가 private
public class Person {
private String secret;
public String getSecret() {
return this.secret; // ✅ 객체의 secret 속성 반환
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.secret; // ❌ 직접 접근 불가능
String newSecret = p1.getSecret(); // ✅ 게터를 활용해 접근가능
}
}
public class Person {
private String secret;
public void setSecret(String secret) {
this.secret = secret; // ✅ secret 속성 설정 및 변경
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.secret = "password"; // ❌ 직접접근, 변경 불가능
p1.setSecret("newPassword"); // ✅ 세터를 활용해 접근, 변경가능
}
}
public class Parent {
public String familyName = "스파르탄";
public int honor = 10;
public void introduceFamily() {
System.out.println("우리 " + this.familyName + " 가문은 대대로 명성을 이어온...");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
System.out.println(child.honor); // ✅ 부모의 속성을 물려받아 사용
System.out.println(child.familyName); // ✅ 부모의 속성을 물려받아 사용
child.introduceFamily(); // ✅ 부모의 메서드를 물려받아 사용
}
}
3. super - 부모 인스턴스
부모클래스의 멤버(변수, 메서드)에 접근할 때 사용하는 키워드
자식 클래스에서 부모의 변수나 메서드를 명확하게 호출할 때 사용
public class Child extends Parent {
private String familyName = "gim"
public void superExample() {
System.out.println("우리 " + this.familyName + " 가문은 ...");
System.out.println("원래 가문의 이름은 " + super.familyName);
}
}
public class Child extends Parent {
...
// ✅ 부모에는 없지만 자식에만 있는 기능
public void showSocialMedia() {
System.out.println("우리 가문은 이제 SNS도 합니다. 팔로우 부탁드려요!");
}
}
public class Main {
public static void main(String[] args) {
...
child.showSocialMedia(); // ✅ 부모에는 없지만 자식에만 있는 기능
}
}
public class Cat extends Animal {
@Override
void eat() {
System.out.println("냠냠"); // ⚠️ 자식클래스에서 강제 구현해야합니다.
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal(); // ❌ 추상클래스는 구현할 수 없습니다.
Cat cat = new Cat();
cat.eat(); // ⚠️ 강제 구현한 메서드 사용
cat.sleep(); // ✅ 부모클래스의 매서드 사용
}
}
public class LifeForm {
public void exist() {
System.out.println("존재합니다2"); // ✅ 공통: 모든 객체는 존재한다.
}
}
public class Animal extends LifeForm {
public void makeSound() {
System.out.println("소리를 냅니다2"); // ✅ 공통: 모든 생명체는 성장한다.
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("야옹2");
}
public void scratch() {
System.out.println("스크래치!");
}
}
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.exist();
cat.makeSound();
cat.scratch();
}
}
public interface Animal extends LifeForm {
void makeSound();
}
public class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("야옹");
}
@Override
public void exist() {
System.out.println("고양이가 존재합니다.");
}
public void scratch() {
System.out.println("스크래치!");
}
}
public class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("야옹");
}
@Override
public void exist() {
System.out.println("고양이가 존재합니다.");
}
public void scratch() {
System.out.println("스크래치!");
}
}
public class Main {
public static void main(String[] args) {
// 다형성 활용
Animal animal = new Cat();
animal.exist(); // ✅
animal.makeSound(); // ✅
}
}
3. 형변환
1) 업캐스팅
자식 타입 > 부모 타입
public class Main {
public static void main(String[] args) {
// 다형성 활용
Animal animal = new Cat(); // ✅ 자동 형 변환
animal.exist(); // ✅
animal.makeSound(); // ✅
}
}
주의사항: 자식 고유기능 활용x
public class Main {
public static void main(String[] args) {
// 다형성 활용
Animal animal = new Cat(); // ✅ 자동 형 변환
animal.exist();
animal.makeSound();
animal.scratch(); // ❌ 사용 불가
}
}
2) 다운캐스팅
부모 타입 > 자식 타입 ( big > small )
public class Main {
public static void main(String[] args) {
// 다형성 활용
Animal animal = new Cat();
animal.exist();
animal.makeSound();
Cat cat = (Cat) animal; // ✅ 다운캐스팅(부모Animal -> 자식Cat)
cat.scratch(); // ✅ 자식 클래스의 기능 활용 가능
}
}
public class Main {
public static void main(String[] args) {
// 다운 캐스팅
Animal dog = new Dog();
// 문법적으로 잘못된건 아니라서 에러가 발생하지 않습니다.
Cat cat1 = (Cat) dog; // ⚠️
cat1.scratch(); // ❌ 해당 라인이 실행할때만 에러 여부를 확인할 수 있습니다.
}
}
instanceof 활용하여 해결
public class Main {
public static void main(String[] args) {
Animal animal2 = new Dog();
// ✅ 안전한 다운캐스팅(animal2 가 Cat 의 인스턴스 유형인지 확인합니다.)
if (animal2 instanceof Cat) {
Cat cat = (Cat) animal2;
cat.scratch();
} else {
System.out.println("객체가 고양이가 아닙니다.");
}
}
}
4. 장점
1) 한 가지 타입으로 유연한 프로그램 처리 가능
animal 안에 여러 자식 데이터 담기 가능
public class Main {
public static void main(String[] args) {
Animal[] animals = {new Cat(), new Dog()};
for (Animal animal : animals) {
animal.makeSound();
}
}
}