반응형

 

상속

 

: 누군가가 만들어 놓은 클래스를 가져와 이용하는 것을 말한다.

부모가 가진 속성을 그대로 가지고 온다.

 

기능이나 메소드들을 추가하여 사용하고 싶어서 상속을 이용한다.

- > 잘 사용할 시 편리하고 코드의 양을 줄일 수 있다.

 

상속은 하나만 가능하며 상속하여 메소드를 재정의할 때 오버라이드를 이용한다.

private의 접근 제한을 가진 것은 상속 대상에서 제외된다.

 

최상위 클래스 : object

 

 

package kr.or.ddit.study07;

public class Computer {
	
	public void run() {
		System.out.println("컴퓨터 동작");
	}
}

 

package kr.or.ddit.study07;

public class Computer486 extends Computer {
	
	// 오버라이드 : 부모 클래스에서 만든 메소드를 재정의하여 사용한다.
	@Override
	public void run() {
		System.out.println("486 컴퓨터 동작");
		
		// super : 부모의 run 메소드
//		super.run();
	}
	
	public void monitor() {
		System.out.println("모니터 동작");
	}
	
}

 

package kr.or.ddit.study07;

public class ComputerI5 extends Computer{
	
}

 

package kr.or.ddit.study07;

public class ComputerMain {
	public static void main(String[] args) {
		Computer486 c486 = new Computer486();
		// 오버라이드를 사용하여 재정의함
		c486.run();
		c486.monitor();
		
		ComputerI5 cI5 = new ComputerI5();
		cI5.keyboard();
		cI5.mouse();
		cI5.run();
	}
}

 

결과 화면1

 

 

package kr.or.ddit.study07.phone;

public class Phone {
	
	public void call() {
		System.out.println("LTE 전화");
	}
	
	public void camera() {
		System.out.println("찰칵");
	}
}

 

package kr.or.ddit.study07.phone;

public class DmbPhone extends Phone{
	
	public void dmb() {
		System.out.println("tv 시청");
	}
}

 

package kr.or.ddit.study07.phone;

public class SmartPhone extends Phone{
	public void touch() {
		System.out.println("터치 기능 추가");
	}
	
	public void internet() {
		System.out.println("인터넷 접속 추가");
	}
}

 

package kr.or.ddit.study07.phone;

public class IPhone extends SmartPhone{
	
	@Override
	public void camera() {
		System.out.println("1000만 화소 카메라");
	}
	
	public void appstore() {
		System.out.println("앱스토어 접속");
	}
}

 

package kr.or.ddit.study07.phone;

public class PhoneMain {
	public static void main(String[] args) {
		System.out.println("Phone");
		Phone phone = new Phone();
		phone.call();
		phone.camera();
		System.out.println();
		
		System.out.println("DmbPhone");
		DmbPhone dmbPhone = new DmbPhone();
		dmbPhone.camera();
		dmbPhone.call();
		dmbPhone.dmb();
		System.out.println();
		
		System.out.println("SmartPhone");
		SmartPhone smartPhone = new SmartPhone();
		smartPhone.internet();
		smartPhone.call();
		smartPhone.camera();
//		smartPhone.touch();
		System.out.println();
		
		System.out.println("IPhone");
		IPhone iPhone = new IPhone();
		iPhone.camera();
		iPhone.appstore();
	}
}

 

결과 화면2

 

 

package kr.or.ddit.study07.Pen;

public class Pen {
	private int amount; // 남은 양
	private String color; // 볼펜 색
	
	public int getAmount() {
		return amount;
	}
	
	public void setAmount(int amount) {
		this.amount = amount;
	}
}

 

package kr.or.ddit.study07.Pen;

public class SharpPencil extends Pen{ // 샤프펜슬
	private int width; // 펜의 굵기
}

 

package kr.or.ddit.study07.Pen;

public class Ballpen extends Pen{ // 볼펜
	private String color; // 볼펜의 색
	
	public String setColor() {
		return color;
	}
	
	public void setColor(String color) {
		this.color = color;
	}
	
}

 

package kr.or.ddit.study07.Pen;

