목차
1. 상속
2. 자식 클래스에 기능 추가
3. 업캐스팅
2개의 클래스를 만들 때 한 클래스가 다른 클래스의 기능들을 모두 포함하는 형태라면 어떻게 해야할까?
모두 복사해서 만들어야 할까?
class Cal{
public int sum(int n, int m) {
return n+m;
}
}
class Cal2{
public int sum(int n, int m) {
return n+m;
}
public int sub(int n, int m) {
return n-m;
}
}
public class InheritanceApp {
public static void main(String[] args) {
Cal c=new Cal();
System.out.println(c.sum(2, 1));
}
}
· Cal 클래스에는 덧셈을 하는 sum 메소드가 있다.
· Cal에서 뺄셈 기능을 추가한 Cal2 클래스는 Cal의 sum 메소드를 그대로 복사
-> 코드의 양이 많아지고, 코드의 양이 많아수록 둘의 관계를 파악하기가 어려워진다,
-> Cal의 sum 메소드를 수정하더라도 Cal2의 sum 메소드에는 어떤 영향도 끼치지 않는다.
=> 상속을 이용
상속
클래스를 상속해서 새로운 클래스를 생성하면 기존 클래스의 모든 변수와 메소드들이 새로운 클래스에 포함되고, 기존의 변수와 메소드를 덮어쓰거나, 새로운 변수와 메소드를 추가할 수도 있다.
[선언]
· extends 키워드 사용
class 자식클래스 extends 부모클래스 { //부모클래스를 상속받는 자식클래스 선언
}
[특징]
· 클래스의 다중 상속 불가
· 상속의 횟수에 제한X
· 계층 구조 최상위에 java.lang.Object 클래스 존재
프로그램에 상속을 이용해 본다.
class Cal {
public int sum(int n, int m) {
return n+m;
}
}
class Cal3 extends Cal { // Cal을 상속받는 클래스 Cal3 선언
}
public class InheritanceApp {
public static void main(String[] args) {
Cal c=new Cal();
System.out.println(c.sum(2, 1));
Cal3 c3=new Cal3();
System.out.println(c3.sum(2, 1));
}
}
· 자식 클래스에서 부모 클래스의 private를 제외한 모든 멤버 접근 가능
· c3는 Cal3 클래스와 Cal 클래스의 변수와 메소드를 모두 가진다.
-> Cal3 클래스에 아무것도 없어도, Cal에 있는 메소드인 sum을 사용 가능
자식 클래스에 기능 추가하기
자식 클래스에 새로운 기능을 추가하기 위해서 어떻게 해야할까?
부모 클래스에 없는 기능 추가
· 변수나 메소드 새로 정의
class Cal {
public int sum(int n, int m) {
return n+m;
}
}
class Cal3 extends Cal {
public int sub(int n, int m) {
return n-m;
}
}
public class InheritanceApp {
public static void main(String[] args) {
Cal c=new Cal();
System.out.println(c.sum(2, 1));
Cal3 c3=new Cal3();
System.out.println(c3.sum(2, 1));
System.out.println(c3.sub(2, 1));
}
}
· 자식 클래스에 뺄셈 기능을 추가하기 위해 새로 메소드 정의
부모 클래스가 가진 기능 확장
· 같은 이름으로 다시 재정의(override)
class Cal3 extends Cal{
//overriding
public int sum(int n, int m) {
System.out.println("Cal3!!");
return n+m;
}
public int sub(int n, int m) {
return n-m;
}
}
<참고> 이클립스의 기능으로 재정의
· 자식 클래스 내 우클릭 -> Source -> Override/Implement Method 클릭
· 재정의할 메소드 선택하고 OK 클릭
· sum 메소드 생성
업캐스팅
캐스팅은 타입 변환을 말하며, 자바에서 클래스에 대한 캐스팅은 업캐스팅과 다운캐스팅으로 나뉜다.
업캐스팅(upcasting)
· 자식 클래스의 객체를 부모 클래스 타입으로 변환
· 부모 클래스 타입의 변수로 자식 클래스의 객체를 가리킨다.
Cal c=new Cal3(2, 1);
System.out.println(c.sum());
// System.out.println(c.sub()); Error
· Cal 타입의 변수 c가 Cal3 객체를 가리킨다. -> Cal3 객체는 Cal 타입의 객체로 취급
· c는 Cal 클래스의 멤버만 접근 가능
· sub 메소드는 Cal3 클래스의 멤버 -> 오류 발생
=> 업캐스팅한 변수로는 부모 클래스의 멤버만 접근할 수 있다.
'Programming 기초 > Java' 카테고리의 다른 글
[Java] super와 생성자 (0) | 2023.04.20 |
---|---|
[Java] overloading vs overriding (0) | 2023.04.17 |
[Java] 생성자와 this (0) | 2023.04.11 |
[Java] 클래스와 인스턴스 - 활용 (0) | 2023.04.08 |
[Java] 인스턴스 (0) | 2023.04.05 |
댓글