그냥
Published 2023. 3. 18. 00:44
4. 상속 (1) JAVA 공부/객체지향 공부

상속

OOP의 핵심이라 여겨지는 특성이며, 다형성의 기반이 된다.

이미 존재하는 클래스를 기반으로 새 클래스를 만드는 방법이다.

      ↘부모 클래스                             ↘자식 클래스

 

새 클래스는 기존 클래스의 동작과 상태를 그대로 물려받는다.

그 외에 새 클래스만의 동작과 상태를 추가를 할 수 있다.

 

※ JAVA에서 상속은 단일 상속만 허용한다. 다중 상속은 불가능

 

개, 고양이, 앵무새를 만든다고 했을 때

class dog{
    public String name; 
    public int age;   
    public String sex;   
    
    public void walk(){ }
    public void eat() { }
    public void shout(){ }
    
    public dog(String name, int age, String sex){
    	this.name = name; 
    	this.age = age;   
    	this.sex = sex;   
    }
}

 

class cat{
    public String name;  
    public int age;     
    public String sex; 
    
    public void walk(){ }
    public void eat() { }
    public void shout(){ }
    
    public cat(String name, int age, String sex){
    	this.name = name;
    	this.age = age;
    	this.sex = sex;
    }
}

 

class parrot{
    public String name;  
    public int age;     
    public String sex; 
    
    public void walk() { }
    public void fly() { }
    public void eat() { }
    public void shout() { }
    
    public cat(String name, int age, String sex){
    	this.name = name;
    	this.age = age;
    	this.sex = sex;
    }
}

이때 개, 고양이, 앵무새의 중복 코드는

public String name;

public int age;

public String sex;

 

public void walk(){ }

public void eat() { }

public void shout(){ }

개와 고양이, 앵무새는 공통으로 애완동물이기에

이름, 나이, 성별이라는 상태를 가지고

걷기, 먹기, 소리내기라는 동작을 가지기에 공통 분모로 뺄 수 있는 것이다.

 

따라서 이를 클래스로 만들어주면 된다.

class animal{
    public String name;  
    public int age;     
    public String sex; 

    public void walk() { }
    public void eat() { }
    public void shout() { }

    public animal(String name, int age, String sex){
    	this.name = name;
    	this.age = age;
    	this.sex = sex;
    }
}

상속하는 방법은

extends 부모 클래스

class dog extends animal{
    public dog(){
    }
}

class cat extends animal{
    public cat(){
    }
}

class parrot extends animal{
    public void fly() { }
    
    public parrot(){
    }
}

이때 이 코드를 실행하면 컴파일 오류가 발생하는데 

 

생성자의 호출 순서는 부모 클래스부터 초기화하고 자식 클래스를 초기화한다.

1. 메모리에 개체 생성

2. 부모 생성자 호출

3. 자식 생성자 호출

 

public dog() {

       // 컴파일러가 자동으로 생성자 animal() 호출

}

자동으로 매개변수가 없는 생성자를 컴파일러가 알아서 생성자 animal()를 호출하지만

매개변수가 있는 생성자가 있으면 컴파일 오류가 발생하는 것이다.

 

public animal(String name, int age, String sex){
     this.name = name;
     this.age = age;
     this.sex = sex;

}

※ 매개변수가 있는 생성자가 있기에 오류가 발생한 것.

 

이를 해결하기 위해서는 자식 생성자에서 부모 생성자를 호출해 줘야 한다.

class dog extends animal{
    public dog(String name, int age, String sex){
    	super(name, age, sex);
    }
}

class cat extends animal{
    public cat(String name, int age, String sex){
    	super(name, age, sex);
    }
}

class parrot extends animal{
    public void fly() { }
    
    public parrot(String name, int age, String sex){
    	super(name, age, sex);
    }
}

 

super

super현 개체의 부모 부분을 가리킨다.

부모의 생성자 호출, 부모의 멤버 변수나 메소드를 호출 할 때 사용한다.

 

부모 클래스의 생성자를 호출 할 때 : super(매개변수 목록)

부모 클래스의 멤버 변수, 메서드를 호출할 때 : super.부모의 멤버 변수

                                                                  super.부모의 메서드

 

this는 내 객체를 의미하지만, super는 부모의 부분을 의미한다

자식은 부모를 호출할 수 있지만, 부모는 자식을 호출할 수 없다.

그 이유로는 부모는 하나지만 자식은 여럿이기에 특정을 지을 수 없기 때문이다.

 

 

'JAVA 공부 > 객체지향 공부' 카테고리의 다른 글

6. 상속(3)  (0) 2023.03.18
5. 상속 (2)  (0) 2023.03.18
4. getter와 setter  (0) 2023.03.13
3. 생성자  (0) 2023.03.13
2. 변수, 메서드  (0) 2023.03.13
profile

그냥

@Ticketpaper

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그