public class FountainPen extends Ballpen{ // 만년필
//	private int amount; // 남은 양
//	private String color; // 볼펜 색
	
//	public int getAmount() {
//		return amount;
//	}
	
//	public void setAmount(int amount) {
//		this.amount = amount;
//	}
	
//	public String getColor() {
//		return color;
//	}
	
//	public void setColor(String color) {
//		this.color = color;
//	}
	
	public void refill(int n) {
		setAmount(n);
	}
}

 

package kr.or.ddit.study07.Pen;

public class PenMain {
	public static void main(String[] args) {
		FountainPen fp = new FountainPen();
		fp.setAmount(10);
		fp.setColor("red");
		
		int amount = fp.getAmount();
		System.out.println(amount);
	}
}

 

결과 화면3

 

 

package kr.or.ddit.study07.person;

public class Person {
	private int age; // 나이
	private String name; // 이름
	private String gender; // 성별

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}
}

 

package kr.or.ddit.study07.person;

public class Student extends Person{
	private String room; // 반
	private int score; // 점수
	
	public String getRoom() {
		return room;
	}
	
	public void setRoom(String room) {
		this.room = room;
	}
	
	public int getScore() {
		return score;
	}
	
	public void setScore(int score) {
		this.score = score;
	}

	@Override
	public String toString() {
		return "Student [room=" + room + ", score=" + score + ", getAge()=" + getAge() + ", getName()=" + getName()
				+ ", getGender()=" + getGender() + "]";
	}
	
}

 

package kr.or.ddit.study07.person;

public class SalaryMan extends Person {
	private String company; // 회사이름
	private int salary; // 연봉
	private String dept; // 부서
	
	public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	public String getDept() {
		return dept;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
	
	@Override
	public String toString() {
		return "SalaryMan [company=" + company + ", salary=" + salary + ", dept=" + dept + ", getAge()=" + getAge()
				+ ", getName()=" + getName() + ", getGender()=" + getGender() + "]";
	}
	
//	@Override
//	public String toString() {
//		super.getAge();
//		super.getGender();
//		super.getName();
//		return "SalaryMan [company=" + company + ", salary=" + salary + ", dept=" + dept + "]";
//	}
}

 

package kr.or.ddit.study07.person;

import java.util.Scanner;

public class PersonMain {
	public static void main(String[] args) {
		/*
		 * Person
		 * age
		 * name
		 * 성별
		 * -------------
		 * Student
		 * 반
		 * 점수
		 * -------------
		 * SalaryMan
		 * 회사 이름
		 * 연봉
		 * 부서
		 */
		
		SalaryMan sm = new SalaryMan();
		sm.setAge(20);
		sm.setName("김수연");
		sm.setGender("남");
		sm.setDept("영업");
		sm.setCompany("1g");
		System.out.println(sm);
		System.out.println();
		
		Student st = new Student();
		st.setAge(22);
		st.setName("강수수");
		st.setGender("여");
		st.setRoom("3반");
		st.setScore(345);
		System.out.println(st);
	}
}

 

결과 화면4

 

 

package kr.or.ddit.study07.shape;

public class Point {
	private int x;
	private int y;
	
	public int getX() {
		return x;
	}
	
	public void setX(int x) {
		this.x = x;
	}
	
	public int getY() {
		return y;
	}
	
	public void setY(int y) {
		this.y = y;
	}
}

 

package kr.or.ddit.study07.shape;

public class Point {
	private int x;
	private int y;
	
	Point() {
	}
	
	Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	public int getX() {
		return x;
	}
	
	public void setX(int x) {
		this.x = x;
	}
	
	public int getY() {
		return y;
	}
	
	public void setY(int y) {
		this.y = y;
	}
}

 

package kr.or.ddit.study07.shape;

public class Triangle extends Shape{
	private int area;
	
	// Shape에서는 name과 point를 반드시 받았기에 Triangle에서도 반드시 받아야 함.
	Triangle(Point[] p) {
		super("삼각형", p);
	}
}

 

package kr.or.ddit.study07.shape;

public class Rectangle extends Shape{
	int area;
	
