오늘보다 더 나은 내일의 나에게_

Java 상속 본문

JAVA

Java 상속

chan_96 2022. 1. 13. 06:17
728x90

상속

: 기존 클래스의 특성(필드)과 기능(메서드)을 물려받아 새로운 클래스를 구성하는 것


기존 클래스 => 부모 클래스, 슈퍼클래스
새로운 클래스 => 자식클래스, 서브클래스

마우스 - 오른쪽/왼쪽버튼 클릭하다
휠마우스 -휠, 오른쪽/왼쪽버튼 클릭하다
무선 마우스 - 휠, 오른쪽/왼쪽 버튼 클릭하다
버티컬 마우스 - 휠, 오른쪽/왼쪽 버튼 클릭하다

마우스라면 가지고 있는 공통적인 특성/기능
> 마우스의 공통/기능을 가지고 있는 클래스가 설계되어 있고 가져다가 사용만 할 수 있다면 편리할 것!

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();
		
	}
}

 

728x90

'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
Comments