상속 super() / 메서드 오버라이딩 복습

리무 rimu ·2022년 12월 18일
0

Java

목록 보기
8/35
post-thumbnail

상속이란?

  • 기존 클래스를 확장하는 개념, 다시말해 기존 클래스의 필드, 메서드를 물려받는 것
  • 상속을 사용하면 코드의 중복을 줄일 수 있고, 프로그램을 보다 손쉽게 확장가능
  • 다른 클래스에서 추가 코드 작성하고 싶을 때 사용!
  • 토대가 되는 클래스를 부모클래스, 이를 물려받는 클래스를 자식클래스 라고 함
public class PlayGame {
	public static void main(String[] args) {
		Wizard wi = new Wizard("해리포터",100,100);
		System.out.println(wi.toString());
		}
	}

class Novice {
	// 필드
	private String name;
	private int hp;

	// 생성자
	public Novice(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}

	// toString
	public String toString() {
		return String.format("%s(HP:%d)", this.name, this.hp);
	}
}

// 자식클래스
class Wizard extends Novice { // 자식클래스 extends: Novice 속성 확장
	/*private String name; // Novice 클래스와 중복된 부분 삭제
	private int hp; // Novice 클래스와 중복된 부분 삭제 */
	// 필드
	private int mp;

	// 생성자
	public Wizard(String name, int hp, int mp) {
		/*this.name = name; // Novice 클래스와 중복된 부분 삭제
		this.hp = hp; // Novice 클래스와 중복된 부분 삭제 */

		super(name, hp); // Novice 초기화, 객체의 영역을 만들어 줌
		this.mp = mp;
	}
}
	// toString
	/*public String toString() { // Novice 클래스와 중복된 부분 삭제
		return String.format("%s(HP:%d)", this.name, this.hp);//
	}// Novice 클래스와 중복된 부분 삭제 */

메서드 오버라이딩

부모 메서드를 자식 클래스에서 재정의하는 것

오버라이딩 조건

  1. 상위클래스의 메서드 이름과 같아야 한다.
  2. 매개변수가 같아야 한다.
  3. 반환타입이 같아야 한다.
    => 구현부 부분만 변경

예를 들어 상위 클래스접근제어자가 protected로 설정이 되어 있다면
하위클래스접근제어자는 protected나 public으로 설정해줘야한다.
보통은 같은 범위의 접근제어자를 사용하지만,
가끔 특이한 경우에 다른 접근제어자를 사용해야 하는 경우가 있는데,
이럴때 이 원칙을 생각하면 될것이다.

접근 제어자의 접근 범위를 넓은 범위에서 좁은 범위 순으로 표현하면 다음과 같다.
(public > protected > (default) > private)

class Cat {
	public void cry() {
		System.out.println("야옹~"); // 구현부
	}
}

class Tiger extends Cat {
	public void cry() {
		System.out.println("어흥~"); // 구현부
	}
}

문제 1 ) 초보자(Novice)클래스를 확장하여 마법사(Wizard)클래스를 정의하고 있다.
toString() 메서드를 "오버라이딩"해라!

여기서 접근제한자 중 protected상속 관계시 공개, 즉, 자식들은 공개!

public class PlayGame {
	public static void main(String[] args) {
		// 객체생성
		Novice nov = new Novice("초보", 100);
		Wizard wi = new Wizard("해리포터",100,100);
		
		// 객체 정보 출력
		System.out.println(nov.toString());
		System.out.println(wi.toString());
		}
	}

class Novice {
	// 필드
	protected String name; // 접근제한자(protected: 상속 관계시 공개, 자식들은 공개!)
	protected int hp;

	// 생성자
	public Novice(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}

	// toString
	public String toString() {
		return String.format("[Novice] %s(HP:%d)", this.name, this.hp);
	}
}

// 자식클래스
class Wizard extends Novice { // 자식클래스 extends: Novice 속성 확장)
	
	// 필드
	protected int mp;
	
	// 생성자
	public Wizard(String name, int hp, int mp) {
		super(name, hp); // Novice 초기화, 객체의 영역을 만들어 줌
		this.mp = mp;
	}
	
	public String toString() {
		return String.format("[Wizard] %s(HP:%d) (mp:%d)", this.name, this.hp, this.mp);
	}
}

필요할때 간편히 쓰는 클래스들

Arrays.toString() 배열을 간편히 출력
Collections.suffle() ArrayList요소를 무작위로 섞음
new ArrayList<Integer>() Integer를 담기위한 객체 생성
Integer int타입을 클래스로 변형한 것

예제로 배우는 자바(2018, 무료 JANA 기초 입문) 홍팍 참고
내용은 계속 수정하는 중입니다!

profile
JAVA / SQL / Spring 을 공부하고 있습니다 🐥

0개의 댓글