IT/JAVA

Java Section 10 : 상속

_KH_ 2025. 1. 17. 18:52

[상속]

■ 상속 : 부모 역할을 하는 클래스가 자식 역할을 하는 클래스에게 클래스 멤버와 메서드를 물려주는 것  

             - 클래스를 재사용하기 때문에 중복을 줄여주고 수정을 최소화함

□ 자식 클래스에서 "extends" 키워드를 사용하여 상속받을 클래스를 지명한다.          

   ※ 자바는 다중 상속을 허용하지 않으므로 extends 뒤에 하나의 부모 클래스만 허용한다.

   - 부모 클래스의 상속을 받은 자식 클래스는 부모 클래스의 모든 멤버를 가져다 쓸 수 있다.

 

부모 클래스 == 상위 클래스 == 기반 클래스

자식 클래스 == 하위 클래스 == 파생 클래스

 

[상속에서의 생성자]

특별한 역할을 하지 않는 기본 생성자는 비어있는 것이 맞지만 자식 클래스의 기본 생성자는 super()라는 메소드를 가지고 있으며 이는 생략되어 있다.

1) super() 

: 부모 클래스의 생성자를 호출할 때 사용

Comic(){
	super();
}

- 개발자가 직접 생성자를 선언할 때도 자식 클래스에서는 반드시 부모 클래스의 생성자를 호출해야 한다.

 

- 만약 부모 클래스의 생성자가 호출될 때 매개변수로 값을 전달받아 부모 클래스의 필드들을 초기화 하도록 구현되어 있으면, 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때도 부모 클래스 대신 값을 매개변수로 받아서 부모 생성자에 넣어주어야 한다.

 

- 부모 클래스

public class Person { 
	String name;
    int age;
    
    
    Person(String name, int age) {
    		this.name = name;
            this.age = age;
     }
}

 

- 자식 클래스

public class Customer extends Person {
	int memberID;
    
    Customer(String name, int age, int memberID) {
    	super(name, age);
        
        this.memberID = memberID;
     }
     
     void enter() {
     	System.out.println("회원번호 : " + memberID + " ( "+ name + " , " + age + "세) 님 입장하셨습니다.);
     } 
}

 

[오버라이딩]

■ 오버라이딩 : 상속 받은 메서드를 변경해서 다시 구현하는 것

   - 오버라이딩한 후 자식 객체를 생성하여 해당 메서드를 호출하면 자식 클래스에서 구현한 메서드가 실행된다.

 

※ 제약 사항

□ 부모 클래스의 메서드 이름/반환 타입/매개변수와 동일해야 한다.

□ 부모 클래스의 메서드보다 접근 제한을 줄일 수는 있으나 (범위를 넓힐 수 있으나) 접근 제한을 늘릴 수는 없다. 

    - default -> public (o), public -> private (x)

 

※ 오버로딩과 오버라이딩

오버로딩은 새로운 메서드를 정의하는 것이고, 오버라이딩은 상속받은 기존의 메서드를 재정의하는 것이다.

 

※ @Override 어노테이션 : 주석과 마찬가지로 코드 실행 시 영향을 미치지 않는다. 자동완성으로 오버라이딩 할 시 자동으로 상단에 @Override가 추가된다. 없어도 되는데 추가할 시 컴파일러에게 한번 더 짚어주면서 개발자의 실수를 줄여줄 수 있다.

 

※ super 키워드 : 부모 클래스에서 상속받은 필드나 메서드를 자식 클래스에서 참조하는 데 사용하는 참조변수

super.부모 메서드();

- super 참조 변수를 사용할 수 있는 대상은 인스턴스 메서드뿐이며, 클래스 메서드에서는 사용할 수 없다.

 

[접근 제한자]

■ 접근 제한자 : 정보 은닉을 위해 사용. 클래스와 멤버에 대해 외부에서 접근하지 못하도록 접근 권한을 제한할 때 사용

- public, private, protected,default 등..

public : 접근 제한자 중 가장 사용 범위가 큰 제어자. 모든 패키지, 모든 클래스 어디서나 해당 클래스로 객체 생성 가능

private : 접근 제한자 중 가장 사용 범위가 작은 제어자. private로 선언된 멤버들은 클래스 외에서 접근이 전혀 불가능하다.

 

[final 클래스와 final 메서드]

① final 클래스 : 상속의 마지막 클래스임을 나타낸다. 어떠한 클래스도 이 클래스의 자식 클래스가 될 수 없고, 이 클래스는 다른 클래스의 부모 클래스가 될 수 없다.

② final 메서드 : 상속받더라도 오버라이딩 불가. final로 선언된 메서드는 자식 클래스에서 오버라이딩하지 못하고 그대로 사용해야 한다.

 

※ 객체 지향의 특징

① 캡슐화 : 객체 내부의 멤버(필드, 메서드 등)를 객체 외부에서 볼 수 없도록 캡슐화 함. 

② 추상화 : 공통된 기능과 정보를 추출해 객체화함

③ 상속 : 미리 정의된 부모 클래스의 모든 멤버를 자식 클래스가 물려받음

④ 다형성 : 하나의 방법으로 여러 객체를 호출하여 사용할 수 있음