오늘보다 더 나은 내일의 나에게_
Java 상속 본문
상속
: 기존 클래스의 특성(필드)과 기능(메서드)을 물려받아 새로운 클래스를 구성하는 것
기존 클래스 => 부모 클래스, 슈퍼클래스
새로운 클래스 => 자식클래스, 서브클래스
마우스 - 오른쪽/왼쪽버튼 클릭하다
휠마우스 -휠, 오른쪽/왼쪽버튼 클릭하다
무선 마우스 - 휠, 오른쪽/왼쪽 버튼 클릭하다
버티컬 마우스 - 휠, 오른쪽/왼쪽 버튼 클릭하다
마우스라면 가지고 있는 공통적인 특성/기능
> 마우스의 공통/기능을 가지고 있는 클래스가 설계되어 있고 가져다가 사용만 할 수 있다면 편리할 것!
class 마우스(부모클래스) | class 휠마우스(자식클래스) | class 인체공학마우스 (자식클래스) |
좌클릭하기 메소드 우클릭하기 메소드 드래그하기 메소드 |
스크롤하기 메소드 |
피로감소 메소드 |
=> class 마우스 상속 시 공통된 메서드 작성하지 않아도 된다!
상속의 장점
: 기존 클래스의 변수와 코드를 재사용
> 코드의 중복 감소, 클래스 간결화
: 먼저 작성된 검증된 프로그램을 재사용
> 신뢰성 있는 프로그램 손쉽게 개발
: 클래스 간 계층적 분류 및 관리
> 유지보수 용이
상속 문법
public class Mouse{ } public class WheelMouse extends Mouse{ }
마우스를 상속받는 휠마우스 클래스 선언
: class 서브클래스 extends 슈퍼클래스
상속의 특징
다중 상속을 지원하지 않는다.(부모는 1개)
> 한 서브 클래스는 하나의 슈퍼 클래스만 가질 수 있음
상속의 횟수에 제한을 두지 않는다.
> 서브 클래스가 상속받는 슈퍼클래스의 또 다른 슈퍼클래스가 존재할 수 있음
모든 클래스는 java.lang.Object를 상속받는다.
> Object가 모든 클래스의 최상위 클래스
예제 1 모든 핸드폰을 특징을 가지고 있는 Phone클래스를 설계한 후 Phone 클래스를 상속받은 FolderPhone 클래스와 SmartPhone 클래스를 설계하고 각 객체를 생성하시오
Phone FolderPhone SmartPhone 스피커 마이크
전화하다
문자 하다스피커 마이크
전화하다
문자 하다
접는다스피커 마이크
전화하다
문자 하다
카메라
인터넷 하다더보기Phone 클래스
package Phone; public class Phone { //필드(속성) : 스피커, 마이크 //메서드(기능) : 전화하다, 문자하다 String speaker; boolean mic; public void call() { System.out.println("따르릉"); } public void message() { System.out.println("문자!"); } }
FolderPhone 클래스package Phone; public class FolderPhone { //필드(속성) : 스피커, 마이크 //메서드(기능) : 전화하다, 문자하다, 접는다 String speaker; boolean mic; public void call() { System.out.println("따르릉"); } public void message() { System.out.println("문자!"); } public void fold() { System.out.println("접는다!"); } }
SmartPhone 클래스package Phone; //상속 : class 클래스명 extends 상위클래스명 //-> 상위클래스를 상속받아서 새로운 클래스 작성 //-> 상위클래스의 필드/메서드를 현재 클래스에 따로 정의하지 않아도 사용할 수 있음 public class SmartPhone extends Phone { //필드(속성) : (스피커, 마이크) => phone, 카메라 //메서드(기능) : (전화하다, 문자하다) => phone, 인터넷하다 String camera; public void internet() { System.out.println("인터넷접속!"); } }
PhoneMain 클래스package Phone; public class PhoneMain { public static void main(String[] args) { Phone p1 = new Phone(); FolderPhone p2 = new FolderPhone(); SmartPhone p3 = new SmartPhone(); p1.call(); p2.call(); //SmartPhone 클래스 call() 따로 정의하지 않았지만 Phone 클래스를 //상속받는 것 만으로도 call()를 사용할 수 있음 p3.call(); } }
super => 부모에 접근
this => 현재 생성된 인스턴스에 접근(생성된 인스턴스 내에서 모든 멤버에 접근 가능 )
오버라이딩(Overriding)
자식 클래스에서 부모 클래스와 동일한 메서드를 재정의 하는 것
> 구조는 같지만 기능이 다른 것
오버로딩 | 오버라이딩 |
매개변수의 개수나 순서, 타입이 다른 같은 이름의 메소드를 여러 개 정의하는 것 중복정의 |
부모클래스의 메소드의 동작 방법을 변경하는 것(매개변수의 개수, 순서, 타입과 반환타입은 같음) 재정의 |
예제 1 모든 동물들의 특징/기능을 가지고 있는 Animal 클래스를 설계한 후 해당 클래스를 상속받는 Dog 클래스와 Cat 클래스를 작성한 후 cry 메서드 기능을 오버 라이딩하시오
Animal Dog Cat 종
울다("울다")
뛰다종
재주부리다
울다("멍멍")
뛰다종
그루밍하다
울다("미야옹")
뛰다
더보기Animal 클래스
package Animal; public class Animal { //필드 : 종 //메서드 : 울다, 뛰다 String species; public void cry() { System.out.println("울다"); } public void run() { System.out.println("뛰다"); } }
Dog 클래스
package Animal; public class Dog extends Animal{ //필드 : 종 //메서드 : 재주부리다, (울다("멍멍"), 뛰다) -> Animal public void skill() { System.out.println("공물어오기!"); } //오버라이딩 : 상위클래스의 메소드 중 재정의해야하는 기능이 있을 때 하위클래스 //에서 매개변수의 개수, 타입, 순서, 반환타입은 동일하게 메서드를 재정의 //(동적바인딩:실행 (런타임) 성격 결정) <-> (정적바인딩:컴파일시 성격 결정) //동적바인딩 ex : 실제 참조하는 개체는 서브클래스이니 서브클래스의 메소드를 호출 //정적바인딩 ex : 업캐스팅(Dog -> Animal) - 타입이 슈퍼클래스일 때 슈퍼클래스 메서드 호출 @Override public void cry() { System.out.println("멍멍!"); } }
Cat 클래스package Animal; public class Cat extends Animal{ public void groom() { System.out.println("그루밍중!"); } //주석(annotation) : 특별한 기능을 가진 주석 //컴파일할 때 오류를 확인할 수 있게 @Override public void cry() { System.out.println("미야옹!"); } }
AnimalMain 클래스package Animal; public class AnimalMain { public static void main(String[] args) { Animal a1 = new Animal(); Dog a2 = new Dog(); Cat a3 = new Cat(); //오버라이딩된 메서드 호출(동적바인딩) a1.cry(); a2.cry(); a3.cry(); } }
Casting(캐스팅)
기존 데이터 타입을 다른 데이터 타입으로 변환하는 것
*Reference Type 데이터 캐스팅*
Upcasting |
Downcasting |
- 하위 클래스가 상위 클래스 타입으로 자동 타입 변환하는 것 > OOP 특징 중 다형성에 해당 - 업캐스팅 된 경우 원래 객체 내 모든 변수, 메소드에 접근할 수 없고 상위 클래스의 변수, 메소드에만 접근 가능 - 하위 클래스가 상위클래스의 메소드를 오버라이딩 한 경우 하위 클래스의 메소드 호출 가능 |
- 업캐스팅(부모)된 것을 명시적(강제) 타입 변환으로 원래 상태로 되돌리는 것 *instanceof 연산자 =>업캐스팅한 경우 레퍼런스 변수가 가리키는 실제 객체가 어떤 클래스의 타입인지 구분하기 위한 연산자(true / false반환) |
예제 RandomToyMachine 프로그램 만들기
class Toy play메서드(놀다)
class Ball class Train class Gun play메서드
(탱탱팅팅팅구르르)play메서드
(칙칙폭폭)play메서드
(크르르칵칵뱅뱅)
RandomToyMachine 클래스의 필드 타입 변수명 설명 ArrayList <Toy> toyList 장난감 목록 Random r 랜덤 객체
RandomToyMachine 클래스의 메서드 이름 리턴 타입 매개변수 설명 addToy - Toy toy 장난감 객체를 매개변수로 받아 ArrayList에 장난감 추가 getToy Toy - Random으로 뽑은 장난감을 리턴
RandomToyMachine, Toy, Ball, Train, Gun 클래스를 각각 설계 후 RandomToyMachine 객체를 생성하여 랜덤으로 장난감 객체를 하나 뽑고 play 메서드 호출해보시오
더보기Toy 클래스
package Toy; public class Toy { public void play() { System.out.println("놀다"); } }
Ball 클래스package Toy; public class Ball extends Toy{ @Override public void play() { System.out.println("탱탱팅팅팅구르르"); } }
Gun 클래스package Toy; public class Gun extends Toy { @Override public void play() { System.out.println("크르르칵칵뱅뱅"); } }
Train 클래스package Toy; public class Train extends Toy{ @Override public void play() { System.out.println("칙칙폭폭"); } }
RandomToyMachine 클래스package Toy; import java.util.ArrayList; import java.util.Random; public class RandomToyMachine extends Toy{ //필드 : arraylist, random //메서드 : 장난감추가, 랜덤뽑기 ArrayList<Toy> toyList = new ArrayList<Toy>(); Random rd = new Random(); public void addToy(Toy toy) { toyList.add(toy); //생성된 머신 인스턴스의 toyList 필드에 장난감 추가 } public Toy getToy() { //0~2 인덱스 중 랜덤으로 하나 뽑음 int ran = rd.nextInt(toyList.size()); return toyList.get(ran); } }
ToyMain 클래스package Toy; public class ToyMain { public static void main(String[] args) { RandomToyMachine rtm = new RandomToyMachine(); rtm.addToy(new Train()); rtm.addToy(new Ball()); rtm.addToy(new Gun()); rtm.getToy().play(); } }
'JAVA' 카테고리의 다른 글
Java 정렬 알고리즘 (0) | 2022.01.13 |
---|---|
Java 추상클래스와 인터페이스 (0) | 2022.01.13 |
Java MVC Pattern (0) | 2022.01.13 |
Java 객체 배열 (0) | 2022.01.13 |
Java 메소드(Method) (0) | 2022.01.13 |