(1) 상속(Inheritance)
효과)
- 부모 클래스를 재사용해서 자식 클래스를 빨리 개발할 수 있다.
- 반복된 코드의 중복을 줄여준다.
- 유지 보수의 편리성을 제공해 준다.
- 객체의 다형성을 구현할 수 있다.
제한)
- 부모 클래스의 private 접근을 갖는 필드와 메소드는 제외된다.
- 부모 클래스가 다른 패키지에 있을 경우, default 접근을 갖는 필드와 메소드는 제한된다.
- 자식 클래스는 부모 클래스의 필드와 메소드를 사용 or 자신의 필드와 메소드를 추가하여 사용할 수 있지만, 부모 클래스는 자식 클래스의 필드와 메소드를 사용할 수 x (only 자신의 필드와 메소드만 사용 가능)
1.상위클래스의 변수, 메소드를 하위클래스에서 사용 가능
2.형식) extends keyword 사용 : 자식 클래스가 부모 클래스를 선택해서 물려받음
하위 sub 상위 super
자식 child 클래스 부모 parent 클래스
접근제어자 class ClassName extends ClassName {
}
3.클래스는 단일 상속만 가능 (다중 상속 불가능, 계층적 상속 구조 가능)
4.모든 클래스의 최상위 클래스는 Object이다.
--------> Object의 메소드는 모든 클래스에서 사용 가능하다.
5.상위 클래스의 field, method는 상속된다.
( but, 생성자, private field & method는 상속되지 x)
6.method의 overriding (재정의) vs overloading (다중정의) ***************************
: 상위 클래스가 가진 메소드를 하위 클래스에 적합하게 변경 (재정의하는 작업)
: 상위 클래스의 메소드와 반드시 형식 일치 (단, 접근제어자는 넓은 의미로 변경 가능)
> public을 default나 private으로 수정할 수 없다.
> 반대로 default는 public으로 수정할 수 있다.
> 하위 클래스가 상위 클래스의 메소드를 '올라타다' (override)
(but, 상위 클래스의 메소드가 사라지는 것은 아님!!!!!)
* @Override 어노테이션 -- 다형성에서 많이 사용**
(개발자가 메소드 이름의 철자를 잘못 입력한 경우, 매개변수에 엉뚱한 값을 넣은 경우, 리턴타입에 잘못된 타입을 입력한 경우... 올바르게 부모 메소드를 재정의 하도록 도와주는 용도 )
> 컴파일러에게 부모 클래스의 메소드 선언부와 동일한지 검사하도록 지시한다.
- 잘못된 경우가 있다면, 컴파일 오류를 출력한다.
> 정확한 메소드 재정의를 위해 @Override를 붙여주는 것이 좋다.
효과)
> 부모 메소드는 숨겨지는 효과 > 재정의된 자식 메소드가 실행되기 때문에
7. this, super : 자기 객체 안에서만 사용가능, 객체 밖에서는 사용 x
super() : 자식 생성자의 첫줄에서만 가능
: 상위클래스(부모 클래스)의 생성자 호출 (하위 클래스의 생성자에 생략되어 있음)
: 부모 클래스에 기본 생성자(default)가 없다면 필수적으로 자식 클래스의 생성자에서 부모 생성자 super(매개변수)를 호출하여 작성해야 한다!!!!
**this(), super() 같이 못 씀!!!!!
Q. 자식 객체를 생성하면 부모 객체도 생성되는가?
> 자식 객체를 생성할 때, 부모 객체부터 생성되고 -> 자식 객체가 생성된다.
> 부모 생성자가 호출 완료되고, 자식 생성자가 나중에 호출 완료된다. --> 부모 객체를 초기화하는 역할
* eclipse에서 사용 : Source에서 Override/implement Methods...클릭
or
ctrl+space바 (현재 상속받고 있는 메소드들이 나온다.)
8.
- is a : 상속 관계 (~이다/ 자동차 - 트럭, 택시....)
import java.awt.*;
public class IsATest extends Frame {
//Frame은 창이 출력되기 때문에 상속관계
Button b = new Button("눌러주세요!!"); //처음부터 글자 출력 (버튼은 포함관계)
public IsATest(){
super("Is A Test!!!!");
//setTitle("Is A Test!!!!");//제목표시줄에 입력하기
setLayout(new FlowLayout());
//b.setLabel("눌러주세요");
add(b);
setBackground(Color.cyan);
setSize(400,300);
setLocation(300,200);
setVisible(true);
}
public static void main(String[] args) {
new IsATest();
}
}
- has a : 포함 관계 (~포함된다/ 엔진,핸들....)
import java.awt.*;
public class HasATest {
Frame f = new Frame("Has A Test!!!!"); //처음부터 제목표시줄에 타이틀 출력
Button b = new Button("눌러주세요"); //처음부터 글자 출력
public HasATest(){
//f.setTitle("Has A Test!!!!");//제목표시줄에 입력하기
f.setLayout(new FlowLayout());
//b.setLabel("눌러주세요");
f.add(b);
f.setBackground(Color.orange);
f.setSize(400,300);
f.setLocation(300,200);
f.setVisible(true);
}
public static void main(String[] args) {
new HasATest();
}
}
******9.다형성 : 하위 클래스를 참조하여 상위 클래스의 객체를 생성할 수 있다.(추상클래스, 인터페이스에서 엄청 중요!!!!)
Car car = new Car();
Car car = new Taxi();
> 인터페이스 클래스 자체가 데이터 타입이 될 수 있다!!!!!
- 주석 : 컴파일 할 때 빼고 실행된다는 의미,
- 어노테이션(Annotation) : 프로그램에게 추가적인 정보를 제공해주는 주석의 일종,
*자바5부터 나옴* : 상황에 따라 다양한 의미가 있다.(자바에서는 @Override 정도만 알기!!)
용도)
① 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.
ex) 메소드가 재정의 되었는지 확인, 내가 지금 작성한 코드가 부모클래스에 있는 메소드인지 확인 (@Override)
② 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공
ex) XML 설정 파일을 자동 생성하거나 배포를 위한 JAR 압축 파일을 자동 생성
③ 실행시 특정 기능을 실행하도록 정보를 제공
ex) 객체가 어플리케이션 내부에서 해야 할 역할을 정의(서블릿, 컨트롤러....)
public class Car{
String carName;
String carColor;
String maker;
int speed;
public Car() {
this ("아반떼", "흰색", "현대");
}
public Car(String carName) {
this (carName, "흰색", "현대");
}
public Car(String carName, String carColor) {
this(carName,carColor,"현대");
}
public Car(String carName, String carColor, String maker) {
this.carName = carName;
this.carColor = carColor;
this.maker = maker;
}
void speedUp() {
speed += 10;
}
int speedUp(int speed) {
this.speed += speed;
return this.speed;
}
void speedDown() {
speed -= 10;
if(speed < 0)
stop();
}
void stop() {
speed = 0;
}
@Override //annotation : 자바에서는 override만 기억하면 된다. 상황에 따라 다름, @Override는 오타 잡을 때 등에 사용됨
public boolean equals(Object obj){ //반드시 public을 붙여줘야 한다.
boolean flag = false; //초기화
Car car = (Car) obj; //Car타입으로 형변환
if (carName == car.carName){
flag = true;
}
return flag;
}
@Override
public String toString(){ //객체의 문자열 표현을 반환한다.
return maker + "에서 만든 " + carColor + " " + carName;
}
}
public class Taxi extends Car{ //Taxi는 Car라는 클래스를 상속 받겠다라는 의미
int price;
public Taxi(){ //기본요금
price = 3800;
}
public Taxi(String carName, String carColor, String maker) {
super(carName, carColor, maker);
}
int calculatePrice(int km){ //km당 300원
return price + (km * 300);
}
@Override
public int speedUp(int speed){
speed = super.speedUp(speed);
if (speed > 200){
this.speed = 200;
}
return this.speed;
}
@Override
public String toString(){
return super.toString() + "택시 속도 : " + speed; //상위가 가진 toString을 호출해라
}
}
public class TaxiUser {
public static void main(String[] args) {
Taxi t1 = new Taxi();
//t1.carName = "K7";
//System.out.println(t1.info()); //결과 : 현대에서 만든 흰색 아반떼 > 인자값이 없는 Car 기본 생성자 호출하기 때문에
System.out.println(t1.toString()); //Taxi@15db9742 > Taxi 타입 @ 주소값 -- but,실제로는 별로 필요 없는 메소드..따라서 overriding으로 재정의 해주기
t1.speedUp(300);
System.out.println(t1);
Taxi t2 = new Taxi("K5", "감홍색", "기아"); // 생성자는 상속이 안되기 때문에 새로 생성자 만들어 줘야 함.
//System.out.println(t2.info());
System.out.println(t2);// toString은 t2만 입력해도 ok
Taxi t3 = new Taxi("K5", "감홍색", "기아");
//Object의 override하기 전 equals method는 주소값을 비교한다(결과 : 다른 택시다.)
//override 후(Car 클래스에) 차이름이 같으면 true
if (t2.equals(t3)){ //t2랑 t3랑 같나?
System.out.println("t2와 t3는 같은 택시다.");
} else {
System.out.println("t2와 t3는 다른 택시다.");
}
}
}
ex)
자동차 (이름, 색상, 제조사, 속도, 가속(), 감속(), 정지())
택시 버스 트럭
필드 요금 승객수 중량
정원수(45)
메소드 요금계산 승차() 상차()
하차() 하차()
public class Bus extends Car{
private int passenger; //승객수
int totalPassenger = 45; //정원수(45) - 처음 만들어질 때부터 정원 고정
public Bus(String carName, String carColor, String maker) { //외부에서 값 입력되도록
super(carName, carColor, maker);
}
int getOn(int passenger){
this.passenger += passenger;
if (this.passenger > 45){ //= if(this.passenger > totalPassenger)
this.passenger = 45; // = this.passenger = totalPassenger
}
return this.passenger;
}
int getOff(int passenger){
this.passenger -= passenger;
if(this.passenger<0) //빼먹음..
this.passenger = 0;//빼먹음..
return this.passenger;
}
//void info(){
@Override
public String toString(){
//System.out.println("현재 탑승인원 : " + passenger + "명, 가능인원 : " + (totalPassenger-passenger) + "명");
return "현재 탑승인원 :" + passenger + "명, 가능인원 : " + (totalPassenger-passenger) + "명";
}
@Override
public int speedUp(int speed){ //상위 클래스 메소드 선언부 그대로 복사(동일해야 함)
speed = super.speedUp(speed); //this.speed = speed;(x)
if (speed > 110){
this.speed = 110;
}
return this.speed;
}
}
public class BusUser {
public static void main(String[] args) {
Bus bus1 = new Bus("기아","알록달록","에어로");
//기아에서 만든 알록달록 에어로버스
System.out.println(bus1.carName + "에서 만든 " + bus1.carColor + " " + bus1.maker + "버스");
//현재 탑승인원 : 0명, 가능인원 : 45명
System.out.println(bus1);
//첫번째 정류장에서 8명 탑승
bus1.getOn(8);
//현재 탑승인원 : 8명, 가능인원 : 37명
System.out.println(bus1);
//두번째 정류장에서 10명 탑승, 3명 하차
bus1.getOff(3); //하차를 먼저 해야 가능인원을 계산할 수 있다.
bus1.getOn(10);
//현재 탑승인원 : 15명, 가능인원 : 30명
System.out.println(bus1);
//세번째 정류장에서 30명 탑승, 8명 하차
bus1.getOff(8);
bus1.getOn(30);
//현재 탑승인원 : 37명, 가능인원 : 8명
System.out.println(bus1);
//네번째 정류장에서 20명 탑승, 10명 하차
bus1.getOff(10);
bus1.getOn(20);
//현재 탑승인원 : 45명, 가능인원 : 0명 // 내리고 타야 됨!!! 순서 중요~~
System.out.println(bus1);
//버스가 120으로 진행
//버스 속도는 110입니다. 제한속도
bus1.speedUp(120);
System.out.println("버스속도 : " + bus1.speed);
}
}
---------- run ----------
기아에서 만든 알록달록 에어로버스
현재 탑승인원 :0명, 가능인원 : 45명
현재 탑승인원 :8명, 가능인원 : 37명
현재 탑승인원 :15명, 가능인원 : 30명
현재 탑승인원 :37명, 가능인원 : 8명
현재 탑승인원 :45명, 가능인원 : 0명
버스속도 : 110
'Language > Java' 카테고리의 다른 글
19.10.31. (API문서(Calendar)/추상클래스 객체 생성 방법/인터페이스/Implements/인터페이스의 default method/추상클래스vs인터페이스) (0) | 2021.02.14 |
---|---|
19.10.30.(추상 클래스(Abstract Class)/추상 메소드(Abstract Method)/클래스 형변환) (0) | 2021.02.14 |
19.10.28. (TV프로그램, 스타크래프트 소스, Call by value, Call by reference, Getter, Setter) (0) | 2021.01.15 |
19.10.26. (배열의 길이/다차원 배열/객체 참조 배열/배열 복사/향상된 for문) (0) | 2021.01.15 |
19.10.25. (Car/CarUser) (0) | 2021.01.15 |