JAVA

자바 기초 문법 다지기3

도원좀비 2025. 2. 26. 17:00

상속(Ingeritance)란?

  • 클래스간의 관계를 부모(상위), 자식(하위) 로 바라보는 개념
  • 이 구조를 통해 상속에서는 재사용성, 확장 이 가능
  • → 물려받은 속성과 기능은 자식 클래스에서 재사용할 수도 있고, 확장 가능
  • extends 키워드를 사용해서 상속관계를 구현
  • 상속을 통해 코드 중복을 줄이고 유지보수성을 높일 수 있습니다.

재사용성

 상속의 장점은 부모 클래스의 내용을 물려받아 그래도 재사용 가능

public class Parent {
    public String familyName = "정가문";
    public int honor = 10;

    public void introduceFamily() {
        System.out.println("우리 " + this.familyName + " 가문은 대대로 명성을 이어온...");
    }
}
class Child extends Parent { // extends 키워드 활용
}
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(); // 부모의 메서드를 물려받아 사용
    }
}

 

super : 부모클래스의 멤버(변수, 메서드)에 접근할 때 사용하는 키워드

super() : 부모 클래스의 생성자를 호출 (자식 클래스의 생성자에서 첫 줄에 위치해야 함)

 

확장(expansion)

 부모클래스의 기능을 유지하면서 자식클래스에서 기능을 확장

public class Child extends Parent {

		...

		// 부모에는 없지만 자식에만 있는 기능
    public void showSocialMedia() {
        System.out.println("우리 가문은 이제 SNS도 합니다. 팔로우 부탁드려요!");
    }
}
public class Main {

    public static void main(String[] args) {
		    ...
        child.showSocialMedia(); // 부모에는 없지만 자식에만 있는 기능
    }
}

 

재정의 - 메서드 오버라이딩(overriding)

 오버라이딩을 통해 부모클래스의 기능을 재정의 가능

  • 오버라이드 된 메서드에는 @Override 키워드를 붙이는 것을 권장
  • @Override를 붙이면 컴파일러가 부모클래서에 동일한 메서드가 없다고 인지

메서드의 이름, 매개변수, 반환타임이 완전히 동일해야 함

 

추상클래스

 공통 기능을 제공하면서 하위 클래스에 특정 메서드 구현을 강제하기 위해 사용

  • 객체를 생성할 목적이 아니라 “설계도” 역할을 할때 적합
  • abstract 키워드로 클래스를 선언하면 추상클래스
  • abstract 키워드로 메서드를 선언하면 자식클래스에서 강제로 구현
  • 추상클래스로 객체를 생성 불가
  • 일반 클래스처럼 변수와 메서드를 가질 수 있음
abstract class Animal {

    private String name; //  변수선언가능

    abstract void eat(); //  추상메서드: 상속 받은 자식은 강제 구현해야합니다.

    public void sleep() { // 자식클래스에서 재사용가능합니다.
        System.out.println("쿨쿨");
    }
}

 

 

인터페이스 상속을 활용한 추상 계층 표현

public interface LifeForm {
    void exist(); // 공통: 모든 생명체는 존재한다.
}

public interface Animal extends LifeForm {

    void makeSound(); //공통: 모든 동물은 소리를 냅니다.
}

public class Cat implements Animal {

    @Override
    public void exist() {
        System.out.println("고양이가 존재합니다.");

    }

    @Override
    public void makeSound() {
        System.out.println("야옹");
    }

    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 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();
    }
}

 

다형성(Polymorphism)이란?

  • 다형성은 하나의 타입으로 여러 객체를 다룰 수 있는 객체지향의 4번째 특징
  • 인터페이스 상속, 클래스 상속을 활용해서 추상계층을 표현
  • 이제 추상 계층이라는 특징을 활용해서 다형성을 구현 가능

형변환(Casting)

  • 부모타입으로 자식타입을 다룰 수 있는 이유는 자동으로 형변환(Casting) 이 발생했기 때문
  • 자식타입 → 부모타입: 업캐스팅(UpCasting)
  • 부모타입 → 자식타입: 다운캐스팅(DownCasting)

업캐스팅(UpCasting) - 자식 → 부모

public class Main {

    public static void main(String[] args) {

        // 다형성 활용
        Animal animal = new Cat(); // 자동 형 변환
        animal.exist(); 
        animal.makeSound(); 
    }
}

 

주의사항

 업캐스팅은 부모의 타입으로 데이터를 다룰 수 있지만 자식 클래스의 고유기능을 활용 불가능

 

다운캐스팅(DownCasting): 부모 → 자식

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(); // 자식 클래스의 기능 활용 가능
    }
}

 

주의사항

 잘못된 다운캐스팅은 컴파일단계에서 감지 불가능

 다운캐스팅을 사용할때 항상 instanceof 를 활용

'JAVA' 카테고리의 다른 글

자바 기초 문법 다지기 4  (1) 2025.02.26
자바 기초 문법 다지기 3  (1) 2025.02.26
자바 기초 문법 다지기 2  (1) 2025.02.25
자바 기초 문법 다지기  (2) 2025.02.24
조건문  (0) 2025.02.20