객체지향 프로그래밍, OOP에서
중요한 개념중 하나로써
기존 클래스의 속성과 메서드를 새로운 클래스에서 재사용할 수 있게 해주기에,
코드의 재사용성을 높이고, 클래스 간의 계층 구조를 형성한다
상속의 기본개념
우선 기본 클래스와 파생 클래스로 나뉘게 되는데
기본 클래스는 흔히 부모 클래스, 슈퍼 클래스라고 불리며
파생 클래스는 흔히 자식 클래스, 서브 클래스라고 불린다
기본클래스와 파생클래스
기본 클래스는 모든 클래스의 기본이 되며
중첩되는 데이터가 많이 있는것이 모이게 된다
파생 클래스는 기본 클래스의 정보와, 함수 등등을 모두
내려 받으며 데이터 혹은 함수등을 추가 할 수 있게 된다
public class Parent {
String name;
int age;
int money;
우선 기본클래스에 이런 정보들이 담겨있고
파생클래스에게 전해주려면
public 혹은 protected 이어야만 한다
하지만 public의 경우 보안상의 이유로
상속관계에서만 접근이 가능한
protected로 설정해주자
그러면 상속받는 파생 클래스에서는
어떻게 상속받았다고 표현해줘야 할까
public class Child extends Parent{
파생클래스의 이름 뒤에
extends 기본클래스이름
을 적어주어
기본클래스로부터 이어진다, 내려받는다 라고 생각하면 좋겠다
private String hobby;
그 후에 파생클래스에는 이런 속성이 추가로 있다고 가정하자
그렇다면 아래와 같이
Child c = new Child();
c.name = "홍길순"
c.age = 25;
c.money = 100000;
c.hobby = "게임";
이런식으로 적어줬다고 했을때
파생클래스인 child에는 name, age, money가 없지만
기본클래스인 Parent로 부터 속성과 함수를 "상 속 " 받았기 때문에
사용 할 수 있게 된다
메소드 오버라이딩과 Super
이렇게 속성과 함수를 상속 받는다면
어떻게 사용될까
public void print(){
System.out.println("이름 : "+ name + ", 나이 : "+ age + ", 재산 : " + money);
}
기본 클래스에서 print() 함수가 있었다고 하자
그리고 파생 클래스에선
public void printChild() {
System.out.println("이름 : "+ name + ", 나이 : "+ age + ", 재산 : " + money);
System.out.println("취미는 : " + hobby);
}
이렇게 있었다면
사용자 입장에서
어차피 상속받는 건데
기본클래스나
파생클래스나
파생의 파생의 파생의 파생의 파생 클래스나
똑같은 함수를 쓰는게 편할것 아닌가?
그리고,
어차피 상속 받는데 기본클래스에서 적어줬던 name age money를 계속 적어줘야 할까?
이런 귀찮음을 해결하는 것이
메소드 오버라이딩 Method Overriding과
Super 키워드다
우선은 오버라이드는
오버로딩과 비슷하지만 살짝 다르다
오버로딩에서는
오버로딩: 같은 클래스 내에서 발생
오버로딩: 같은 이름의 메서드를 다양한 매개변수 목록으로 제공하여 편의성을 높입니다.
오버로딩: 메서드의 이름은 같지만 매개변수 목록이 달라야 합니다.
오버로딩: 접근 제어자에 제한이 없습니다.
오버라이딩: 상속 관계 클래스 간에 발생
오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 재정의하여 기능을 수정하거나 확장합니다.
오버라이딩: 메서드의 이름, 매개변수 목록, 반환 타입이 모두 동일해야 합니다.
오버라이딩: 자식 클래스에서 오버라이딩된 메서드는 부모 클래스의 메서드보다 더 제한적인 접근 제어자를 사용할 수 없습니다.
즉, 오버로딩에서는 같은 클래스에서의
다양한 매개변수로 다양한 값을 구하기위함이지만
오버라이딩에서는 상속 클래스에서의
기능 자체의 확장, 수정이며 상속받는것과 모두 동일하게 진행된다
그렇기에 위의 경우
public void print() {
System.out.println("이름 : "+ name + ", 나이 : "+ age + ", 재산 : " + money);
System.out.println("취미는 : " + hobby);
}
라고 쓸 수 있겠는데
printChild에서 상속클래스와 동일하게 print로 사용할 수 있겠다
하지만 문제점은 여전히 남아있다
상속받을때도 썼던 name, age, money를 계속 써줘야할까?
Super 키워드
이때 사용하는게 Super 라는 키워드인데
super는 상속하는 기본 클래스를 의미한다
public void print() {
super.print();
System.out.println("취미는 : " + hobby);
}
그래서 이렇게 상속하는 쪽에서의 print 함수를 super.print() 라고 사용한다면
굳이 일일히 쓸 필요가 없게 된다
그리고 한가지 더 문제점이 남아있는데
이걸 작성하는 나 는 이게 어디서 상속받았고 상속해주고 그런걸 다 아는데
만약 내가 퇴사하고 다른 사람이 들어왔을때
이걸 보면서 이게 무슨소리인지 못 알아들을 수 있다
그렇기에
@Override
public void print() {
super.print();
System.out.println("취미는 : " + hobby);
}
이렇게 함수 위에 @Override
라고 적어주자
그리고 이것을 편히 사용하기 위해
위와같이 마우스 우측 클릭을 하면 오버라이드 메소드를 편히 사용하는 툴이 있는데
이를 클릭하면
위와같이 어떤것을 사용할 것인지 물어보는게 나오게 된다
이 경우는 print 이니 체크해서 OK를 클릭하면
이렇게 나오게 되니
우리는 추가할 메세지만 추가로 적어주면 되겠다
Abstract
구현해야 할 것들은 다 구현을 끝낸 뒤
상속 받을 하위 클래스에서 구현해내야 할 내용은 비워두고
메소드를 구현하도록 만든 클래스
이를 추상클래스 라고도 한다
대부분의 회사에서는 혼자 하는 일이 아니라
구성원들끼리 모여 일을 하게 되는데
일의 분담을 위해
어느정도 만든뒤 다음사람에게 넘기게 된다
이때 메소드의 이름만 정해둔 채
기능은 이런 기능으로 만들어달라 라고 넘기게 된다
멤버 변수들을 모두 출력하도록 만든다
public void print();
이름 입력하면 화면에 출력하도록 만든다
public void hello(String name);
만약 이렇게 구현해 달라 라는 메세지를 남기고 싶다면
abstract public void print();
abstract public void hello(String name);
각각 앞에 abstract를 남기면 된다
그러면
좌측과 같이 오류가 나오게 되니
우측처럼 같이 abstract를 추가해주자
그리고 하위클래스로 가게 되면

오류가 나게 되고 클릭해보면
메소드를 추가한다는 메세지가 있으니 클릭해보자

그러면 위와 같이 앞에서 추가해야할 메소드들을 상속받게 된다
그렇다
상속은 재산도 상속되지만
빚도 상속이 된다
빚을 처리해야 한다

그래서 위와같이 하게 된다면


상속받은
아무것도 만들어지지않은 함수를
수정하여 처리 할 수 있게된다
'Java > JAVA' 카테고리의 다른 글
Java - 문자열, 정수 및 실수를 클래스로 생성하는 법 (0) | 2024.06.03 |
---|---|
Java - 다중 상속 Interface (0) | 2024.06.03 |
Java - Overloading (0) | 2024.05.31 |
Java - Getter, Setter 함수 (0) | 2024.05.31 |
Java - 접근 제어자 (0) | 2024.05.31 |