상속
public class Dog extends Animals{ } // Dog클래스가 Animals클래스를 상속 받는다.
- 부모클래스의 자원을 자식클래스에서 사용할 수 있게 하는 것.
- 자식/하위/서브클래스가 부모/상위/슈퍼클래스로부터 상속을 받는다.
- 같은 변수와 같은 메서드를 갖고 있을 때 상속을 사용할 수 있다.
- 상속받는 대상: 부모클래스의 변수/상수와 메서드 (생성자 또는 접근제한자가 private인 필드나 메서드는 상속불가)
- 단일 상속만 가능
- super 와 super( )
- super: 부모클래스의 객체
- super( ): 부모클래스의 디폴트/사용자 생성자 호출
public class Animals {
private int id;
private String name;
private String kind;
private int age;
public Animals() {
}
public Animals(int id, String name, String kind, int age) {
super();
this.id = id;
this.name = name;
this.kind = kind;
this.age = age;
}
----------------------------------------------------------------------------
public class Cat extends Animals{
public Cat() {
// 부모클래스의 사용자 생성자 (디폴트생성자는 ( )일 때)
super(1, "hello", "jo", 11);
}
}
------------------------------------------------------------------------
public class Dog extends Animals{
private int id;
public Dog() {
}
public Dog(int id) {
this.id = id;
super.setId(id); // 부모클래스의 객체가 setId메서드사용
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
Object 클래스
- 자바에서 최상위 클래스
- 자바의 모든 클래스는 자동으로 Object클래스의 모든 필드와 메서드를 상속 받음.
- 클래스에 extends를 이용한 상속이 표기되어 있지 않으면 항상 Object클래스를 상속한 것으로 된다.
메서드 오버라이딩(method overriding)
- 부모클래스로부터 상속받은 메서드를 재정의 하는 것.
- 메서드 내용을 추가 할 시, super.메서드명( ); 밑에 추가할 내용 삽입.
- 접근제한자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
<접근제한자 범위> (복습)
- public : 접근 제한이 없다.
- protected : 같은 패키지,상속받은 자손클래스라면 다른 패키지에서도 사용가능하다.
- default : 같은 패키지 내에서만 사용가능하다.
- private : 같은 클래스 내에서만 사용가능하다.
public class Weapon { // 부모클래스
public void attack() {
System.out.println("몬스터를 공격합니다.");
attackImg();
}
public void attackImg() {
System.out.println("화살을 마구마구 쏩니다.");
}
}
--------------------------------------------------------
public class Bow extends Weapon { // 자식클래스
@Override
public void attackImg() {
System.out.println("활로 공격");
}
}
-------------------------------------------------------
public class Gun extends Weapon { // 자식클래스
@Override
public void attackImg() {
System.out.println("총으로 공격");
}
}
--------------------------------------------------------
public class Sword extends Weapon { // 자식클래스
@Override
public void attackImg() {
System.out.println("검으로 공격");
}
}
--------------------------------------------------------
public class MainEx {
public static void main(String[] args) {
Weapon weapon = new Weapon();
weapon.attack();
Bow bow = new Bow();
bow.attack();
Sword sword = new Sword();
sword.attack();
Gun gun = new Gun();
gun.attack();
}
}
---------------------Console---------------------------
몬스터를 공격합니다.
화살을 마구마구 쏩니다.
몬스터를 공격합니다.
활로 공격
몬스터를 공격합니다.
검으로 공격
몬스터를 공격합니다.
총으로 공격
다형성 (Polymorphism)
- 하나의 객체나 메서드가 여러가지 다른 형태를 가질 수 있는 것.
- 다형성으로 변수를 선언하면, 자료형을 통일하는 효과가 발행!!!
위의 Weapon, Bow, Gun, Sword ... 클래스 활용
---------------------------------------------
public class Hero { // 여러 무기를 갖고있는 Hero
// 다형성을 이용하면 간단히 만들 수 있음
private Weapon[] weapons;
/*private Weapon[] weapons= {
new Bow(),
new Sword(),
new Gun(),
new Bow(), ...
};*/
}
- 다향성 공식
부모클래스 변수명 = new 자식생성자();
public interface Inter1 {
public abstract void me1();
}
--------------------------------------------------------
public interface Inter11 {
public abstract void me11();
}
---------------------------------------------------------
public class Inter1Impl implements Inter1, Inter11 {
@Override
public void me1() {
System.out.println("자바는 기본적으로 이렇게 사용함.");
}
@Override
public void me11() {
System.out.println("자바는 기본적으로 이렇게 사용함.2");
}
}
----------------------------------------------------------
public class MainEx {
public static void main(String[] args) {
// 기본 객체 생성
Inter1Impl i1 = new Inter1Impl();
i1.me1();
// 다형성 사용
Inter11 i2 = new Inter1Impl();
i2.me11();
}
}
------------------Console----------------------------------
자바는 기본적으로 이렇게 사용함.
자바는 기본적으로 이렇게 사용함.2
다향성의 단점
- 자식클래스가 갖고있는 고유한 자원에 접근할 수 없다.
- 이러한 단점을 보완하기 위해 if문과 instanceof연산자를 이용해서
해당 변수가 특정클래스의 생성자를 이용해서 만든 객체인지 확인 후
형변환을 하고나서 해당 자원을 호출한다.
- 최근에는 getClass를 더 사용한다.
public class Fruits { // 부모클래스
public void eat() {
System.out.println("과일을 먹는다.");
}
}
-------------------------------------------------------------------
public class Apple extends Fruits { // 자식클래스
@Override
public void eat() {
System.out.println("사과를 먹는다.");
}
public void stop() {
System.out.println("멈춰.");
}
}
---------------------------------------------------------------------
public class Banana extends Fruits { // 자식클래스
public void run(){
System.out.println("바나나를 먹는다.");
}
}
----------------------------------------------------------------------
public class MainEx {
public static void main(String[] args) {
Fruits apple = new Apple(); // Apple객체 생성
Fruits banana = new Banana(); // Banana객체 생성
apple.stop(); // 오류(자식클래스의 고유 자원 접근 불가)
if(apple instanceof Apple) { // 해당 변수가 특정클래스의 생성자를 이용해서 만든 객체인지 확인
Apple a = (Apple)apple; // 형변환
a.stop();
}else {
System.out.println("xxx");
}
if(banana instanceof Apple) {
Apple b = (Apple)banana;
b.stop();
}else {
System.out.println("xxx");
}
if(banana instanceof Banana) {
Banana b = (Banana) banana;
b.run();
}else {
System.out.println("xxx");
}
if(apple.getClass()== Fruits.class) { // 요즘은 instanceof보다 getClass()메서드를 이용.
Banana b = (Banana)apple;
b.run();
}else {
System.out.println("xxx");
}
}
}
----------------------------Console--------------------------------
멈춰.
xxx
바나나를 먹는다.
xxx
추상화(Abstract)
추상메서드
- abstract 키워드가 붙은 메서드
- 부모클래스에서 본문이 없는 메서드(원래 메서드에 본문이 없으면 에러발생)
- 자식클래스에서 반드시 오버라이딩을 해야하는 메서드를 알려주고 싶을 때 사용
- 추상메서드를 갖고있는 클래스는 반드시 추상클래스로 선언해야 함. (역은 성립x)
추상클래스
- abstract 키워드가 붙은 클래스
- 부모클래스로 객체 생성을 막기 위해 사용 (new 부모클래스( ))
public abstract class Student { // 추상클래스
public void me1() {
System.out.println("me1():::::::::");
}
public void me2() {
System.out.println("me2():::::::::");
}
// 무조건 자식 클래스에서 오버라이딩 해야하므로
// 메서드의 본문내용 필요x
public abstract void me3(); // 추상메서드
}
----------------------------------------------
public class ElementStudent extends Student {
@Override
public void me3() {
System.out.println("교복을 안 입음.");
}
}
-----------------------------------------------
public class MiddleStudent extends Student{
@Override
public void me3() {
System.out.println("중학교 교복을 입음.");
}
}
------------------------------------------------
public class HighStudent extends Student {
@Override
public void me3() {
System.out.println("고등학교 교복을 입음.");
}
}
--------------------------------------------------
public class MainEx {
public static void main(String[] args) {
// Student가 추상클래스이므로 new Student()
// 형태로 객체를 생성할 수 없음.
// Student kim = new Student();
Student kim = new ElementStudent();
Student lee = new MiddleStudent();
Student park = new HighStudent();
kim.me3();
lee.me3();
park.me3();
}
}
------------------------Console--------------------
교복을 안 입음.
중학교 교복을 입음.
고등학교 교복을 입음.
위의 weapon의 main메서드 에서
public class MainEx {
public static void main(String[] args) {
// Weapon이 추상클래스이므로 new Weapon() 생성 불가
// Weapon weapon = new Weapon();
// weapon.attack();
Bow bow = new Bow();
bow.attack();
Sword sword = new Sword();
sword.attack();
Gun gun = new Gun();
gun.attack();
}
}
-------------------Console--------------------------------
몬스터를 공격합니다.
활로 공격
몬스터를 공격합니다.
검으로 공격
몬스터를 공격합니다.
총으로 공격
추상메서드 특징
- 자식클래스에서 반드시 구현해야 하는 메서드
- 그러나 자식클래스가 추상클래스면,
자식클래스에서는 부모의 추상메서드를 구현(오버라이딩)하지 않아도 됨. (추상메서드 = 부모의 빚)
public abstract class Unit { // 부모클래스
public abstract void attack();
public abstract void heal();
}
------------------------------------------------------------
// 오버라이딩 한 것.(추상클래스o, 추상메서드o)
public abstract class Protos extends Unit { // 자식클래스
public abstract void zuzu();
@Override
public void attack() {
// TODO Auto-generated method stub
System.out.println("공격");
}
@Override
public void heal() {
// TODO Auto-generated method stub
}
}
------------------------------------------------------------
// 오버라이딩 안해도 됨.(추상클래스o, 추상메서드x)
public abstract class Terran extends Unit{ // 자식클래스
}
-------------------------------------------------------------
// 오버라이딩 안해도 됨 (추상클래스o, 추상메서드o)
public abstract class Zerg extends Unit { // 자식클래스
public abstract void bubu();
}
'자바(java)' 카테고리의 다른 글
인터페이스(Interface) (0) | 2023.03.09 |
---|---|
Final(변수, 메서드, 클래스) (0) | 2023.03.09 |
String 클래스 (0) | 2023.03.07 |
스태틱(클래스)변수와 인스턴스변수 (0) | 2023.03.06 |
배열 (Array) (0) | 2023.03.06 |