본문 바로가기

자바(java)

상속 (Inheritance)

상속

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