[Java] 객체 지향 - 상속, 오버라이딩

2023. 8. 24. 02:11·개발 ━━━━━/Java
반응형

상속 (Inheritance)

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것

class Parent { ... }

class Child extends Parent { ... }

Parent : 조상 클래스 (부모 parent, 상위 super, 기반 base 클래스)

Child : 자손 클래스 (자식 child, 하위 sub, 파생된 derived 클래스)

 

- 생성자와 초기화 블럭은 상속되지 않고 멤버만 상속된다.

- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.

 

포함관계 (Composite)

한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것

class Circle{
    Point c = new Point();
//    int x;
//    int y;
    int r;
}

class Point{
    int x;
    int y;
}

 

상속관계

class Circle extends Point{
    int r;
}

class Point{
    int x;
    int y;
}

 

포함관계 ~은 ~을 가지고 있다. (has-a)
상속관계 ~은 ~이다. (is-a)

 

단일 상속 (Single Inheritance)

Java 는 다중 상속을 허용하지 않는다.

class TV { ... }

class VCR {
	void play() { ... }
    void stop() { ... }
}

class TVCR extends TV {
	VCR vcr = new VCR();
    
    void play(){
    	vcr.play();
    }
    
    void stop(){
    	vcr.stop();
    }
}

TV 클래스를 조상으로 하고, VCR 클래스를 TVCR 클래스에 포함시킨 코드

 

Object 클래스

모든 클래스 상속계층도의 최상위에 있는 조상 클래스이다.

 

오버라이딩 (Overriding)

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것

 

조건

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 이름, 매개변수, 반환타입이 같아야한다. ( = 선언부가 일치해야 한다.)

단, 접근 제어자와 예외는 제한된 조건 하에서 다르게 변경 가능하다.

  1. 접근 제어자 - 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  2. 예외 - 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
  3. 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.

 

오버로딩 vs 오버라이딩

오버로딩 기존에 없는 새로운 메서드를 정의하는 것 (new)
오버라이딩 상속받은 메서드의 내용을 변경하는 것 (change, modify)

 

super

자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수

(멤버변수와 지역변수의 이름이 같을 때 this 로 구별했듯이 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름을 구별)

class superTest{
    public static void main(String[] args) {
        Child1 c = new Child1();
        Child2 d = new Child2();
        c.method();
        d.method();
    }
}

class Parent{
    int x = 10;
}

class Child1 extends Parent{
    void method(){
        System.out.println("x=" + x);
        System.out.println("this.x=" + this.x);
        System.out.println("super.x=" + super.x);
    }
}

class Child2 extends Parent{
    int x = 20;
    void method(){
        System.out.println("x=" + x);
        System.out.println("this.x=" + this.x);
        System.out.println("super.x=" + super.x);
    }
}

// 출력
// x=10
// this.x=10
// super.x=10

// x=20
// this.x=20
// super.x=10
조상 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우 메서드에도 super 를 붙여준다.
후에 조상 클래스의 메서드가 변경되더라도 변경된 내용이 자손 클래스의 메서드에 자동 반영된다.

 

super()

조상 클래스의 생성자를 호출하는데 사용

class PointTest{
    public static void main(String[] args) {
        Point3D p3 = new Point3D(1,2,3);
    }
}

class Point{
    int x;
    int y;
    
    // 해결방법 2
    // Point(){
        
    // } 추가
    Point(int x, int y){
        this.x = x;
        this.y = y;
    }
}

class Point3D extends Point{
    int z;
    Point3D(int x, int y, int z){
        // 컴파일 에러 발생
        // 생성자 첫 줄에 생성자를 호출하지 않았기 때문에 super(); 가 디폴트로 들어가지만
        // Point 클래스에는 Point() 가 없으므로 에러 발생
        
        // 해결방법 1
        // super(x, y); 추가 - 조상 클래스의 생성자 호출
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

실행 순서

Point3D() → Point3D(int x, int y, int z) → Point(int x, int y) → Object()

조상 클래스의 멤버 변수는 조상의 생성자에 의해 초기화되도록 해야 한다.
반응형

'개발 ━━━━━ > Java' 카테고리의 다른 글

[Java] String <-> Int 형변환  (0) 2023.08.25
[Java/Algorithm] List 오름차순  (0) 2023.08.24
[Java] 객체 지향 - 클래스, 인스턴스, 생성자  (2) 2023.08.19
[Java] 기초 문법 - 컬렉션 (Collection)  (0) 2023.08.16
[Java] 기초 문법 - 배열  (1) 2023.08.16
'개발 ━━━━━/Java' 카테고리의 다른 글
  • [Java] String <-> Int 형변환
  • [Java/Algorithm] List 오름차순
  • [Java] 객체 지향 - 클래스, 인스턴스, 생성자
  • [Java] 기초 문법 - 컬렉션 (Collection)
GukJang
GukJang
•  ⌘ ⌥ •
    반응형
  • GukJang
    SPACE
    GukJang
  • 전체
    오늘
    어제
    • Blog (73)
      • 개발 ━━━━━ (68)
        • Java (14)
        • C++ (1)
        • HTML (1)
        • Spring(boot) (7)
        • Dev (9)
        • SQL (1)
        • CS (2)
        • Git (1)
        • Troubleshoot (14)
        • Algorithm (2)
        • Definition (1)
        • Dev Life (2)
        • TIL (7)
        • 항해 (6)
      • 공돌 ━━━━━ (4)
        • 플젝 (2)
        • 장비 (1)
        • 부품 (1)
      • 독서 ━━━━━ (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    EC2
    마이크로파이썬
    electron-builder
    micropython
    mysql
    알고리즘
    spring
    docker volume
    자바
    CI CD
    Java
    AWS
    github actions
    사전 스터디
    Python
    백준
    항해99
    오픈소스 기여
    SpringBoot
    docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
GukJang
[Java] 객체 지향 - 상속, 오버라이딩
상단으로

티스토리툴바