Notice
Recent Posts
Recent Comments
Link
Tags
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

JongDDA의 한걸음 한걸음씩

[Java] 상속(Inheritance) 본문

개발/Java

[Java] 상속(Inheritance)

종따 2021. 8. 16. 18:33
728x90

상속(Inheritance)

 상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다. 

 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다. 자바에서의 상속을 구현하는 방법은 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 함께 써 주기만 하면 된다.

 

예를 들어 새로 작성하려는 클래스 이름이 Child이고 상속받고자 하는 기존 클래스의 이름이 Parent라면 다음과 같이 코드를 쓰면 된다.

class Parent { }
class Child extends Parent {
	// ... 
}

이 두 클래스는 서로 상속 관계에 있다고 하며 상속해주는 클래스를 '부모클래스, 상위클래스, 슈퍼클래스' 라고 하며 상속받는 클래스를 '자식클래스, 하위클래스, 서브클래스' 라고 부른다.

자식클래스는 부모클래스의 모든 멤버를 상속받기 때문에 Child 클래스는 Parent 클래스의 멤버들을 포함한다고 할 수 있다. 따라서 부모 클래스에 멤버변수를 추가하게 되면 자동적으로 자식클래스에도 멤버변수가 추가되는 것이다. 하지만 자식클래스에 새로운 코드가 추가되어도 부모클래스에는 아무런 영향을 받지 못한다. 

 

public class Person {
	
    String name;
	int age;
	float height;
	String gender;
	String job;
    
	Person(){
		name = "홍길동";
		age = 20;
		height = 160.0f;
		gender = "남";
		job ="의적";
		password = "tiger";
		System.out.println("기본생성자 호출됨");
	}
	
	void walking() {
		System.out.println("걷기");
	}
	void eating() {
		System.out.println("먹기");
	}
	void sleeping() {
		System.out.println("잠자기");
	}
}
// SueprMan 클래스는 Person 클래스의 확장판
public class SuperMan extends Person{
	
	float weight;
	SuperMan() {
		// 부모 클래스의 기본 생성자를 호출
		// super();
		System.out.println("슈퍼맨기본 생성자");
	}
	SuperMan(String name, String job, int age, float height, float weight, String gender){
		super(name, job, height, gender);
		this.weight = weight;
		this.age =age;
		System.out.println("슈퍼맨 매개변수 있는 생성자");
	}
	public void fly() {
		System.out.println("날아라 슈 옹~~~");
	}
	public void shootingOfLaser() {
		System.out.println("찌이잉~~");
	}
	
}

 

단일상속(single inheritance)

다른 객체지향언어 C++ 에서는 여러 조상 클래스로부터 상속받는 것이 가능한 '다중상속(multiple inheritance)'을 허용하지만 자바애서는 단일 상속만을 허용한다. 

 

Object 클래스

모든 클래스 상속계층도의 최상위에 있는 부모 클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 된다. 따라서 자바의 모든 클래스들은 Object클래스에 정의된 멤버들과 메서드, 클래스들을 사용할 수 있게된다. 

 

오버라이딩(overriding)

부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 매서드를 그대로 사용하기도 하지만, 자식 클래스 자신에 맞게 변경해야 하는 경우가 많다. 이럴 때 부모클래스의 매서드를 오버라이딩한다.

-- override의 사전적 의미는 '~~ 위에 덮어쓰다' 이다.

 

class Point {
	int x;
    int y;
    
    String getLocation(){
    	return "x : " + x + ", y : " + y;
    }
}

class Point3D extends Point{
	int z;
    
    String getLocation(){ // 오버라이딩
    	return "x : " + x + ", y : " + y +", z : " + z;
    }
}

위 코드를 보면 부모클래스 Point에 getLocation 메서드가 있고 자식클래스 Point3D에도 getLocation 매서드가 있지만 오버라이딩을 이용하여 출력되는 결과 값을 다르게 해주었다. 

 

오버라이딩의 조건

오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로 매서드의 선언부(매서드 이름, 매개변수, 반환타입)는 부모의 것과 완전히 일치해야 한다. (접근 제어자와 예외의 경우 제한된 조건하에 다르게 변경 -- 추후학습)

오버라이딩할 때 지키야할 조건은 다음과 같다.

  1.  선언부가 부모 클래스의 메서드와 일치해야 한다.
  2.  접근 제어자를 부모 클래스의 매서드보다 좁은 범위로 변경할 수 없다.
  3.  예외는 부모 클래스의 매서드보다 많이 선언할 수 없다.

 

참조변수 super

super는 자손 클래스에서 조상클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. 멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버와 이름이 같을 때 super를 붙여서 구별할 수 있다.

 

public class Ex {
	public static void main(String[] args) {
		Child c = new Child();
        c.method();
	}
}
class Parent { String name = "완득이"; }

class Child extends Parent {
		void method(){
    	System.out.println("제 이름은 "+ name + " 입니다.");
        System.out.println("제 이름은 "+ this.name + " 입니다.");
        System.out.println("제 이름은 "+ super.name + " 입니다.");
    }
}

모두 같은 결과를 출력해낸다. 

모든 인스턴스 메서드에는 this 와 super가 지역변수로 존재하는데, 이 들에는 자신이 속한 인스턴스의 주소가 자동으로 저장된다. 

 

super() - 부모의 생성자

super()는 부모의 생성자를 호출하는데 사용된다.

class Point {
	int x;
    int y;
    
    Point(int x, int y){
    	this.x =x;
        this.y =y;
    }
}

class Point3D extends Point{
	int z;
     Point(int x, int y, int z){
    	super(x,y); // 부모클래스의 생성자 Point(int x, int y)를 호출
    	this.z = z; // 자신의 멤버를 초기화
    }
}

위의 코드는 Point3D 클래스가 부모의 멤버변수를 부모의 생성자를 통해 초기화 해주었다. 

 

 

 

 

 

 

 

 

728x90
반응형

'개발 > Java' 카테고리의 다른 글

[Java] 다형성(Polymorphism)  (0) 2021.08.17
[Java] 제어자(modifier)  (0) 2021.08.17
[Java] 생성자(Constructor)  (0) 2021.08.15
[Java] 객체지향 , 클래스(Class)  (0) 2021.07.09
[Java] 메서드(Method)  (0) 2021.07.07
Comments