ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 상속
    Java 2023. 2. 18. 17:58
    학습 목표

    상속에 대한 개념
    메서드 오버 라이딩 -> 재정의
    메서드 오버 로딩 -> 같은 메서드 이름으로 사용할 수 있게 한다 (매개변수로 구분 가능)
    접근 제어 지시자 의미 확인 -> protected

     

     

     

    클래스 상속

     

    기존의 클래스를 재사용하여 속성이나 기능을 확장하여 새로운 클래스를 작성하는 것이다.

    자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 물려받는다. (extends 키워드를 사용)

     

    소스 코드를 보면서 이해하자

     

    package ch10;
    
    public class A {
    	String name;
    	int height;
    	int weight;
    	int age;
    
    }// end of A class
    //기능을 추가하기 위해서
    
    class B {
    	String name;
    	int height;
    	int weight;
    	int age;
    
    	int level;
    	String nicName;
    
    }// end of B class
    //A와C는 상속관계 
    
    class C extends A {
    	String phone;
    }// end of C class
    package ch10;
    
    public class Test {
    	// 코드 테스트
    	public static void main(String[] args) {
    
    		C myC = new C();
    		myC.age = 100;
    		System.out.println(myC.age);
    
    	}
    }
    결과를 보면 A(부모)에게 C(자식)이 상속을 받으니 A에 있던걸 사용할수 있다.

     

     

    오버라이드

    부모에게 상속받은 기능을 재정의

     

    이번에도 코드소스를 보며 이해하도록 하자

     

    package ch10;
    
    public class Cal {
    	
    	
    	public int sum(int n1,int n2) {
    		return n1 + n2;
    	}
    	
    	public int multiply(int n1,int n2) {
    		System.out.println("부모 메서드");
    		return n1 * n2;
    	}
    }
    class Cal2 extends Cal	{
    	
    	public int minus(int n1,int n2) {
    		return n1 - n2;
    	}
    	// 오버 라이드 != 오버 로딩 ()
    	// 재정의한다 : 부모에 있는 메서드를 재 정의한다.
    	// 조건 : 메서드 모양이 똑같아야 한다.
    //	public int multiply(int n1,int n2) {
    //		System.out.println("자식 메서드");
    //		if (n1 == 0 || n2 ==0) {
    //			System.out.println("0을 입력하였습니다.");
    //		}
    //		return n1 * n2;
    //	}
    	//sum 컨트롤 + 스페이스
    	//주석 + 힌트
    	@Override	//어노테이션
    	public int sum(int n1, int n2) {
    		System.out.println("n1 :"+n1+"을 입력 하였습니다.");
    		return super.sum(n1, n2);
    	}
    }
    소스 코드를 보면 부모(Cal)이 들고 있는 sum 메서드를 Cal2가 들고와서 재정의 한걸 볼수있다.
    super 키워드는 자식 클래스에서 부모 클래스를 재정의 할때 부모 클래스의 메소드는 사용할 수가 없다.
    그걸 보완하고자 자식클래스에서 부모 클래스의 메소드를 사용하고자 할때 super 키워드를 사용하게 된다.

     

    이번에는 여러 자식들이 부모에게 상속을 받아보고 자식 객체에 각자 메소드를 가지게 해보자.

     

    package ex11;
    
    public class Hero {
    	String name; 
    	int hp; 
    	
    	public Hero(String name, int hp) {
    		System.out.println("Hero 클래스 생성 합니다.");
    		this.name = name; 
    		this.hp = hp; 
    	}
    	
    	void attack() {
    		System.out.println("기본 공격 합니다");
    	}
    	
    }
    ackage ex11;
    
    public class Wizard extends Hero {
    
    	public Wizard(String name, int hp) {
    		super(name, hp);
    	}
    	
    	void freezing() {
    		System.out.println(name + " 가 얼음 공격을 합니다");
    	}
    
    }
    package ex11;
    
    public class Warrior extends Hero {
    	
    	public Warrior(String name, int hp) {
    		// 부모 클래스에 사용자 정의 생성자가 있다면 
    		// 부모 생성자를 반드시 호출 하여야 한다. 
    		// System.out.println("11111111"); // 부모 정의 생성자가 있으면 먼저 호출 해 주어야 한다. 
    		super(name, hp); // super 키워드는 부모 생성자를 호출 하는 녀셕이다.
    		System.out.println("Warrior 생성자 마지막 줄 코드");
    	}
    	
    	void comboAttack() {
    		System.out.println(name + " 가 2단 공격을 합니다.");
    	}
    	// 테스트 코드 
    	public static void main(String[] args) {
    		Warrior warrior = new Warrior("야스오", 100);
    		warrior.comboAttack();
    	}
    }
    package ex11;
    
    public class Archer extends Hero {
    	
    	public Archer(String name, int hp) {
    		super(name, hp); // super 키워드는 부모 생성자를 호출 하는 녀셕이다.
    	}
    	
    	void fireArror() {
    		System.out.println(name + " 가 불화살 공격 합니다.");
    	}
    	
    }

     

    여기서 protected을 선언해보자

     

    package ex11;
    
    public class Hero {
    	// protected -> 자식 클래스에서 접근 가능한 레벨링이다. 
    	// 같은 패키지 안에서 접근 가능 하다. 
    	protected String name; 
    	protected int hp; 
    	
    	public Hero(String name, int hp) {
    		System.out.println("Hero 클래스 생성 합니다.");
    		this.name = name; 
    		this.hp = hp; 
    	}
    	
    	protected void attack() {
    		System.out.println("기본 공격 합니다");
    	}
    	
    }
    protected는 같은 패키지에서는 default와 같이 접근 제한이 없지만, 다른 패키지에서는 자식 클래스만 접근을 허용한다.

     

    'Java' 카테고리의 다른 글

    추상 클래스  (0) 2023.02.18
    다형성  (0) 2023.02.18
    배열  (2) 2023.02.18
    static  (0) 2023.02.13
    this  (0) 2023.02.13
Designed by Tistory.