(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

+ Recent posts