hyeongwoo's blog

[Java] 상속 본문

JAVA

[Java] 상속

toribro 2024. 1. 26. 17:51

[상속]

상속은 자식이 부모로부터 물려받는것을 의미한다.
자바에서 상속도 같은 의미이다 . 클래스가 클래스로 물려주는 형태가 존재 , 물려주는 클래스는 부모클래스, 물려받는 클래스는 자식클래스라고 한다.
여러클래스에서 같은 코드를 사용할때,아니면 클래스를 재사용할때  번거러움을 줄이기 위해 클래스의 상속관계를 이용하여 중복을 줄여 효율적인 프로그래밍을 할 수 있다.
 

[Java에서의 상속]

  • 다른 클래스가 가지고 있는 멤버들을 새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능이다.

목적

  • 클래스의 재사용
  • 연관된 일련의 클래스들에 대한 공통적인 규약정의
  • 사람이 사용하기위한 규칙을 설정

장점

  • 보다 적은 양의 코드로 새로운 클래스를 작성할수 있다.
  • 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경이 용이하다.
  • 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.

자바상속_특징

  • 모든 클래스는 Object클래스를 상속받는다.
  • 부모클래스의 생성자는 상속이 되지 않는다. 다만 부모생성자는 자식 생성자에서 super()로 호출이 가능하다.
  • 부모클래스의 static변수는 상속이 되지 않지만 호출은가능하다. (static영역은 다른 영역이라고 보면 된다.)
  • 부모의 private 멤버는 상속은 되지만 직접 접근은 불가하다. (private 멤버에 접근이 필요하면 setter 와 getter를 이용해서 접근하면된다.),
  • protected 접근제어자를 사용하면 상속관계의 클래스에서는 직접 접근이 가능하다.
  • 자식클래스는 부모클래스의 메소드를 오버라이딩(재정의) 하여 사용할수 있다.
  • 자바는 단일상속만 되고 다중 상속은 지원하지 않는다.
    • 다중상속을하면 의미가 모호해진다.  만일 메소드 이름이 같으면 어느 클래스에서 상속받은 메소드인지 알수가 없다. class a extends b,c (x)
  • 부모생성자가 먼저 메모리에 생성되고 그다음에 자식클래스생성자가 메모리가 생성된다.

 

super

  • 상속받은 자식클래스에서 부모클래스의 생성자,메소드,필드를 호출할때 사용한다.
  • 부모클래스의 생성자 호출:super();
  • 부모클래스의 메소드 호출: super.메소드();
  • 부모클래스의 필드 호출:super.필드;

 

자바 상속시 조건

모든 클래스들은 서로 상속이 가능하다.(컴퓨터이기때문에) 하지만 코드를 사람이 읽는 것이기에 의미를 잘 파악하여 상속관계를 만들어야한다.

  • 부모-자식클래스는 is~a의 연관관계를 가져야한다.
    • 예) 강아지 클래스는 동물 클래스를 상속받는다. -> 강아지는 동물이다. (O)
  • 의미를 따라 상속해야한다. 연관성이 없는 클래스를 함부로 상속하지 않는다.
    • 예) SUV차량클래스는 동물 클래스를 상속받는다. -> SUV차량은 동물이다. (X)

 
예시코드

class Parent{

   private int a;
   private int b;
   protected int p;
    
   public Parent(){//명시적 디폴트 생성자
    
   }
    
   public Parent(int a, int b){//오버로딩된 생성자,명시적 생성자
      this.a=a;
      this.b=b;
      this.p=1;
   }
    
   public void print(){
      System.out.println(this.a+","+this.b);
      
   }
    
   public int getA() {
   	  return a;
   }

   public void setA(int a) {
	  this.a = a;
   }

   public int getB() {
	  return b;
   }

   public void setB(int b) {
	  this.b = b;
   }
	    

}

class Child extends Parent{

   private int c;
    
    public Child(){
      super();//부모클래스의 생성자 호출
    }
    
    public Child(int a,int b,int c){
      super(a,b);//부모클래스의 오버로딩된 생성자 호출
      
      this.setB(5);//private필드에 접근이 필요할시 setter로 접근 초기화
      this.c=c;
      this.p=2;//부모의 protected필드에 직접접근가능
    }

    @Override // 오버라이드 된 함수, 부모클래스의 메소드를 재정의한다.
    public void print(){
       super.print()// super 키워드로 부모클래스의 메소드를 호출할수도 있다.
       System.out.println(this.c);// 재정의 부분
    }
    
    //getter setter 생략

}

 
 

 
 
 
 
 
 

'JAVA' 카테고리의 다른 글

[Java] None_Static영역과 Static영역  (0) 2024.02.02
[Java] 다형성  (0) 2024.01.27
[Java] 메소드  (0) 2024.01.26
[Java] this  (2) 2024.01.24
[Java] 클래스_(구성)  (2) 2024.01.24