본문 바로가기
JAVA/JAVA 기초 문법

[java] 클래스 상속, Protected 엑세스,super, 메소드 오버라이딩

by 코끼리똥11 2024. 6. 3.

상속

상속(Inheritance)이란 부모 클래스(상위 클래스)와 자식 클래스(하위 클래스)가 있으며, 자식 클래스는 부모 클래스를 선택해서, 그 부모의 멤버를 상속받아 그대로 쓸 수 있게 됩니다.

상속을 하는 이유는 간단합니다. 이미 마련되어 있던 클래스를 재사용해서 만들 수 있기 때문에 효율적이고, 개발 시간을 줄여주게 됩니다.

 

방법

상속받고자 하는 자식 클래스명 옆에 extends 키워드를 붙이고, 상속할 부모 클래스명을 적습니다.
자바는 다중 상속을 허용하지 않으므로, extends 뒤에는 하나의 부모 클래스만 와야 합니다

public class Parent {
	protected String name;
	protected int age;
	protected int money;
}

Parent  클래스에 라는 name, age, money  변수가 있다. 

 

public class Child extends Parent{
	//	String name;
	//	int age;
	//	int money;
	// 부모의 함수도 다 상속받는다.
    private String hobby;
}

child 클래스가 Parent 클래스 를 상속받았다. child 클래스 안에서도 Parent 클래스 안에 있는 변수를 사용 할  수 있고 Child 클래스 고유의 변수인 hobby를 사용 할 수 있다.

 

protected 접근 제어자

protected 접근 제어자는 클래스 멤버(필드, 메서드)에 대한 접근 권한을 제어하는 데 사용됩니다. protected는 다음과 같은 특성을 가집니다:

  1. 같은 패키지 내의 클래스들: protected로 선언된 멤버는 같은 패키지 내의 모든 클래스에서 접근할 수 있습니다.
  2. 상속받은 클래스들: protected로 선언된 멤버는 다른 패키지에 있더라도 해당 클래스를 상속받은 자식 클래스에서 접근할 수 있습니다.

이를 통해 protected는 클래스 간의 적절한 정보 은닉을 유지하면서도, 상속 관계에서의 접근을 허용하여 유연한 코드 재사용성을 보장합니다.

접근 제어자 같은 클라스  같은 패키지 자식 클래스(다른 패키지) 모든 곳
private  O X X X
default O O X X
protected O O O X
public O O O O

 

super

부모 클래스의 생성자, 필드, 메서드에 접근할 때 사용됩니다. super를 사용하여 부모 클래스의 멤버를 호출하거나 참조할 수 있습니다.

주요 사용법

  1. 부모 클래스의 생성자 호출:
    • 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때 사용됩니다.
    • 부모 클래스의 생성자는 super() 메서드를 사용하여 호출됩니다. 이때, 반드시 자식 클래스의 생성자의 첫 번째 문장이어야 합니다.
  2. 부모 클래스의 메서드 호출:
    • 자식 클래스에서 부모 클래스의 메서드를 호출할 때 사용됩니다.
    • super.method() 형태로 사용하여 부모 클래스의 메서드를 호출할 수 있습니다.
  3. 부모 클래스의 필드 참조:
    • 자식 클래스에서 부모 클래스의 필드를 참조할 때 사용됩니다.
    • super.field 형태로 사용하여 부모 클래스의 필드에 접근할 수 있습니다.

 

public class Parent {
	protected String name;
	protected int age;
	protected int money;

	public Parent(String name, int age, int money) {
		this.name = name;
		if(age>0) {
			this.age=age;
		}
		this.money=money;
		// TODO Auto-generated constructor stub
	}
	public Parent() {
		System.out.println("Praent Class 생성자 동작 1");
	}
	
	public void print(){
		System.out.println("이름 : "+ name + " , 나이 : " + age + " , 재산 : " + money);
	}

부모 클래스인 Parent에 print 라는 함수를 만들었다.

public class Child extends Parent{
	//	String name;
	//	int age;
	//	int money;
	
	// 부모의 함수도 다 상속받는다.
	
	private String hobby;
	public Child(){
	}
	public Child(String name, int age, int money, String hobby) {
		super(name,age,money);
		this.hobby=hobby;
		System.out.println("Child class 생성자 실행 2");
		
		// TODO Auto-generated constructor stub
	}

	public String getHobby() {
		return hobby;
	}

	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	//메소드 오버라이딩
	@Override
	public void print() {
		super.print();
		System.out.println("취미는 : "+ hobby);
	}
	
	
}

 

자식 클래스에 Hobby 라는 Child 전용 매개변수를 만들어주고 " super.print(); " 에서 를 통해 부모 클래스(super)의 print() 를 그대로 가지고 올수있다.

 

오버라이딩

오버라이딩(Overriding)은 객체 지향 프로그래밍에서 상속 관계에 있는 클래스 간에 발생하는 개념으로, 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것을 말합니다. 즉, 자식 클래스에서 부모 클래스의 메서드를 새로 구현하여 사용하는 것입니다.

오버라이딩을 사용하면 부모 클래스의 메서드를 자식 클래스에 맞게 수정하거나 확장할 수 있습니다. 이는 코드의 재사용성과 유연성을 높여줍니다.

오버라이딩의 조건

오버라이딩을 사용하려면 몇 가지 조건이 충족되어야 합니다:

  1. 상속 관계: 오버라이딩은 부모 클래스와 자식 클래스 간에만 발생합니다.
  2. 메서드 시그니처 동일성: 자식 클래스에서 오버라이딩된 메서드는 부모 클래스의 메서드와 동일한 시그니처(이름, 매개변수 타입, 반환 타입)를 가져야 합니다.
  3. 접근 제어자 변경: 자식 클래스에서 오버라이딩된 메서드는 부모 클래스의 메서드보다 접근 제어자를 더 강하게 변경할 수 없습니다.
  4. 예외 타입 변경: 자식 클래스에서 오버라이딩된 메서드는 부모 클래스의 메서드가 선언하는 예외의 타입을 더 일반적인 예외로 변경할 수 없습니다.
public void print(){
		System.out.println("이름 : "+ name + " , 나이 : " + age + " , 재산 : " + money);
	}

 

부모 클래스의 print 함수

public void print() {
		super.print();
		System.out.println("취미는 : "+ hobby);
	}

자식 클래스의 print 함수

 

부모 자식간의 함수 명을 똑같이해서 자식 클래스에서 부모 클래스의 메서드를 새로 구현했다.