전공/객체지향프로그래밍

[객체지향프로그래밍][Java] 상속 1 (객체 생성, 접근 지정자, 업캐스팅, 다운캐스팅, instanceof 연산자)

Campus Coder 2023. 4. 27. 16:25
728x90
반응형

객체지향의 상속

  • 부모클래스에 만들어진 필드, 메소드를 자식클래스가 물려받음
  • 부모의 생물학적 특성을 물려받는 유전과 유사
  • 상속을 통해 간결한 자식 클래스 작성
    • 동일한 특성을 재정의할 필요가 없어 자식클래스가 간결해짐

 

장점

클래스의 간결화

- 멤버의 중복 작성 불필요

 

클래스 관리 용이

- 클래스들의 계층적 분류

 

소프트웨어의 생산성 향상

- 클래스 재사용과 확장 용이

- 새로운 클래스의 작성 속도 빠름

 

자바의 상속과 객체

상속 선언 - extends 키워드 사용 -> 슈퍼 클래스를 확장한다는 개념

  • 부모 클래스 <-> 자식 클래스
  • 슈퍼 클래스 <-> 서브 클래스

 

클래스 상속 만들기 - Point와 ColorPoint 클래스

class Point {
    private int x, y; //한 점을 구성하는 x, y 좌표
    public void set(int x, int y) {
        this.x = x; this.y;
    }
    public void showPoint(){ //점의 좌표 출력
        System.out.println("(" + x + "," + ")");
    }
}

class ColorPoint extends Point { //Point를 상속받은 ColorPoint 선언
    private String color; //점의 색
    public void setColor(String color) {
        this.color = color;
    }
    public void showColorPoint() { //컬러 점의 좌표 출력
        System.out.print(color);
        showPorint(); //Point 클래스의 showPoint() 호출
    }
}

public class ColorPointEx {
    public static void main(String[] args) {
        p.set(1. 2); //Point 클래스의 set() 호출
        p.showPoint();
        
        ColorPoint cp = new ColorPoint();
        cp.set(3, 4); //Point의 setColor() 호출
        cp.setColor("red") //ColorPoint의 setColor() 호출
        cp.showColorPoint(); //컬러와 좌표 출력
    }
}

출력 결과

(1,2)

red(3,4)

 

객체 생성

 

서브클래스에서 슈퍼 클래스의 멤버 접근

 

자바 상속의 특징

- 클래스의 다중 상속 지원하지 않음

- 상속 횟수 무제한

- 상속의 최상의 부모 클래스는 java.lang.Object 클래스

  • 모든 클래스는 자동으로 java.lang.Object를 상속받은
  • 자바 컴파일러에 의해 자동으로 이루어짐

 

상속과 접근 지정자

접근 지정자 슈퍼 클래스의 [접근 지정자] 멤버
private - 다른 클래스에 접근 불허
- 클래스 안의 멤버들에게만 접근 허용
디폴트 - 클래스 내의 멤버
public - 다른 모든 클래스에 접근 허용
protected - 같은 패키지 내의 모든 클래스 접근 허용
- 다른 패키지에 있어도 서브 클래스는 슈퍼 클래스의 protected 멤버 접근 가능

 

서브 클래스/슈퍼 클래스의 생성자

호출 및 실행

new에 의해 서브 클래스 객체가 생성될 때

- new에 의해 서브 클래스 생성자 모두 실행됨

- 호출 순서: 서브 클래스의 생성자가 먼저 호출, 서브 클래스의 생성자는 실행 전 슈퍼 클래스 생성자 호출

- 실행 순서: 슈퍼 클래스의 생성자가 먼저 실행된 후 서브 클래스의 생성자 실행

 

생성자 선택

상속 관계에서의 생성자

- 슈퍼 클래스와 서브 클래스 각각 여러 생성자 작성 가능

 

서브 클래스 생성자 작성 원칙

- 서브 클래스 생성자에서 슈퍼 클래스 생성자 하나 선택

 

서브 클래스에서 슈퍼 클래스의 생성자를 선택하지 않는 경우

- 컴파일러가 자동으로 슈퍼 클래스의 기본 생성자 선택(기본 생성자 없을 경우 오류)

 

생성자를 선택하는 방법

super() 이용

서브 클래스에서 명시적으로 슈퍼 클래스의 생성자 선택 호출

- super(parameter);

- 인자를 이용하여 슈퍼 클래스의 적당한 생성자 호출

- 반드시 서브 클래스 생성자 코드의 제일 첫 라인에 와야 함

 

업캐스팅

  • 서브 클래스의 객체 = 서브 클래스의 멤버 + 슈퍼 클래스의 멤버
  • 서브 클래스의 객체는 슈퍼 클래스의 객체로 취급할 수 있음

업캐스팅 - 서브 클래스 객체를 슈퍼 클래스 타입으로 형 변환

class Person { ... }
class Studend extends Person { ... }

Student s = new Student();
Person p = s; //업캐스팅, 자동 타입 변환

업케스팅된 레퍼런스는 슈퍼 클래스의 멤버만 접근 가능

 

업캐스팅 사례

더보기
class Person {
    String name;
    String id;
    
    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    String grade;
    String department;
    
    public Student(String name) {
        super(name);
    }
}

public class UpcastingEx {
    public static void main(String[] args) {
        Person p;
        Student s = new Student("지웅초이");
        p = s; //업캐스팅
        
        System.out.println(p.name); //오류 없음
        
        //p.grade = "A"; -> 컴파일 오류
        //p.department = "com"; -> 컴파일 오류
    }
}

실행 결과 -> 지웅초이

- 레퍼런스 p를 이용하면 Student 객체의 멤버 중 Person의 멤버만 접근 가능하다. -> name, id, Person()

- 레퍼런스 s를 이용하면 위의 6개 멤버에 모두 접근 가능하다. -> name, department, Person, grade, department, Student()

 

다운캐스팅

- 슈퍼 클래스 객체를 서브 클래스 타입으로 변환

- 개발자의 명시적 타입 변환 필요

class Person { ... }
class Student extend Person { ... }

Person p = new Student("지웅초이"); //업캐스팅

Student s = (Student)p; //다운캐스팅, (Student)의 타입 변환 표시 필요

 

다운캐스팅 사례

더보기
public class DowncastingEx { //업케스팅 예시의 Person, Student 클래스를 참고할 것
    public static void main(String[] args) {
        Persin p = new Student("지웅초이"); //업캐스팅
        Student s;
        
        s = (Student)p; //다운캐스팅

        System.out.println(s.name); //오류 없음
        s.grade = "A"; //오류 없음
    }
}

실행 결과  -> 지웅초이

두 레퍼런스 모두 Person의 멤버만 접근 가능 -> name, id, Person()

 

instanceof 연산자와 객체의 타입 판단

업캐스팅된 레퍼런스로 객체의 타입 판단 어려움

- 슈퍼 클래스는 여러 서브 클래스에 상속되기 때문

 

instanceof 연산자

- 레퍼런스가 가리키는 객체의 타입 식별을 위해 사용

- 사용법

객체레퍼런스 instanceof 클래스 타입

연산의 결과: true/false 불린 값

 

728x90
반응형