반응형
상속
: 누군가가 만들어 놓은 클래스를 가져와 이용하는 것을 말한다.
부모가 가진 속성을 그대로 가지고 온다.
기능이나 메소드들을 추가하여 사용하고 싶어서 상속을 이용한다.
- > 잘 사용할 시 편리하고 코드의 양을 줄일 수 있다.
상속은 하나만 가능하며 상속하여 메소드를 재정의할 때 오버라이드를 이용한다.
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();
}
}
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();
}
}
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);
}
}
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);
}
}
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();
}
}
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();
}
}
TIP
오버로딩, 오버라이딩의 차이점
오버로딩 = 오버로드 | 오버라이딩 = 오버라이드 | |
공통점 | 동일한 이름의 메소드 사용 | |
차이점 | 파라미터만 다름 | 동작 방법을 재정의 |
예시 | 파라미터가 다른 생성자 생성할 때 | 상속 시 메소드 안의 내용을 변경할 때 |
반응형
'자바' 카테고리의 다른 글
[Java 초급] 18장 추상 클래스, 인터페이스, 중첩 클래스 (0) | 2023.12.27 |
---|---|
[Java 초급] 17.5장 테스트 (0) | 2023.12.26 |
[Java 초급] 16.5장 테스트 (0) | 2023.12.22 |
[Java 초급] 16장 Getter, Setter, 재귀함수 (0) | 2023.12.22 |
[Java 초급] 15.5.1장 테스트1 (0) | 2023.12.21 |