Notice
Recent Posts
Recent Comments
Link
컴퓨터는 잘못이 없다..
[JAVA]상속 본문
Contents
접기
#핵심 요약
- 상속
- 기존 클래스에 기능 추가 및 재정의하여 새로운 클래스를 정의
- 부모클래스(=상위클래스) / 자식클래스(=하위클래스)
- 부모클래스의 필드와 메소드가 상속된다. (생성자, 초기화 블록은 상속되지 않는다.)
- 상속 형태
- 부모 <- 자식 <- 자식 (가능)
- 부모 <- 자식
<- 자식
(가능, 여러 개의 자식 클래스가 한 개의 부모 클래스를 상속하는 형태) - 부모 <- 자식 -> 부모
(불가능, 자식클래스가 여러 개의 부모 클래스를 상속받는 형태 즉, 다중 상속 불가)
- super, super()
- super : 부모 클래스와 자식 클래스의 멤버 이름이 같을 때 구분하는 키워드
- super() : 부모 클래스의 생성자 호출
- 오버라이딩
- 부모 클래스의 메소드를 자식 클래스에서 재정의
- 오버라이딩 조건
- 메소드의 선언부는 부모, 자식 클래스 동일해야함
- 반환타입 변경 가능
- 부모클래스의 메소드보다 접근제어자를 더 좁은 범위로 변경 불가
- 부모 클래스의 메소드보다 더 큰 범위의 예외 선언 불가
#소스 코드
1. 상속, super, 오버라이딩 사용 예제
// Java 프로그래밍 - 상속
class Person {
String name;
int age;
public int a1;
private int a2;
Person() {}
Person(String name, int age) {
this.name = name;
this.age = age;
}
public void printInfo() {
System.out.println("Person.printInfo");
System.out.println("name: " + name);
System.out.println("age: " + age);
}
}
// Student 클래스 - Person 상속, 접근제어자 확인
class Student extends Person {
Student() {
a1 = 1;
// a2 = 2; //private 이라 접근 불가능
}
}
// Student 클래스 - Person 상속, super 사용, 오버라이딩
class Student2 extends Person {
String name;
int stdId;
// super, super()
Student2(String name, int age, int stdId) {
this.name = name; //자식클래스의 name
// super.name = name; //부모클래스의 age에 접근하고 싶을 땐 super를 사용
this.age = age; //상속받은 age를 의미
// super(name, age); //부모클래스의 생성자를 호출하는 것임
this.stdId = stdId; //자식클래스의 name
}
// 오버라이딩 - 메소드의 이름은 부모클래스에 있는 메소드와 동일하게 작성한다.
public void printInfo() {
System.out.println("Student2.printInfo");
System.out.println("name: " + name);
System.out.println("age: " + age);
System.out.println("stdId: " + stdId);
}
}
public class Main {
public static void main(String[] args) {
// Test code
// 1. 상속
System.out.println("=============");
Student s1 = new Student();
s1.name = "a";
s1.age = 25;
s1.printInfo();
// 2. super, super(), 오버라이딩
System.out.println("=============");
Student2 s2 = new Student2("b",32, 1);
s2.printInfo();
}
}
2. 예제 - 1
// Practice1
// 아래의 클래스 및 상속 관계에서 Test code를 수정하지 않고
// Cat 클래스 내에서 super 또는 super()를 이용하여
// "고양이 입니다." 가 출력될 수 있도록 변경해보세요.
class Animal {
String desc;
Animal() {
this.desc = "동물 클래스 입니다.";
}
Animal(String desc) {
this.desc = desc;
}
public void printInfo() {
System.out.println(this.desc);
}
}
class Cat extends Animal {
String desc;
Cat() {
this.desc = "고양이 입니다.";
// super.desc = "고양이 입니다."; //방법1. super를 이용하여 직접 부모 클래스의 변수 초기화
// super("고양이 입니다."); //방법2. supter() 생성자를 호출하여 직접 부모 클래스의 변수 초기화
}
}
public class Practice1 {
public static void main(String[] args) {
// Test code
Cat cat = new Cat();
cat.printInfo();
}
}
3. 예제 - 2
// Practice2
// 아래 클래스와 상속 관계에서
// Test code를 수정하지 않고, 아래와 같이 출력될 수 있도록 오버라이딩 해보세요.
// 빵빵!
// 위이잉!
// 빵빵!
// 삐뽀삐보!
class Car {
Car(){}
public void horn() {
System.out.println("빵빵!");
}
}
class FireTruck extends Car {
public void horn() {
super.horn(); //부모클래스의 메소드를 호출
System.out.println("위이잉!");
}
}
class Ambulance extends Car {
public void horn() {
super.horn(); //부모클래스의 메소드를 호출
System.out.println("삐뽀삐뽀!");
}
}
public class Practice2 {
public static void main(String[] args) {
// Test code
FireTruck truck = new FireTruck();
truck.horn();
Ambulance amb = new Ambulance();
amb.horn();
}
}
'공부 > JAVA' 카테고리의 다른 글
[JAVA]다형성 (0) | 2024.04.13 |
---|---|
[JAVA]클래스와 객체 (1) | 2024.04.10 |
[JAVA]다차원배열 (0) | 2024.04.07 |
Comments