갑작스레 쌀쌀해진 날씨 때문인지, 어제는 급작스런 컨디션 난조로 인해 오후 조퇴를 감행했지만
오전 수업 내용만큼은 남겨야했기에 뒤늦게나마 블로그 열정 불태우기🔥
사실 당일에 쓰고싶었지만 카카오 데이터센터 화재로 인해서 티스토리도 정상화되는데 꽤나 시간이 걸렸고,
데이터 분산백업의 중요성도 다시 한 번 깨닫고, 아무튼 요란하고 험난한 하루였다😂
클래스의 다형성 (메소드 오버라이딩)
필드와 메소드를 정의하는 Car 클래스와 Tire 클래스를 생성한다.
Car 클래스에서는 자동차의 타이어 4개를 필드로 정의하고, run(), stop() 메소드를 정의하였고,
Tire 클래스에서는 타이어의 최대회전수, 누적회전수, 타이어위치와 roll() 메소드를 정의하였다.
Car는 자동차의 기본정보를 담은 클래스이고, Tire은 공통되는 필드와 정보를 담은 클래스이다.
Car의 run() 메소드에서는 자동차가 달리기 시작하여 타이어에 펑크가 난 경우
자동차를 멈추는 stop() 메소드를 호출하여 자동차가 멈추도록 정의하였다.
Tire는 타이어의 위치와 최대 회전수를 매개변수로하는 생성자를 정의하였고,
roll() 메소드의 내용은 아래에 다시 정리하였다.
다음으로 Tire 클래스를 상속하는 HankookTire 와 KumhoTire 클래스를 생성한다.
각 하위클래스에서 roll()메소드를 오버라이딩하여 정의한다.
roll() 메소드에서는 누적회전수가 최대회전수를 넘지않는 경우 최대회전수까지 남은 수명을 출력해주고,
누적회전수가 최대회전수를 넘은 경우 해당 타이어의 위치의 타이어 펑크 사실을 출력해준다.
마지막으로 메인메소드에서 Car 객체를 생성하여 반복문 내에서 run() 메소드를 호출하고,
조건문을 통해 각 실행문을 정의해주면 각 정보들이 출력되는 것을 확인할 수 있다.
switch 조건문 내에서 각 바퀴의 최대회전수를 정의해두었기 때문에
run() 메소드를 통해 누적회전수가 추가되면서 최대회전수를 넘어서게되면 Tire 펑크로 인식하여
자동차가 멈추고, 펑크난 위치의 타이어를 교체할 수 있도록 출력해주는 방식이다.
같은 방법으로 필드을 배열로 정의한 다음 메인소드에서 원소를 객체로 하는 배열을 정의한 다음
생성자를 호출하고, 반복문 내에서 run() 메소드를 호출하여 조건문을 정의하면 동일하게 출력이 가능하다.
매개변수의 다형성(하위타입의 자동형변환)
먼저 Vehicle 클래스에 run 메소드를 정의하고, 생성자 호출을 위한 Driver 클래스를 생성한 다음
Vehicle 클래스를 상속하는 Bus와 Taxi 클래스를 각각 생성하여 run() 메소드를 오버라이딩 해주었다.
그리고 새로운 Bus, Taxi 객체는 각각 bus, taxi라는 Vehicle 객체에 할당해주고, Driver 객체도 생성해준다.
이 때, Bus, Taxi 객체는 Vehicle을 상속하는 하위타입의 객체이기 때문에 강제형변환을 하지않아도
자동형변환을 통해 Vehicle 객체 내에 있는 메소드를 수행할 수 있다.
그리고나서 생성자를 호출하는 객체 driver에 taxi, bus를 매개변수로하여 drive 메소드를 호출해주면
Vehicle 객체의 run() 메소드를 오버라이딩 한 결과를 실행하게된다.
클래스의 다형성(자동타입변환 & 강제타입변환, hasA & isA)
위에서 본 예제와 마찬가지로 동일한 케이스이고, 필드로 문자열과 배열을 활용한 것이다.
마찬가지로 하위타입의 SmartPhone 객체는 자동 타입 변환을 통해 Phone 객체에 할당할 수 있고,
ph2는 상위타입의 필드와 메소드는 활용이 가능하지만 하위타입의 메소드는 사용이 불가능하다.
상위타입의 객체인 ph2를 하위타입의 Smartphone 객체로 강제 타입 변환을 하면
상위타입의 필드와 메소드, 하위타입의 메소드까지 모두 사용할 수 있다.
객체 타입 확인, instanceof 활용
다음으로 객체의 타입을 확인할 수 있는 instanceof를 활용해보았다.
상위클래스인 Fruit과 이를 상속하는 Apple, Orange, Banana 클래스를 각각 생성해준다.
각 클래스는 필드와 메소드, 생성자 등을 따로 정의하지 않았다!
그리고 instanceof를 통해 객체의 타입을 출력하는 checkFruitType 메소드를 정의해주고,
메인메소드에서 객체 생성 후 checkFruitType 메소드를 호출해주면 각 객체의 타입을 확인할 수 있다.
이 때 checkFruitType 메소드는 Fruit 타입의 객체를 매개변수로 하는 메소드이기 때문에
checkFruitType 메소드를 통한 객체 타입의 확인은 Fruit 타입의 객체만 가능하다.
모든 타입은 상위타입으로 Object를 상속하고 있기 때문에 모든 객체는 Object 타입이 될 수 있고,
반대로 Object타입위 객체는 하위타입이 될 수 없는 것을 확인할 수 있었다.
객체명 instanceof 타입명 |
instanceof은 boolean 타입으로 결과를 출력하여
해당 객체가 해당 타입이 맞는지에 대한 결과를 알 수 있다.
객체 타입 확인, instanceof 활용
같은 방법으로 instanceof를 활용하여 객체의 타입을 확인하고,
각 객체의 타입에 따라 실행문을 반환하는 메소드를 호출하여 확인하였다.
'Develop growth diary > JAVA' 카테고리의 다른 글
이것이 자바다 6장 클래스 복습 #1 - 클래스, 변수, 생성자 오버로딩 (0) | 2022.10.25 |
---|---|
자바 기반 객체지향 프로그래밍 08 - 인터페이스(interface) 구현, 추상메소드 (0) | 2022.10.19 |
자바 기반 객체지향 프로그래밍 06 - 클래스의 다형성(List<>, interface) (0) | 2022.10.13 |
자바 기반 객체지향 프로그래밍 05 - 상속(Override, protected, 클래스의 타입변환과 다형성) (0) | 2022.10.12 |
자바 기반 객체지향 프로그래밍 04 - 상속(Override - 접근제한자, super, toString) (0) | 2022.10.11 |