상속(Inheritance)
B 클래스가 A 클래스를 상속 받으면 B 클래스는 A 클래스의 필드와 메서드를 사용할 수 있음
→ 유지 보수가 편하고, 프로그램을 수정하거나 새로운 내용을 추가하는 것이 편리함

클래스 상속 문법
자식 클래스 생성
extends 키워드를 사용함
// 예시
public class 자식클래스 extendss 부모클래스 {...}
이 문법에서 사용되는 부모클래스는 하나여야 함.
사용 예시: 포유류와 사람 (포유류는 상위 클래스, 사람은 하위 클래스)
// 포유류 클래스
class Mammal { ... }
// 사람 클래스
class Human extends Mammal {...}
자식 클래스의 객체를 만들 때, 부모 객체가 먼저 생성되고 이후에 자식 객체가 생성된다.
자식클래스 변수 = new 자식클래스();
자식 클래스는 부모클래스를 상속받았기 때문에 자유롭게 부모의 모든 속성을 사용할 수 있음.
하지만 그럼에도 자식과 부모사이의 구분이 있어야하는데, 자식클래스가 부모클래스의 속성과 동일한 이름을 갖고 있다면 그것을 부모로부터 구분해 낼 수 있어야한다는 것
자식 생성자 만들 때, super() 사용
public 자식클래스(...) {
super();
...
}
상속에서 생성자는 자식에게 상속되지 않는 유일한 요소임
하위 클래스가 생성될 때는 상위 클래스의 생성자가 먼저 호출됨
→ 생성자를 만들 때 부모 클래스의 생성자를 선언해주어야 함
경우는 세 가지!
1. 파라미터가 없는 기본 생성자만 부모가 가진 경우
자식 생성자를 만들 때, super()을 굳이 적지 않아도 자바 컴파일러가 알아서 적용을 시켜준다.
2-1. 기본 생성자가 있지만, 파라미터를 지닌 다른 생성자도 부모가 지니고 있는 경우
디폴트가 아닌 자식 생성자를 만들 때, 자유롭게 만들 수 있음
this 써도 되고, super 써도 되고
2-2. 부모가 기본 생성자를 지니고 있지 않은 경우
public class Parent {
public Parent(int a) {
this.n = a;
}
}
public class Child extends Parent {
public Child() {
// 자식 생성자 내용
}
}
이럴 때 두 가지로 해결 할 수 있다.
부모에게 기본 생성자를 만들어주거나, 자식 생성자를 만들 때 super내에 파라미터 값을 넣어주는 것이다.
// 부모에 기본 생성자를 넣어주는 방법
public class Parent {
public Parent() {
n = 10;
}
public Parent(int a) {
this.n = a;
}
}
public class Child extends Parent {
public Child() {
super();
// 자식 생성자 내용
}
}
// super에 파라미터를 넣어주는 방법
public class Parent {
public Parent(int a) {
this.n = a;
}
}
public class Child extends Parent {
public Child() {
super(40);
// 자식 생성자 내용
}
}
위와 같은 두 가지 방법으로 해결할 수 있다.
상위 클래스의 필드나 메서드를 참조하는 super
하위 클래스에서 상위 클래스에 선언한 필드나 메서드에 접근할 때에도 super을 사용함
class A {
int a;
}
class B extends A {
int a;
}
public static void main(String args[]){
B ins = new B();
ins.a = 2 // 자식의 변수이다
// 만약 자식에게 a라는 변수가 없었다면 부모의 a를 가리켰을 것이다.
// 여기서 자식 a가 아닌 부모의 a로 접근하고 싶다면?
ins.super.a = 20; // 이렇게 super라는 참조 변수를 사용해서 부모의 a에 접근할 수 있다
}
Method overriding
자식 클래스에서 메서드를 재정의 하는 것
메서드가 자식 클래스에서 새로 정의되면, 자식 객체에서 재정의한 메서드가 실행됨
class Parent {
void method1() {
System.out.println("hi");
}
void method2() {
System.out.println("hello");
}
}
class Child extends Parent {
void method2() {
System.out.println("hello2");
}
void method3() {
System.out.println("안녕");
}
}
class Main {
public static void main(string[] args) {
Child child = new Child();
child.method1(); // hi 출력
child.method2(); // hello2 출력
child.method3(); // 안녕 출력
}
}
오버라이딩 시에, 자식 메서드는 부모 메서드의 리턴 타입, 메서드 이름, 파라미터가 동일해야 한다.
public에서 private로의 변경과 같이 범위를 더 제한적으로 바꾸는 것이 불가능하다.
super을 이용하여 부모 메서드에 접근하기
super과 dot(.)을 사용하여 부모 메서드를 사용할 수 있다.
이를 통해 자식 메서드에서 부모 메서드를 재사용함으로써 중복되는 작업을 제거할 수 있음
class Parent {
void method2() {
System.out.println("hello");
}
}
class Child extends Parent {
void method2() {
super.method2();
System.out.println("hi");
}
}
이후 main에서 실행하면 hello와 hello2 모두를 출력하게 된다.

