course 2021/JAVA

day10 - inheritance, overriding, overloading

코딩하는토끼 2021. 8. 31. 00:06

객체지향 프로그래밍 기술 - 상속, 은닉, 다형성

> 상속 inheritance

extends 상속받을클래스명

 

객체 지향 언어에서의 상속은 기존 클래스를 확장하여 새로운 클래스를 이끌어내는 것

여러 개의 클래스가 같은 기능(코드)를 필요로 할 때, 이것을 한 클래스에서 작성 후 여러 개의 클래스에게 상속

코드 재사용으로 반복작업을 줄일 수 있음

 

[상속해주는 클래스 = 부모 클래스 (parent / super class)]  →  [상속받는 클래스 = 자식 클래스 (child / sub class)]

멤버변수메소드가 상속되며, 생성자는 상속되지 않음

단일 상속만 지원함

*자바의 모든 클래스는 Object 클래스를 상속받고 있음 (Object 클래스는 자바의 최상위 클래스)

//만들고 싶은 클래스1
public class Student {
    String name;
    int age;
    String studentId;
    
    String info() { 
        return "이름: " + name + ", 나이: " + age;
    }
}

//만들고 싶은 클래스2
public class Teacher {
    String name;
    int age;
    String subject;
    
    String info() {
        return "이름: " + name + ", 나이: " + age;
    }
}

//공통 부분: 멤버변수 name, age, 메소드 info
//각각의 고유한 부분: Student 클래스의 멤버변수 studentId, Teacher 클래스의 멤버변수 subject
//부모클래스
public class Person {
    String name;
    int age;
    
    String info() {
        return "이름: " + name + ", 나이: " + age;
    }
}

//자식클래스1
public class Student extends Person {  //상속받음
    String studentId;
}

//자식클래스2
public class Teacher extends Person {  //상속받음
    String subject;
}

//student 클래스의 main 클래스
public class MainClass { 
    Student s = new Student();  //객체생성
    s.name = "홍길동";
    s.age = 20;
    s.studentId = "123123";
    
    System.out.println( s.info() );
}

> 오버라이딩 overriding - 메소드 재정의

부모클래스에서 상속받은 메소드를 자식클래스에서 다시 정의하여 사용하는 것

부모클래스에서와는 다르게 사용하기 위해 바꾸거나 보완

오버라이딩 이후 자식클래스에서 메소드를 호출하면 재정의된 메소드가 호출됨

재정의된 메소드는 우선적으로 실행됨

- 규칙 -

1. 상속을 전제로 함

2. 메소드의 이름, 반환유형, 매개변수 선언이 기존 메소드와 완전히 일치

3. 접근제한자는 같거나 더 제한이 없어야 함

//부모클래스
public class Parent {
    void method1() {
        System.out.println("부모의 1번 메소드");
    }
    void method2() {
        System.out.println("부모의 2번 메소드");
    }
}

//자식클래스
public class Child extends Parent {
    void method2() {   //오버라이딩, 메소드 이름/반환유형/매개변수 동일하게 작성
        System.out.println("부모의 2번 메소드 재정의");  //메소드 내용 변경
    }
    void method3() {
        System.out.println("자식의 3번 메소드");
    }
}

//main 클래스
public class MainClass{
    Child c = new Child();
    c.method1(); //상속받은 메소드
    c.method2(); //오버라이딩 된 메소드
    c.method3(); //자식클래스의 고유한 메소드 (자식클래스에서 정의된 메소드)
//위의 상속 예제 오버라이딩
public class Student extends Person {
    String studentId;
    String info() {
        return "이름: " + name + ", 나이: " + age + ", 학번: " + studentId;  //내용 추가
    }
}

> 오버로딩 overloading - 메소드 중복

메소드/생성자의 중복 선언

메소드/생성자를 선언할 때 이름은 같게, 매개변수 유형/ 개수 / 순서를 다르게 선언하는 것

하나의 메소드로 매개 변수의 유형에 따라 다른 동작이 실행됨

- 조건 -

1. 이름이 같아야 함

2. 매개변수의 유형 / 개수 / 순서가 달라야 함

3. 상속 여부, 접근제한자, 반환유형 무관

//안되는 예 - 반환유형은 void와 int로 서로 다르지만, 매개변수 유형과 개수가 동일
void input(int a) {
    System.out.println("정수 입력");
}
int input(int b) {
    return b;
}

//되는 예 
void input(int a) {
    System.out.println("정수 입력");
}
void input(int a, int b) {  //매개변수의 개수가 다름
    System.out.println("정수 두개 입력");
}
void input(double b, String s) {   //매개변수의 종류가 다름
    System.out.println("실수 하나, 문자열 하나 입력");
}
void input(String s, double b) {   //매개변수의 순서가 다름
    System.out.println("문자열 하나, 실수 하나 입력");
}

//main 클래스
public class MainClass {
    public static void mian(String[] args) {
        Basic b = new Basic();
        b.input(5);  //매개변수 입력을 메소드에 맞게 하면 됨
        b.input(1, 2);
        b.input(3.14, "응");
        b.input("가", 1.23);
    }
}