[Java] 상속 Inheritance - 1 (extends, super)

2024. 4. 6. 21:07·CS/Java
목차
  1. 상속(Inheritance)
  2. 클래스 상속 문법
  3. 자식 클래스 생성
  4. 자식 생성자 만들 때, super() 사용
  5. 상위 클래스의 필드나 메서드를 참조하는 super
  6. Method overriding
  7. super을 이용하여 부모 메서드에 접근하기

상속(Inheritance)


B 클래스가 A 클래스를 상속 받으면 B 클래스는 A 클래스의 필드와 메서드를 사용할 수 있음

→ 유지 보수가 편하고, 프로그램을 수정하거나 새로운 내용을 추가하는 것이 편리함

화살표 방향 주의

 

클래스 상속 문법


자식 클래스 생성

extends 키워드를 사용함

// 예시
public class 자식클래스 extendss 부모클래스 {...}

이 문법에서 사용되는 부모클래스는 하나여야 함.

 

사용 예시: 포유류와 사람 (포유류는 상위 클래스, 사람은 하위 클래스)

// 포유류 클래스
class Mammal { ... }

// 사람 클래스
class Human extends Mammal {...}

 

자식 클래스의 객체를 만들 때, 부모 객체가 먼저 생성되고 이후에 자식 객체가 생성된다.

자식클래스 변수 = new 자식클래스();

자식 클래스는 부모클래스를 상속받았기 때문에 자유롭게 부모의 모든 속성을 사용할 수 있음.

하지만 그럼에도 자식과 부모사이의 구분이 있어야하는데, 자식클래스가 부모클래스의 속성과 동일한 이름을 갖고 있다면 그것을 부모로부터 구분해 낼 수 있어야한다는 것

 

 

자식 생성자 만들 때, super() 사용

public 자식클래스(...) {
    super();
    ...
}

상속에서 생성자는 자식에게 상속되지 않는 유일한 요소임

하위 클래스가 생성될 때는 상위 클래스의 생성자가 먼저 호출됨

→ 생성자를 만들 때 부모 클래스의 생성자를 선언해주어야 함

경우는 세 가지!

 

1. 파라미터가 없는 기본 생성자만 부모가 가진 경우

자식 생성자를 만들 때, super()을 굳이 적지 않아도 자바 컴파일러가 알아서 적용을 시켜준다.

 

2-1. 기본 생성자가 있지만, 파라미터를 지닌 다른 생성자도 부모가 지니고 있는 경우

디폴트가 아닌 자식 생성자를 만들 때, 자유롭게 만들 수 있음

this 써도 되고, super 써도 되고

 

2-2. 부모가 기본 생성자를 지니고 있지 않은 경우

public class Parent {
    public Parent(int a) {
        this.n = a;
    }
}

public class Child extends Parent {
	public Child() {
    	// 자식 생성자 내용
    }
}

이럴 때 두 가지로 해결 할 수 있다.

부모에게 기본 생성자를 만들어주거나, 자식 생성자를 만들 때 super내에 파라미터 값을 넣어주는 것이다.

// 부모에 기본 생성자를 넣어주는 방법

public class Parent {

	public Parent() {
    	n = 10;
    }
    
    public Parent(int a) {
        this.n = a;
    }
}

public class Child extends Parent {
	public Child() {
    	super();
    	// 자식 생성자 내용
    }
}
// super에 파라미터를 넣어주는 방법

public class Parent {
    
    public Parent(int a) {
        this.n = a;
    }
}

public class Child extends Parent {
	public Child() {
    	super(40);
    	// 자식 생성자 내용
    }
}

위와 같은 두 가지 방법으로 해결할 수 있다.

 

상위 클래스의 필드나 메서드를 참조하는 super

하위 클래스에서 상위 클래스에 선언한 필드나 메서드에 접근할 때에도 super을 사용함

class A {
    int a;
}

class B extends A {
    int a;
}

public static void main(String args[]){
    B ins = new B();
    ins.a = 2 // 자식의 변수이다
    // 만약 자식에게 a라는 변수가 없었다면 부모의 a를 가리켰을 것이다.
    // 여기서 자식 a가 아닌 부모의 a로 접근하고 싶다면?

    ins.super.a = 20; // 이렇게 super라는 참조 변수를 사용해서 부모의 a에 접근할 수 있다
}

 