'CS > Java' 카테고리의 다른 글
상속(Inheritance)
B 클래스가 A 클래스를 상속 받으면 B 클래스는 A 클래스의 필드와 메서드를 사용할 수 있음
→ 유지 보수가 편하고, 프로그램을 수정하거나 새로운 내용을 추가하는 것이 편리함

클래스 상속 문법
자식 클래스 생성
extends 키워드를 사용함
// 예시
public class 자식클래스 extendss 부모클래스 {...}
이 문법에서 사용되는 부모클래스는 하나여야 함.
사용 예시: 포유류와 사람 (포유류는 상위 클래스, 사람은 하위 클래스)
// 포유류 클래스
class Mammal { ... }
// 사람 클래스
class Human extends Mammal {...}
자식 클래스의 객체를 만들 때, 부모 객체가 먼저 생성되고 이후에 자식 객체가 생성된다.
자식클래스 변수 = new 자식클래스();
자식 클래스는 부모클래스를 상속받았기 때문에 자유롭게 부모의 모든 속성을 사용할 수 있음.
하지만 그럼에도 자식과 부모사이의 구분이 있어야하는데, 자식클래스가 부모클래스의 속성과 동일한 이름을 갖고 있다면 그것을 부모로부터 구분해 낼 수 있어야한다는 것
자식 생성자 만들 때, super() 사용
public 자식클래스(...) {
super();
...
}
상속에서 생성자는 자식에게 상속되지 않는 유일한 요소임
하위 클래스가 생성될 때는 상위 클래스의 생성자가 먼저 호출됨
→ 생성자를 만들 때 부모 클래스의 생성자를 선언해주어야 함
경우는 세 가지!
1. 파라미터가 없는 기본 생성자만 부모가 가진 경우
자식 생성자를 만들 때, super()을 굳이 적지 않아도 자바 컴파일러가 알아서 적용을 시켜준다.
2-1. 기본 생성자가 있지만, 파라미터를 지닌 다른 생성자도 부모가 지니고 있는 경우
디폴트가 아닌 자식 생성자를 만들 때, 자유롭게 만들 수 있음
this 써도 되고, super 써도 되고
2-2. 부모가 기본 생성자를 지니고 있지 않은 경우
public class Parent {
public Parent(int a) {
this.n = a;
}
}
public class Child extends Parent {
public Child() {
// 자식 생성자 내용
}
}
이럴 때 두 가지로 해결 할 수 있다.
부모에게 기본 생성자를 만들어주거나, 자식 생성자를 만들 때 super내에 파라미터 값을 넣어주는 것이다.
// 부모에 기본 생성자를 넣어주는 방법
public class Parent {
public Parent() {
n = 10;
}
public Parent(int a) {
this.n = a;
}
}
public class Child extends Parent {
public Child() {
super();
// 자식 생성자 내용
}
}
// super에 파라미터를 넣어주는 방법
public class Parent {
public Parent(int a) {
this.n = a;
}
}
public class Child extends Parent {
public Child() {
super(40);
// 자식 생성자 내용
}
}
위와 같은 두 가지 방법으로 해결할 수 있다.
상위 클래스의 필드나 메서드를 참조하는 super
하위 클래스에서 상위 클래스에 선언한 필드나 메서드에 접근할 때에도 super을 사용함
class A {
int a;
}
class B extends A {
int a;
}
public static void main(String args[]){
B ins = new B();
ins.a = 2 // 자식의 변수이다
// 만약 자식에게 a라는 변수가 없었다면 부모의 a를 가리켰을 것이다.
// 여기서 자식 a가 아닌 부모의 a로 접근하고 싶다면?
ins.super.a = 20; // 이렇게 super라는 참조 변수를 사용해서 부모의 a에 접근할 수 있다
}
Method overriding
자식 클래스에서 메서드를 재정의 하는 것
메서드가 자식 클래스에서 새로 정의되면, 자식 객체에서 재정의한 메서드가 실행됨
class Parent {
void method1() {
System.out.println("hi");
}
void method2() {
System.out.println("hello");
}
}
class Child extends Parent {
void method2() {
System.out.println("hello2");
}
void method3() {
System.out.println("안녕");
}
}
class Main {
public static void main(string[] args) {
Child child = new Child();
child.method1(); // hi 출력
child.method2(); // hello2 출력
child.method3(); // 안녕 출력
}
}
오버라이딩 시에, 자식 메서드는 부모 메서드의 리턴 타입, 메서드 이름, 파라미터가 동일해야 한다.
public에서 private로의 변경과 같이 범위를 더 제한적으로 바꾸는 것이 불가능하다.
super을 이용하여 부모 메서드에 접근하기
super과 dot(.)을 사용하여 부모 메서드를 사용할 수 있다.
이를 통해 자식 메서드에서 부모 메서드를 재사용함으로써 중복되는 작업을 제거할 수 있음
class Parent {
void method2() {
System.out.println("hello");
}
}
class Child extends Parent {
void method2() {
super.method2();
System.out.println("hi");
}
}
이후 main에서 실행하면 hello와 hello2 모두를 출력하게 된다.
