오늘은 어제보다 나아지길
[Java] 상속 본문
상속
현실에서 상속이란 부모가 자식에게 물려주는 행위를 뜻한다.
객체 지향 프로그램에서도 상속이란 개념이 존재하는데 부모 클래스의 멤버를 자식 클래스에게 물려주는 행위를 말한다.
상속은 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기에 코드의 중복을 줄여준다.
클래스 상속
class 자식클래스 extends 부모클래스 {
// 필드
// 생성자
// 메소드
}
프로그래밍 에선 자식 클래스가 상속을 하기 위해 부모 클래스를 선택한다.
자바에서는 다중 상속을 허용하지 않기에 한 개의 부모클래스만을 선택해야 한다.
super()
상속에서 super는 두가지 역할을 한다
- 부모 생성자 호출
- 부모 메소드 호출
// 부모 생성자 호출
public class Phone {
public String name;
public String price;
public Phone(name, price) {
this.name = name;
this.price = price;
}
public void Color() {
System.out.println("검정");
}
}
// 자식 클래스
public CellPhone extends Phone {
public iphone(String name, String price, String ram){
super(name, price);
this.ram = ram
}
super.Color(); // 부모 객체의 Color 메소드 호출
}
public class PhoneExample {
public static void main(String[] args) {
CellPhone cellPhone = new CellPhone("아이폰", "100만원", "8GB");
System.out.println("name: " + cellPhone.name); // 부모에게 물려받음
System.out.println("price: " + cellPhone.price); // 부모에게 물려받음
System.out.println("ram: " + cellPhone.ram); //
cellPhone.Color();
}
}
부모 생성자 호출 시 super(매개값) 방식을 사용하며, 매개값의 타입과 일치하는 부모 생성자를 호출한다.
super(name, price)는 Phone 생성자인 Phone(name, price)을 호출한다.
자식 클래스에서 부모 클래스의 메소드를 오버라이딩 하게 되면, 자식 메소드만 사용
메소드 재정의 ( @Override )
메소드 오버라이딩이란 상속된 메소드의 내용이 자식 클래스에서 맞지 않을 경우, 자식 클래스에서 동일한 메소드를 재
정의 하는 것을 말한다.
메소드가 오버라이딩되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 오버라이딩된
자식 메소드가 호출된다.
public class Cal {
double circle(double r){
System.out.println("Cal의 circle 실행");
return 3.141592 * r * r;
}
}
public class Computer extends Cal {
@Override
double circle(double r) {
System.out.println("Computer의 circle 실행");
return Math.PI * r * r;
}
}
public class Example {
public static void main(String[] args) {
int r = 10;
Cal cal = new Cal();
System.out.println("면적: " + cal.circle(r)); // 부모 메소드 호출
Computer com = new Computer();
System.out.println("면적: " + com.circle(r)); // 자식 메소드 호출
}
}
final
클래스와 메소드 앞에 final 키워드를 붙이면 상속과 오버라이딩이 불가능한 상태로 만들수 있다.
public final class ABC{ // 상속 불가능한 클래스
public final void DEF() { // 오버라이딩 불가능한 메소드
}
}
protected 접근 제한자
protected는 public과 default 접근 제한의 중간쯤에 해당한다.
같은 패키지에서는 default 처럼 접근 제한이 없지만, 다른 패키지에서는 자식 클래스만 접근을 허용한다.
protected는 필드, 생성자, 메소드 선언에 사용될 수 있다.
추상 클래스
사전적 의미로 추상(abstract)은 실체 간에 공통되는 특성을 추출한 것을 말한다.
클래스들의 공통적인 특성을 추출해서 선언한 클래스 ==> 추상 클래스
객체를 직접 생성할 수 있는 클래스 ==> 실체 클래스
추상 클래스가 부모이며 실체 클래스는 자식으로 구현되어 실체 클래스는 추상클래스의 모든 특성을 물려 받고,
추가적인 특성을 가질 수 있다.
추상 클래스는 공통되는 필드와 메소드를 쓰기 위해 만들어 졌기에 객체를 직접 생성 할 수 없다.
즉, new 연산자를 사용해서 인스턴스를 생성시키지 못하기에 부모 클래스로만 사용된다.
( 즉, extends를 통해서 사용 가능 )
추상 클래스의 용도
- 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적
- 실체 클래스를 작성할 때 시간을 절약
추상클래스 선언
public abstract class Phone {
// 필드
public String owner;
// 생성자
public Phone(String owner) {
this.owner = owner;
}
// 메소드
public void turnOn() {
System.out.println("전원을 킵니다.");
}
public void turnOff(){
System.out.println("전원을 킵니다.");
}
}
public class SmartPhone extends Phone {
// 생성자
public SmartPhone(String owner) {
super(owner)
}
// 메소드
public void internetSearch() {
System.out.println("인터넷을 검색합니다.");
}
}
public class PhoneExample {
public static void main(String[] args) {
SmartPhone smartPhone = new SmartPhone("홍길동");
smartPhone.turnOn(); // 전원을 킵니다.
smartPhone.internetSearch(); // 인터넷을 검색합니다.
smartPhone.turnOff(); // 전원을 끕니다.
}
}
추상 클래스를 설계할 때, 하위 클래스가 반드시 메소드를 실행하여야 할 경우, 해당 메소드를 추상 메소드로 선언하면 된다. 자식 클래스는 반드시 추상 메소드를 오버라이딩해서 사용하여야 하기 때문이다.
public abstract class Animal{
public String kind;
public void breathe() {
System.out.println("숨을 쉽니다.");
}
public abstract void sound(); // 추상 메소드 선언
}
public class Dog extends Animal {
public Dog() {
this.kind = "포유류";
}
@Override
public void sound() {
System.out.pritln("멍멍");
}
}
public class AnimalExample {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound(); // 멍멍
}
}
'[Java]' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 (0) | 2020.12.15 |
---|---|
[Java] 클래스 정리 (0) | 2020.11.16 |
[Java] 자바 다시 시작하기 (0) | 2020.11.12 |