BOOK

[JAVA] MENTOR JAVA SECTION 10

Minch13r 2025. 1. 17. 17:47

상속

상속은 우리가 일반적으로 알고 있는 의미와 비슷하다. 부모가 자식에게 무언가를 물려주는 것을 상속이라고 부르는 것처럼, 자바에서도 부모 역할을 하는 클래스가 자식 역할을 하는 클래스에게 클래스 멤버와 메서드를 물려주는 것을 상속이라고 한다. 상속은 클래스를 재사용하기 때문에 중복을 줄여주고 수정을 최소화하는 특징을 가지고 있다.

 

자바에서 상속을 구현하는 방법은 자식 클래스를 선언할 때, extends라는 키워드를 사용해 상복받을 클래스를 지명한다. 자식 클래스에서 선택받은 클래스는 부모 클래스 역할을 하게 된다.

class A {

}

class B extends A {

}

상속에서의 생성자

 

자식 클래스의 객체를 생성할 때, 자식 클래스는 자식의 생성자를 통해 자식 객체를 생성한다.

Comic comicBook = new Comic();

 

특별한 역할을 하지 않는 기본 생성자는 비어있는 것이 맞다. 하지만 자식 클래스의 기본 생성자는 다르다. 필드 초기화와 같은 특별한 역할을 하고 있지 않더라도, super()라는 메서드를 가지고 있다.

 

this() 메서드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면, super() 메서드는 부모 클래스의 생성자를 호출할 때 사용한다.

Comic(){
	super();
}

 

자식 클래스로 객체를 생성하기 위해 기본 생성자가 호출되면, super()라는 메서드를 통해 부모 클래스의 기본 생성자를 호출한다. 그렇게 부모 객체를 먼저 생성한 후, 부모 객체를 감싸고 자녀 객체를 생성한다. 즉, 자식 객체 안에는 부모 객체가 들어있게 된다. 개발자가 직접 생상자를 선언할 때도, 자식 클래스에서는 반드시 부모 클래스의 생성자를 호출해줘야 한다.

부모 클래스(매개변수1, 매개변수2){
	this.필드1 = 매개변수1;
    	this.필드2 = 매개변수2;
}

 

자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때도 부모 클래스 대신 값을 매개변수로 받아서 부모 생성자에 넣어줘야 한다.

자식 클래스(매개변수1, 매개변수2, ...){
	super(매개변수1, 매개변수2, ...);
}

오버라이딩

부모 클래스를 상속받은 자식 클래스는 부모 클래스의 필드와 메서드를 가져와서 그대로 사용할 수 있다. 하지만 필요하다면, 자식 클래스가 상속받은 메서드의 내용을 변경해서 사용할 수도 있다. 이렇게 상속받은 메서드를 변경해서 다시 구현하는 것을 오버라이딩이라고 한다.

  • 부모 클래스의 메서드 이름/반환 타입/매개변수와 동일해야 한다.
  • 부모 클래스의 메서드 보다 접근 제한을 줄일 수는 있으나 접근 제한을 늘릴 수는 없다.

상속 관게에서 사용할 수 있는 super 키워드를 활용하면 중복을 줄일 수 있따. super 키워드는 부모 클래스에서 상속받은 필드나 상속받은 필드나 메서드를 자식 클래스에서 참조하는 데 사용하는 참조 변수이다.

super.부모 메서드();

접근 제한자

제한자란 클래스, 변수 또는 메서드의 선언부에 함께 사용해 부가적인 의미를 부여하는 키워드를 의미한다. 자바에서 제한자는 접근 제한자와 기타 제한자로 구분한다. 제한자는 경우에 따라 여러 개를 함께 조합해 사용할 수 있지만, 접근 제한자의 경우 하나만 선택해서 사용해야 한다.

 

모든 클래스와 모든 멤버에 외부에서 접근하지 못하도록 접근 권한을 제한할 수 있따. 접근이 필요하지 않은 곳에서의 사용을 막거나, 특정 범위에서만 접근할 수 있게 하기 위함이다. 이는 OOP의 특징 중에 한 가지인 정보 은닉을 지키기 위한 중요한 부분이다. 공공의라는 뜻을 가지는 public이 있고 별도로 명시하지 않으면 자동으로 default가 접근 제한자가 된다.

  • public : 제한 없이 모든 패키지, 모든 클래스에서 접근 가능하다.
  • protected : 같은 패키지 안에서 접근 가능하며, 다른 패키지라도 자식 클래스라면 접근 가능하다.
  • default : 같은 패키지 내에서만 접근 가능하다.
  • private : 같은 클래스 내에서만 접근 가능하다.

public > protected > default > private 순으로 접근 범위가 좁다.

 

public은 접근 제한자 중에서 가장 사용 범위가 큰 제어자이다 public으로 선언된 클래스와 멤버들은 같은 패키지는 물론 다른 패키지의 클래스에서도 접근할 수 있다.

 

접근 제한자를 명시하지 않으면 클래스와 멤버들은 자동으로 default라는 접근 제한자를 가진다. default로 선언된 클래스와 멤버들은 같은 패키지 안에서는 어디서든 접근 및 사용이 가능하지만 다른 패키지에서는 접근이 불가능하다.

 

protected는 클래스 멤버를 위한 제한자로, 클래스의 접근 제한자로 사용하지 않는 protected는 상속과 관련있는 제한자이다. default 제한자와 동일하게 같은 패키지 안에서 접근과 사용을 허용하지만, 다른 패키지에서의 접근을 완전히 제한하는 것이 아닌 해당 클래스와 상속 관계에 있는 자식 클래스라면 다른 패키지라도 접근 및 사용이 가능하다.

 

private는 접근 제한자 중에서 가장 사용 범위가 좁은 클래스 멤버를 위한 제한자이다. 클래스가 public/default라도, private로 선언된 멤버들은 클래스 외부에서 접근이 전혀 불가능하다. 오직 선언된 클래스 내부에서만 접근하여 사용할 수 있다. 따라서 private 멤버는 public 인터페이스를 직접 구성하지 않고, 클래스 내부의 세부적인 동작을 구현하는 데 사용한다.


2차 상속

현실에서 우리는 누군가의 자식도 될 수 있지만 누군가의 부모도 될 수 있듯이, 상속 역시 원한다면 다음 세대에게, 그리고 또 다음 세대로 이어질 수 있다. 자바도 마찬가지로, 2차 3차 N차까지 가능하다.

A 클래스 <- B 클래스 extends A 클래스 <- C 클래스 extends B 클래스 ... <= ...

'BOOK' 카테고리의 다른 글

[JAVA] MENTOR JAVA SECTION 12  (2) 2025.01.19
[JAVA] MENTOR JAVA SECTION 11  (2) 2025.01.18
[JAVA] MENTOR JAVA SECTION 9  (1) 2025.01.16
[JAVA] MENTOR JAVA SECTION 8  (2) 2025.01.15
[JAVA] MENTOR JAVA SECTION 7  (0) 2025.01.14