Java 16(상속, 객체 형변환)

Kang.__.Mingu·2024년 5월 3일
0

Java

목록 보기
18/108

상속(Inheritance)

  • 클래스 선언시 다른 클래스를 물려받아 작성하는 기능
  • 기존 클래스를 재사용하여 새로운 클래스를 쉽고 빠르게 작성 - 생산성 증가
  • 공통적인 속성과 행위를 포함한 다수의 클래스를 작성할 때 공통적인 속성과 행위를 구현한 클래스를 선언하고 클래스를 물려받아 새로운 클래스 작성 - 유지보수의 효율성 증가
  • 물려주는 클래스 - 부모클래스, 슈퍼클래스
  • 물려받는 클래스 - 자식클래스, 서브클래스

형식
public class 자식클래스 extend 부모클래스 {
자식클래스에서는 부모클래스의 필드와 메소드를 상속받아 사용 가능
}

  • 부모클래스의 생성자는 자식클래스에 상속되지 않으며 부모클래스의 은닉화 처리된 필드 또는 메소드는 자식클래스에서 사용할 수 없다.
  • Java 언어에서는 자식클래스가 하나의 부모클래스만 상속받아 작성 - 단일 상속

super

  • 자식클래스의 메소드에서 부모클래스 객체의 메모리 주소를 저장하여 부모 객체를 참조해 부모클래스의 필드 또는 메소드를 사용하기 위한 키워드
  • 자식클래스의 메소드에서 this 키워드로 참조하는 자식클래스 객체의 필드 또는 메소드가 없는 경우 자동으로 spuer 키워드로 부모클래스의 객체를 참조하여 필드 또는 메소드 사용

super 키워드를 사용하는 경우

  1. 자식클래스의 생성자에서 부모클래스의 매개변수가 있는 생성자를 호출하여 부모클래스의 객체를 생성하기 위해 super 키워드 사용
    • 형식) super(값, 값, ...);
    • 자식클래스 생성자에서 부모클래스의 매개변수가 있는 생성자를 호출하는 명령 - 부모클래스의 객체 필드 초기화
    • 자식클래스 생성자에서 부모클래스의 생성자를 호출하는 명령은 반드시 첫번째 명령으로 작동
  2. 자식클래스에서 부모클래스의 메소드를 오버라이딩 선언한 경우 자식클래스의 메소드에서 부모클래스의 숨겨진 메소드를 호출하기 위해 super 키워드 사용

메소드 오버라이딩(Method Overriding)

  • 상속관계의 클래스에서 부모클래스의 메소드를 자식클래스에서 다시 선언하는 기능
  • 부모클래스의 메소드를 자식클래스에서 사용하기 부적절한 경우 메소드 오버라이딩 사용
  • 메소드를 오버라이딩 작성 규칙: 부모클래스의 메소드와 같은 접근 제한자, 반환형, 메소드명, 매개변수, 예외전달을 자식클래스에서 동일하게 작성
  • 메소드 오버라이딩 선언하면 부모클래스의 메소드(Hide Method)는 숨겨지고 자식클래스의 메소드만 사용되도록 실행

어노테이션(Annotation)

  • 특별한 기능을 제공하기 위한 Java 자료형
  • (@Override, @Deprecated, @SuppressWarnings)

객체 생성 방법 종류

  1. 부모클래스 참조변수 = new 부모클래스(); = 가능

    • 부모클래스의 생성자를 호출하여 객체를 생성해 부모클래스의 참조변수에 저장
  2. 자식클래스 참조변수 = new 자식클래스(); = 가능

    • 자식클래스의 생성자를 호출하면 부모클래스의 생성자가 먼저 호출되어 부모클래스의 객체가 생성되고 자식클래스의 객체가 생성된 후 자식클래스의 참조변수에 자식클래스의 객체 저장
    • 참조변수로 자식클래스의 객체를 참조하여 자식클래스의 메소드를 호출할 수 있으며 상속관계에 의해 부모클래스의 객체를 참조하여 부모클래스의 메소드를 호출 가능
  3. 자식클래스 참조변수 = new 부모클래스(); = 불가능 - 에러 발생

    • 자식클래스의 참조변수에 자식클래스의 객체를 저장해야 되지만 자식클래스의 객체가 없으므로 에러 발생

객체 형변환

  • 객체 형변환을 사용하면 부모클래스의 참조변수로 자식클래스의 객체를 참조하여 자식클래스의 메소드 호출 가능
  • 명시적 객체 형변환(강제 형변환)
  • 묵시적 강제 형변환(자동 형변환)
  • 상속 관계의 클래스에서만 객체 형변환 사용 가능

