상속(Inheritance)이란?
부모 클래스와 자식 클래스가 있으며 자식 클래스는 부모 클래스를 선택해서, 그 부모의 값을 상속받아 쓸 수 있게된다.
- 상속 관계의 객체를 생성하면 그 내부에는 부모와 자식이 모두 생성된다.
- 상속 관계의 객체를 호출할 때, 대상 타입을 정해야한다. 이때 호출자의 타입을 통해 대상 타입을 찾는다.
- 현재 타입에서 기능을 찾지 못하면 상위 부모 타입으로 기능을 찾아서 실행한다. 찾지 못하면 컴파일 오류 발생.
상속을 왜해?
이미 마련되어 있던 클래스를 재사용해서 만들 수 있기 때문에 개발 시간을 줄여줄 수 있어 매우 효율적(유지 보수성 향상))이다.
상속을 하더라도 자식 클래스가 부모의 모든 것들을 물려받을 수 있는 것은 아니다.
부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없다.
부모와 자식 클래스가 서로 다른 패키지에 있다면,
부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없다.
(default 접근 제한은 ‘같은 패키지에 있는 클래스’만 접근이 가능하게끔 하는 접근 제한자이기 때문.)
그 이외의 경우는 모두 상속의 대상이 된다..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class A{ private int x; private int y; public A(){ x =1; y =1; } //자식에 있는 super에 의해 부모 기본 생성자가 자동으로 설정된다. x와 y는 원래 0인데 1을 설정해주었다. public A(int x){ this.x = x; y =1; } public void disp1(){ System.out.print("x = " + x + ", y = " + y); } public void disp2(int x){ System.out.print("x = " + x + ", y = " + y); } } | cs |
A라는 클래스를 만들어 변수를 private 해주었고,
public A() { } 생성자를 만들어 x =1, y=1 을 정의해 주었다.
중요한 것은 public A( ) 이 괄호 ( ) 안에 아무것도 들어가 있지 않은 것이 기본 생성자이다.
public A(int x) 생성자는 매개변수 x를 하나 갖고 있는 생성자이며,
이때 this.x = x; 에서 밑줄 친 x는 private int x에 정의된 객체 x이다.
그리고 this.x = x; 에서 밑줄 친 x는 생성자 매개변수의 x이다.
public void disp1() { } 라는 메소드 안에 출력 문구를 적었고,밑의 public void disp1(int x) { } 라는 메소드 안에도 출력 문구를 적어주었다. 이 둘의 차이점은 밑에서 추가적으로 말해 볼 것이다.
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 31 | class B extends A{ // this.x는 B 클래스에 있는 x. // super.x는 부모 클래스 즉 A 클래스에 있는 x private int x; private int y; public B(){ //super(); 이게 숨겨져있음. x =1; y =1; } public B(int x) { super(x); this.x = 1; y =1; } public void disp(){ disp1(); System.out.println(", x = " + x + ", y = " + y ); } public void disp(int x){ disp2(10); System.out.println(", x = " + x + ", y = " + y ); } } | cs |
A 클래스를 상속 받는 자식클래스 B를 만들어 보았다. Class B 뒤에 extends A 를 덧붙여 주어 상속시켜줄 수 있다.
public B( ) { } 의 기본 생성자에 super() ; 가 숨겨져 있는 기능이 있다.
이 것은 부모 클래스의 기본 생성자를 호출하라는 의미이다.
public B(int x) { } 의 생성자에는 매개변수가 하나 들어가 있다. 이 경우 부모 클래스 A또한 B와 같은 형태의 생성자를 만들어 주어야 한다.
바로 밑에는 출력을 도와 줄 public void disp() { } 메서드를 만들었고, 부모 클래스에 있는 disp1( );을 호출해줄 것이라고 직접 코드를 넣었다.
public void disp(int x) { } 코드에는 매개변수가 있으므로 A 클래스에 있는 같은 자료 형의 메서드를 함께 호출할 수 있다.
1 2 3 4 5 6 7 8 9 10 | public class Work { public static void main(String[] args) { B bp = new B(); B bp1 = new B(10); bp.disp(); bp1.disp(10); } } | cs |
마지막으로 실행 시켜 줄 main이 포함된 Work 클래스를 만들어 주었다.
B bp = new B (); 는 B 클래스의 bp변수를 만들어 new 새로운 B 클래스를 넣으라는 의미이다.
우리는 처음에 비어있는 생성자와 하나의 매개변수를 갖는 생성자를 만들었다.
B bp1 = new B(10); 이라는 공간도 새로 만들어 주어
bp.disp() ;를 실행해주었다. bp는 변수이며, 뒤의 B클래스에 있는 메소드 disp 를 실행하라는 의미로 해석할 수 있다.
마찬가지로 bp1.disp( 10) ;은 B 클래스에 있는 메소드 disp에서 매개변수 하나를 갖는 값을 bp1에 넣어 실행하라는 의미다.
x = 1, y = 1, x = 1, y = 1
x = 10, y = 1, x = 10, y = 1
컴파일 해보면 위와 같은 결과 값을 도출해 낼 수 있다.
다음 장에서는 오버라이딩(Overriding)과 오버로딩(Overroding)에 대해서 적어보려고 한다.
'✨ Java > 상속(Inheritance)' 카테고리의 다른 글
자바(JAVA) - 상속(Inheritance) -3 (0) | 2023.07.13 |
---|---|
자바(JAVA) - toString( )과 Object클래스 (0) | 2023.02.13 |
자바(JAVA) - OverLoding 오버로딩과 Overriding 오버라이딩 (상속) (0) | 2023.02.13 |
자바(JAVA) - 상속(Inheritance) -2 (0) | 2023.02.13 |
댓글