[Java] 상속 (extends)
2024. 10. 5. 19:33ㆍJava
오늘은 자바의 상속에 대해 알아보고, 상속은 어떠한 장점이 있는지 코드를 작성하며 배워볼거다.
Java 상속 시 유의할 점
1. 부모 클래스에서 private 필드나 메서드는 상속이 안된다.
2. 다중 상속이 안된다. (인터페이스 에서는 가능)
슈퍼 클래스 & 서브 클래스
슈퍼 클래스 = 부모 클래스
서브 클래스 = 자식 클래스
부모의 속성과 기능을 그대로 물려받는다.
이미 만들어진 클래스의 재상용을 하기 위함.
즉, 서브클래스는 부모클래스의 내용을 상속받아서 추가적인 요소를 넣어 개념을 확장한다.
서브클래스 선언
: extends (확장) 이라는 키워드를 이용함
-> class 자식클래스명 extends 부모클래스명
예시 코드
class Parent1 { // 두 정수를 저장할 수 있는 메서드 == SuperClass
int x;
int y;
void show() {
System.out.printf("x : %d , y : %d\n", x, y);
}
void setX(int x) {
this.x = x;
}
void setY(int y) {
this.y = y;
}
}
// Parent1 클래스의 속성과 기능을 그대로 물려받는 서브클래스 Child1
class Child1 extends Parent1 { // extends
// int x;
// int y;
int z; // 새로운 속성 추가
// void setX(int x) {this.x = x;}
// void setY(int y) {this.y = y;}
void setZ(int z) {this.z = z;}
void show() { // 기존 기능을 수정 (기존에 만들어진 함수와 형식이 일치해야한다)
System.out.printf("x : %d , y : %d , z : %d\n", x, y, z);
}
}
public class Ex01 {
public static void main(String[] args) {
Parent1 ob1 = new Parent1();
ob1.setX(12);
ob1.setY(7);
ob1.show();;
Child1 ob2 = new Child1();
ob2.setX(35);
ob2.setY(72);
ob2.setZ(17); // ob1 과 다른 형태로 결과 출력된다
ob2.show();;
}
}
오버라이딩 (재정의)
: 부모에게 상속받은 것을 수정해서 사용하는것
오버라이딩 사용법 (메서드 위에 Override 어노테이션을 사용해야함)
: @Override
public String 함수명()
오버라이딩에서 유의할 점
1. 이름이 같아야한다
2. 매개변수 타입이 같아야한다
3. 리턴타입이 같아야한다
4. 내가 재정의하지 않는 것은 그대로 쓸 수 있음
5. 접근제어자는 부모보다 더 좁은 범위로 변경할 수 없다.
class Student02 {
String name;
int score;
public Student02(String name, int score) {
this.name = name;
this.score = score;
}
void show() {
System.out.printf("이름 : %s, 점수 : %d\n", name, score);
}
@Override
public String toString() { // 객체를 문자열로 나타낼때의 형식을 정의하는 함수 (= 오버라이딩)
return String.format("이름 : %s, 점수 : %d\n", name, score);
}
}
public class Ex09 {
public static void main(String[] args) {
Student02 ob = new Student02("이지은", 99);
ob.show();
System.out.println(ob.toString());
System.out.println(ob);
// Student02의 객체도 Object 이다
Object ob2 = ob;
// ob2.show(); // Object 클래스에는 show() 메서드가 없음
System.out.println(ob2.toString()); // object 클래스에는 toString() 메서드가 있다
// 오버라이딩을 했기 때문에 오버라이딩 한 내용대로 실행된다
// Object >> toString()
//
// ↓
//
// Student >> show() : toString을 오버라이딩한 show()
// Student02 ob1 = new Student02( .. )
// Object ob2 = new Object ( .. )
// ob1.show() == 가능
// ob2.show() == 불가능
}
}
오버라이딩 vs 오버로딩
오버로딩은 새로운 메서드를 정의
오버라이딩은 상속받은 부모 메서드의 내용만 변경하는 것
오버라이딩 | 오버로딩 | |
메서드명 | 동일 | 동일 |
매개변수, 타입 | 동일 | 다름 |
리턴타입 | 동일 | 상관없음 |
오버라이딩을 잘 만 사용한다면 굳이 클래스를 더 만들 필요가 없어서 편리한 것 같다.
언제까지나 이걸 잘 활용할 수 있을 만큼 기초가 탄탄하다는 가정하에...
'Java' 카테고리의 다른 글
[Java] StringBuffer (0) | 2024.10.12 |
---|---|
[Java] DAO와 DTO (2) (0) | 2024.10.04 |
[Java] DAO와 DTO (1) (3) | 2024.10.04 |
[Java] 프로그래머스 문제 풀이에 유용한 String 메서드 (0) | 2024.10.04 |
[Java] Exception (0) | 2024.10.04 |