상속 - 법률 용어
일정한 친족 관계가 있는 사람 사이에서, 한 사람이 사망한 후에 다른 사람에게 재산에 관한 권리와 의무의 일체를이어 주거나, 다른 사람이 사망한 사람으로부터 그 권리와의무의 일체를 이어받는 일.
Java에서 상속이란?
부모 클래스(상위 클래스)와 자식 클래스(하위 클래스)가 있으며, 자식 클래스는 부모 클래스를 선택해서, 그 부모의 멤버를 상속받아 그대로 쓸 수 있게 됩니다.
- 부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없습니다.
- 부모와 자식 클래스가 서로 다른 패키지에 있다면, 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없습니다.
(default 접근 제한은 ‘같은 패키지에 있는 클래스’만 접근이 가능하게끔 하는 접근 제한자이기 때문입니다.) - 그 이외의 경우는 모두 상속의 대상이 됩니다.
상속의 장점
- 코드 재사용성: 상속을 통해 기존 클래스를 수정하지 않고 새 클래스를 만들 수 있습니다. 이는 기존 클래스의 속성과 메서드를 재사용하고 새 클래스에서 사용할 수 있음을 의미합니다. 즉, 코드를 재사용하여 시간과 노력을 절약할 수 있습니다.
- 유연성: 상속은 새로운 기능을 추가하거나 새 클래스의 기존 기능을 수정할 수 있도록 하여 유연성을 제공합니다. 부모 클래스의 속성이나 메서드를 수정하면 자동으로 상속받은 모든 자식 클래스에 영향을 미칩니다.
- ★계층 구조: 상속을 통해 클래스의 계층 구조를 만들 수 있습니다. 부모 클래스를 만든 다음 이 클래스에서 상속되는 자식 클래스를 만들 수 있습니다. 이 계층 구조는 코드 구조를 보다 조직화하고 관리하기 쉽게 만듭니다.
- 다형성(Polymorphism): 상속을 통해 객체가 다양한 형태를 취할 수 있는 능력인 다형성을 구현할 수 있습니다. 부모 클래스에서 메서드를 상속하면 자식 클래스에서 메서드를 재정의하여 다른 동작을 제공할 수 있습니다. 이것은 우리가 다른 자식 클래스에서 다른 방식으로 동일한 방법을 사용할 수 있음을 의미합니다.
- 중복 코드 제거: 상속을 통해 공통 속성 및 메서드를 포함하는 공통 상위 클래스를 생성하여 중복 코드를 제거할 수 있습니다. 그런 다음 하위 클래스는 이러한 공통 속성과 메서드를 상속할 수 있으며 각 하위 클래스에서 동일한 코드를 반복할 필요가 없습니다. 이것은 우리가 작성해야 하는 코드의 양을 줄이고 코드를 더 유지하기 쉽게 만듭니다.
사용 방법
상속받고자 하는 자식 클래스명 옆에 extends 키워드를 붙이고, 상속할 부모 클래스명을 적습니다.
자바는 다중 상속을 허용하지 않으므로, extends 뒤에는 하나의 부모 클래스만 와야 합니다.
public Class Parent{ .... }; // 부모 클래스
public Class Child extends parent { .... }; // 자식 클래스
동물과 사람에 대한 예시를 보여드리겠습니다.
예시
public class Animal {
private int age=1;
public void eat() {
System.out.println("먹다");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Person extends Animal{
public void study() {
//부모의 age 변수에 접근 불가
//상속받았더라도 부모의 private 에는 직접 접근불가
//getter setter 가 있을때 그 메서드로 접근한다
System.out.println(getAge()+"세 사람이 공부하다");
}
}
public class TestInheritance1 {
public static void main(String[] args) {
Animal a=new Animal();
System.out.println(a.getAge()); // 1
a.eat(); // 먹다
Person p=new Person();
p.study(); // 1세 사람이 공부하다
p.eat();//상속받았으므로 사용가능 // 먹다
System.out.println(p.getAge()); // 1
}
}
Animal에 있는 메소드와 속성을 가져와서 Person 이 study 메소드에서 사용하는 것을 보고 상속을 사용했다고 할 수 있고, 또한 eat 메소드도 가져와서 먹다로 출력하는 것을 확인 할 수 있습니다. (자바는 코드가 길어지다보니까 예시를 사용하기가 참 애매합니다. 하지만 직접 IDE에 코드를 가져가서 실행하고 혹은 꼼꼼히 읽어보면 이해가 잘 됩니다. 코드가 복잡해 보인다고 대충 읽지 말고 지나가면 좋더라고요.)
super
- 부모 클래스의 생성자 호출: 부모 클래스에서 생성자 호출을 super()사용하여 부모 클래스의 생성자를 호출할 수 있습니다. 이를 통해 부모 클래스의 작업을 수행할 수 있습니다.
- 부모 클래스 메소드 호출: 자식 클래스에서 super.method()사용하여 부모 클래스의 메소드를 호출할 수 있습니다. 이를 통해 자식 클래스에서 부모 클래스의 방법을 재정의할 때, 부모 클래스의 기능을 그대로 유지하면서 일부 기능만 표기할 수 있습니다.
- 부모 클래스의 속성에 접근: super.variable사용하여 부모 클래스의 속성에 접근할 수 있습니다. 이를 통해 부모 클래스에서 정의된 구성원을 구성원 클래스에서 재활용할 수 있습니다.
super는 부모 클래스에서 부모 클래스 멤버에 접근할 때 사용되며, 상속 관계에서 유용하게 사용됩니다. super를 사용하면 코드의 가독성과 유지 보수성이 좋아지고, 중복 코드를 찢을 수 있습니다.
constructor에 많이 사용되긴합니다.
예시
이번에도 위의 예시와 비슷하게 진행하겠습니다.
public class Animal {
private int age;
public Animal(int age) {
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Person extends Animal{
// 생성자를 명시하지 않으면 아래와 같이 기본 생성자가 자동 삽입
// 이 경우 super() 는 부모의 기본 생성자를 호출
// 현재 부모 클래스인 Animal에는 기본 생성자가 존재하지 않아
// 컴파일 에러가 발생 이 경우에는 직접 super(data) 를 명시
// public Person(){super();}
// super 를 명시
private String name;
public Person(int age,String name) {
super(age);
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class TestSuper2 {
public static void main(String[] args) {
// super() 를 직접 명시해야 하는 경우에 대한 예제
Person p=new Person(30,"아이유");
System.out.println(p.getAge()); // 30
System.out.println(p.getName()); // 아이유
}
}
생성자에 super를 넣어서 실행을 하게 되면 부모 class에서 선언한 age 인스턴스 변수를 가져와서 자식 constructor에서 사용할 수 있습니다.
또한, 속성 말고도 메소드도 super.method() 로 가져올 수 있으니 직접 작성해서 연습해보면 좋겠습니다.
Object class (java.lang 클래스) - 모든 클래스의 조상
부모 클래스는 그럼 그냥 아무 조건없이 생성되는 것인가라는 의문이 생기게 되는데 java.lang Object클래스를 사용하여 생성되는 것이라고 합니다.
부모 클래스는 사실 extends Object 가 생략되었다고 생각하면 되겠습니다.
public class Animal {
public int age;
public Animal(int age) {
super(); // 이거 ctrl + 마우스 왼쪽 버튼 클릭
this.age=age;
}
}
예시코드 처럼 만들고 super를 ctrl + 마우스 왼쪽 버튼 하면 Object.class에 들어가지게 되는데 이게 바로 자바에서 부모클래스도 최상위 클래스 Object로 부터 상속하게 만듭니다.
그래서.... Object 클래스의 toString()함수는.... protected로 선언할 수 없다는 점.... 잊지마세요.
그리고 상속은 단일 상속이라는 점 잊지마세요. 인터페이스와는 다르답니다.
소감
모든 언어가 점점 복잡해지면서 예시코드를 보여주기가 힘들어지는데, 자바는 특히 class들이 나누어져있어서 사람들이 예제코드를 보기에 불편할 것 같다는 생각이 들었습니다. 어떻게하면 짧게 작성하여 사람들이 이해하기 쉽게 만들까라는 고민을 하게되는데요. 그냥 부지런한 자들이 더 많이 얻을 것 같기 때문에 검색을 하시는 분들이 조금만 더 친하게 다가가는 것이 좋다고 생각합니다. 저도 다른 글들을 보면서 최대한 꼼꼼하게 읽으려고 노력합니다.
상속은 객체지향 프로그래밍에서 매우 중요한 부분이라고 생각이 됩니다. 기본을 탄탄하게 하여 다음 단계인 다형성을 공부할 때 도움이 되게 해야겠습니다.
출처
https://chanhuiseok.github.io/posts/java-1/
https://blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220960019390
'코딩 개발 > Java' 카테고리의 다른 글
Java - Static (feat. final, metaspace) (0) | 2023.04.09 |
---|---|
Java - 다형성(Polymorphism) (0) | 2023.04.09 |
Java - Array(배열) (0) | 2023.04.07 |
Java - UML 다이어그램 (0) | 2023.04.05 |
Java - Data Type (0) | 2023.04.05 |