라봉이의 개발 블로그

java의 정석 7강. 객체지향프로그래밍2(중) 본문

Java/Java의 정석 읽고 정리

java의 정석 7강. 객체지향프로그래밍2(중)

Labhong 2018. 6. 1. 01:31
반응형

객체지향은 c++과 유사한 점이 많으니 특징과 다른 점만 짚고 넘어가도록 하겠다.


5.다형성

5.1 다형성이란?


객체지향개념에서의 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한  타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다.

=> 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.



5.2 참조변수의 형변환


서로 상속관계에 있는 클래스 사이에서만 가능하다.


  • 자손타입 -> 조상타입(업캐스팅): 형변환 생략가능
  • 자손타입 <- 조상타입(다운캐스팅): 형변환 생략불가

class Car {
    String color;
    int door;
    void drive() {
        System.out.println("drive, Brrrr~");
    }
    void stop() {
        System.out.println("Stop!!");
    }
}

class FireEngine extends Car {
    void water() {
        System.out.println("Water!!");
    }
}

class Ambulance extends Car {
    void siren() {
        System.out.println("siren!!");
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = null;
        FireEngine fe1 = new FireEngine();
        FireEngine fe2 = null;

        car = fe1;                      // car = (Car) fe1;에ㅐ서 형변환이 생략된 형태이다.
        fe2 = (FireEngine)car;          // 형변환을 생략할 수 없다.
    }
}



5.3 instanceof 연산자


참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다. 연산의 결과boolean 값인 true, false를 반환한다.

void doWork(Car c) {
  if(c instanceof FireEngine) {
    FireEngine fe = (FireEngine) c;
    fe.water();
  } else if (c instanceof Ambulance) {
    Ambulance am = (Ambulance) c;
    am.siren();
  }
  // ...
}



5.4 참조변수와 인스턴스의 연결


메서드의 경우 조상 클래스의 메서드를 자손의 클래스에서 오버라이딩한 경우에도 참조변수의 타입에 관계없이 항상 실제 인스턴스의 메서드(오버라이딩한 메서드)가 호출되지만, 멤버변수의 경우 참조변수의 타입에 따라 달라진다.

class Parent {
    int x = 100;
    void method() {
        System.out.println("Parent method");
    }
}

class Child extends Parent {
    int x = 200;
    void method() {
        System.out.println("Child method");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent p = new Child();
        Child c = new Child();

        System.out.println("p.x = " + p.x);
        p.method();

        System.out.println("c.x = " + c.x);
        c.method();
    }
}

출력 결과:

p.x = 100

Child method

c.x = 200

Child method



5.5 매개변수의 다형성


참조변수의 다형적인 특징메서드의 매개변수에도 적용된다.

void buy(Product p) {        // Product는 상품 클래스들의 조상 클래스이다.
        money = money - p.price;
        bonusPoint = bonusPoint + p.bonusPoint;
}



5.6 여러 종류의 객체를 하나의 배열로 다루기


ex)

Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();



6. 추상클래스

6.1 추상클래스란?


추상클래스는 키워드 'abstract'를 붙여주기만 하면 된다.

absctract class 클래스 이름 {
        //....
}



6.2 추상메서드(abstract method)


선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 "추상메서드"이다.

키워드 'abstract'를 앞에 붙여주고 주석으로 어떤 기능을 수행할 것인지 코멘트를 남긴다.


만일 조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자손클래스 역시 추상클래스로 지정해줘야한다.

반응형
Comments