상속과 오버라이딩

성혜·2024년 1월 21일
0

Java

목록 보기
9/25
post-thumbnail

상속, Inheritace

부모가 가지는 재산을 자식에게 물려주는 행동

  • 부모(클래스)가 가지는 재산(멤버 변수, 메서드)을 자식(클래스)에게 물려주는 행동

부모 클래스에서 이미 선언된 코드를 자식 클래스에서 재구현 없이 사용 가능

  • 코드를 재사용하기 위한 기술
  • 비용 절감
class Parent {
	public int a;
	public int b;

	public void ccc() {
		System.out.println("ccc");
	}
}

//자식 클래스 역할 => 자식이 부모 클래스를 결정함
class Child extends Parent {

	public int d;
	public int e;

	public void fff() {
		System.out.println("fff");
	}

}


메서드 오버라이딩, Method Overriding

클래스 상속 할 때 발생

메서드 재정의 > 상속 받은 메서드를 수정하는 기술

개발자에게 도움 > 또 다른 메서드 이름을 외울 필요가 없음


  • 예시코드
class overridingParent {
	
	public String name;
	
	public void hello() {
		System.out.printf("안녕하세요. 좋은 아침입니다. 저는 %s입니다.\n", this.name);
	}
	
}
class overridingChild extends overridingParent {
	
//	public void hi() { 새로운 메서드
//		System.out.printf("하이~ 방가~ 난 %s야\n", this.name);
//	}
	
	//메서드 재정의
	public void hello() {
		System.out.printf("하이~ 방가~ 난 %s야\n", this.name);
	}
}


public static void main(String[] args) {
		overridingParent hong = new overridingParent();
		
		hong.name = "홍길동";
		hong.hello();
		
		
		
		overridingChild jhong = new overridingChild();
		
		jhong.name ="홍철수";
		//hong.hello();
		//jhong.hi();
		jhong.hello();
		
		
		//overridingParent.hello() -> 길동이꺼
		//overridingChild.hello() -> 철수꺼
	}//main

//결과
안녕하세요. 좋은 아침입니다. 저는 홍길동입니다.
하이~ 방가~ 난 홍철수야


Q. 오버로딩도 아닌데 왜 에러 안남?

: 자식 메서드가 이김 -> 외부에는 자식 메서드 노출 ! 부모 메서드는 볼 수 없음

: 메서드를 고친게 아님 => 메서드를 재정의 한 것 = 오버라이딩

❗ 같은 이름의 메서드를 다시 만들 때 상의 클래스의 메서드는 무시 당함 = 메서드 재정의


하지만 문제 발생

상위 클래스를 무시한다면 상위 클래스의 메서드를 사용하고 싶을 때 어떡할까요?

: 자바에서 자식은 super라는 참조값을 통해 부모의 메서드를 호출 할 수 있다.

=> this와 super에 대해 알아보자


this

클래스 내에서 클래스가 가지고 있는 멤버 필드 또는 멤버 메소드를 직접 참조할 수 있는 자신의 참조 변수

클래스 디자인 타임에 사용

: 클래스를 디자인 할 때는 메모리 할당이 되지 않은 순간이다. 객체를 생성하기 전 단계에 그 주소를 this라고 칭하고 할당되는 순간 this는 할당되는 메모리의 참조값을 갖게 된다면 this는 디자인 타임에 실행 타임의 주소를 아는 것 처럼 행동이 가능하다.

즉, this = 언젠가 생성되어질 내 주소 this의

public class Employee {
	
	private String name; // 직원명
	private String department; // 직원명
	
	
	//직속 상사정보
	private String sname; // 직원명
	private String sdepartment; // 직원명
	
	private Employee superior;
	
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDepartment() {
		return department;
	}
	public void setDepartment(String department) {
		this.department = department;
	}
	public Employee getSuperior() {
		return superior;
	}
	public void setSuperior(Employee superior) {
		this.superior = superior;
	}
}

public static void main(String[] args) {
		
		//부장
		Employee e1 = new Employee();
		e1.setName("홍길동");
		e1.setDepartment("영업부");
		
		
		//과장
		Employee e2 = new Employee();
		e2.setName("홍길동");
		e2.setDepartment("영업부");
		e2.setSuperior(e1);
		
		System.out.println(e2.getSuperior().getName());
		
		Parent father = new Parent();
		father.setName("홍길동");
		father.setAge(40);
		
		Parent mother = new Parent();
		mother.setName("성춘향");
		mother.setAge(35);
		
	
		Child child = new Child();
		child.setName("홍무개");
		child.setAge(12);
		child.setFather(father); //관계
		child.setMother(mother); //관계
		
		System.out.println();
		
		Person p1 = new Person();
		p1.setName("홍길동");
		p1.setAge(20);
		p1.setAddress("서울시 강남구 역삼동");
		//p1.setNick("홀쭉이");
		
//		String[] nick= new String[3];
//		nick[0] ="홀쭉이";
//		nick[1] ="젓가락";
//		nick[2] ="철사";
//		
//		
//		p1.setNick(nick);
		
		
		//com.test.java.obj.Person
		//@
		//8efb846
		//컴파일러가 배열로 바꿈 > p1은 주솟값
		
		p1.addNick("홀쭉이");
		p1.addNick("젓가락");
		p1.addNick("철사");
		
		System.out.println(p1.info());
		
		System.out.println(p1.getNick(1));
	}


//결과
홍길동

이름: 홍길동
나이: 20
주소: 서울시 강남구 역삼동
별명: [홀쭉이, 젓가락, 철사]

젓가락


super

상속 구조에서 디자인 타임에 사용할 수 있는 상의 클래스의 참조 변수.
=> 상위 클래스를 참조할 수 있는 유일한 방법

class NewFather{
	public void overrideFunc(){
			System.out.println("아버지의 함수");
             }
}
public class NewSon extends NewFather{
     public void overrideFunc(){
     		System.out.println("아들의 재정의 함수");
     }
     public void testFunc(){
     		super.overrideFunc();
     }
     public static void main(String[] args){
             NewSon s = new NewSon();
             s.overrideFunc();//재정의 된 함수호출
             s.testFunc();//super를 이용한 아버지 호출
    }
}

//결과
아들의 재정의 함수
아버지의 함수
profile
하루를 정리하고 기록합니다.

0개의 댓글