JAVA - 상속
상속
부모 클래스의 멤버(변수, 함수)를 상속받는 것을 의미하며, 하나의 클래스에 여러 클래스를 상속할 수 없다.
부모 클래스에게 인스턴스 멤버를 상속받은 경우, 자식 클래스의 이름으로 인스턴스를 생성해야 한다.
왜 사용해야 하는가?
- 코드를 재사용하고, 중복을 줄이기 위해 사용한다.
사용방법
클래스 선언 부분 뒤에 'extends 부모 클래스명'을 붙여 상속할 수 있다.
class Parents {
int a = 10;
}
class Child extends Parents {
int b = 20;
}
'
'
'
[X] Parents pa = new Parents() [X]
Child ch = new Child();
ch.a;
ch.b;
Parents 클래스를 Child 클래스에 상속하면 Child 클래스의 인스턴스를 통해 Parents 클래스의 인스턴스 변수에 접근할 수 있다.
예시
public class Person {
void breath() {
System.out.println("숨쉬기");
}
void eat() {
System.out.println("밥먹기");
}
void say() {
System.out.println("말하기");
}
}
public class Student extends Person {
void learn() {
System.out.println("배우기");
}
}
public class Teacher extends Person {
void teach() {
System.out.println("가르치기");
}
}
public class inheritance {
public static void main(String[] args) {
Student s1 = new Student();
s1.breath();
s1.learn();
Teacher t1 = new Teacher();
t1.eat();
t1.teach();
}
}
Person 클래스를 상속받은 Student 클래스와 Teacher 클래스의 인스턴스를 통해 Person 클래스의 메서드에 접근할 수 있다.
오버라이딩
부모 클래스에게 상속받은 메서드를 리모델링(재정의) 하는 것이다. 부모 클래스의 메서드 위에 자식 클래스의 메서드를 쌓는다고 생각하면 이해하기 쉽다.
동일한 이름의 메서드를 호출하면, 자식 클래스에 작성된 메서드가 호출된다.(우선순위)
사용방법
자식 클래스에 부모 클래스의 메서드와 동일한 이름, 반환타입, 매개변수를 가진 메서드를 작성하고, 내용을 바꾸면 된다.(형식은 그대로 내용만 바뀐다.)
class aaa{
void a1() {
System.out.println("aaa");
}
}
class bbb extends aaa {
void a1() {
System.out.println("bbb");
}
}
'
'
'
bbb b1 = new bbb();
b1.a1();
자식 클래스에 오버라이딩된 메서드 a1이 호출된다.
재정의 하고 싶은 메서드를 자동으로 선택하는 법(오타방지)
이클립스에서 상속받은 자식 클래스 우클릭
Source ㅡ> Override/Implement Method ㅡ> 오버라이딩할 메서드 선택
생성자
super
부모 클래스의 멤버에 접근하기 위한 명령어로, 클래스 멤버(static)에는 사용 불가능하다.
1. 부모 클래스 생성자를 호출하는 데 사용한다.
자식 클래스 생성자에서 사용한다.
super();
특징
- 자식 클래스 생성자의 첫 번째 줄에 자동 생성된다.(눈에 안보임)
- 자식 클래스 생성자가 매개변수를 가지고 있다면, 부모 클래스에 기본 생성자를 생성해 줘야 작동한다.
2. 부모 클래스의 인스턴스 멤버 접근
super는 부모 클래스를 뜻한다.
super.변수;
super.메서드();
특징
- 상속시 동일한 이름을 가진 멤버에 접근할 때 사용된다.(부모 클래스)
- 부모 클래스의 인스턴스 멤버에 접근 가능하다.
super() 예시
class A{
A(int a) {
System.out.println(a);
}
A(int a, int b) {
System.out.println(a+b);
}
}
class B extends A {
B(int a) {
super(a);
}
B(int a, int b) {
super(a, b);
}
}
'
'
'
B test1 = new B(100);
오버리딩된 A생성자와 B생성자가 각각 두 개씩 있다.
객체를 생성했을 때, 매개변수가 정수타입에 1개인 B생성자를 호출하여 100을 전달하고, 부모클래스에서 동일하게 매개변수가 정수타입에 1개인 A생성자를 호출하여 a의 값을 전달, a의 값이 출력된다.
만약 200과 300을 매개변수로 전달하면 500이 출력된다.
this
현재 객체의 멤버를 참조하며, 클래스 멤버(static)에 사용할 수 없다.
'this.변수'는 현재 객체의 인스턴스 변수를 뜻한다.
1. 생성자에서 this
int a = 100;
class(int a) {
this.a = a;
}
위 예시에서 this.a는 인스턴스 변수 a를 뜻하고, a는 매개변수를 뜻한다.
2. 오버로딩된 생성자끼리 호출
class test {
int a = 1;
class() {
this(2000);
}
class(int a) {
this.a = a;
}
}
'
'
'
class test = new class();
기본 생성자로 객체를 생성하면, 기본 생성자가 호출된다.
기본 생성자에서 'this(2000);'을 사용해 현재 객체에서 해당 매개변수가 있는
생성자를 호출한다.
따라서 인스턴스 변수 a의 값은 2000이 된다.
object
모든 클래스의 조상인 클래스
toString(), equals() 사용이 가능하다.