Method overriding

자식 클래스에서 메서드를 재정의 하는 것

메서드가 자식 클래스에서 새로 정의되면, 자식 객체에서 재정의한 메서드가 실행됨

class Parent {
    
    void method1() {
            System.out.println("hi");
    }

    void method2() {
    	System.out.println("hello");
    }
}

class Child extends Parent {
	
    void method2() {
    	System.out.println("hello2");
    }
    
    void method3() {
    	System.out.println("안녕");
    }
}

class Main {
	public static void main(string[] args) {
    	Child child = new Child();
        child.method1();	// hi 출력
        child.method2();	// hello2 출력
        child.method3();	// 안녕 출력
    }
}

 

오버라이딩 시에, 자식 메서드는 부모 메서드의 리턴 타입, 메서드 이름, 파라미터가 동일해야 한다.

public에서 private로의 변경과 같이 범위를 더 제한적으로 바꾸는 것이 불가능하다.

 

super을 이용하여 부모 메서드에 접근하기

super과 dot(.)을 사용하여 부모 메서드를 사용할 수 있다.

이를 통해 자식 메서드에서 부모 메서드를 재사용함으로써 중복되는 작업을 제거할 수 있음

class Parent {
    
    void method2() {
    	System.out.println("hello");
    }
}

class Child extends Parent {
	
    void method2() {
    	super.method2();
    	System.out.println("hi");
    }
    
}

이후 main에서 실행하면 hello와 hello2 모두를 출력하게 된다.

'CS > Java' 카테고리의 다른 글

[Java] 상속 Inheritance - 3 (Type Conversion 형변환, Polymorphism 다형성)  (0) 2024.04.15
[Java] 상속 Inheritance - 2 (Final Class, Final Method, protected 제어자)  (0) 2024.04.15
[Java] Class 클래스 - 2 (정적 변수 static, 상수 final, 패키지, 접근 제어자 private-public-protected, getter & setter)  (0) 2024.04.06
[Java] Class 클래스 - 1 (field, constructor, method)  (0) 2024.04.03
[Java] Object-Oriented Programming 객체 지향 프로그래밍  (0) 2024.04.03
  1. 상속(Inheritance)
  2. 클래스 상속 문법
  3. 자식 클래스 생성
  4. 자식 생성자 만들 때, super() 사용
  5. 상위 클래스의 필드나 메서드를 참조하는 super
  6. Method overriding
  7. super을 이용하여 부모 메서드에 접근하기
'CS/Java' 카테고리의 다른 글
  • [Java] 상속 Inheritance - 3 (Type Conversion 형변환, Polymorphism 다형성)
  • [Java] 상속 Inheritance - 2 (Final Class, Final Method, protected 제어자)
  • [Java] Class 클래스 - 2 (정적 변수 static, 상수 final, 패키지, 접근 제어자 private-public-protected, getter & setter)
  • [Java] Class 클래스 - 1 (field, constructor, method)
1in
1in
1in
Love IT!
1in
전체
오늘
어제
  • 분류 전체보기 (52)
    • BackEnd (9)
      • Django (3)
      • AWS (0)
      • Error (2)
    • 문제 풀이 (7)
      • Baekjoon (7)
    • CS (36)
      • 자료구조 (17)
      • Java (11)
      • C언어 (1)
      • 알고리즘 (6)
      • 어셈블리어 (0)
      • Python (1)
    • 이것저것 (0)
      • 회고 (0)
      • 책 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • avl tree
  • 연결리스트
  • 상향식 분석
  • 링크드리스트
  • 레드블랙트리
  • 재귀 분석
  • 자료구조
  • 유클리드 호제법
  • Queue
  • C언어
  • 하향식 분석
  • 라이브러리
  • 이진트리
  • 큐
  • 모듈
  • 인터페이스
  • 이중연결리스트
  • 알고리즘
  • 자바
  • 재귀

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
1in
[Java] 상속 Inheritance - 1 (extends, super)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.