	Rectangle(String name, Point[] p) {
		// 부모 클래스에 존재함.
		super(name, p);
	}
}

 

package kr.or.ddit.study07.shape;

public class RightTriangel extends Triangle{
	
	RightTriangel(Point[] p) {
		super(p);
	}
}

 

package kr.or.ddit.study07.shape;

public class ShapeMain {
	public static void main(String[] args) {
		/*
		 * Point
		 * x, y 좌표
		 * 
		 * shape
		 * 이름
		 * Point 배열
		 * 
		 * 사각형
		 * 
		 * 삼각형
		 * 
		 */
		
		Point[] p = {new Point(0,0), new Point(2,1), new Point(1,1)};
		Triangle tr = new Triangle(p);
	}
}

 

 

 

final 클래스, final 메소드

 

+ final 변수란

수정될 수 없는 변수를 이야기 하며 변수명을 대문자로 하여 사용한다.

ex) 𝝅

 

위와 같이 final 클래스와 메소드는

수정될 수 없으상속을 할 수 없다.

 

 

 

 

다형성

 

: 사용 방법동일하지만 다양한 객체를 활용해 여러 실행결과가 나오도록 하는 것을 말한다.

부모 클래스다시 재정의한다.

 

 

 

package kr.or.ddit.study07.animal;

public class Animal {
	
	public void cry() {
	}
}

 

package kr.or.ddit.study07.animal;

public class Cat extends Animal{
	@Override
	public void cry() {
		System.out.println("야옹");
	}
}

 

package kr.or.ddit.study07.animal;

public class Dog extends Animal{
	@Override
	public void cry() {
		System.out.println("멍멍");
	}
}

 

package kr.or.ddit.study07.animal;

import java.util.Scanner;

public class AnimalMain {
	public static void main(String[] args) {
		Animal ani = null;
		
		Scanner sc = new Scanner(System.in);
		System.out.println("1. 고양이");
		System.out.println("2. 개");
		int sel = sc.nextInt();
		
		// 다형성
		if(sel == 1) {
			ani = new Cat();
		} else if(sel == 2) {
			ani = new Dog();
		}
		ani.cry();
		
	}
}

 

결과 화면5

 

 

package kr.or.ddit.study07.car;

public class Car {
	
	public void startCar() {
		System.out.println("시동을 켜다.");
	}
	
	public void turnOff() {
		System.out.println("시동을 끄다.");
	}
	
	public void stop() {
		
	}
	
	public void drive() {
		System.out.println();
	}
	
	public void run() {
		startCar();
		drive();
		stop();
		turnOff();
	}
}

 

package kr.or.ddit.study07.car;

public class AICar extends Car{
	
	@Override
	public void drive() {
		System.out.println("자율 주행을 합니다.");
	}
	
	@Override
	public void stop() {
		System.out.println("자동차가 스스로 멈춥니다.");
	}
}

 

package kr.or.ddit.study07.car;

public class ManualCar extends Car{
	@Override
	public void drive() {
		System.out.println("사람이 운전합니다.");
	}
	
	@Override
	public void stop() {
		System.out.println("사람이 브레이크를 사용하여 차를 멈춥니다.");
	}
}

 

package kr.or.ddit.study07.car;

public class CarMain {
	public static void main(String[] args) {
		/*
		 * Car
		 * run 
		 * startCar()
		 * turnOff()
		 * drive()
		 * stop()
		 * 
		 */
		
		// 부모 클래스 = 자식 클래스 : 부모 클래스에 있는 내용이 자식 클래스의 내용으로 덮어씌워짐
		// >> 오버라이드 됨
		Car c1 = new AICar();
		c1.run();
		System.out.println();
		
		Car c2 = new ManualCar();
		c2.run();
	}
}

 

결과 화면6

 

 

 

TIP

 

오버로딩, 오버라이딩의 차이점

 

  오버로딩 = 오버로드 오버라이딩 = 오버라이드
공통점 동일한 이름의 메소드 사용
차이점 파라미터만 다름 동작 방법을 재정의
예시 파라미터가 다른 생성자 생성할 때 상속 시 메소드 안의 내용을 변경할 때

 

 

반응형