명시적 객체 형변환

  • Cast 연산자를 사용하여 부모클래스의 참조변수의 자료형(클래스)을 자식클래스로 변경하면 일시적으로 참조변수가 자식클래스 객체를 참조하여 자식클래스의 메소드 호출
  • ex) (자식클래스)참조변수명.메소드();

묵시적 객체 형변환

  • 부모클래스의 메소드를 자식클래스에서 오버라이딩 선언하면 부모 클래스의 메소드 숨겨지고 자식클래스의 메소드만 사용되므로 참조변수로 부모클래스의 객체를 참조해 부모클래스의 메소드를 호출하면 자동으로 객체 형변환되어 자식클래스의 메소드 호출
  1. 부모클래스 참조변수 = new 자식클래스(); = 가능

Member.class

  • Member class는 기본적인 필드, 생성자, 메소드로만 이루어져 있음
package inheritance;

// 회원정보(아이디, 이름)를 저장하기 위한 클래스
public class Member {
    // 필드
    private String id;
    private String name;
	
    // 매개변수가 없는 생성자
    public Member() {
    }
	
    // 매개변수가 있는 생성자
    public Member(String id, String name) {
        this.id = id;
        this.name = name;
    }
	
    // Getter & Setter
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
	
    // 메소드
    public void display() {
        System.out.println("아이디 = " + id);
        System.out.println("이름 = " + name);
    }
}

MemberEvent

  • 이벤트 관련 회원정보(아이디, 이름, 이메일)를 저장하기 위한 클래스
  • 외원정보를 저장하기 위한 클래스(Member 클래스)를 상속받아 작성하는 것을 권장
public class MemberEvent extends Member {
    /*
    // 부모클래스로부터 상속받은 필드 또는 메소드 작성 불필요
    private String id;
    private String name;
    */
    private String email;

    public MemberEvent() {
        // 부모클래스의 매개변수가 없는 기본 생성자를 호출하는 명령 - 생략 가능
        super();
    }
    
    // 받은 매개변수를 super 키워드로 부모 클래스로 넘겨주면 필드에 들어감
   	public MemberEvent(String id, String name, String email) {
        super(id, name);
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
	
    // 오버라이딩
    @Override
    public void display() {
        // 부모클래스의 숨겨진 메소드 호출
        super.display();
        System.out.println("이메일 = " + email);

    }
}

MemaberApp

  • 객체를 만들어 setter로 각 필드에 값을 지정한 후 display() 메소드 호출
  • 객체를 생성할 때 매개변수에 값을 넣어 생성
package inheritance;

public class MemberApp {
    public static void main(String[] args) {
        Member member1 = new Member();
        member1.setId("abc123");
        member1.setName("홍길동");
        member1.display();
        System.out.println("=========================================");

        Member member2 = new Member("xyz456", "임꺽정");
        member2.display();
        System.out.println("========================================");
        
        // Member 클래스를 상속받은 MemberEvent를 가지고 호출
        MemberEvent member3 = new MemberEvent("2020", "전우치", "abcdefg@naver.com");

MemberEvnetAPP

package inheritance;

// 상속관계의 클래스에서 참조변수와 객체와의 관계
public class MemberCastApp {
    public static void main(String[] args) {
        // 부모클래스 참조변수 = new 부모클래스();
        Member member1 = new Member();

        // 참조변수로 부모클래스의 객체를 참조하여 부모클래스의 메소드 호출
        member1.setId("abc123");
        member1.setName("홍길동");
        member1.display();
        System.out.println("===========================================");
        
        // 자식클래스 참조변수 new 자식클래스();
        MemberEvent member2 = new MemberEvent();
        
        member2.setId("abc123");
        member2.setName("임꺽정");
        member2.setEmail("opq@itwill.xyz");
        member2.display();
        System.out.println("===========================================");
        
        // 자식클래스 참조변수 = new 부모클래스();
        // MemberEvent member3 = new Member();
        System.out.println("===========================================");
        
        // 부모클래스 참조변수 = new 자식클래스(); // 가능
        Member member4 = new MemberEvent();

        // 참조변수로 부모클래스의 객체를 참조하여 부모클래스의 메소드 호출
        member4.setId("xyz567");
        member4.setName("전우치");

        // 명시적 객체 형변환
        /*
        MemberEvent event = (MemberEvent) member4;
        event.setEmail("adsfasfs@itwill.xyz");
        */
        ((MemberEvent) member4).setEmail("opq@itwill.xyz");

        // 오버라이딩 선언된 메소드 호출
        member4.display();

        System.out.println("===========================================");
    }
}
profile
최선을 다해 꾸준히 노력하는 개발자 망고입니당 :D

0개의 댓글