Notice
Recent Posts
Recent Comments
Link
hyeongwoo's blog
[Java] 상속 본문
[상속]
상속은 자식이 부모로부터 물려받는것을 의미한다.
자바에서 상속도 같은 의미이다 . 클래스가 클래스로 물려주는 형태가 존재 , 물려주는 클래스는 부모클래스, 물려받는 클래스는 자식클래스라고 한다.
여러클래스에서 같은 코드를 사용할때,아니면 클래스를 재사용할때 번거러움을 줄이기 위해 클래스의 상속관계를 이용하여 중복을 줄여 효율적인 프로그래밍을 할 수 있다.
[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)
- 예) SUV차량클래스는 동물 클래스를 상속받는다. ->
예시코드
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 |