profile image

L o a d i n g . . .

article thumbnail image
Published 2022. 7. 11. 06:43

상속? 

부모 클래스의 멤버를 자식 클래스에게 물려준다

 

class 자식클래스 extends 부모클래스 {
  ...
}

extends 후 기본생성자 만들때 생기는 super가 부모의 기본 생성자를 호출한다

 

 

 

 

 

 

 

 

 

Java 상속 특징

- 여러개의 부모 클래스를 상속할 수 없다. (다중상속 허용 x)

- 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외

- 부모 클래스와 자식 클래스가 다른 패키지에 존재할 경우 default 접근 제한을 갖는 필드와 메소드도 상속 x

 

 

예제

package chap07;

public class Cellphone {
	String model;
	String color;
	
	void powerOn() {System.out.println("전원을 켭니다");}
	void powerOff() {System.out.println("전원을 끕니다");}
	void bell() {System.out.println("벨이 울립니다");}
	void sendVoid(String message) {System.out.println("Me: " + message);}
	void receiveVoid(String message) {System.out.println("Friend: " + message);}
	void hangUp() {System.out.println("전화를 끊습니다");}
}
package chap07;

public class DmbCellPhone extends Cellphone{
	int channel;
	
	public DmbCellPhone(String model, String color, int channel) {
		this.model = model;
		this.color = color;
		this.channel = channel;
	}
	
	void turnOnDmb() {
		System.out.println("채널 " + channel + "번 방송 수신을 시작합니다");
	}
	
	void changeChannelDmb(int channel) {
		this.channel = channel;
		System.out.println("채널 " + channel + "번으로 바꿉니다");
	}
	void turnOffDmb() {
		System.out.println("방송 수신을 멈춥니다");
	}
}
package chap07;

public class DMbCellPhoneEx {
	public static void main(String[] args) {
		DmbCellPhone cellPhone = new DmbCellPhone("갤럭시", "검정", 22);
		
		System.out.println("모델: " + cellPhone.model);
		System.out.println("색상: " + cellPhone.color);
		
		System.out.println("채널: " + cellPhone.channel);
		
		cellPhone.powerOn();
		cellPhone.powerOff();
		cellPhone.sendVoid("여보세욥");
		cellPhone.receiveVoid("안녕하세요 저는 홍길동입니다");
		cellPhone.sendVoid("예 반갑습니다~");
		cellPhone.hangUp();
		
		cellPhone.turnOnDmb();
		cellPhone.changeChannelDmb(86);
		cellPhone.turnOffDmb();
	}
}​

 

 

 

CellPhone클래스를 상속해서 DMB폰 클래스를 작성한 예제

(DMB 오랜만이네..)

 

 

 

 

 

 

 

 

 


메소드 재정의

 

자식 클래스에서 부모 클래스의 메소드를 다시 정의 하는 것.

- 부모의 메소드와 동일한 시그니처(리턴타입, 메소드이름, 매개변수목록)를 가져야 한다.

- 접근 제한을 더 강하게 재정의 할 수 있다.

- 새로운 예와를 throws 할 수 없다.

package chap07;

public class Calculator {
	double areCircle(double r) {
		System.out.println("Calculator 객체의 areaCircle() 실행");
		return 3.14159 * r * r ;
	}
}
package chap07;

public class Computer extends Calculator{

	@Override
	double areCircle(double r) {
						//재정의
		System.out.println("Computer 객체의 areCircle() 실행");
		return Math.PI * r * r;
	}
}
package chap07;

public class ComputerEx {
	public static void main(String[] args) {
		int r = 10;
		
		Calculator calculator = new Calculator();
		System.out.println("원면적: " + calculator.areCircle(r));
		System.out.println();
		
		Computer computer = new Computer();
		System.out.println("원면적: " + computer.areCircle(r));
	}
}

Calculator의 areaCircle() 메소드는 3.14159로 계산했지만 좀 더 정밀한 계산을 위해 Computer areaCircle()메소드를 Math.PI 상수로 계산했다.

 


Math

수학 계산과 관련된 필드와 메소드를 가지고 있는 자바 표준 API

 

 

 

 

 

 

 

 


부모 메소드 호출

super 는 부모 객체를 참조하고 있기 때문에 부모 메소드에 접근 가능하다.

 

package chap07;

public class Airplane {
	public void land() {
		System.out.println("착륙합니다");
	}
	public void fly() {
		System.out.println("일반비행합니다");
	}
	public void takeOff() {
		System.out.println("이륙합니다");
	}
}
package chap07;

public class SupersonicAirplane extends Airplane{
	public static final int NORMAL = 1;
	public static final int SUPERSONIC = 2;
	
	public int flyMode = NORMAL;

	@Override
	public void fly() {
		if (flyMode == NORMAL) {
			System.out.println("초음속비행합니다");
		}else {
			super.fly();
		}
	}
}
package chap07;

public class SupersonicAirplaneEx {
	public static void main(String[] args) {
		SupersonicAirplane sa = new SupersonicAirplane();
		
		sa.takeOff();
		sa.fly();
		sa.flyMode = SupersonicAirplane.SUPERSONIC;
		sa.fly();
		sa.flyMode = SupersonicAirplane.NORMAL;
		sa.fly();
		sa.land();
	}
}

 

 

 

 

 

 

 

 


상속할 수 없는 final 클래스

가장 대표적인 예는 자바 표준 API에서 제공하는 String 클래스.

 

//상속불가
public class NewString extends String {...}

클래스 선언시 final 키워드를 붙여서 이후 extends를 통한 자식 클래스를 만들 수 없다

 

 

 

 

재정의 할 수 없는 final 메서드

메소드를 선언할 때 final 키워드를 붙이면 이 메소드는 최종적인 메소드이므로 재정의 할 수 없다.

즉, 부모 클래스를 상속해서 자식 클래서를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 불가

package chap07;

public class Car {
	public int speed;
	
	public void speedUP() {speed += 1;}
	
	public final void stop() {
		System.out.println("차를 멈춤");
		speed = 0;
	}
}
package chap07;

public class SportCar extends Car{

	@Override
	public void speedUP() {
		speed += 10;
	}
	
	@Override
	public void stop() {
		System.out.println("스포츠카를 멈춤");
		speed = 0; 
	}
}

 

Multiple markers at this line
- Cannot override the final method  from Car
- overrides chap07.Car.stop

 

 

 

 

 

참고:

- 혼자 공부하는 자바(신용권), 한빛미디어

반응형

'개발 > JAVA' 카테고리의 다른 글

[Java] 추상(abstract) 클래스  (0) 2022.07.12
[Java] 타입 변환과 다형성  (0) 2022.07.11
[Java] Getter & Setter  (0) 2022.07.08
[Java] 인스턴스 멤버와 정적 멤버  (0) 2022.07.07
[Java] 메소드  (0) 2022.07.06
복사했습니다!